Changeset 567 for experiments/frams


Ignore:
Timestamp:
08/07/16 15:05:16 (8 years ago)
Author:
oriona
Message:

Chamber growth visualization added, [OFFSPRING] message added, refactoring.

Location:
experiments/frams/foraminifera/data/scripts
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • experiments/frams/foraminifera/data/scripts/foraminifera.expdef

    r561 r567  
    2323code:~
    2424
    25 global chambers;
    2625global colors;
    2726global retColors;
     
    3029global movePerStep;
    3130global nutrientenergywaiting;
    32 global o;
    3331global reprocounter;
    3432global changePeriod;
    3533global phase;
    3634global nutrientSqrCm;
    37 global species_genes;
     35global species_genes;
     36global max_chambers_def;
     37global foram_uid; //introduced because each replacement of a creature (while growing) would generate a new Creature.uid
     38global chamber_vis_denominator;
     39global curRadius;
    3840
    3941@include "foraminifera.inc"
     
    9698
    9799        //morphology
    98         init_chambers();
    99         curColor = retColors[0];
    100100        ExpProperties.zone1_range = micronsToFrams(1000);
    101101        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;
    115108
    116109        //nutrients
     
    122115        ExpState.totaltestedcr = 0;
    123116        ExpState.nutrient = "";
    124        
     117
     118        max_chambers_def = 35;
     119        chamber_vis_denominator = 6;
    125120        //addSpecies({"min_repro_energies" : [4,6]});
    126121        //addSpecies({"min_repro_energies" : [4,8]});
     
    132127@include "standard_placement.inc"
    133128
    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 frams
    146         {
    147                 return ExpProperties.picoCarbonPerMikro*volumeInMicrons(base);
    148         }
    149         else //volume in microns
    150         {
    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         else
    182                 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 sets
    198         }
    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 threshold
    210         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 values
    214 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 
    224129function onExpInit()
    225130{
     131        foram_uid = 0;
     132
    226133        Populations[0].clear();
    227134        Populations[1].clear();
    228135        Populations[2].clear(); //reticulopodia and nutrients
    229136
     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
    230157        if (species_genes.size == 0)
    231158        {
     
    240167                }
    241168        }
    242         o = Populations[0][0].getMechPart(0).orient.clone();
    243169        ExpState.totaltestedcr = 0;
    244170
     
    312238// -------------------------------- experiment end --------------------------------
    313239
     240function 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
     251function secToSimSteps(value_in_sec){
     252        return value_in_sec/ExpProperties.secPerStep;
     253}
     254
     255function volumeInMicrons(radiusInFrams)
     256{
     257        return 4.0/3.0*Math.pi*Math.pow(framsToMicrons(radiusInFrams),3);
     258}
     259
     260function 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
     272function getMovePerStep()
     273{
     274        return micronsToFrams((ExpProperties.foramSpeedMmPerMin/60)*1000)*ExpProperties.secPerStep;
     275}
     276
     277function micronsToFrams(micrometers)
     278{
     279        return micrometers*ExpProperties.scalingFactor;
     280}
     281
     282function framsToMicrons(framsworldunits)
     283{
     284        return framsworldunits/ExpProperties.scalingFactor;
     285}
     286
     287function getProperty(gen, prop_id)
     288{
     289        var ploid = "haplo";
     290        if (gen == 1) ploid = "diplo";
     291        return ExpProperties.[prop_id + "_" + ploid];
     292}
     293
     294function 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
     302function 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
     312function 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
     327function 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
     345function 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
     359function 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
    314369// -------------------------------- foram begin -----------------------------------
    315370
     
    322377function lastChamberNum(cr)
    323378{
    324         return cr.numparts-1;
     379        return cr.numparts;
    325380}
    326381
     
    328383{
    329384        return ExpProperties.["zone"+zone_num+"_range"];
     385}
     386
     387function 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);
    330397}
    331398
     
    335402        if (ExpProperties.visualize == 1)
    336403        {
    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);
    342407}
    343408
     
    355420}
    356421
     422function 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
    357437function visualization(cr)
    358438{
    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
     442function foramGrow(cr, chamber_num, lastchambergrowth)
     443{
     444        if ((chamber_num+1) <= max_chamber_volume[cr.data->lifeparams->gen].size)
    375445        {
    376446                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);
    378449                var cr2 = Populations[0].add(geno);
    379450
     
    382453
    383454                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);
    385456                setForamMeta(cr2);
    386457
    387                 if (visualization(cr))
     458                if (reticulopodiaExists(cr))
    388459                {
    389460                        Populations[2].delete(cr.data->reticulopodiacreature);
    390461                }
    391462                Populations[0].delete(cr);
    392         }
     463                return cr2;
     464        }
     465        return cr;
    393466}
    394467
     
    551624}
    552625
    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 
    570626function onForamsStep(cr)
    571627{
     
    583639        else if (cr.data->lifeparams->chamber_growth > 0)
    584640        {
    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;
    587643                cr.energy -= ExpProperties.chamberCostPerSec * cr.energy * ExpProperties.secPerStep;
    588644
    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                }
    590678        }
    591679        //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);
    595683                cr.data->lifeparams->chamber_growth = -1;
    596684                //Simulator.print("chamber "+ (lastChamberNum(cr) + 1) +" complete");
     
    603691                        setForamMeta(cr);
    604692                }
    605 
    606                 cr.getMechPart(0).orient.set(o);
    607693
    608694                if (deathConditions(cr) == 1)
     
    631717
    632718                //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))) 
    636722                        {
    637723                                cr.data->lifeparams->chamber_growth = int(secToSimSteps(ExpProperties.chamberGrowthSec));
     
    765851        {
    766852                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               
    769858        }
    770859
     
    849938}
    850939
     940function 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
    851958// -------------------------------- step end --------------------------------
    852959//TODO default params values in frams instead of microns/seconds
     
    866973name:Maximum number of steps
    867974type:d 0 10000000 0
     975group:
     976
     977property:
     978id:scalingFactor
     979name:Scaling factor for micrometers
     980type:f 0 -1 0.01
    868981group:
    869982
     
    9261039property:
    9271040id:min_repro_energ_haplo
    928 name:Min reproduction energy of haploid
    929 type:f 0 -1 4
     1041name:Min reproduction energy of haploid in pg
     1042type:f 0 -1 350000
    9301043group:Energy
    9311044
    9321045property:
    9331046id:min_repro_energ_diplo
    934 name:Min reproduction energy of diploid
    935 type:f 0 -1 6
     1047name:Min reproduction energy of diploid in pg
     1048type:f 0 -1 600000
    9361049group:Energy
    9371050
     
    9551068
    9561069property:
     1070id:max_chamber_num_haplo
     1071name:Maximum number of haploid chambers
     1072type:f 1 50 35
     1073group:Energy
     1074
     1075property:
     1076id:max_chamber_num_diplo
     1077name:Maximum number of diploid chambers
     1078type:f 1 50 35
     1079group:Energy
     1080
     1081
     1082property:
    9571083id:crossprob
    9581084name:Crossover probability
     
    9751101id:chamberGrowthSec
    9761102name:Time of the chamber growth in seconds
    977 type:f 360 1440 720
     1103type:f 720 43200 43200
    9781104group:Foraminifera
    9791105
     
    9881114name:Size of proculus
    9891115type:f
    990 group:Foraminifera
    991 
    992 property:
    993 id:chamber_difference_haplo
    994 name:Difference in size between subsequent chambers
    995 type:f 0 -1 0
    996 group:Foraminifera
    997 
    998 property:
    999 id:chamber_difference_diplo
    1000 name:Difference in size between subsequent chambers
    1001 type:f 0 -1 0.08
    10021116group:Foraminifera
    10031117
  • experiments/frams/foraminifera/data/scripts/foraminifera.inc

    r561 r567  
    1717                        size=size*(1.35-0.35*lastchambergrowth); //last iteration: 'size' is only used for shifting (dx). The last chamber emerges at the surface of the previous one
    1818                }
    19                 str+="p:sh=1,sx=%g,sy=%g,sz=%g,vr=%s\n" % effectivesize % effectivesize % effectivesize % rgbstring;
     19                str += "p:sh=1,sx=%g,sy=%g,sz=%g,rz=3.14159265358979,vr=%s\n" % effectivesize % effectivesize % effectivesize % rgbstring;
    2020                if (i>0)
    21                         str+="j:%d,%d,sh=1,dx=%g,ry=%g\n" % (i-1) % i % (size*shift) % (angle_delta+i*angle_delta_delta);
     21                        str+="j:%d,%d,sh=1,dx=%g,rz=%g\n" % (i-1) % i % (size*shift) % (angle_delta+i*angle_delta_delta);
    2222                size*=growing;
    2323        }
    2424        return str;
    25 }
    26 
    27 function init_chambers()
    28 {
    29         colors = ["1.0,1.0,0.0","1.0,0.5,0.0"];
    30         retColors = ["1.0,1.0,1.0", "1.0,1.0,0.0"];
    31         chambers = [ ["p:sh=1, sx=0.2, sy=0.2, sz=0.2, rz=3.14159265358979,",
    32 "p:0.18421219587326, 0.13, sh=1, sx=0.21, sy=0.21, sz=0.21,",
    33 "p:0.323935478925705, 0.195192575454712, -0.0246672090142965, sh=1, sx=0.2205, sy=0.2205, sz=0.2205,",
    34 "p:0.467822402715683, 0.258204102516174, -0.0246672090142965, sh=1, sx=0.231525, sy=0.231525, sz=0.231525,",
    35 "p:0.664101362228394, 0.309014827013016, -0.0246672090142965, sh=1, sx=0.24310125, sy=0.24310125, sz=0.24310125,",
    36 "p:0.860512733459473, 0.274790525436401, -0.0246672090142965, sh=1, sx=0.2552563125, sy=0.2552563125, sz=0.2552563125,",
    37 "p:1.0273220539093, 0.1655353307724, -0.0246672090142965, sh=1, sx=0.268019128125, sy=0.268019128125, sz=0.268019128125,",
    38 "p:1.13825333118439, -0.000509921927005053, -0.0246672090142965, sh=1, sx=0.28142008453125, sy=0.28142008453125, sz=0.28142008453125,",
    39 "p:1.17569863796234, -0.196833491325378, -0.0246672090142965, sh=1, sx=0.295491088757813, sy=0.295491088757813, sz=0.295491088757813,",
    40 "p:1.13369226455688, -0.392314255237579, -0.0246672090142965, sh=1, sx=0.310265643195703, sy=0.310265643195703, sz=0.310265643195703,"],
    41         ["p:sh=1, sx=0.1, sy=0.1, sz=0.1, rz=3.14159265358979,",
    42 "p:0.110527315735817, -0.0167302016913891, sh=1, sx=0.105, sy=0.105, sz=0.105, rx=3.63519277003091e-33,",
    43 "p:0.207026958465576, -0.080698736011982, 1.17627548103266e-17, sh=1, sx=0.11025, sy=0.11025, sz=0.11025,",
    44 "p:0.271191358566284, -0.169948443770409, 1.17627548103266e-17, sh=1, sx=0.1157625, sy=0.1157625, sz=0.1157625,",
    45 "p:0.291628688573837, -0.286643952131271, 1.17627548103266e-17, sh=1, sx=0.121550625, sy=0.121550625, sz=0.121550625,",
    46 "p:0.264833927154541, -0.403534322977066, 1.17627548103266e-17, sh=1, sx=0.12762815625, sy=0.12762815625, sz=0.12762815625,",
    47 "p:0.194418027997017, -0.500668346881866, 1.17627548103266e-17, sh=1, sx=0.1340095640625, sy=0.1340095640625, sz=0.1340095640625,",
    48 "p:0.091719962656498, -0.562735974788666, 1.17627548103266e-17, sh=1, sx=0.140710042265625, sy=0.140710042265625, sz=0.140710042265625,",
    49 "p:-0.0270438715815544, -0.57991486787796, 1.17627548103266e-17, sh=1, sx=0.147745544378906, sy=0.147745544378906, sz=0.147745544378906,",
    50 "p:-0.143122747540474, -0.549489378929138, 1.17627548103266e-17, sh=1, sx=0.155132821597852, sy=0.155132821597852, sz=0.155132821597852,"]];
    51 }
    52 
    53 function createForamMorphology(morphotype, gen, chamber_num)
    54 {
    55         var geno = "//0\nm:Vstyle=foram\n" + chambers[morphotype][0] + "vr=" + colors[gen];
    56 
    57         chamber_num = Math.min(chamber_num, chambers[morphotype].size - 1);
    58 
    59         for (var i = 0; i < chamber_num; i++)
    60         {
    61                 geno += "\n" + chambers[morphotype][i+1]  + "vr=" +  colors[gen];
    62         }
    63 
    64         for (var i = 0; i < chamber_num; i++)
    65         {
    66                 geno += "\n" +  "j:"+ i +", "+ (i+1) +", sh=1";
    67         }
    68 
    69         return geno;
    7025}
    7126
     
    8035        else if (mode->opt == "birth")
    8136        {
     37                foram_uid += 1;
     38                var new_id = "c"+string(foram_uid);
    8239                mode->cr.data->genes = String.deserialize(String.serialize(mode->genes));
    83                 mode->cr.data->lifeparams = {"max_energy_level" : mode->energy0, "gen" : mode->gen,  "hibernated" : 0, "species" : mode->species, "reproduce" : 0, "dir" : randomDir(), "dir_counter" : Math.random(int(secToSimSteps(ExpProperties.dir_change_sec))), "chamber_growth" : -1, "division_time" : -1};                   
    84 
    85         }
     40                mode->cr.data->lifeparams = {"max_energy_level" : mode->energy0, "gen" : mode->gen,  "hibernated" : 0, "species" : mode->species, "reproduce" : 0, "dir" : randomDir(), "dir_counter" : Math.random(int(secToSimSteps(ExpProperties.dir_change_sec))), "chamber_growth" : -1, "division_time" : -1, "uid" : new_id};   
     41
     42                var oper = "cloning";
     43                if (mode->parentsuids.size > 1)
     44                {       
     45                        oper = "cross-over";
     46                }
     47               
     48                var dict={"Time":Simulator.stepNumber,"FromIDs":mode->parentsuids,"ID":new_id, "Inherited":[1.0], "Operation": oper, "Kind" : mode->gen};
     49                Simulator.print("[OFFSPRING] " + String.serialize(dict));               
     50        }
     51}
     52
     53function getEnergy0(radius)
     54{
     55        return energyFromVolume(micronsToFrams(radius),1);
    8656}
    8757
     
    9363        {
    9464                result = (result-ExpProperties.divisionCost)/2;
    95                 number *= 2; 
     65                number *= 2;
    9666        }
    9767        //Simulator.print("parent: " + parent_energy + " result: " + result + " number " + number);
    9868        return {"energy" : result, "number" : number};
    99 }
    100 
    101 function getEnergy0(radius)
    102 {
    103         return energyFromVolume(micronsToFrams(radius),1);
    10469}
    10570
     
    135100        }
    136101
    137         Simulator.print("haploid number of offspring: " + number + " energ0: " + energy0);
     102        //Simulator.print("haploid number of offspring: " + number + " energ0: " + energy0);
    138103
    139104        for (var j = 0; j < number; j++)
    140105        {
    141                 createOffspring(createForamMorphology(gen, gen, 0), energy0, new_genes, parent.data->lifeparams);
     106                createOffspring(create_genotype(ExpProperties.chamber_proculus_diplo, 1, colors[1], 1), energy0, new_genes, parent.data->lifeparams, [parent.data->lifeparams->uid, parent2.data->lifeparams->uid]);
    142107        }
    143108}
     
    156121                }       
    157122
    158         Simulator.print("diploid number of offspring: " + number+ " energ0: " + energy0);
     123        //Simulator.print("diploid number of offspring: " + number+ " energ0: " + energy0);
    159124
    160125        for (var j = 0; j < number / 2; j++)
     
    170135                for (var k = 0; k < 2; k++)
    171136                {
    172                         createOffspring(createForamMorphology(1 - parent.data->lifeparams->gen, 1 - parent.data->lifeparams->gen, 0), energy0, parent.data->genes[0], parent.data->lifeparams);
     137                        createOffspring(create_genotype(ExpProperties.chamber_proculus_haplo, 1, colors[0], 1), energy0, parent.data->genes[0], parent.data->lifeparams, [parent.data->lifeparams->uid]);
    173138                }
    174139
     
    220185                                        {
    221186                                                reproduce_haploid(parent1, parent2, 0);
    222                                                 print_repro_info(parent1);
    223                                                 print_repro_info(parent2);
     187                                                //print_repro_info(parent1);
     188                                                //print_repro_info(parent2);
    224189                                                pop.kill(parent1);
    225190                                                pop.kill(parent2);
     
    235200{
    236201        var reproduced = 1;
    237        
    238        
     202
    239203        if (cr.data->lifeparams->gen == 1)
    240204        {
     
    260224        if (reproduced == 1)
    261225        {
    262                 print_repro_info(cr);
     226                //print_repro_info(cr);
    263227                Populations[0].kill(cr);
    264228        }
     
    267231}
    268232
    269 function print_repro_info(cr)
    270 {
    271         Simulator.print("Reproduced " + cr.data->lifeparams->gen + " of species " + cr.data->lifeparams->species + " energy: " + cr.energy);
    272 }
    273 
    274233function foramReproduce(cr)
    275234{
    276         var properEnergy = cr.energy >= energyFromVolume(max_chamber_volume[cr.data->lifeparams->gen][getGene(cr, "min_repro_energies",0)[cr.data->lifeparams->gen]],0);
     235        var properEnergy = cr.energy >= getGene(cr, "min_repro_energies",0)[cr.data->lifeparams->gen];
    277236        var reproduced = 0;     
    278237
     
    309268}
    310269
    311 function createOffspring(geno, energy, parent_genes, parent_lifeparams)
     270function createOffspring(geno, energy, parent_genes, parent_lifeparams, parentsuids)
    312271{
    313272        curColor = retColors[1-parent_lifeparams->gen];
     
    315274        cr.energy0 = energy;
    316275        cr.energy = cr.energy0;
    317         setGenotype({"opt" : "birth", "cr" : cr, "gen" : 1 - parent_lifeparams->gen, "species" : parent_lifeparams->species, "energy0" : cr.energy0, "genes" : parent_genes});
     276        setGenotype({"opt" : "birth", "cr" : cr, "gen" : 1 - parent_lifeparams->gen, "species" : parent_lifeparams->species, "energy0" : cr.energy0, "genes" : parent_genes, "parentsuids" : parentsuids});
    318277        placeRandomlyNotColliding(cr);
    319278}
     279
     280function print_repro_info(cr)
     281{
     282        Simulator.print("Reproduced " + cr.data->lifeparams->gen + " of species " + cr.data->lifeparams->species + " energy: " + cr.energy);
     283}
  • experiments/frams/foraminifera/data/scripts/foraminifera.show

    r503 r567  
    1818function onLoad()
    1919{
     20        Params = { "foodperiod" : [43200,25920,10800], "feedtrans" : [0.0005,0.001,0.002],"energy_nut" :[144.54,544.54,944.54], "stress" : [0,1], "visualize" : [0,1]};
     21        ShowProperties.visualize=1;
    2022        Simulator.init();
    2123        last_simspeed=0;
     
    2325        GLDisplay.minfps = 10;
    2426        TrackingCam.cam_h = 15; //more side view
    25         Params = { "foodperiod" : [43200,25920,10800], "feedtrans" : [0.0005,0.001,0.002],"energy_nut" :[144.54,544.54,944.54], "stress" : [0,1], "visualize" : [0,1]};
    26         ShowProperties.visualize=1;
    2727       
    2828        //useful for screenshots:
Note: See TracChangeset for help on using the changeset viewer.