source: experiments/frams/foraminifera/data/scripts/foraminifera.inc @ 436

Last change on this file since 436 was 432, checked in by oriona, 10 years ago

Minor corrections, hibernation gene value changed to 1, param for stopping simulation added

File size: 7.3 KB
Line 
1//size versus energy
2//real proportions
3
4function init_chambers()
5{
6        colors = ["1.0,1.0,0.0","1.0,0.5,0.0"];
7        chambers = [ ["0.0,0.0,0.0,",  //coiled
8        "1.08020961284637, -0.0597195439040661, -0.0393781512975693,",
9        "1.08020961284637, -0.0597195439040661, -0.0393781512975693,",
10        "0.615013539791107, 0.778662621974945, 0.535521030426025,",
11        "0.488581955432892, 0.826426684856415, -0.381044268608093,",
12        "0.732419908046722, -0.0084995785728097, -1.02214300632477,",
13        "1.35288727283478, 0.875738024711609, -1.03719782829285,",
14        "0.342692613601685, 0.938660383224487, -1.45657968521118,",
15        "1.0958571434021, 0.316927701234818, -1.813929438591,",
16        "0.903768002986908, 1.11856341362, -2.53161096572876,",
17        "0.21014116704464, 0.295340299606323, -2.45328187942505,"],
18        ["0.0,0.0,0.0,", //longitudal
19        "0.98089325428009, 0.00591040402650833, 0.00389722990803421,",
20        "1.90962779521942, -0.256769120693207, -0.16194811463356,",
21        "2.63965249061584, -0.727959632873535, -0.609036147594452,",
22        "3.17575979232788, -1.34843015670776, -1.14828503131866,",
23        "3.55273032188416, -2.22369408607483, -1.3917418718338,",
24        "3.64916682243347, -3.11888360977173, -1.01666414737701,",
25        "3.50461649894714, -3.84039807319641, -0.377427101135254,",
26        "3.15921688079834, -4.50001525878906, 0.261153399944305,",
27        "2.51528453826904, -5.16421365737915, 0.59241509437561,"]];
28}
29
30function createForamGenotype(gen, species, chamber_num)
31{
32        var rad = getProperty(gen, "chamber_proculus");
33        var geno = "//0\np:" + chambers[species][0] + "sh=1,sx=" + rad + ",sy=" + rad + ",sz=" + rad + ", rz=3.14159265358979,vr=" + colors[gen];
34
35        chamber_num = Math.min(chamber_num, chambers[species].size - 1);
36
37        for (var i = 0; i < chamber_num; i++)
38        {
39                rad = getProperty(gen, "chamber_proculus") + getProperty(gen, "chamber_difference") * (i + 1);
40                geno += "\n" + "p:" + chambers[species][i+1] + "sh=1,sx=" + rad + ",sy=" + rad + ",sz=" + rad + ",vr=" + colors[gen];
41        }
42
43        for (var i = 0; i < chamber_num; i++)
44        {
45                geno += "\n" +  "j:"+ i +", "+ (i+1) +", sh=1";
46        }
47
48        if (species == 0) geno += "\nn:p=0,d=\"S\"";
49
50        return geno;
51}
52
53function setGenotype(mode)
54{
55        if (mode["opt"] == 0) //initial
56        {
57                mode["cr"].user1 = {"min_repro_energies" : [max_chamber_energ[0][getProperty(0, "min_repro_energ")], max_chamber_energ[1][getProperty(1, "min_repro_energ")]], "hibernation" : mode["species"]};
58                mode["cr"].user2 = {"max_energy_level" : getProperty(0,"energies0"), "gen" : 0,  "hibernated" : 0, "species" : mode["species"], "reproduce" : 0};
59        }
60        else if (mode["opt"]  == 1) //child
61        {
62                mode["cr"].user2 = {"max_energy_level" : getProperty(1 - mode["parent_user2"]["gen"],"energies0"), "gen" : 1 - mode["parent_user2"]["gen"],  "hibernated" : 0, "species" : mode["parent_user2"]["species"], "reproduce" : 0};
63                mode["cr"].user1 = mode["parent_user1"];
64        }
65        else //grow
66        {
67                mode["cr"].user1 = mode["parent_user1"];
68                mode["cr"].user2 = mode["parent_user2"];
69        }
70}
71
72function reproduce_haploid(parent, parent2, clone)
73{       
74        var number, energy0, new_user1, gen;
75        if (clone == 1)
76        {
77                energy0 = getProperty(0,"energies0");
78                number = (( 1 - getProperty(1, "e_repro_cost")) * parent.energy) / energy0;
79                new_user1 = parent.user1;
80                parent.user2["gen"] = 1 - parent.user2["gen"]; //because of reversal of "gen" in createOffspring function
81                gen = parent.user2["gen"];
82        }
83        else
84        {
85                energy0 = getProperty(1,"energies0");
86                number = (((1 - getProperty(parent.user2["gen"], "e_repro_cost")) * parent.energy) + ((1 -(getProperty(parent.user2["gen"], "e_repro_cost"))) * parent2.energy)) / energy0;
87                new_user1 = [parent.user1, parent2.user1];
88                gen = 1 - parent.user2["gen"];
89        }
90
91        Simulator.print("haploid number of offspring: " + number + " energ0: " + energy0);
92
93        for (var j = 0; j < number; j++)
94        {
95                createOffspring(createForamGenotype(gen, parent.user2["species"], 0), energy0, new_user1, parent.user2);
96        }
97}
98
99function reproduce_diploid(parent)
100{
101        var energy0 = getProperty(0,"energies0");
102        var number = ((1 - (getProperty(parent.user2["gen"], "e_repro_cost"))) * parent.energy) / energy0;
103
104        Simulator.print("diploid number of offspring: " + number+ " energ0: " + energy0);
105
106        for (var j = 0; j < number / 2; j++)
107        {
108                var crossed = 0;
109                //crossover
110                if (Math.rnd01 < ExpParams.crossprob)
111                {
112                        crossover(parent, "min_repro_energies");
113                        crossed = 1;
114                }
115
116                for (var k = 0; k < 2; k++)
117                {
118                        createOffspring(createForamGenotype(1 - parent.user2["gen"], parent.user2["species"], 0), energy0, parent.user1[0], parent.user2);
119                }
120
121                //reverse of crossover for fossilization
122                if (crossed == 1)
123                {
124                        crossover(parent, "min_repro_energies");
125                        crossed = 0;
126                }
127                       
128        }
129}
130
131function reproduce_parents(species)
132{
133                var parent1 = null;
134                var parent2 = null;
135                var pop = Populations[0];
136                for (var i = pop.size-1; i >= 0; i--)
137                {
138                        if (pop[i].user2["reproduce"] == 1 && pop[i].user2["species"] == species)
139                        {
140                                if ((pop[i].user2["gen"]==1) || ((pop[i].user2["gen"]==0) && ExpParams.stress == 0))
141                                {
142                                        continue;
143                                }
144                                else if (parent1 == null)
145                                {
146                                        parent1 = pop[i];
147                                }
148                                else if (parent2 == null)
149                                {
150                                        parent2 = pop[i];
151                                } 
152                                if (parent1 != null && parent2 != null)
153                                {
154                                        reproduce_haploid(parent1, parent2, 0);
155                                        print_repro_info(parent1);
156                                        print_repro_info(parent2);
157                                        pop.kill(parent1);
158                                        pop.kill(parent2);
159                                        parent1 = null;
160                                        parent2 = null;
161                                }       
162                        }
163                }
164}
165
166function readyToRepro(cr)
167{
168        var reproduced = 1;
169       
170       
171        if (cr.user2["gen"] == 1)
172        {
173                reproduce_diploid(cr);
174        }
175
176        else if (ExpParams.stress == 0)
177        {
178                reproduce_haploid(cr, null, 1);
179        }
180
181        else
182        {
183                if (cr.signals.size == 0)
184                {
185                        cr.signals.add("repro"+cr.user2["species"]);
186                        cr.signals[0].power = 1;
187                }
188                reproduced = 0;
189                cr.user2["reproduce"] = 1;
190        }
191
192        if (reproduced == 1)
193        {
194                print_repro_info(cr);
195                Populations[0].kill(cr);
196        }
197
198        return reproduced;
199}
200
201function print_repro_info(cr)
202{
203        Simulator.print("Reproduced " + cr.user2["gen"] + " of species " + cr.user2["species"] + " energy: " + cr.energy);
204}
205
206
207
208function foramReproduce(cr)
209{
210        var properEnergy = 0;
211        var reproduced = 0;
212
213        if (cr.user2["gen"] == 0)
214        {
215                properEnergy = ( cr.energy >= cr.user1["min_repro_energies"][cr.user2["gen"]] );
216        }
217        else
218        {
219                properEnergy = ( cr.energy >= cr.user1[0]["min_repro_energies"][cr.user2["gen"]] ); //TODO gene selection
220        }
221
222        //if creature has proper energy
223        if ( properEnergy && cr.signals.size == 0)
224        {
225                //reproduce with probability repro_prob
226                if (Math.rnd01 <= ExpParams.repro_prob) //TODO env trigger
227                {
228                        reproduced = readyToRepro(cr);
229                }
230                else if (cr.signals.receive("repro"+cr.user2["species"]) > 0)
231                {
232                        reproduced = readyToRepro(cr);
233                }
234                if (reproduced == 1)
235                                return 1;
236        }
237
238        else if (!properEnergy)
239        {
240                cr.signals.clear();
241                cr.user2["reproduce"] = 0;
242        }
243
244        return 0;
245}
246
247function crossover(parent, gene)
248{
249        var tmp = parent.user1[0][gene];
250        parent.user1[0][gene] = parent.user1[1][gene];
251        parent.user1[1][gene] = tmp;
252}
253
254function createOffspring(geno, energy, parent_user1, parent_user2)
255{
256        var cr = Populations[0].add(geno);
257        cr.energy0 = energy;
258        cr.energy = cr.energy0;
259        setGenotype({"cr" : cr, "parent_user1" : parent_user1, "parent_user2" : parent_user2, "opt" : 1});
260        placeRandomlyNotColliding(cr);
261}
Note: See TracBrowser for help on using the repository browser.