def test_add_axe(): g = MTG() labels = g.property('label') p1 = add_plant(g) p2 = add_plant(g) vid_axe = add_axe(g, 'T0') assert g.complex(vid_axe) == p1 assert labels[g.parent(vid_axe)] == 'MS' vid_axe = add_axe(g, 'T1.3', plant_number=2) assert g.complex(vid_axe) == p2 assert labels[g.parent(vid_axe)] == 'T1' vid_metamer0 = g.component_roots_at_scale(vid_axe, 3)[0] assert labels[g.parent(vid_metamer0)] == "metamer3"
def test_insert_elements(): g = MTG() labels = g.property('label') add_plant(g) elts = [{'label': 'elt1'}, {'label': 'elt2'}] collar = find_label('collar', g)[0] insert_elements(g, collar, elts) elt1 = find_label('elt1', g)[0] assert labels[g.parent(elt1)] == 'baseElement' assert labels[g.children(elt1)[0]] == 'elt2'
def mtg_factory(params, sectors = 1): """ Construct a MTG from a dictionary. The dictionary contains the parameters and a list of elements. Sector is an integer giving the number of LeafElements per Leaf The keys of params are: - plant: indx of plant - axe: - numphy - Lv - L_shape - Lsen - Lw_shape - LcType - LcIndex - Linc - Laz - Lpo - Lpos - Gl - Gv - Gsen - Gpo - Gpos - Gd - Ginc - El - Ev - Esen - Ed - Einc - Epo - Epos :TODO: * add length and final_length (DONE) * fix naming convention for Linc: relative inclination (DONE) * Add a scale to define the tissue types (ear, sheath, laminae, gain) * diam and final_diam (resp. width) * function reset length * function phenology(g, table) -> dynamic parameters (start_thermaltime, end_thermaltime) * function growthThermaltime(g, tt, dtt): tt=thermaltime du couvert * function growthThermaltime(g, tt, dtt, stress factor) * stress factor: offre/demande - demand = :math:`D=\int_{tt}^{tt+dtt}{S(x)dx}*\rho_s+\int_{tt}^{tt+dtt}{V(x)dx}*\rho_v` - offre : :math:`sum{E_abs}*\eps_b` => ds = ds_predit* stress_factor * give the area to the leaf model * update properties """ if not _check_adel_parameters(params): raise ValueError('Adel parameters are invalid') g = MTG() topology = ['plant', 'axe', 'numphy'] # buffers prev_plant = 0 prev_axe = -1 prev_metamer = -1 vid_plant = -1 vid_axe = -1 vid_metamer = -1 vid_node = -1 # store the metamer vids of the axis 0 metamers = [] nodes = [] edge_type = '<' dp = params nrow = len(params['plant']) for i in range(nrow): #plant, axe, num_metamer = [int(convert(d.get(x),undef=None)) for x in topology] plant = int(dp['plant'][i]) try: axe = int(dp['axe'][i]) except: axe = int(dp['ms_insertion'][i]) num_metamer = int(dp['numphy'][i]) #plant, axe, num_metamer = [int(convert(d.get(x),undef=None)) for x in topology] #print 'plant: %d, axe:%d, nb_metamers: %d'%(plant, axe, num_metamer) # Add new plant if plant != prev_plant: label = 'plant'+str(plant) vid_plant = g.add_component(g.root, label=label, edge_type='/') vid_axe = -1 vid_metamer = -1 vid_node = -1 prev_axe = -1 if num_metamer < prev_metamer: prev_axe = -1 prev_metamer = -1 # Add an axis if axe != prev_axe: label = 'axe'+str(axe) if axe == 0: vid_axe = g.add_component(vid_plant,edge_type='/',label=label) vid_node = -1 else: #args['edge_type'] = '+' edge_type = '+' assert g.parent(vid_plant) is None new_axe = g.add_child(vid_axe,edge_type=edge_type,label=label) print vid_axe, new_axe, vid_plant assert g.parent(vid_plant) is None #vid, vid_axe = g.add_child_and_complex(metamers[axe], complex=vid_axe, **args) # Add metamers args = properties_from_dict(dp,i,exclude=topology) assert num_metamer > 0 label = 'metamer'+str(num_metamer) if axe==0 and num_metamer==1: metamers=[] edge_type = '/' vid_metamer = g.add_component(vid_axe, edge_type='/', label = label, **args) elif num_metamer == 1: # Add the first element connected to previous metamer on the previous axis edge_type = '+' vid_metamer = g.add_component(vid_axe, label=label, **args) vid_metamer = g.add_child(metamers[axe-1], child=vid_metamer, edge_type='+') vid_node = nodes[axe-1] else: edge_type = '<' vid_metamer = g.add_child(vid_metamer, label=label, edge_type='<',**args) if axe == 0: metamers.append(vid_metamer) # Add internode, sheath, and lamina # Visible Internode #if args['Ev'] > 0.: tissue = 'internode' # Several cases: Egreen = args['Ev']-args['Esen'] if args['Ev']-args['Esen'] >0. else 0. Esen = args['Ev'] if Egreen == 0. else args['Esen'] # - Green element and perhaps a senescent one if vid_node == -1: # first metamer on the axis vid_node= g.add_component(vid_metamer, label='StemElement', edge_type='/', length=Egreen,final_length=args['El'],po=args['Epo'], diam=args['Ed'], tissue=tissue, inclination=args['Einc'] ) assert edge_type == '/' else: # first element on the metamer which has a parent metamer on the axis new_node = g.add_component(vid_metamer) vid_node= g.add_child(vid_node,child=new_node, label='StemElement', edge_type=edge_type, length=Egreen,final_length=args['El'],po=args['Epo'], diam=args['Ed'], tissue=tissue, inclination=args['Einc'] ) # Add a senescent element #if args['Esen'] > 0.: vid_node = g.add_child(vid_node, label='StemElement', edge_type='<', length=Esen,final_length=args['El'],po=args['Epos'], diam=args['Ed'], tissue=tissue, sen=True, inclination=0.) # Sheath # Same logic that described previously. Ggreen = args['Gv']-args['Gsen'] if args['Gv']-args['Gsen'] >0. else 0. Gsen = args['Gv'] if Ggreen == 0. else args['Gsen'] vid_node= g.add_child(vid_node, label='StemElement', edge_type='<', length=Ggreen,final_length=args['Gl'],po=args['Gpo'], diam=args['Gd'], tissue=tissue, inclination=args['Ginc'] ) #if args['Gsen'] > 0.: vid_node= g.add_child(vid_node, label='StemElement', edge_type='<', length=Gsen,final_length=args['Gl'],po=args['Gpos'], diam=args['Gd'], sen=True, tissue=tissue, inclination=0.) if axe == 0: nodes.append(vid_node) # Lamina #if args['Lv'] > 0.: l_node = vid_node tissue='lamina' ds = 1. / sectors srlim = 1.-(args['Lsen']/args['Lv']) st = ds edge_type = '+' Laz = args['Laz'] Lgreen = args['Lv']-args['Lsen'] if args['Lv']-args['Lsen'] >0. else 0. Lsen = args['Lv'] if Lgreen == 0. else args['Lsen'] for isect in range(sectors): # create one green and/or one senescent sector srb_green = st-ds srt_green = min(st, max(srb_green,srlim)) srb_sen = srt_green srt_sen= st l_node = g.add_child(l_node, label='LeafElement', edge_type=edge_type, length=args['Lv'],final_length=args['L_shape'],po=args['Lpo'], Ll=args['Ll'], Lw= args['Lw_shape'], LcType=args['LcType'], LcIndex=args['LcIndex'], Laz=Laz,Linc=args['Linc'], srb=srb_green, srt=srt_green, tissue=tissue) l_node = g.add_child(l_node, label='LeafElement', edge_type='<', length=args['Lv'],final_length=args['L_shape'],po=args['Lpos'], Ll=args['Ll'], Lw= args['Lw_shape'], LcType=args['LcType'], LcIndex=args['LcIndex'], Laz=Laz,Linc=args['Linc'], srb=srb_sen, srt=srt_sen, sen=True, tissue=tissue) st += ds edge_type = '<' prev_plant = plant prev_axe = axe prev_metamer = num_metamer return fat_mtg(g)