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

Last change on this file since 422 was 422, checked in by oriona, 9 years ago

new species added, hibernation added, morphology changed to more realistic, parameters in .show changed, refactoring

File size: 7.1 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\np:sh=1,",
8        "p:0.98089325428009, 0.00591040402650833, 0.00389722990803421,",
9        "p:1.90962779521942, -0.256769120693207, -0.16194811463356,",
10        "p:2.63965249061584, -0.727959632873535, -0.609036147594452,",
11        "p:3.17575979232788, -1.34843015670776, -1.14828503131866,",
12        "p:3.55273032188416, -2.22369408607483, -1.3917418718338,",
13        "p:3.64916682243347, -3.11888360977173, -1.01666414737701,",
14        "p:3.50461649894714, -3.84039807319641, -0.377427101135254,",
15        "p:3.15921688079834, -4.50001525878906, 0.261153399944305,",
16        "p:2.51528453826904, -5.16421365737915, 0.59241509437561,"],
17        ["//0\np:sh=1,",
18        "p:1.08020961284637, -0.0597195439040661, -0.0393781512975693,",
19        "p:1.08020961284637, -0.0597195439040661, -0.0393781512975693,",
20        "p:0.615013539791107, 0.778662621974945, 0.535521030426025,",
21        "p:0.488581955432892, 0.826426684856415, -0.381044268608093,",
22        "p:0.732419908046722, -0.0084995785728097, -1.02214300632477,",
23        "p:1.35288727283478, 0.875738024711609, -1.03719782829285,",
24        "p:0.342692613601685, 0.938660383224487, -1.45657968521118,",
25        "p:1.0958571434021, 0.316927701234818, -1.813929438591,",
26        "p:0.903768002986908, 1.11856341362, -2.53161096572876,",
27        "p:0.21014116704464, 0.295340299606323, -2.45328187942505,"] ];
28}
29
30function createForamGenotype(gen, species, chamber_num)
31{
32        var rad = getProperty(gen, "chamber_proculus");
33        var geno = chambers[species][0] + "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" +  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        if (species == 1) geno += "\nn:p=0,d=\"S\"";
48
49        return geno;
50}
51
52function setGenotype(mode)
53{
54        if (mode["opt"] == 0) //initial
55        {
56                mode["cr"].user1 = {"min_repro_energies" : [getProperty(0, "min_repro_energ"), getProperty(1, "min_repro_energ")], "hibernation" : 1 - mode["species"]};
57                mode["cr"].user2 = {"max_energy_level" : getProperty(0,"energies0"), "gen" : 0,  "hibernated" : 0, "species" : mode["species"], "reproduce" : 0};
58        }
59        else if (mode["opt"]  == 1) //child
60        {
61                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};
62                mode["cr"].user1 = mode["parent_user1"];
63        }
64        else //grow
65        {
66                mode["cr"].user1 = mode["parent_user1"];
67                mode["cr"].user2 = mode["parent_user2"];
68        }
69}
70
71function reproduce_haploid(parent, parent2, clone)
72{       
73        var number, energy0, new_user1, gen;
74        if (clone == 1)
75        {
76                energy0 = getProperty(0,"energies0");
77                number = getProperty(1, "e_repro_cost") * parent.energy / energy0;
78                new_user1 = parent.user1;
79                parent.user2["gen"] = 1 - parent.user2["gen"]; //because of reversal of "gen" in createOffspring function
80                gen = parent.user2["gen"];
81        }
82        else
83        {
84                energy0 = getProperty(1,"energies0");
85                number = getProperty(parent.user2["gen"], "e_repro_cost") * parent.energy / energy0 + getProperty(parent.user2["gen"], "e_repro_cost") * parent2.energy / energy0;
86                new_user1 = [parent.user1, parent2.user1];
87                gen = 1 - parent.user2["gen"];
88        }
89
90        Simulator.print("number of offspring: " + number);
91
92        for (var j = 0; j < number; j++)
93        {
94                createOffspring(createForamGenotype(gen, parent.user2["species"], 0), energy0, new_user1, parent.user2);
95        }
96}
97
98function reproduce_diploid(parent)
99{
100        var energy0 = getProperty(0,"energies0");
101        var number = getProperty(parent.user2["gen"], "e_repro_cost") * parent.energy / energy0;
102
103        Simulator.print("number of offspring: " + number);
104
105        for (var j = 0; j < number / 2; j++)
106        {
107                var crossed = 0;
108                //crossover
109                if (Math.rnd01 < ExpParams.crossprob)
110                {
111                        crossover(parent, "min_repro_energies");
112                        crossed = 1;
113                }
114
115                for (var k = 0; k < 2; k++)
116                {
117                        createOffspring(createForamGenotype(1 - parent.user2["gen"], parent.user2["species"], 0), energy0, parent.user1[0], parent.user2);
118                }
119
120                //reverse of crossover for fossilization
121                if (crossed == 1)
122                {
123                        crossover(parent, "min_repro_energies");
124                        crossed = 0;
125                }
126                       
127        }
128}
129
130function reproduce_parents(species)
131{
132                var parent1 = null;
133                var parent2 = null;
134                var pop = Populations[0];
135                for (var i = pop.size-1; i >= 0; i--)
136                {
137                        if (pop[i].user2["reproduce"] == 1 && pop[i].user2["species"] == species)
138                        {
139                                if ((pop[i].user2["gen"]==1) || ((pop[i].user2["gen"]==0) && ExpParams.stress == 0))
140                                {
141                                        continue;
142                                }
143                                else if (parent1 == null)
144                                {
145                                        parent1 = pop[i];
146                                }
147                                else if (parent2 == null)
148                                {
149                                        parent2 = pop[i];
150                                } 
151                                else
152                                {
153                                        reproduce_haploid(parent1, parent2, 0);
154                                        print_repro_info(parent1);
155                                        print_repro_info(parent2);
156                                        pop.kill(parent1);
157                                        pop.kill(parent2);
158                                        parent1 = null;
159                                        parent2 = null;
160                                }
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
206function foramReproduce(cr)
207{
208        var properEnergy = 0;
209        var reproduced = 0;
210
211        if (cr.user2["gen"] == 0)
212        {
213                properEnergy = ( cr.energy >= cr.user1["min_repro_energies"][cr.user2["gen"]] );
214        }
215        else
216        {
217                properEnergy = ( cr.energy >= cr.user1[0]["min_repro_energies"][cr.user2["gen"]] ); //TODO gene selection
218        }
219
220        //if creature has proper energy
221        if ( properEnergy && cr.signals.size == 0)
222        {
223                //reproduce with probability repro_prob
224                if (Math.rnd01 <= ExpParams.repro_prob) //TODO env trigger
225                {
226                        reproduced = readyToRepro(cr);
227                }
228                else if (cr.signals.receive("repro"+cr.user2["species"]) > 0)
229                {
230                        reproduced = readyToRepro(cr);
231                }
232                if (reproduced == 1)
233                                return;
234        }
235
236        else if (!properEnergy)
237        {
238                cr.signals.clear();
239                cr.user2["reproduce"] = 0;
240        }
241}
242
243function crossover(parent, gene)
244{
245        var tmp = parent.user1[0][gene];
246        parent.user1[0][gene] = parent.user1[1][gene];
247        parent.user1[1][gene] = tmp;
248}
249
250function createOffspring(geno, energy, parent_user1, parent_user2)
251{
252        var cr = Populations[0].add(geno);
253        cr.energy0 = energy;
254        cr.energy = cr.energy0;
255        setGenotype({"cr" : cr, "parent_user1" : parent_user1, "parent_user2" : parent_user2, "opt" : 1});
256        placeRandomlyNotColliding(cr);
257}
Note: See TracBrowser for help on using the repository browser.