Ignore:
Timestamp:
03/25/16 00:28:50 (8 years ago)
Author:
oriona
Message:

Parameters calibrated, diversification of initial population added, chamber growth and gametogenesis extended in time.

File:
1 edited

Legend:

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

    r476 r479  
    2323code:~
    2424
    25 
     25global chambers;
     26global colors;
     27global dir_change;
     28global max_chamber_volume;
     29global movePerStep;
    2630global nutrientenergywaiting;
     31global o;
    2732global reprocounter;
    28 global colors;
    29 global chambers;
    30 global o;
    31 global max_chamber_energ;
    32 global dir_change;
    33 global movePerStep;
    3433
    3534@include "foraminifera.inc"
     
    8382
    8483        //time
    85         ExpParams.secPerStep = 60;
     84        ExpParams.secPerStep = 480;
    8685        ExpParams.foramSpeedMmPerMin = 0.05;
    8786        movePerStep = getMovePerStep();
     
    9291
    9392        //reproduction
    94         ExpParams.foramPop = 10;       
     93        ExpParams.foramPop = 4;
    9594        ExpParams.crossprob = 0;
    9695        ExpParams.mutationprob = 0;
    97         ExpParams.repro_time = 20;
     96        ExpParams.repro_time = 720;
     97        ExpParams.gametoPeriod = 43200;
     98        ExpParams.divisionCost = 15.6;
    9899        reprocounter = 0;
     100
     101        init_chambers();
    99102
    100103        //morphology
     
    102105        ExpParams.zone1_range = micronsToFrams(1000);
    103106        ExpParams.zone2_range = micronsToFrams(3000);
    104         init_chambers();
     107        ExpParams.chamber_growth_time = 720;
     108        ExpParams.chamberCostPerSec = 0.000001;
    105109        ExpParams.chamber_proculus_haplo = micronsToFrams(50);
    106110        ExpParams.chamber_difference_haplo = 0.0;
    107111        ExpParams.chamber_proculus_diplo = micronsToFrams(20);
    108112        ExpParams.chamber_difference_diplo = 0.2;
    109         max_chamber_energ = [Vector.new(), Vector.new()];
     113
     114        max_chamber_volume = [Vector.new(), Vector.new()];
    110115        for (var j = 0; j < 2; j++)
    111116        {
    112117                for (var i = 0; i < chambers[0].size; i++)
    113118                {
    114                         max_chamber_energ[j].add(((energyFromVolume(getProperty(j, "chamber_proculus")) + energyFromVolume(getProperty(j, "chamber_proculus") + (i) * getProperty(j, "chamber_difference")))*(i+1))/2);
     119                        max_chamber_volume[j].add(((volumeInMicrons(getProperty(j, "chamber_proculus")) + volumeInMicrons(getProperty(j, "chamber_proculus") + (i) * getProperty(j, "chamber_difference")))*(i+1))/2); 
    115120                }                                 
    116121        }
     
    120125        ExpParams.min_repro_energ_diplo = 6;
    121126
    122         ExpParams.e_meta = 0.00005;
    123         ExpParams.energy_hib = 0.000025;
    124         ExpParams.energy_move = 0.00005;
    125 
    126         ExpParams.energies0_haplo = max_chamber_energ[0][0] - 0.001*max_chamber_energ[0][0];
    127         ExpParams.energies0_diplo = max_chamber_energ[1][0] - 0.001*max_chamber_energ[1][0];
    128         ExpParams.feedtrans = 0.125;
    129         ExpParams.e_repro_cost_haplo = 0.7;
    130         ExpParams.e_repro_cost_diplo = 0.3;
     127        ExpParams.e_meta = 0.0000005;
     128        ExpParams.energy_hib = 0.0000001;
     129        ExpParams.energy_move = 0.0000005;
     130
     131        ExpParams.energies0_haplo = energyFromVolume(ExpParams.chamber_proculus_haplo,1);
     132        ExpParams.energies0_diplo = energyFromVolume(micronsToFrams(1.25),1);
     133        ExpParams.feedtrans = 0.001;
     134        ExpParams.e_repro_cost_haplo = 0.3;
     135        ExpParams.e_repro_cost_diplo = 0.2;
     136
     137        ExpParams.e_death_level_haplo = 0.5;
     138        ExpParams.e_death_level_diplo = 0.5;
    131139
    132140        //nutrients
    133         ExpParams.nutrientsize = micronsToFrams(10);
    134         ExpParams.energy_nut = 100 * energyFromVolume(ExpParams.nutrientsize);
    135         ExpParams.nutrientPop = 1;
    136         ExpParams.feedrate = 100;
     141        ExpParams.foodperiod = 480;
     142        ExpParams.nutrientradius = micronsToFrams(10);
     143        ExpParams.energy_nut = energyFromVolume(ExpParams.nutrientradius,1);
     144        ExpParams.feedrate = 1;
     145        ExpParams.ingestion = 0.25;
    137146        nutrientenergywaiting = 0;
    138147        ExpState.totaltestedcr = 0;
     
    142151@include "standard_placement.inc"
    143152
    144 function energyFromVolume(radius)
    145 {
    146         return 4.0/3.0*Math.pi*Math.pow(radius,3);
     153function volumeInMicrons(radiusInFrams)
     154{
     155        return 4.0/3.0*Math.pi*Math.pow(framsToMicrons(radiusInFrams),3);
     156}
     157
     158function energyFromVolume(base, isRadiusInFrams)
     159{
     160        if (isRadiusInFrams == 1) //radius in frams
     161        {
     162                return ExpParams.picoCarbonPerMikro*volumeInMicrons(base);
     163        }
     164        else //volume in microns
     165        {
     166                return ExpParams.picoCarbonPerMikro * base;
     167        }
    147168}
    148169
     
    169190}
    170191
    171 function addInitialForam(species, i)
    172 {
    173         var geno = createForamGenotype(0, species, 0);
     192function addForam(species, iter, chambernum, ploid)
     193{
     194        var geno = createForamGenotype(ploid, species, chambernum);
    174195        var cr = Populations[0].add(geno);
    175         cr.name = "Initial creature" + species + "_" + i;
     196        cr.name = "Initial creature" + species + "_" + iter;
    176197        placeCreatureRandomly(cr, 0, 0);
    177         cr.energy0 = getProperty(0, "energies0");
     198        cr.energy0 = energyFromVolume(max_chamber_volume[ploid][chambernum],0);
    178199        cr.energy = cr.energy0;
    179200        setGenotype({"opt" : 0, "cr" : cr, "species" : species});
     201        if (ploid == 1)
     202        {
     203                cr.data->lifeparams->gen = 1;
     204                cr.data->genes = [cr.data->genes, cr.data->genes]; //TODO two different genes sets
     205        }
     206}
     207
     208function addInitialForam(species, iter)
     209{
     210        var ploid = 0;
     211        if (Math.rnd01 > 0.5)
     212        {
     213                ploid = 1;
     214        }       
     215        //add new foram with random energy bewtween starting energy and reproduction treshold
     216        addForam(species, iter, Math.rndUni(0,getProperty(ploid, "min_repro_energ")),ploid);
    180217}
    181218
     
    261298// -------------------------------- foram begin -----------------------------------
    262299
    263 function setForamMeta(cr, gen)
    264 {
    265         //cr.idleen = (ExpParams.e_meta * max_chamber_energ[gen][Math.min(lastChamberNum(cr), max_chamber_energ[gen].size-1)])*ExpParams.secPerStep;
     300function setForamMeta(cr)
     301{
     302        //percent of current energy
    266303        cr.idleen = (ExpParams.e_meta * cr.energy)*ExpParams.secPerStep;
    267304}
     
    272309}
    273310
     311function getZoneRange(cr, zone_num)
     312{
     313        return ExpParams.["zone"+zone_num+"_range"];
     314}
     315
    274316function onForamsBorn(cr)
    275317{
    276         setForamMeta(cr, 1);
     318        setForamMeta(cr);
    277319        if (ExpParams.visualize == 1)
    278320        {
    279                 var ret = Populations[2].add("//0\np:sh=3,sx=0.01,sy="+ExpParams.zone1_range+",sz="+ExpParams.zone1_range+",ry=1.57,vr=1.0,1.0,1.0");
     321                var ret = Populations[2].add("//0\np:sh=3,sx=0.01,sy="+getZoneRange(cr,1)+",sz="+getZoneRange(cr,1)+",ry=1.57,vr=1.0,1.0,1.0");
    280322                cr.data->reticulopodiacreature = ret;
    281323        }
     
    322364                setGenotype({"cr" : cr2, "parent_genes" : cr.data->genes, "parent_lifeparams" : cr.data->lifeparams, "opt" : 2});
    323365                cr2.moveAbs(cr.center_x - cr2.size_x / 2, cr.center_y - cr2.size_y / 2, cr.pos_z);
    324                 setForamMeta(cr2, cr2.data->lifeparams->gen);
     366                setForamMeta(cr2);
    325367
    326368                if (visualization(cr))
     
    335377{
    336378        var p = cr.getMechPart(0);
    337         var n = cr.signals.receiveSet("nutrient", ExpParams.zone2_range);
     379        var n = cr.signals.receiveSet("nutrient", getZoneRange(cr,2));
    338380
    339381        //if signals are received find the source of the nearest
     
    354396                        distvec.sub(p.pos);
    355397                        dist = distvec.length;
    356                         if (dist < ExpParams.zone1_range)
     398                        if (dist < getZoneRange(cr,1))
    357399                        {
    358400                                if (n[i].value != null)
     
    390432        if (cr.data->lifeparams->hibernated == 0)
    391433        {
    392                 //cr.energy_m += (ExpParams.energy_move * max_chamber_energ[cr.data->lifeparams->gen][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.data->lifeparams->gen].size)-1)])*ExpParams.secPerStep;
    393                 cr.energy_m += (ExpParams.energy_move * cr.energy)*ExpParams.secPerStep;
     434                //percent of maximal energy
     435                cr.energy_m += (ExpParams.energy_move * cr.data->lifeparams->max_energy_level)*ExpParams.secPerStep;
    394436        }
    395437}
     
    422464        }
    423465        //random move
    424         else if (cr.lifespan%(dir_change/ExpParams.secPerStep) == 0)
     466        else if (cr.lifespan%int(dir_change/ExpParams.secPerStep) == 0)
    425467        {
    426468                cr.data->lifeparams->dir = randomDir();
     
    445487{
    446488        cr1.localDrive = XYZ.new(0,0,0);
    447         var e = ExpParams.feedtrans*ExpParams.secPerStep; //TODO efficiency dependent on age
    448         e = Math.min(cr2.energy, e) + 0.0000001;
    449         //Simulator.print("transferring "+e+" to "+cr1.name+" from "+cr2.name+" ("+cr2.energy+")");
    450         cr2.energy_m = cr2.energy_m + e;
    451         cr1.energy_p = cr1.energy_p + e;
     489        var e =  ExpParams.feedtrans*cr1.energy;//ExpParams.feedtrans*cr1.energy*ExpParams.ingestion*ExpParams.secPerStep; //TODO efficiency dependent on age
     490        e = Math.min(cr2.energy, e);
     491        e *= ExpParams.secPerStep;
     492        //Simulator.print("transferring "+e +"("+e*ExpParams.ingestion+")"+" to "+cr1.name +" ("+ cr1.energy+") " +" from "+cr2.name+" ("+cr2.energy+") "+ e/ExpParams.secPerStep+ " per sec");
     493        cr2.energy_m = cr2.energy_m + e + 0.0000001;
     494        cr1.energy_p = cr1.energy_p + e*ExpParams.ingestion;
    452495        if (cr1.data->lifeparams->hibernated == 1)
    453496        {
     
    460503        if (cr.data->lifeparams->hibernated == 1)
    461504        {
    462                 setForamMeta(cr, cr.data->lifeparams->gen); //unhibernate
     505                setForamMeta(cr); //unhibernate
    463506        }
    464507        else
    465508        {
    466                 //cr.idleen = (ExpParams.energy_hib * max_chamber_energ[cr.data->lifeparams->gen][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.data->lifeparams->gen].size)-1)])*ExpParams.secPerStep; //hibernate
    467509                cr.idleen = (ExpParams.energy_hib * cr.energy)*ExpParams.secPerStep; //hibernate
    468510        }
     
    470512}
    471513
     514
    472515function onForamsStep(cr)
    473516{
    474         cr.getMechPart(0).orient.set(o);
    475         if (visualization(cr))
    476         {
    477                 cr.data->reticulopodiacreature.moveAbs(cr.center_x-ExpParams.zone1_range, cr.center_y-ExpParams.zone1_range, cr.center_z-ExpParams.zone1_range-getProperty(cr.data->lifeparams->gen, "chamber_proculus"));
    478         }
    479 
    480         if (deathConditions(cr) == 1)
    481         {
    482                 Populations[0].kill(cr);
    483                 return;
    484         }
    485 
    486         foramMove(cr);
    487 
    488         var repro = foramReproduce(cr);
    489         if (repro == 1)
    490         {
    491                 return;
    492         }
    493 
    494         cr.data->lifeparams->max_energy_level = Math.max(cr.energy, cr.data->lifeparams->max_energy_level);
    495         if  (lastChamberNum(cr) <= chambers[0].size-1)
    496         {
    497                 if ((cr.data->lifeparams->max_energy_level >= max_chamber_energ[cr.data->lifeparams->gen][lastChamberNum(cr)]))         
    498                 {
    499                         foramGrow(cr, lastChamberNum(cr));
    500                 }       
     517        //checking for gametogenesis process
     518        if (cr.data->lifeparams->division_time > 0)
     519        {
     520                cr.data->lifeparams->division_time = Math.max(cr.data->lifeparams->division_time-1,0);
     521        }
     522        //checking for end of gametogenesis
     523        else if (cr.data->lifeparams->division_time == 0)
     524        {
     525                //waiting for gamets fusion
     526        }
     527        //checking for chamber growth process
     528        else if (cr.data->lifeparams->chamber_growth > 0)
     529        {
     530                cr.data->lifeparams->chamber_growth = Math.max(cr.data->lifeparams->chamber_growth-1,0);
     531                //Simulator.print("chamber growing, time left = " + cr.data->lifeparams->chamber_growth*ExpParams.secPerStep);
     532                cr.energy_m += ExpParams.chamberCostPerSec * cr.energy * ExpParams.secPerStep;
     533
     534                //Simulator.print("energy " + cr2.energy + " subtracting " + growth_cost);
     535        }
     536        //checking for end of chamber growth process
     537        else if (cr.data->lifeparams->chamber_growth == 0)
     538        {
     539                foramGrow(cr, lastChamberNum(cr));
     540                cr.data->lifeparams->chamber_growth = -1;
     541                //Simulator.print("chamber "+ (lastChamberNum(cr) + 1) +" complete");
     542        }
     543        else
     544        {
     545                //update of metabolism rate
     546                if (cr.data->lifeparams->hibernated == 0)
     547                {
     548                        setForamMeta(cr);
     549                }
     550
     551                cr.getMechPart(0).orient.set(o);
     552                if (visualization(cr))
     553                {
     554                        cr.data->reticulopodiacreature.moveAbs(cr.center_x-getZoneRange(cr,1), cr.center_y-getZoneRange(cr,1), cr.center_z-getZoneRange(cr,1)-getProperty(cr.data->lifeparams->gen, "chamber_proculus"));
     555                }
     556
     557                if (deathConditions(cr) == 1)
     558                {
     559                        Populations[0].kill(cr);
     560                        return;
     561                }
     562
     563                foramMove(cr);
     564
     565                var repro = foramReproduce(cr);
     566                if (repro == 1)
     567                {
     568                        return;
     569                }
     570
     571                cr.data->lifeparams->max_energy_level = Math.max(cr.energy, cr.data->lifeparams->max_energy_level);
     572
     573                //cheking conditions of chamber growth process start
     574                if  (lastChamberNum(cr) != chambers[0].size-1)
     575                {
     576                        if ((cr.data->lifeparams->max_energy_level >= energyFromVolume(max_chamber_volume[cr.data->lifeparams->gen][lastChamberNum(cr)],0)))   
     577                        {
     578                                cr.data->lifeparams->chamber_growth = int(ExpParams.chamber_growth_time/ExpParams.secPerStep);
     579                        }       
     580                }
    501581        }       
    502582}
     
    504584function deathConditions(cr)
    505585{
    506         if ((cr.energy <= getProperty(cr.data->lifeparams->species,"e_death_level")) || (Math.rnd01 < ExpParams.hunted_prob))
     586        if ((cr.energy <= getProperty(cr.data->lifeparams->gen,"e_death_level")*cr.data->lifeparams->max_energy_level) || (Math.rnd01 < ExpParams.hunted_prob))
     587        {
    507588                return 1;
     589        }
    508590        else
    509591                return 0;
     
    528610// -------------------------------- nutrient begin --------------------------------
    529611
    530 function createNutrientGenotype(nutrientsize, zone1_range)
    531 {
    532         return "//0\np:sh=3,sx="+nutrientsize+",sy="+nutrientsize+",sz="+nutrientsize+",ry=1.5,vr=0.0,1.0,0.0";
     612function createNutrientGenotype(nutrientradius)
     613{
     614        return "//0\np:sh=3,sx="+nutrientradius+",sy="+nutrientradius+",sz="+nutrientradius+",ry=1.5,vr=0.0,1.0,0.0";
    533615}
    534616
     
    540622function addNutrient()
    541623{
    542         var cr = Populations[1].add(createNutrientGenotype(ExpParams.nutrientsize, ExpParams.zone1_range));
     624        var cr = Populations[1].add(createNutrientGenotype(ExpParams.nutrientradius));
    543625
    544626        cr.name = "Nutrients";
     
    553635        if (ExpParams.visualize == 1)
    554636        {
    555                 var nutsize = ExpParams.nutrientsize*10;
     637                var nutsize = ExpParams.nutrientradius*10;
    556638                var nut = Populations[2].add("//0\np:sh=2,sx="+nutsize+",sy="+nutsize+",sz="+nutsize+",ry=1.5,vr=0.0,1.0,0.0");
    557639                cr.data->reticulopodiacreature = nut;
     
    571653{
    572654        nutrientenergywaiting = nutrientenergywaiting + 1;
    573         if (nutrientenergywaiting > ExpParams.feedrate/ExpParams.secPerStep)
    574         {
    575                 for (var i = 0; i < ExpParams.nutrientPop; i++)
     655        if (nutrientenergywaiting*ExpParams.secPerStep >= ExpParams.foodperiod)
     656        {
     657                for (var i = 0; i < ExpParams.feedrate*(ExpParams.secPerStep/ExpParams.foodperiod); i++)
    576658                {   
    577659                        addNutrient();
     
    668750
    669751// -------------------------------- step end --------------------------------
     752//TODO default params values in frams instead of microns/seconds
    670753
    671754@include "standard_events.inc"
     
    692775
    693776prop:
     777id:gametSuccessRate
     778name:Ratio of successful gamets
     779type:f 0.001
     780group:Foraminifera
     781
     782prop:
     783id:gametoPeriod
     784name:Time of gametogenesis
     785type:f 720
     786group:Foraminifera
     787
     788prop:
     789id:picoCarbonPerMikro
     790name:Picograms of carbon in cubed micrometer
     791type:f 0.13
     792group:Foraminifera
     793
     794prop:
    694795id:secPerStep
    695796name:Seconds per simulation step
     
    705806
    706807prop:
     808id:divisionCost
     809name:Cost of division in pG
     810type:f
     811group:Foraminifera
     812
     813prop:
    707814id:e_repro_cost_diplo
    708815name:Cost of reproduction
    709816type:f 0.1 0.9 0.3
     817group:Foraminifera
     818
     819prop:
     820id:chamber_growth_time
     821name:Time of the chamber growth in seconds
     822type:f
     823group:Foraminifera
     824
     825prop:
     826id:chamberCostPerSec
     827name:Cost of growning chamber per second
     828type:f
    710829group:Foraminifera
    711830
     
    791910id:e_death_level_haplo
    792911name:Minimal level of energy to sustain life of haploid
    793 type:f 0 20 4
     912type:f 0 20 0.2
    794913group:Foraminifera
    795914
     
    797916id:e_death_level_diplo
    798917name:Minimal level of energy to sustain life of diploid
    799 type:f 0 20 0.25
     918type:f 0 20 0.2
    800919group:Foraminifera
    801920
     
    857976
    858977prop:
     978id:ingestion
     979name:Ingestion rate
     980type:f
     981group:Energy
     982
     983prop:
    859984id:energy_nut
    860985name:Nutrient energy
    861 type:f 0 1000
     986type:f 0 100000
    862987group:Energy
    863988
    864989prop:
    865990id:feedtrans
    866 name:Ingestion multiplier
    867 type:f 0 100
     991name:Energy transfer per second
     992type:f 0 100000
    868993group:Energy
    869994
    870995prop:
    871 id:nutrientsize
     996id:foodperiod
     997name:Time between food occurrences
     998type:f 0 100000
     999group:Energy
     1000
     1001prop:
     1002id:nutrientradius
    8721003name:Nutrient size
    8731004type:f 0.1 0.9 0.1
    8741005group:Energy
    875 
    876 prop:
    877 id:nutrientPop
    878 name:Nutrient population size
    879 group:Energy
    880 type:d 1 1000 10
    8811006
    8821007prop:
Note: See TracChangeset for help on using the changeset viewer.