예제 #1
0
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"
예제 #2
0
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'
예제 #3
0
파일: mtg.py 프로젝트: imane-aanna/adel
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)