# -*- coding: utf-8 -*- # ============================================================================ # ============================================================================ ''' carboKB_*.py Software to interpret the KnowledgeBase for Pickup by Modelling Software Chris Jenkins INSTAAR Donald Potts UCSC Peter Burgess RHUL a Started 12 May 2011 from code inside carboLOT Version 1: 12 May 2011 CJJ at Boulder ''' # ========================= 1 1 1 1 1 1 1 1 1 1 1 1 ========================== # ============================================================================ import time # ============================================================================ # ============================================================================ ''' Structure: getKnowledgeBase() Reads the organism-knowledegebase into arrays reconcileValuesKB(kbDataA) Tidies up the KB data as it proceeds into arrays: brings human-friendly syntaxes into machine-syntaxes interpHabiRange(enviroPrpty,habitatS) Calculates a organism parameter (eg suitability) from an enviro value of a grid cell by interpolating to a position in a linear set from the KnowledgeBase. Other explanations: 1. Arrays are generally marked with an ending "a" or "A" 2. Strings are generally marked with an ending "s" or "S" 3. Data directly taken from the Knowledge Base is prefixed with "kb" 4. The parameter names of the KB have a web syntax eg organism.param.subparam 5. Usually, counters use "i" or "n", and elements of an array may use "ë" 6. Terms and Arrays are named this way forwhatWhatCoords and then the a/s/e/n/i suffix: eg "crStocksMapA" organism-stock at Yth row-Xth col in array ''' # ============================================================================ def myMAIN(): global kbINf, kbOUTf global nowClock nowClock=time.clock() loudQ=False #Determines whether run screen is verbose #(Not a global: different each module)iCr,kbWdHabitA #Which file to use the KnowledgeBase eg "KB_3.txt" ---- global kbFileName kbFileName="_carboKB_7" #(Conceivably, users may substitute their own) kbINf=open(kbFileName+".txt","r") kbOUTf=open(kbFileName+".inp","w") #Interrogate organism KnowledgeBase ----------- foo=getKnowledgeBase() kbINf.close() #Close files kbOUTf.close() return # ============================================================================ def getKnowledgeBase(): global kbOrgnsmA,numOrgnsms global kbCoverageA,kbGrowthA,kbSkeletalA,\ kbZonesA,kbMortalityA,kbReprodA,\ kbWdHabitA,kbTempHabitA,kbParHabitA #Harvests some of the Knowledge Base data into RAM # per property with creatr1,.. as elements. #Note the KB at present is 7cols wide, with '>getKnowledgeBase:" loudQ=False #Controls the amount of output to screen #Initializations... kbCoverageA=[]; kbGrowthA=[]; kbSkeletalA=[];\ kbZonesA=[]; kbMortalityA=[]; kbReprodA=[];\ kbWdHabitA=[]; kbTempHabitA=[];kbParHabitA=[] kbCoverageU=[]; kbGrowthU=[]; kbSkeletalU=[];\ kbZonesU=[]; kbMortalityU=[]; kbReprodU=[];\ kbWdHabitU=[]; kbTempHabitU=[];kbParHabitU=[] kbOrgnsmA=[]; kbOrgnsm="" '''As 7 Sep 2010 Organism= Marginopora vertebralis 9 Foraminiferida : Miliolina .Alternatives Other taxa included .Skeleton.Size linear size (diam) .Skeleton.Capacity Observed areal coverages .Skeleton.Frame.Fraction Areal proportion of colony arms (view vertically) .Skeleton.GrowthRate linear extension .Skeleton.Morphology Descriptive .Skeleton.Morphology.Zones [%Presence] Set .Skeleton.Tissue.Fraction Areal fraction (vertical view) of living tissue .Skeleton.Disintegrated.Fraction Fraction volume it will disintegrate to after death/transport/burial .Skeleton.Disintegrated.Grainsize Clast/grain size after death/transport/burial .Enviro.Limits Limitations on growth/fecundity/survival .Enviro.Prefs Preferences for growth/fecundity/survival .Enviro.Prefs.irrad [EnviroParam, Fitness] LineSet .Enviro.Prefs.salin [EnviroParam, Fitness] LineSet .Enviro.Prefs.nutr word .Enviro.Prefs.temp [EnviroParam, Fitness] LineSet .Enviro.Prefs.wd [EnviroParam, Fitness] LineSet .Mortality.Longevity .Mortality.Rate .Mortality.Type Causes of mortality even in optimum conditions (e.g predation, dieback) .Repro.Clone.ProductionRate Clones produced per adult per year under normal conditions .Repro.Clone.SuccessRate Successful formation of colonies from clones (e.g., unattached colonies) .Repro.Clone.Type .Repro.Maturity.Size .Repro.Spawn.ProductionRate Spawn (eggs,larvae) produced per adult per year .Repro.Spawn.SuccessRate Propagules surviving to grow; /m2 instantaneously .Repro.Spawn.Type The process of reproduction; seasonality''' #Find the entry... while kbINf: kbINs=kbINf.readline().lower() if kbINs=="": break #EOF kbINs=kbINs.strip().replace("'","").replace('"','') kbINa=kbINs.split("\t") #Tab delimited if len(kbINa)<>8 or kbINa[7]<>""": # for the organism ... if "Zones" in kbINa[1]: print "kbOrgnsm+kbINa[1]=",kbOrgnsm+kbINa[1] #Do reconciling and deal with nulls --------- if "$" in kbINa[3]: #Meant to be string data #Interim: if kbINa[2].strip()=="": kbINa[2]="-" foo=kbVocabulary(kbINa) else: #Meant to be numerical data # (including linear sets) if kbINa[2].strip()=="": kbINa[2]="-99." #Local convenient name to be used to reconcile, later) if kbSize==-99.: kbSize=0.1 #Arbitrary! based on 10cm diam #print "kbCoverageA=",kbCoverageA kbINa=reconcileValuesKB(kbINa,kbSize) #And for numerical, submit for adjustment in units... kbINa=reconcileUnitsKB(kbINa,kbSize) #print "kbINa=",kbINa #Assign the found values to the RAM arrays ----------- if ".skeleton.size" in kbINa[1]: kbCoverageA[-1][0]=min(float(kbINa[2]),1.0) #Size not allowed to be greater than 1m (measurement area) kbCoverageU[-1][0]=kbINa[3] kbSize=kbCoverageA[-1][0] #Local convenient name elif ".skeleton.frame.fraction" in kbINa[1]: kbCoverageA[-1][1]=float(kbINa[2]) kbCoverageU[-1][1]=kbINa[3] if kbCoverageA[-1][1]==-99.: kbCoverageA[-1][1]=0.5 #Default is 50% frame fraction elif ".skeleton.capacity" in kbINa[1]: kbCoverageA[-1][2]=float(kbINa[2]) kbCoverageU[-1][2]=kbINa[3] elif ".skeleton.morphology.zones" in kbINa[1]: try: kbZonesSa=kbINa[2].replace("[","").replace("]","").split(";") kbZonesA[-1]=map(float,kbZonesSa) except: kbZonesA[-1]=[0.,100.,0.,0.] #print "kbZonesA=",kbZonesA #Default is 100% frame fraction above the seabed elif ".skeleton.morphology.shape" in kbINa[1]: #kbMorphA[-1][0]="" #kbMorphU[-1][0]="$" #kbMorphA[-1][1]=[0.,100.,0.,0.] #kbMorphU[-1][1]="[%]" pass elif ".skeleton.tissue.fraction" in kbINa[1]: pass elif ".skeleton.morphology" in kbINa[1]: pass elif ".skeleton.growthrate" in kbINa[1]: kbGrowthA[-1]=float(kbINa[2]) kbGrowthU[-1]=kbINa[3] #Ie absolute rate divide by colony sze => relative if kbGrowthA[-1]==-99.: kbGrowthA[-1]=0.01 #ie 1cm/yr CJJ ?Reasonable kbGrowthU[-1]="m/yr" #Default 0.1% growth elif ".skeleton.disintegrated.fraction" in kbINa[1]: kbSkeletalA[-1][0]=float(kbINa[2]) kbSkeletalU[-1][0]=kbINa[3] #fxn elif ".skeleton.disintegrated.grainsize" in kbINa[1]: kbSkeletalA[-1][1]=float(kbINa[2]) kbSkeletalU[-1][1]=kbINa[3] #m elif ".skeleton.porosity" in kbINa[1]: kbSkeletalA[-1][2]=0.8 #General value kbSkeletalU[-1][2]="fxn" elif ".enviro.prefs.wd" in kbINa[1]: kbWdHabitA[-1]=kbINa[2] #Still in % at this stage kbWdHabitU[-1]=kbINa[3] elif ".enviro.prefs.temp" in kbINa[1]: kbTempHabitA[-1]=kbINa[2] kbTempHabitU[-1]=kbINa[3] elif ".enviro.prefs.irrad" in kbINa[1]: kbParHabitA[-1]=kbINa[2] kbParHabitU[-1]=kbINa[3] elif ".enviro.prefs.nutr" in kbINa[1]: pass elif ".enviro.prefs.salin" in kbINa[1]: pass elif ".enviro.limits" in kbINa[1]: pass elif ".enviro.prefs" in kbINa[1]: pass elif ".mortality.rate" in kbINa[1]: kbMortalityA[-1][0]=float(kbINa[2]) kbMortalityU[-1][0]=kbINa[3] if kbMortalityA[-1][0]==-99.: kbMortalityA[-1][0]=0.05 kbMortalityU[-1][0]="fxn/yr" #see: "http://www.springerlink.com/content/rrjq7p8vq45221x8/fulltext.pdf" elif ".mortality.longevity" in kbINa[1]: kbMortalityA[-1][1]=float(kbINa[2]) kbMortalityU[-1][1]=kbINa[3] elif ".mortality.type" in kbINa[1]: pass elif "repro.clone.productionrate" in kbINa[1]: kbReprodA[-1][0][0]=float(kbINa[2]) kbReprodU[-1][0][0]=kbINa[3] elif "repro.clone.success" in kbINa[1]: kbReprodA[-1][0][1]=float(kbINa[2]) kbReprodU[-1][0][1]=kbINa[3] if kbReprodA[-1][0][1]==-99.: kbReprodA[-1][0][1]=0.0 kbReprodU[-1][0][1]="fxn" #Default success for cloning is zero elif "repro.clone.type" in kbINa[1]: pass elif "repro.spawn.productionrate" in kbINa[1]: kbReprodA[-1][1][0]=float(kbINa[2]) kbReprodU[-1][1][0]=kbINa[3] elif "repro.spawn.success" in kbINa[1]: kbReprodA[-1][1][1]=float(kbINa[2]) kbReprodU[-1][1][1]=kbINa[3] if kbReprodA[-1][1][1]==-99.: kbReprodA[-1][1][1]=0.01 #=1% kbReprodU[-1][1][1]="fxn" #Default success for spat: 0.01 signifies 1% of populations #Apply cap ! CJJ temporary if kbReprodA[-1][1][1]>0.1: kbReprodA[-1][1][1]=0.1 elif "repro.spawn.type" in kbINa[1]: pass elif "repro.maturity.size" in kbINa[1]: pass else: raw_input("parameter not in program ! ("+kbINa[1]+")") else: #In case something else in kb field "Look what I found in a kb field:" print "\t"+"kbINa,kbOrgnsm=",kbINa,kbOrgnsm raw_input("!") #------------------------------------------------------------- numOrgnsms=len(kbOrgnsmA) #Echo the results to file and screen ----------------------------------- runYMDHMs="".join(map(str,time.localtime()[:5])) outS="Compiled Knowledge Base at:"+runYMDHMs outS+="-"*72 outS+="| kbOrgnsm.. | kbCoverage.. | kbGrowth.. | kbSkeletal.. | "+\ "kbZones.. | kbWdHabit.. | kbTempHabit.. | kbParHabit.. | "+\ "kbMortality.. | kbReprod.. |:"+"\n" outS+="\n" outS="Synopsis of the Organism KB parameters -----------------" outS+="\t"+"kbOrgnsmA[iCr]=Organism name" outS+="\n" outS+="\t"+"kbCoverageA[iCr][0]=Colony Size (m)" outS+="\t"+"kbCoverageA[iCr][1]=Colony Frame Fraction (fxn)" outS+= "\t"+"kbCoverageA[iCr][2]=Observed Carrying Capacity (area_fxn)" outS+="\n" outS+= "\t"+"kbGrowthA[iCr][0]=Colony Growth Rate (m/yr)" outS+="\n" outS+= "\t"+"kbSkeletalA[iCr][0]=Disintegrated volume fraction (fxn)" outS+= "\t"+"kbSkeletalA[iCr][1]=Disintegrated grainsize (m)" outS+= "\t"+"kbSkeletalA[iCr][2]=Porosity (fxn)" outS+="\n" outS+= "\t"+"kbZonesA[iCr]=Vertical 4-Zone Presences (%)" outS+="\n" outS+= "\t"+"kbWdHabitA[iCr]=Habitat by WD ([m,fxn])" outS+= "\t"+"kbTempHabitA[iCr]=Habitat by Temperature ([degC,fxn])" outS+= "\t"+"kbParHabitA[iCr]=Habitat by Temperature ([degC,fxn])" outS+="\n" outS+= "\t"+"kbMortalityA[iCr][0]=Mortality (fxn per individ /yr)" outS+="\n" outS+= "\t"+"kbReprodA[iCr][0][0]=Cloning Reproduction Rate (fxn/yr)" outS+= "\t"+"kbReprodA[iCr][0][0]=Cloning Reproduction Success (fxn)" outS+= "\t"+"kbReprodA[iCr][1][0]=Spawning Reproduction Rate (fxn/yr)" outS+= "\t"+"kbReprodA[iCr][1][0]=Spawning Reproduction Success (fxn)" outS+= "\t"+"(Note: units are shown as expected by the modelling)" outS+="\n" #Output KB values for the organisms ----------------------- outS+="parameterName"+"\t"+"parameterValues"+"\t"+\ "parameterUncerts"+"\t"+"parameterUnits"+"\n" outS+="\n" print "kbReprodU=",kbReprodU for iCr in range(numOrgnsms): outS="\n"+str(iCr)+" "+kbOrgnsmA[iCr] outS+="\n Covrg\t"+"|".join(map(str,kbCoverageA[iCr]))+\ "\t"+"|".join(map(str,kbCoverageU[iCr]))+\ "\n Grwth\t"+"["+str(kbGrowthA[iCr])+"]"+\ "\t"+"["+str(kbGrowthU[iCr])+"]"+\ "\n Skltl\t"+"|".join(map(str,kbSkeletalA[iCr]))+\ "\t"+"|".join(map(str,kbSkeletalU[iCr]))+\ "\n Zones\t"+"|".join(map(str,kbZonesA[iCr]))+\ "\t"+"|".join(map(str,kbZonesU[iCr]))+\ "\n HabWd\t"+str(kbWdHabitA[iCr])+\ "\t"+str(kbWdHabitU[iCr])+\ "\n HabTemp\t"+str(kbTempHabitA[iCr])+\ "\t"+str(kbTempHabitU[iCr])+\ "\n HabPar\t"+str(kbParHabitA[iCr])+\ "\t"+str(kbParHabitU[iCr])+\ "\n MortR\t"+"|".join(map(str,kbMortalityA[iCr]))+\ "\t"+"|".join(map(str,kbMortalityU[iCr]))+\ "\n ReprR\t"+"|".join(map(str,kbReprodA[iCr]))+\ "\t"+"|".join(map(str,kbReprodU[iCr]))+"|" kbOUTf.write(outS) print outS print;print "<>kbVocabulary: kbINa=",kbINa if ".enviro.prefs.irrad" in kbINa[1]: #Irradiance - available from MODIS & Gattuso kbIrradVocabA=[["bright","~600"],\ ["euphotic","6:600"],\ ["upper_euphotic","60:600"],\ ["lower_euphotic","6:60"],\ ["disphotic","0.6:6"],\ ["aphotic","<0.6"],\ ["dark_zone","<0.6"]] kbIrradWord=[]; kbIrradValu=[] for kbIrradVocab in kbIrradVocabA: kbIrradWord.append(kbIrradVocab[0]) kbIrradValu.append(kbIrradVocab[1]) #print "kbIrradWord=",kbIrradWord try: kbDataA=[kbIrradValu[kbIrradWord\ .index(kbINa[2].lower())],"umol photons/m2/s1"] except: #print "Word not in vocab" kbDataA=["",""] elif ".enviro.prefs.salin" in kbINa[1]: #Salinity - available from WOA05 kbSalinVocabA=[["fresh","<0.5"],\ ["brackish","0.5:25"],\ ["steno","25:35"],\ ["hypersaline",">35"]] kbSalinWord=[]; kbSalinValu=[] for kbSalinVocab in kbSalinVocabA: kbSalinWord.append(kbSalinVocab[0]) kbSalinValu.append(kbSalinVocab[1]) #print "kbSalinWord=",kbSalinWord try: kbDataA=[kbSalinValu[kbSalinWord\ .index(kbINa[2].lower())],"ppt"] except: #print "Word not in vocab" kbDataA=["",""] elif ".enviro.prefs.nutr" in kbINa[1]: '''#Chlorophyll - available from MODIS for surface kbChlorVocabA=[["eutrophic","1.0:10.0"],\ ["mesotrophic","0.1:1.0"],\ ["oligotrophic","<0.1"]] kbChlorWord=[]; kbChlorValu=[] for kbChlorVocab in kbChlorVocabA: kbChlorWord.append(kbChlorVocab[0]) kbChlorValu.append(kbChlorVocab[1]) print "kbChlorWord=",kbChlorWord try: kbDataA=[kbChlorValu[kbChlorWord\ .index(kbINa[2].lower())],"chl-a mg/m3"] except: print "Word not in Chlor vocab" kbDataA=["",""]''' #Nitrate (available from WOA05) kbNitratVocabA=[["eutrophic","1.0:10.0"],\ ["mesotrophic","0.1:1.0"],\ ["oligotrophic","<0.1"]] kbNitratWord=[]; kbNitratValu=[] for kbNitratVocab in kbNitratVocabA: kbNitratWord.append(kbNitratVocab[0]) kbNitratValu.append(kbNitratVocab[1]) #print "kbChlorWord=",kbNitratWord try: kbDataA=[kbNitratValu[kbNitratWord\ .index(kbINa[2].lower())],"uMol/ltr"] except: #print "Word not in vocab" kbDataA=["",""] else: #print "Other!" kbDataA=["",""] if loudQ: print "<>reconcileValuesKB:" changedQ=False #Detects an operation kbData2,kbData3=kbDataA[2:4] if loudQ: print "kbData2,kbData3=",kbData2,kbData3 #Strip off the doubt flags from the Value and Units field entries: kbData2=kbData2.replace("?","").replace("!","").replace("~","") kbData2=kbData2.replace("_w","").replace("_h","").replace("_l","") #ie: wide,high,long kbData3=kbData3.replace("?","").replace("!","").replace("~","") #Meant to be numeric try: foo=float(kbData2) changedQ=True #Already a number and kbData2 will be evaluated except: #Not a number,but meant to be ... #Ranging data... if ">>" in kbData2: #(Note: this will fail below if >> is in just text) kbData2="("+kbData2.replace(">>","+")+")/2" changedQ=True if ":" in kbData2: #(Note: this will fail below if >> is in just text) kbData2="("+kbData2.replace(":","+")+")/2" changedQ=True #Max/Avg/Min data if "mx=" in kbData2: #Rate to half the value kbData2=kbData2.replace("mx=","0.5*").replace(";","+") changedQ=True if "mn=" in kbData2: #Rate to double the value kbData2=kbData2.replace("mn=","2.0*").replace(";","+") changedQ=True if "av=" in kbData2: #Just accept it kbData2=kbData2.replace("av=","1.0*").replace(";","+") changedQ=True if "~=" in kbData2: #Override the ~: just accept it kbData2=kbData2.replace("~=","1.0*").replace(";","+") changedQ=True #Multidim data... if "x" in kbData2: #(Note: this will fail below if >> is in just text) kbData2=kbData2.replace("x","*") changedQ=True #Arithmetic data... if "+" in kbData2 or "*" in kbData2: #(Note: this will fail below if >> is in just text) #kbData2=kbData2.replace("+","+") #Trivial changedQ=True #Convert to numerical data type --------------------- if loudQ: print "kbData2,kbData3=",kbData2,kbData3 if changedQ: if loudQ: print "kbDataA[2],kbData2=",kbDataA[2],kbData2 try: kbDataA[2]=str(eval(kbData2)) #A number except: raw_input("Could not eval: kbData2= "+kbData2) #------------------------------------------------------------------ if loudQ: print "kbDataA[2:4]=",kbDataA[2:4] #if changedQ: raw_input("<>reconcileUnitsKB: kbDataA[:3]=",kbDataA[:3] if kbDataA[1].strip()=="": return kbDataA #Abort if null data changedQ=False #Detects an operation #The data fields renamed... kbDat0=kbDataA[0].lower() kbDat1=kbDataA[1].lower() kbDat2=kbDataA[2].lower() '''All: ["#/m2",-99],["%",-99],["mm/yr",-99],\ ["$",-99],["m",-99],["%/yr",-99],\ ["#/adult",-99],["#/m2/yr",-99],["mm/day",-99],\ ["mm",-99],["microns",-99],["yr",-99],\ ["degC",-99],["psu",-99],["umol photons/m2/s1",-99],\ ["#/day",-99],["cm",-99],["cm/yr",-99],\ ["#/m2/yr",-99],["yr",-99],["%/adult",-99],\ ["#/yr",-99],["yr",-99] ]''' #print "kbDat0,kbDat1,kbDat2=",kbDat0,kbDat1,kbDat2 #(Will multiply the value by [1] to get standardized values) growthUa=[["mm/yr",0.001],["mm/day",3.65],["cm/yr",0.01],["m/yr",1.0]] #m/yr standard sizeUa=[["m",1.],["mm",0.001],["microns",0.000001],["cm",0.01]] #m=standard poprateUa=[["%/mo",0.00083],["%/day",0.0000273],["%/yr",0.01],\ ["%/m2/yr",0.01],["%",0.01],\ ["#/adult",1.0]] #fxn/yr=standard timeUa=[["yr",1.0],["mo",0.083],["day",0.00273]] # yr=Standard stockUa=[["#/m2",1.0]] #=Standard salinUa=[["psu",1.0]] #=Standard lightUa=[["mol photons/m2/d1",1.0]] #=Standard amountUa=[["%",0.01],["/1",1.],["fxn",1.]] #fxn=Standard if ".capacity" in kbDat0 and kbDat1<>"-99.": #Standard capacity unit will be #/m2 #Non-empty term... if kbDat2=="#/m2": kbDataA[1]=float(kbDat1) #OK else: if loudQ: print ".capacity Units not #/m2 ! ("+kbDat2+")" if kbSize==-99.: raw_input("Colony size needed but unknown ! ("+\ str(kbSize)+")") #Will try to fix them using colony size if are % coverage if kbDat2=="%" and kbSize<>-99.: if loudQ: print "kbCoverageA[-1]=",kbCoverageA[-1] #All 3 items kbDataA[1]=float(kbDat1)*kbSize**2 #(Note: the % is areal coverage; size comes in via global; # it is in cm) kbDataA[2]=="#/m2" if loudQ: print "Changed % to #" changedQ=True if ".fraction" in kbDat0 and kbDat1<>"-99.": #Applies to frame fxn, tissue fxn, disintegrated volume, # porosity (1-solid carb) #Non-empty term... for amountU in amountUa: if amountU[0]==kbDat2: if loudQ: print "Gotcha: kbDat0,kbDat1,kbDat2,amountU=",\ kbDat0,kbDat1,kbDat2,amountU kbDataA[1]=float(kbDat1)*amountU[1] kbDataA[2]="/1" #Set to fraction ... elif ".growthrate" in kbDat0 and kbDat1<>"-99.": #Non-empty term... #Standard growthrate unit will be m/yr if kbDat2=="%/yr" and kbSize<>-99.: kbDataA[1]=float(kbDat1)/100.*kbSize kbDataA[2]="m/yr" #Set to standard size ... #Changed % to m for growthU in growthUa: #Scan to find the unit if growthU[0]==kbDat2: if loudQ: print "Gotcha: kbDat0,kbDat1,kbDat2,growthU=",\ kbDat0,kbDat1,kbDat2,growthU kbDataA[1]=float(kbDat1)*growthU[1] kbDataA[2]="m/yr" #Set to standard size ... changedQ=True elif ".longevity" in kbDat0 and kbDat1<>"-99.": #Standard longevity unit will be yr #Non-empty term... for timeU in timeUa: if timeU[0]==kbDat2: if loudQ: print "Gotcha: kbDat0,kbDat1,kbDat2,timeU=",\ kbDat0,kbDat1,kbDat2,timeU kbDataA[1]=float(kbDat1)*timeU[1] kbDataA[2]="yr" #Set to standard size ... changedQ=True #Standard size unit will be cm elif (".size" in kbDat0 or \ ".grainsize" in kbDat0) \ and kbDat1<>"-99.": #Non-empty term... for sizeU in sizeUa: if sizeU[0]==kbDat2: if loudQ: print "Gotcha: kbDat0,kbDat1,kbDat2,sizeU=",\ kbDat0,kbDat1,kbDat2,sizeU kbDataA[1]=float(kbDat1)*sizeU[1] kbDataA[2]="m" #Set to standard size ... changedQ=True #Standard frequency (rate per individual) unit will be fxn/yr # also for rate (eg mortality) elif (".productionrate" in kbDat0 or \ ".successrate" in kbDat0 or \ ".rate" in kbDat0) and kbDat1<>"-99.": if loudQ: print "Fix units for recruitm: kbDat1,kbDat2",kbDat1,kbDat2 #is it a number unit ? if kbDat2=="%": if loudQ: print "Fix % units for recruitm: kbDat1,kbDat2",kbDat1,kbDat2 kbDataA[1]=float(kbDat1)/100. kbDataA[2]="fxn/yr" #Will assume that % means /yr overall if loudQ: print "unit revised: kbDataA[1:3]=",kbDataA[1:3] #(Now can proceed as usual) if kbDat2=="%/yr": if loudQ: print "Fix %/yr units for recruitm: kbDat1,kbDat2",kbDat1,kbDat2 kbDataA[1]=float(kbDat1)/100. kbDataA[2]="fxn/yr" if loudQ: print "unit revised: kbDataA[1:3]=",kbDataA[1:3] #(Now can proceed as usual) #is it a number unit ? elif (kbDat2=="#/yr" or kbDat2=="#/m2"): #Normalize against possible number/m2... if loudQ: print "Fix # units for recruitm: kbDat1,kbDat2",kbDat1,kbDat2 kbDataA[1]=float(kbDat1)/(1./kbSize**2) #fxn #Assumed #/yr is also /m2 ! ; also assume is yearly) kbDataA[1]=min(1.0,kbDataA[1]) #and limit it to 100% kbDataA[2]="fxn/yr" if loudQ: print "unit revised: kbDataA[1:3],kbAbund=",kbDataA[1:3],kbAbund #(Now can proceed as usual) #Non-empty term... for poprateU in poprateUa: if poprateU[0]==kbDat2: if loudQ: print "Gotcha poprate: kbDat0,kbDat1,kbDat2,poprateU=",\ kbDat0,kbDat1,kbDat2,poprateU kbDataA[1]=float(kbDat1)*poprateU[1] kbDataA[2]="fxn/yr" #Set to standard size ... changedQ=True else: #print "No units action" pass if changedQ: kbDataA[3]+=":UnitsSetTo "+kbDataA[2] if loudQ: print "New Units: kbDataA[:3]=",kbDataA[:3] return kbDataA # ============================================================================ # ============================================================================ foo=myMAIN() #Finish ----------------------- print "End of Interpreting the Knowledge Base "+"="*50