source: experiments/frams/foraminifera/data/scripts/forams_repro.inc @ 403

Last change on this file since 403 was 403, checked in by Maciej Komosinski, 9 years ago

Haplo/diploid forams are visualized correctly since their birth

File size: 6.5 KB
Line 
1//size versus energy
2//real proportions
3
4// -------------------------------- step begin --------------------------------
5
6function reproduce_haploid(repro_list, number)
7{
8        var len = repro_list.size;
9        if (len % 2 != 0) len = repro_list.size - 1;
10
11        for (var i = 0; i < len - 2 ; i = i + 2)
12        {
13                var parent = Populations[0].get(repro_list[i]);
14                var parent2 = Populations[0].get(repro_list[i + 1]);
15
16                number = parent.user2["Va"] / ExpParams.ofnumd + parent2.user2["Va"] / ExpParams.ofnumd;
17                for (var j = 0; j < number; j++)
18                {
19                        //size
20                        var rsize = (parent.user1["delta_d"] + ExpParams.diplo_rad);
21                        if (Math.rnd01 < 0.5)
22                        {
23                                rsize = parent2.user1["delta_d"] + ExpParams.diplo_rad;
24                        }
25
26                        var deltas = parent.user1["delta_d"];
27                        //mutation
28                        if (Math.rnd01 < ExpParams.mutationprob)
29                        {
30                                var diff = delta_change * deltas;
31                                if (Math.rnd01 < 0.5)
32                                {
33                                        deltas -= diff;
34                                }
35                                else
36                                {
37                                        deltas += diff;
38                                }
39                                rsize = ExpParams.diplo_rad + deltas;
40                        }
41
42                        var geno = "//0\np:sh=1,sx=" + rsize + ",sy=" + rsize + ",sz=" + rsize + ", rz=3.14159265358979";
43                        geno += "\nn:p=0,d=\"S\""; //TODO is this the only difference with haploid code? TODO why initial genotypes are not used as defined in ExpParams?
44                        var cr = Populations[0].add(geno);
45                        cr.energ0 = ExpParams.ofnumd;
46                        cr.energy = cr.energ0;
47                        var dsize =  ExpParams.diplo_rad * ExpParams.delta_rate + ExpParams.diplo_rad;
48                        cr.user1 = [ {"vamin" : (rsize / dsize) * ExpParams.v_min_d, "amin": parent.user1["amin"], "delta_h" : parent.user1["delta_h"], "delta_d" : deltas }, {"vamin" : (rsize / dsize) * ExpParams.v_min_d, "amin": parent2.user1["amin"], "delta_h" : parent2.user1["delta_h"], "delta_d" : deltas }];
49                        cr.user2 = { "Va" : cr.energ0, "gen" : 1 , "growth_step" : ExpParams.growth_step, "rsize": rsize, "vinit": cr.energ0};
50                        placeRandomlyNotColliding(cr);
51                }
52        }
53
54        for (var j = 0; j < repro_list.size; j++)
55        {
56                Populations[0].kill(repro_list[j]);
57        }
58}
59
60function reproduce_diploid(repro_list, number)
61{
62        for (var i = 0; i < repro_list.size; i++)
63        {
64                var parent = Populations[0].get(repro_list[i]);
65
66                if (parent.user2["gen"] == 1)
67                {
68
69                        var number = parent.user2["Va"] / ExpParams.ofnumh;
70
71
72                        for (var j = 0; j < number / 2; j++)
73                        {
74                                var crossed = 0;
75                                //crossover
76                                if (Math.rnd01 < ExpParams.crossprob)
77                                {
78                                        var tmp = parent.user1[0]["vamin"];
79                                        parent.user1[0]["vamin"] = parent.user1[1]["vamin"];
80                                        parent.user1[1]["vamin"] = tmp;
81                                        crossed = 1;
82                                }
83
84                                for (var k = 0; k < 2; k++)
85                                {
86                                        var rsize = parent.user1[k]["delta_h"]  + ExpParams.haplo_rad;
87                                        var vamin = parent.user1[k]["vamin"];
88                                        var deltas =  parent.user1[k]["delta_h"];
89
90
91                                        if (Math.rnd01 < ExpParams.mutationprob)
92                                        {
93                                                var diff = delta_change * deltas;
94                                                if (Math.rnd01 < 0.5)
95                                                {
96                                                        deltas -= diff;
97                                                }
98                                                else
99                                                {
100                                                        deltas += diff;
101                                                }
102                                                rsize = ExpParams.diplo_rad + deltas;
103                                        }
104
105                                        var geno = "//0\np:sh=1,sx=" + rsize + ",sy=" + rsize + ",sz=" + rsize + ", rz=3.14159265358979";
106                                        var cr = Populations[0].add(geno);
107                                        cr.energ0 = ExpParams.ofnumh;
108                                        cr.energy = cr.energ0;
109                                        //vamin depends on rsize
110                                        var hsize = ExpParams.haplo_rad * ExpParams.delta_rate + ExpParams.haplo_rad;
111                                        cr.user1 = {"vamin" : (rsize / hsize) * ExpParams.v_min_h, "amin": ExpParams.age_min_d, "delta_h" : deltas, "delta_d" : parent.user1[0]["delta_d"]};
112                                        cr.user2 = { "Va" : cr.energ0, "gen" : 0 , "growth_step" : ExpParams.growth_step, "rsize" : rsize, "vinit": cr.energ0};
113                                        placeRandomlyNotColliding(cr);
114                                }
115
116                                //reverse of crossover for fossilization
117                                if (crossed == 1)
118                                {
119                                        var tmp = parent.user1[0]["vamin"];
120                                        parent.user1[0]["vamin"] = parent.user1[1]["vamin"];
121                                        parent.user1[1]["vamin"] = tmp;
122                                        crossed = 0;
123                                }
124
125                        }
126                }
127        }
128        for (var j = 0; j < repro_list.size; j++)
129        {
130                Populations[0].kill(repro_list[j]);
131        }
132}
133
134
135function onStep()
136{
137        var haploids = 0;
138        var diploids = 0;
139        var e_inc_h = 0.0;
140        var e_inc_d = 0.0;
141        var e_nut = 0.0;
142        var size_h = 0.0;
143        var size_d = 0.0;
144        var vmin_h = 0.0;
145        var vmin_d = 0.0;
146
147        for (var i = 0; i < Populations[0].size; i++)
148        {
149                var cr = Populations[0].get(i);
150                if (cr.user2["gen"] == 0)
151                {
152                        haploids += 1;
153                        e_inc_h += cr.energy;
154                        size_h += cr.user1["delta_h"] + ExpParams.haplo_rad;
155                        vmin_h += cr.user1["vamin"];
156                }
157                else if (cr.user2["gen"] == 1)
158                {
159                        diploids += 1;
160                        e_inc_d += cr.energy;
161                        size_d += cr.user1[0]["delta_d"] + ExpParams.diplo_rad;
162                        vmin_d += cr.user1[0]["vamin"];
163                }
164        }
165
166        for (var i = 0; i < Populations[1].size; i++)
167        {
168                var cr = Populations[1].get(i);
169                e_nut += cr.energy;
170        }
171
172        if (haploids < 2 && diploids == 0)
173        {
174                Simulator.print("no more creatures, stopped.");
175                Simulator.stop();
176        }
177
178        var l1 = [haploids, diploids, Populations[1].size];
179        var l2 = [e_inc_h, e_inc_d, e_nut];
180        var dp = diploids;
181        var hp = haploids;
182        if (dp == 0) dp = 0.000001;
183        if (hp == 0) hp = 0.000001;
184        var l3 = [size_h / hp, vmin_h / hp, size_d / dp, vmin_d / dp];
185
186        if (ExpParams.logging == 1)
187        {
188                log(l1, "log.txt");
189                log(l2, "log2.txt");
190                log(l3, "log3.txt");
191        }
192        //food growth ---------------------------------------------
193        foodenergywaiting = foodenergywaiting + ExpParams.feedrate;
194        if (foodenergywaiting > ExpParams.feede0)
195        {
196                for (var i = 0; i < ExpParams.foodPop; i++)
197                {
198                        addfood();
199                }
200
201                foodenergywaiting = 0.0;
202                Simulator.checkpoint();
203        }
204
205        //reproduction --------------------------------------------
206        reprocounter += 1;
207        if (reprocounter > ExpParams.repro_time)
208        {
209                reprocounter = 0;
210                var to_repro_h = [];
211                var to_repro_d = [];
212                for (var i = 0; i < Populations[0].size; i++)
213                {
214                        var cr = Populations[0].get(i);
215                        if (cr.signals.size > 0)
216                        {
217                                if (cr.user2["gen"] == 0)
218                                {
219                                        to_repro_h.add(i);
220                                }
221                                else if (cr.user2["gen"] == 1)
222                                {
223                                        to_repro_d.add(i);
224                                }
225                        }
226                }
227                if (to_repro_h.size > 1)
228                {
229                        reproduce_haploid(to_repro_h, ExpParams.ofnumh);
230                }
231                if (to_repro_d.size > 0)
232                {
233                        reproduce_diploid(to_repro_d, ExpParams.ofnumd);
234                }
235        }
236
237        //check for death -----------------------------------------------
238        if (Populations[0].size == 0)
239        {
240                if (ExpParams.autorestart)
241                {
242                        Simulator.print("no more creatures, restarting...");
243                        onExpInit();
244                }
245                else
246                {
247                        Simulator.print("no more creatures, stopped.");
248                        Simulator.stop();
249                }
250        }
251}
252
253// -------------------------------- step end --------------------------------
Note: See TracBrowser for help on using the repository browser.