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

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