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

Last change on this file since 432 was 432, checked in by oriona, 9 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.