- Timestamp:
- 08/07/16 15:05:16 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
experiments/frams/foraminifera/data/scripts/foraminifera.expdef
r561 r567 23 23 code:~ 24 24 25 global chambers;26 25 global colors; 27 26 global retColors; … … 30 29 global movePerStep; 31 30 global nutrientenergywaiting; 32 global o;33 31 global reprocounter; 34 32 global changePeriod; 35 33 global phase; 36 34 global nutrientSqrCm; 37 global species_genes; 35 global species_genes; 36 global max_chambers_def; 37 global foram_uid; //introduced because each replacement of a creature (while growing) would generate a new Creature.uid 38 global chamber_vis_denominator; 39 global curRadius; 38 40 39 41 @include "foraminifera.inc" … … 96 98 97 99 //morphology 98 init_chambers();99 curColor = retColors[0];100 100 ExpProperties.zone1_range = micronsToFrams(1000); 101 101 ExpProperties.zone2_range = micronsToFrams(3000); 102 ExpProperties.chamber_proculus_haplo = micronsToFrams(50); 103 ExpProperties.chamber_difference_haplo = 0.0; 104 ExpProperties.chamber_proculus_diplo = micronsToFrams(20); 105 ExpProperties.chamber_difference_diplo = micronsToFrams(8); 106 107 max_chamber_volume = [Vector.new(), Vector.new()]; 108 for (var j = 0; j < 2; j++) 109 { 110 for (var i = 0; i < chambers[0].size; i++) 111 { 112 max_chamber_volume[j].add(((volumeInMicrons(getProperty(j, "chamber_proculus")) + volumeInMicrons(getProperty(j, "chamber_proculus") + (i) * getProperty(j, "chamber_difference")))*(i+1))/2); 113 } 114 } 102 ExpProperties.chamber_proculus_haplo = micronsToFrams(20); 103 ExpProperties.chamber_proculus_diplo = micronsToFrams(10); 104 colors = ["1.0,1.0,0.0","1.0,0.5,0.0"]; 105 retColors = ["1.0,1.0,1.0", "1.0,1.0,0.0"]; 106 curColor = retColors[0]; 107 curRadius = ExpProperties.zone1_range; 115 108 116 109 //nutrients … … 122 115 ExpState.totaltestedcr = 0; 123 116 ExpState.nutrient = ""; 124 117 118 max_chambers_def = 35; 119 chamber_vis_denominator = 6; 125 120 //addSpecies({"min_repro_energies" : [4,6]}); 126 121 //addSpecies({"min_repro_energies" : [4,8]}); … … 132 127 @include "standard_placement.inc" 133 128 134 function secToSimSteps(value_in_sec){135 return value_in_sec/ExpProperties.secPerStep;136 }137 138 function volumeInMicrons(radiusInFrams)139 {140 return 4.0/3.0*Math.pi*Math.pow(framsToMicrons(radiusInFrams),3);141 }142 143 function energyFromVolume(base, isRadiusInFrams)144 {145 if (isRadiusInFrams == 1) //radius in frams146 {147 return ExpProperties.picoCarbonPerMikro*volumeInMicrons(base);148 }149 else //volume in microns150 {151 return ExpProperties.picoCarbonPerMikro * base;152 }153 }154 155 function getMovePerStep()156 {157 return micronsToFrams((ExpProperties.foramSpeedMmPerMin/60)*1000)*ExpProperties.secPerStep;158 }159 160 function micronsToFrams(micrometers)161 {162 return micrometers*0.01;163 }164 165 function framsToMicrons(framsworldunits)166 {167 return framsworldunits/0.01;168 }169 170 function getProperty(gen, prop_id)171 {172 var ploid = "haplo";173 if (gen == 1) ploid = "diplo";174 return ExpProperties.[prop_id + "_" + ploid];175 }176 177 function getGene(cr, gen_id, gen_set)178 {179 if (cr.data->lifeparams->gen == 0)180 return cr.data->genes[gen_id];181 else182 return cr.data->genes[gen_set][gen_id];183 }184 185 function addForam(species, iter, chambernum, ploid)186 {187 var geno = createForamMorphology(ploid, ploid, chambernum);188 curColor = retColors[ploid];189 var cr = Populations[0].add(geno);190 cr.name = "Initial creature" + species + "_" + iter;191 placeCreatureRandomly(cr, 0, 0);192 cr.energy0 = energyFromVolume(max_chamber_volume[ploid][chambernum],0);193 cr.energy = cr.energy0;194 setGenotype({"opt" : "birth", "cr" : cr, "gen" : ploid, "species" : species, "energy0" : cr.energy0, "genes" : species_genes[species]});195 if (ploid == 1)196 {197 cr.data->genes = [cr.data->genes, cr.data->genes]; //TODO two different genes sets198 }199 moveReticulopodia(cr);200 }201 202 function addInitialForam(species, iter)203 {204 var ploid = 0;205 if (Math.rnd01 > 0.5)206 {207 ploid = 1;208 }209 //add new foram with random energy bewtween starting energy and reproduction threshold210 addForam(species, iter, int(Math.rndUni(0,species_genes[species]->min_repro_energies[ploid])),ploid);211 }212 213 //new species can be added as a dictionary with parameter values that are different than default values214 function addSpecies(new_genes)215 {216 species_genes.add({"min_repro_energies" : [ExpProperties.min_repro_energ_haplo,ExpProperties.min_repro_energ_diplo], "energies0" : [ExpProperties.energies0_haplo, ExpProperties.energies0_diplo], "hibernation" : 0, "morphotype" : 0});217 for (var i = 0; i < new_genes.size; i++)218 {219 var key = new_genes.getKey(i);220 species_genes[species_genes.size-1][key] = new_genes[key];221 }222 }223 224 129 function onExpInit() 225 130 { 131 foram_uid = 0; 132 226 133 Populations[0].clear(); 227 134 Populations[1].clear(); 228 135 Populations[2].clear(); //reticulopodia and nutrients 229 136 137 if (ExpProperties.max_chamber_num_haplo == max_chambers_def && ExpProperties.max_chamber_num_diplo == max_chambers_def) 138 { 139 max_chamber_volume = [[30403.5869594578,52812.2546633948,79578.5148482541,113588.815134453,154620.677376218,205094.322220826,262572.712174265,326078.453295303,402342.518962956,498133.985678766,615066.864740109,759500.497626816,937064.025544282,1155915.25563075,1429139.14079748,1762487.92940157,2176286.62046069,2685795.63187845,3316190.12127043,4096436.04462706,5051343.25226193,6231980.1061213,7687880.79524734,9485307.02904958,11716968.9852569,14459866.4934433,17836388.9853663,22004935.7247348,27138607.2546045,33482425.1582986,41336775.1280297,50997910.7842793,62888631.7871037,77563060.9243464,95659468.591964] 140 , [3430.07716920763,6159.93090353532,9322.94192815286,13462.9896597283,18399.8550832969,24558.9218126892,31468.8148639192,39189.4977865513,48404.4292075836,60185.8639086061,74490.6048472854,92117.8178412275,113852.779747083,140714.366929552,174450.937643841,215250.242147183,266323.295274072,328858.042352538,406552.379957238,503526.321155323,621060.781025019,767240.824049468,947210.683224091,1169506.19906112,1447211.61255879,1787155.29073739,2205627.64766244,2723413.2837305,3360233.53738709,4147771.02835393,5126445.06973928,6328060.3331703,7805693.278958,9631924.72156452,11884287.1596814]]; 141 } 142 143 else 144 { 145 max_chamber_volume = [Vector.new(), Vector.new()]; 146 var density = 100; 147 for (var ploid = 0; ploid < 2; ploid++) 148 { 149 var rad = getPloidRadius(ploid); 150 for (var cham_num = 0; cham_num < getProperty(ploid,"max_chamber_num"); cham_num++) 151 { 152 max_chamber_volume[ploid].add(volumeFromGeno(ploid, rad, cham_num+1, density)); 153 } 154 } 155 } 156 230 157 if (species_genes.size == 0) 231 158 { … … 240 167 } 241 168 } 242 o = Populations[0][0].getMechPart(0).orient.clone();243 169 ExpState.totaltestedcr = 0; 244 170 … … 312 238 // -------------------------------- experiment end -------------------------------- 313 239 240 function volumeFromGeno(morphotype, rad, chamber_num, density) 241 { 242 var geno = create_genotype(rad, chamber_num, colors[morphotype], 1); 243 var m=Model.newFromString(geno); 244 var mg=ModelGeometry.forModel(m); 245 mg.geom_density=density; 246 var volumeInFrams = mg.volume(); 247 248 return volumeInFrams/Math.pow(ExpProperties.scalingFactor,3); 249 } 250 251 function secToSimSteps(value_in_sec){ 252 return value_in_sec/ExpProperties.secPerStep; 253 } 254 255 function volumeInMicrons(radiusInFrams) 256 { 257 return 4.0/3.0*Math.pi*Math.pow(framsToMicrons(radiusInFrams),3); 258 } 259 260 function energyFromVolume(base, isRadiusInFrams) 261 { 262 if (isRadiusInFrams == 1) //radius in frams 263 { 264 return ExpProperties.picoCarbonPerMikro*volumeInMicrons(base); 265 } 266 else //volume in microns 267 { 268 return ExpProperties.picoCarbonPerMikro * base; 269 } 270 } 271 272 function getMovePerStep() 273 { 274 return micronsToFrams((ExpProperties.foramSpeedMmPerMin/60)*1000)*ExpProperties.secPerStep; 275 } 276 277 function micronsToFrams(micrometers) 278 { 279 return micrometers*ExpProperties.scalingFactor; 280 } 281 282 function framsToMicrons(framsworldunits) 283 { 284 return framsworldunits/ExpProperties.scalingFactor; 285 } 286 287 function getProperty(gen, prop_id) 288 { 289 var ploid = "haplo"; 290 if (gen == 1) ploid = "diplo"; 291 return ExpProperties.[prop_id + "_" + ploid]; 292 } 293 294 function getGene(cr, gen_id, gen_set) 295 { 296 if (cr.data->lifeparams->gen == 0) 297 return cr.data->genes[gen_id]; 298 else 299 return cr.data->genes[gen_set][gen_id]; 300 } 301 302 function getPloidRadius(ploid) 303 { 304 var radius = ExpProperties.chamber_proculus_haplo; 305 if (ploid == 1) 306 { 307 radius = ExpProperties.chamber_proculus_diplo; 308 } 309 return radius; 310 } 311 312 function chamberNumFromEnergy(energy, ploid) 313 { 314 var chamber_num = max_chamber_volume[ploid].size; 315 for (var i = 0; i < chamber_num; i++) 316 { 317 if (energy < energyFromVolume(max_chamber_volume[ploid][i],0)) 318 { 319 chamber_num = i+1; 320 break; 321 } 322 } 323 324 return chamber_num; 325 } 326 327 function addForam(species, iter, start_energy, ploid) 328 { 329 var chambernum = chamberNumFromEnergy(start_energy, ploid); 330 var radius = getPloidRadius(ploid); 331 var geno = create_genotype(radius, chambernum, colors[ploid], 1); 332 curColor = retColors[ploid]; 333 var cr = Populations[0].add(geno); 334 cr.name = "Initial creature" + species + "_" + iter; 335 placeCreatureRandomly(cr, 0, 0); 336 cr.energy = start_energy; 337 setGenotype({"opt" : "birth", "cr" : cr, "gen" : ploid, "species" : species, "energy0" : cr.energy, "genes" : species_genes[species], "parentsuids" : ["c0"]}); 338 if (ploid == 1) 339 { 340 cr.data->genes = [cr.data->genes, cr.data->genes]; //TODO two different genes sets 341 } 342 moveReticulopodia(cr); 343 } 344 345 function addInitialForam(species, iter) 346 { 347 var ploid = 0; 348 if (Math.rnd01 > 0.5) 349 { 350 ploid = 1; 351 } 352 //add new foram with random energy bewtween starting energy and reproduction threshold 353 var repro_thr = species_genes[species]->min_repro_energies[ploid]; 354 var start_energy = Math.rndUni(energyFromVolume(getPloidRadius(ploid),1),repro_thr-0.25*repro_thr); 355 addForam(species, iter, start_energy,ploid); 356 } 357 358 //new species can be added as a dictionary with parameter values that are different than default values 359 function addSpecies(new_genes) 360 { 361 species_genes.add({"min_repro_energies" : [ExpProperties.min_repro_energ_haplo,ExpProperties.min_repro_energ_diplo], "energies0" : [ExpProperties.energies0_haplo, ExpProperties.energies0_diplo], "hibernation" : 0, "morphotype" : 0}); 362 for (var i = 0; i < new_genes.size; i++) 363 { 364 var key = new_genes.getKey(i); 365 species_genes[species_genes.size-1][key] = new_genes[key]; 366 } 367 } 368 314 369 // -------------------------------- foram begin ----------------------------------- 315 370 … … 322 377 function lastChamberNum(cr) 323 378 { 324 return cr.numparts -1;379 return cr.numparts; 325 380 } 326 381 … … 328 383 { 329 384 return ExpProperties.["zone"+zone_num+"_range"]; 385 } 386 387 function addReticulopodia(cr, radius) 388 { 389 if (reticulopodiaExists(cr)) 390 { 391 Populations[2].delete(cr.data->reticulopodiacreature); 392 } 393 var ret = Populations[2].add("//0\nm:Vstyle=reticulopodia\np:sh=1,sx=0.001,sy=0.001,sz=0.001\np:sh=3,sx=0.01,sy="+radius+",sz="+radius+",ry=1.57079633,vr="+curColor+"\nj:0, 1, sh=1"); 394 cr.data->reticulopodiacreature = ret; 395 ret.getMechPart(0).orient.set(cr.getMechPart(0).orient); 396 ret.moveAbs(cr.center_x-radius, cr.center_y-radius, cr.center_z-radius); 330 397 } 331 398 … … 335 402 if (ExpProperties.visualize == 1) 336 403 { 337 var ret = Populations[2].add("//0\nm:Vstyle=reticulopodia\np:sh=1,sx=0.001,sy=0.001,sz=0.001\np:sh=3,sx=0.01,sy="+getZoneRange(cr,1)+",sz="+getZoneRange(cr,1)+",ry=1.57079633,vr="+curColor+"\nj:0, 1, sh=1"); 338 cr.data->reticulopodiacreature = ret; 339 ret.getMechPart(0).orient.set(cr.getMechPart(0).orient); 340 ret.moveAbs(cr.center_x-getZoneRange(cr,1), cr.center_y-getZoneRange(cr,1), cr.center_z-getZoneRange(cr,1)); 341 } 404 addReticulopodia(cr, curRadius); 405 } 406 moveReticulopodia(cr); 342 407 } 343 408 … … 355 420 } 356 421 422 function reticulopodiaExists(cr) 423 { 424 var has_ret = 0; 425 426 if (cr.data->reticulopodiacreature != null) 427 { 428 if (Populations[2].findUID(cr.data->reticulopodiacreature.uid) != null) 429 { 430 has_ret = 1; 431 } 432 } 433 434 return has_ret; 435 } 436 357 437 function visualization(cr) 358 438 { 359 var has_ret = 0; 360 361 if (cr.data->reticulopodiacreature != null) 362 { 363 if (Populations[2].findUID(cr.data->reticulopodiacreature.uid) != null) 364 { 365 has_ret = 1; 366 } 367 } 368 369 return has_ret; 370 } 371 372 function foramGrow(cr, chamber_num) 373 { 374 if ((chamber_num+1) < chambers[cr.data->lifeparams->species].size) 439 return reticulopodiaExists(cr); 440 } 441 442 function foramGrow(cr, chamber_num, lastchambergrowth) 443 { 444 if ((chamber_num+1) <= max_chamber_volume[cr.data->lifeparams->gen].size) 375 445 { 376 446 curColor = retColors[cr.data->lifeparams->gen]; 377 var geno = createForamMorphology(cr.data->lifeparams->gen, cr.data->lifeparams->gen, chamber_num+1); 447 var ploid = cr.data->lifeparams->gen; 448 var geno = create_genotype(getPloidRadius(ploid), chamber_num+1, colors[ploid], lastchambergrowth); 378 449 var cr2 = Populations[0].add(geno); 379 450 … … 382 453 383 454 setGenotype({"cr" : cr2, "parent_genes" : cr.data->genes, "parent_lifeparams" : cr.data->lifeparams, "opt" : "growth", "energy0" : cr.energy0}); 384 cr2.moveAbs(cr. center_x - cr2.size_x / 2, cr.center_y - cr2.size_y / 2,cr.pos_z);455 cr2.moveAbs(cr.pos_x, cr.pos_y,cr.pos_z); 385 456 setForamMeta(cr2); 386 457 387 if ( visualization(cr))458 if (reticulopodiaExists(cr)) 388 459 { 389 460 Populations[2].delete(cr.data->reticulopodiacreature); 390 461 } 391 462 Populations[0].delete(cr); 392 } 463 return cr2; 464 } 465 return cr; 393 466 } 394 467 … … 551 624 } 552 625 553 function createLogVector(cr, value)554 {555 var vec = Vector.new();556 for (var i = 0; i < species_genes.size; i++)557 {558 for (var j = 0; j < 2; j++)559 {560 vec.add(0);561 }562 if (cr.data->lifeparams->species == i)563 {564 vec[i*2+cr.data->lifeparams->gen] = value;565 }566 }567 return vec;568 }569 570 626 function onForamsStep(cr) 571 627 { … … 583 639 else if (cr.data->lifeparams->chamber_growth > 0) 584 640 { 585 cr.data->lifeparams->chamber_growth= Math.max(cr.data->lifeparams->chamber_growth-1,0);586 //Simulator.print("chamber growing, time left = " + cr.data->lifeparams->chamber_growth*ExpProperties.secPerStep);641 var chamber_time = Math.max(cr.data->lifeparams->chamber_growth-1,0); 642 cr.data->lifeparams->chamber_growth = chamber_time; 587 643 cr.energy -= ExpProperties.chamberCostPerSec * cr.energy * ExpProperties.secPerStep; 588 644 589 //Simulator.print("energy " + cr2.energy + " subtracting " + growth_cost); 645 if (visualization(cr)) 646 { 647 var total_time = secToSimSteps(ExpProperties.chamberGrowthSec); 648 var ret_unit = total_time/chamber_vis_denominator; 649 var chamber_unit = total_time-ret_unit; 650 651 if (chamber_time < ret_unit || chamber_time >= chamber_unit) 652 { 653 var new_rad = Math.min(Math.max((chamber_time%ret_unit)/ret_unit*getZoneRange(cr,1),0.01),getZoneRange(cr,1)); 654 655 if(chamber_time < ret_unit) 656 new_rad = getZoneRange(cr,1)-new_rad; 657 658 addReticulopodia(cr,new_rad); 659 } 660 else 661 { 662 var new_rad = 1 - Math.min(Math.max((chamber_time-ret_unit)/chamber_unit,0.01),1); 663 curRadius = cr.data->reticulopodiacreature.getPart(1).sy; 664 665 if (chamber_time == ret_unit){ 666 new_rad == 1; 667 } 668 669 var new_cr = foramGrow(cr, chamberNumFromEnergy(cr.data->lifeparams->max_energy_level, cr.data->lifeparams->gen)-1, new_rad); 670 curRadius = getZoneRange(new_cr,1); 671 672 if (chamber_time == 0)//checking for end of chamber growth process 673 { 674 new_cr.data->lifeparams->chamber_growth = -1; 675 } 676 } 677 } 590 678 } 591 679 //checking for end of chamber growth process 592 else if (cr.data->lifeparams->chamber_growth == 0 )593 { 594 foramGrow(cr, lastChamberNum(cr) );680 else if (cr.data->lifeparams->chamber_growth == 0 && visualization(cr)==0) 681 { 682 foramGrow(cr, lastChamberNum(cr), 1); 595 683 cr.data->lifeparams->chamber_growth = -1; 596 684 //Simulator.print("chamber "+ (lastChamberNum(cr) + 1) +" complete"); … … 603 691 setForamMeta(cr); 604 692 } 605 606 cr.getMechPart(0).orient.set(o);607 693 608 694 if (deathConditions(cr) == 1) … … 631 717 632 718 //cheking conditions of chamber growth process start 633 if (lastChamberNum(cr) != chambers[0].size-1)634 { 635 if ((cr.data->lifeparams->max_energy_level >= energyFromVolume(max_chamber_volume[cr.data->lifeparams->gen][lastChamberNum(cr) ],0)))719 if (lastChamberNum(cr) < max_chamber_volume[cr.data->lifeparams->gen].size) 720 { 721 if ((cr.data->lifeparams->max_energy_level >= energyFromVolume(max_chamber_volume[cr.data->lifeparams->gen][lastChamberNum(cr)-1],0))) 636 722 { 637 723 cr.data->lifeparams->chamber_growth = int(secToSimSteps(ExpProperties.chamberGrowthSec)); … … 765 851 { 766 852 reprocounter = 0; 767 reproduce_parents(0); 768 reproduce_parents(1); 853 for (var s = 0; s < species_genes.size; s++) 854 { 855 reproduce_parents(s); 856 } 857 769 858 } 770 859 … … 849 938 } 850 939 940 function createLogVector(cr, value) 941 { 942 var vec = Vector.new(); 943 for (var i = 0; i < species_genes.size; i++) 944 { 945 for (var j = 0; j < 2; j++) 946 { 947 vec.add(0); 948 } 949 if (cr.data->lifeparams->species == i) 950 { 951 vec[i*2+cr.data->lifeparams->gen] = value; 952 } 953 } 954 return vec; 955 } 956 957 851 958 // -------------------------------- step end -------------------------------- 852 959 //TODO default params values in frams instead of microns/seconds … … 866 973 name:Maximum number of steps 867 974 type:d 0 10000000 0 975 group: 976 977 property: 978 id:scalingFactor 979 name:Scaling factor for micrometers 980 type:f 0 -1 0.01 868 981 group: 869 982 … … 926 1039 property: 927 1040 id:min_repro_energ_haplo 928 name:Min reproduction energy of haploid 929 type:f 0 -1 41041 name:Min reproduction energy of haploid in pg 1042 type:f 0 -1 350000 930 1043 group:Energy 931 1044 932 1045 property: 933 1046 id:min_repro_energ_diplo 934 name:Min reproduction energy of diploid 935 type:f 0 -1 6 1047 name:Min reproduction energy of diploid in pg 1048 type:f 0 -1 600000 936 1049 group:Energy 937 1050 … … 955 1068 956 1069 property: 1070 id:max_chamber_num_haplo 1071 name:Maximum number of haploid chambers 1072 type:f 1 50 35 1073 group:Energy 1074 1075 property: 1076 id:max_chamber_num_diplo 1077 name:Maximum number of diploid chambers 1078 type:f 1 50 35 1079 group:Energy 1080 1081 1082 property: 957 1083 id:crossprob 958 1084 name:Crossover probability … … 975 1101 id:chamberGrowthSec 976 1102 name:Time of the chamber growth in seconds 977 type:f 360 1440 7201103 type:f 720 43200 43200 978 1104 group:Foraminifera 979 1105 … … 988 1114 name:Size of proculus 989 1115 type:f 990 group:Foraminifera991 992 property:993 id:chamber_difference_haplo994 name:Difference in size between subsequent chambers995 type:f 0 -1 0996 group:Foraminifera997 998 property:999 id:chamber_difference_diplo1000 name:Difference in size between subsequent chambers1001 type:f 0 -1 0.081002 1116 group:Foraminifera 1003 1117
Note: See TracChangeset
for help on using the changeset viewer.