Beispiel #1
0
def test_update():
    """ Check if 'update' from 'protocol.py' provokes the growth of a lesion instantiated on the MTG.

    """
    g = adel_mtg2()
    set_properties(g, area=20., green_area=20.)
    septoria = plugin_septoria()
    SeptoriaDU = septoria.dispersal_unit()
    stock = [SeptoriaDU(nb_spores=random.randint(1,100), status='emitted') for i in range(100)]
    inoculator = RandomInoculation()
    initiate(g, stock, inoculator)
    
    controler = NoPriorityGrowthControl()
    
    dt = 1
    nb_steps = 750
    nb_les_inc = numpy.zeros(nb_steps)
    # nb_les_chlo = numpy.array([0. for i in range(nb_steps)])
    # nb_les_nec = numpy.array([0. for i in range(nb_steps)])
    nb_les_spo = numpy.zeros(nb_steps)
    # nb_les_empty = numpy.array([0. for i in range(nb_steps)])
    nb_les = 0.
    for i in range(nb_steps):

        ts = time.clock()
        #print('time step %d' % i)
        
        update_climate_all(g)
            
        #grow(g)
        update_healthy_area(g, label = 'LeafElement')
        infect(g, dt)
        update(g,dt, growth_control_model=controler)
        # control_growth(g, controler)
        
        # Count of lesions :
        nb_les_inc[i] = count_lesions_in_state(g, state = 0)
        # nb_les_chlo[i] = count_lesions_in_state(g, state = 1)
        # nb_les_nec[i] = count_lesions_in_state(g, state = 2)
        nb_les_spo[i] = count_lesions_in_state(g, state = 3)
        # nb_les_empty[i] = count_lesions_in_state(g, state = 4)

        te = time.clock()
        #print "time ", i, " : ", te-ts
                
    # Display results
    plot(nb_les_inc)
    plot(nb_les_spo)
    ylabel('Nombre de lesions dans cet etat sur le MTG')
    xlabel('Pas de temps de simulation')
    ylim([0, 120])
    
    # displayer = DisplayLesions()
    # displayer.print_all_lesions(g)
  
    # plot_lesions(g)
    return g
Beispiel #2
0
def example_one_leaf(fungus = septoria,
                     nb_dus=10,
                     group_dus = False,
                     infection_controler = BiotrophDUPositionModel(),
                     growth_controler = PriorityGrowthControl(),
                     nb_steps = 1000, 
                     leaf_area = None,
                     eradicant = 0.,
                     protectant = 0.):
    # Initiate wheat MTG with one leaf and good conditions for disease
    g = adel_one_leaf()
    set_properties(g, label='LeafElement', wetness=True, 
                   temperature_sequence=np.array([22.]), rain_intensity=0., 
                   global_efficacy={'eradicant':eradicant, 'protectant':protectant})
    if leaf_area is not None:
        set_properties(g, label='LeafElement', area=leaf_area, green_area=leaf_area)

    # Initiate disease
    leaf = g.node(10)
    dispersal_units = [fungus.dispersal_unit() for i in range(nb_dus)]
    for du in dispersal_units:
        du.set_position([random.random() * leaf.length, 0])
    if group_dus:
        pos = [du.position[0] for du in dispersal_units]
        dispersal_units[0].fungus.group_dus = True
        dispersal_units[0].set_position(pos)
        dispersal_units = [dispersal_units[0]]
    leaf.dispersal_units = dispersal_units

    # Initiate output recorder
    recorder = SeptoRecorder(vids=[10], group_dus=group_dus)
    recorder.record(g,0)
    
    # Simulation loop
    for i in range(nb_steps):
        # Update wheat healthy area
        update_healthy_area(g, label = 'LeafElement')
        
        # Update dispersal units and lesions
        infect(g, 1, infection_controler, label='LeafElement')
        update(g, 1, growth_controler, senescence_model=None, label='LeafElement')
        
        # Get outputs
        recorder.record(g, date=i+1)
    recorder.get_complete_dataframe()
    
    # return g, inspector
    return g, recorder
Beispiel #3
0
        areas = g.property('area')
        senesced_areas = g.property('senesced_area')
        leaves = get_leaves(g, label='LeafElement')
        vids = [leaf for leaf in leaves if leaf in g.property('geometry')]
        positions.update({
            vid: (0 if (positions[vid] == 1 and not greens[vid]) or
                  (positions[vid] > 0 and round(areas[vid], 5) == round(
                      senesced_areas[vid], 5)) else positions[vid])
            for vid in vids
        })

    # Develop disease
    if septo_eval:
        # Update g for the disease
        sen_model.find_senescent_lesions(g, label='LeafElement')
        update_healthy_area(g, label='LeafElement')

        # Possibly refill pool of initial inoculum to simulate differed availability
        if rain_eval and i <= 700 and source_leaf.geometry != None:
            dus = generate_stock_du(nb_dus=rd.randint(0, 5), disease=septoria)
            try:
                source_leaf.dispersal_units += dus
            except:
                source_leaf.dispersal_units = dus

        # Update dispersal units and lesions
        infect(g, septo_eval.dt, infection_controler, label='LeafElement')
        update(g,
               septo_eval.dt,
               growth_controler,
               sen_model,
Beispiel #4
0
def run_simulation(start_year, variability=True, **kwds):
    # Set the seed of the simulation
    rd.seed(0)
    np.random.seed(0)

    # Read weather and adapt it to septoria (add wetness)
    weather_file = 'meteo'+ str(start_year)[-2:] + '-' + str(start_year+1)[-2:] + '.txt'
    meteo_path = shared_data(alinea.septo3d, weather_file)
    weather = Weather(data_file=meteo_path)
    weather.check(varnames=['wetness'], models={'wetness':wetness_rapilly})
    seq = pandas.date_range(start = str(start_year)+"-10-01 01:00:00",
                            end = str(start_year+1)+"-07-01 01:00:00", 
                            freq='H')

    # Initialize a wheat canopy
    g, wheat, domain_area, domain = initialize_stand(age=0., length=0.1, 
                                                    width=0.2, sowing_density=150,
                                                    plant_density=150, inter_row=0.12, 
                                                    seed=3)
    
    # Initialize the models for septoria
    if 'alinea.alep.septoria_age_physio' in sys.modules:
        del(sys.modules['alinea.alep.septoria_age_physio'])
    if variability==True:
        septoria = variable_septoria(**kwds)
    else:
        septoria = plugin_septoria(model="septoria_age_physio")
    DU = septoria.dispersal_unit()
    inoculator = RandomInoculation()
    growth_controler = NoPriorityGrowthControl()
    infection_controler = BiotrophDUPositionModel()
    sen_model = WheatSeptoriaPositionedSenescence(g, label='LeafElement')
    emitter = SeptoriaRainEmission(domain_area=domain_area)
    transporter = Septo3DSplash(reference_surface=domain_area)
    washor = RapillyWashing()

    # Define the schedule of calls for each model
    every_h = time_filter(seq, delay=1)
    every_24h = time_filter(seq, delay=24)
    every_rain = rain_filter(seq, weather)
    weather_timing = IterWithDelays(*time_control(seq, every_h, weather.data))
    wheat_timing = IterWithDelays(*time_control(seq, every_24h, weather.data))
    septo_timing = IterWithDelays(*time_control(seq, every_h, weather.data))
    rain_timing = IterWithDelays(*time_control(seq, every_rain, weather.data))

    # Call leaf inspectors for target blades (top 3)
    inspectors = {}
    first_blade = 80
    ind = 4.
    for blade in range(first_blade,104,8):
        ind -= 1
        inspectors[ind] = LeafInspector(g, blade_id=blade)
    
    # Simulation loop
    for i,controls in enumerate(zip(weather_timing, wheat_timing, 
                                    septo_timing, rain_timing)):
        weather_eval, wheat_eval, septo_eval, rain_eval = controls
        
        # Update date
        date = weather_eval.value.index[0]

        # Get weather for date and add it as properties on leaves
        if weather_eval:
            set_properties(g,label = 'LeafElement',
                           temp = weather_eval.value.temperature_air[0],
                           wetness = weather_eval.value.wetness[0],
                           relative_humidity = weather_eval.value.relative_humidity[0],
                           wind_speed = weather_eval.value.wind_speed[0])
        if rain_eval:
            set_properties(g,label = 'LeafElement',
                           rain_intensity = rain_eval.value.rain.mean(),
                           rain_duration = len(rain_eval.value.rain) if rain_eval.value.rain.sum() > 0 else 0.)

        # Grow wheat canopy
        if wheat_eval:
            print(date)
            g,_ = grow_canopy(g, wheat, wheat_eval.value)
            # Note : The position of senescence goes back to its initial value after
            # a while for undetermined reason
            # --> temporary hack for keeping senescence position low when it is over
            positions = g.property('position_senescence')
            are_green = g.property('is_green')
            leaves = get_leaves(g, label = 'LeafElement')
            positions.update({leaf:(0 if positions[leaf]==1 and not are_green[leaf] else positions[leaf]) 
                              for leaf in leaves})
            
        # Develop disease
        if septo_eval:
            sen_model.find_senescent_lesions(g, label = 'LeafElement')
            update_healthy_area(g, label = 'LeafElement')
            if rain_eval and i <= 500:
                # Refill pool of initial inoculum to simulate differed availability
                if rd.random()<0.4:
                    dispersal_units = [DU(nb_spores=rd.randint(1,100), status='emitted') for i in range(rd.randint(0,3))]
                    initiate(g, dispersal_units, inoculator)
            infect(g, septo_eval.dt, infection_controler, label='LeafElement')
            update(g, septo_eval.dt, growth_controler, sen_model, label='LeafElement')                
        
        les = g.property('lesions')
        lesions = sum([l for l in les.values()], [])
        
        print([l.fungus.degree_days_to_chlorosis for l in lesions])
        
        # if len(lesions)>10:
            # import pdb
            # pdb.set_trace()
        
        
        if rain_eval:
            g, nb = disperse(g, emitter, transporter, "septoria", label='LeafElement')
            wash(g, washor, rain_eval.value.rain.mean(), label='LeafElement')
        
        # Save outputs
        for inspector in inspectors.itervalues():
            inspector.update_variables(g)
            inspector.update_du_variables(g)
        
        if wheat_eval:
            plot_severity_by_leaf(g)
    
    return inspectors
Beispiel #5
0
def test_update(senescence_threshold=330., sen_day=500., model="septoria_exchanging_rings", **kwds):
    """ 
    """
    from alinea.alep.wheat import adel_one_leaf_element
    
    # Read weather and adapt it to septoria (add wetness)
    meteo_path = shared_data(alinea.septo3d, 'meteo00-01.txt')
    weather = Weather(data_file=meteo_path)
    weather.check(varnames=['wetness'], models={'wetness':wetness_rapilly})
    seq = pandas.date_range(start = "2000-10-01 01:00:00",
                            end = "2000-12-31 01:00:00", 
                            freq='H')
    
    # Generate a wheat MTG
    g = adel_one_leaf_element()
    set_properties(g, label = 'LeafElement', 
                   area=5., green_area=5., healthy_area=5., position_senescence=1,
                   wetness=True, temp=22., rain_intensity=0., relative_humidity=90.)
    
    # Generate one lesion of septoria and distribute it on g
    # septoria = new_septoria(senescence_threshold=senescence_threshold)
    septoria = plugin_septoria(model)
    Lesion = septoria.lesion(**kwds)
    leaf = g.node(10)
    leaf.lesions = [Lesion(nb_spores=1, position=[0.5, 0])]
    
    # Call model of growth control
    growth_controler = NoPriorityGrowthControl()
    sen_model = WheatSeptoriaPositionedSenescence(g, label='LeafElement')
    
    #Temp
    emitter = SeptoriaRainEmission(domain_area=0.0004)
    transporter = Septo3DSplash(reference_surface=0.0004)
    
    # Loop of simulation
    every_h = time_filter(seq, delay=1)
    every_rain = rain_filter(seq, weather)
    septo_timing = IterWithDelays(*time_control(seq, every_h, weather.data))
    rain_timing = IterWithDelays(*time_control(seq, every_rain, weather.data))
    surface = []
    surface_alive = []
    surface_empty = []
    nb_dus = []
    stock_spores = []
    for i,controls in enumerate(zip(septo_timing, rain_timing)):
        septo_eval, rain_eval = controls
        
        if i==sen_day:
            set_properties(g, label = 'LeafElement', position_senescence=0) 
        if rain_eval:
            set_properties(g,label = 'LeafElement',
                           rain_intensity = rain_eval.value.rain.mean(),
                           rain_duration = len(rain_eval.value.rain) if rain_eval.value.rain.sum() > 0 else 0.)
            
        # Update healthy area
        sen_model.find_senescent_lesions(g, label = 'LeafElement')
        update_healthy_area(g, label = 'LeafElement')
    
        # Update
        update(g, septo_eval.dt, growth_controler, senescence_model=sen_model, label='LeafElement')
        
        if rain_eval:
            g, nb = disperse(g, emitter, transporter, "septoria", label='LeafElement')
        else:
            nb=0.
        nb_dus.append(nb)
        
        # Check that the lesion is in the right status and has the right surface
        lesion = g.property('lesions')
        if lesion:
            assert sum(len(l) for l in lesion.itervalues()) == 1
            l = lesion.values()[0][0]
            surface.append(l.surface)
            surface_alive.append(l.surface_alive)
            surface_empty.append(l.surface_empty)
            stock_spores.append(l.stock_spores)
            # if i==299:
                # import pdb
                # pdb.set_trace()
            l.compute_all_surfaces()
            f = l.fungus
            print('lesion surface: %f' % round(l.surface, 6))
            
    return g, surface, surface_alive, surface_empty, nb_dus, stock_spores
                       rain_intensity = weather_eval.value.rain.mean(),
                       wetness = weather_eval.value.wetness[0],
                       relative_humidity = weather_eval.value.relative_humidity[0],
                       wind_speed = weather_eval.value.wind_speed[0],
                       wind_direction = (1,0,0))

    # Grow vine canopy
    if vine_eval:
        print(vine_eval.value.datetime[0])
        g,_ = grow_canopy(g, vine, vine_eval.value)
        add_area_topvine(g)
    
    # Develop disease
    if mildew_eval:
        # Update g for the disease
        update_healthy_area(g, label = 'lf')
        
        # Refill pool of initial inoculum to simulate differed availability
        labels = g.property('label')
        if ind < 500 and labels[188]=='lf' and ind%50==0:
            dispersal_units = generate_stock_du(nb_dus=100, disease=powdery_mildew)
            try:
                g.node(188).dispersal_units += dispersal_units
            except: 
                g.node(188).dispersal_units = dispersal_units
               
        # Update dispersal units and lesions
        infect(g, mildew_eval.dt, infection_controler, label='lf')
        update(g, mildew_eval.dt, growth_controler, senescence_model=None, label='lf')
        
        # Disperse
Beispiel #7
0
def run_sim(year=1999, nb_dus=1, model='septoria_exchanging_rings', **kwds):
    # Set the seed of the simulation
    rd.seed(0)
    np.random.seed(0)

    # Read weather and adapt it to septoria (add wetness)
    weather_file = 'meteo'+ str(year-1)[-2:] + '-' + str(year)[-2:] + '.txt'
    meteo_path = shared_data(alinea.septo3d, weather_file)
    weather = Weather(data_file=meteo_path)
    weather.check(varnames=['wetness'], models={'wetness':wetness_rapilly})
    seq = pandas.date_range(start = str(year)+"-02-01 01:00:00",
                            end = str(year)+"-05-01 01:00:00", 
                            freq='H')

    # Generation of 1 leaf
    g = leaf()
    set_properties(g, label = 'LeafElement', area=20., green_area=20., position_senescence=1)
    source_leaf = g.node(10)
    blade_id = 8
    inspector = LeafInspector(g, blade_id=blade_id)

    # Initialize the models for septoria
    if 'alinea.alep.'+model in sys.modules:
        del(sys.modules['alinea.alep.'+model])
    septoria = plugin_septoria(model)
    DU = septoria.dispersal_unit(**kwds)
    growth_controler = NoPriorityGrowthControl()

    # Define the schedule of calls for each model
    every_h = time_filter(seq, delay=1)
    every_24h = time_filter(seq, delay=24)
    every_rain = rain_filter(seq, weather)
    weather_timing = IterWithDelays(*time_control(seq, every_h, weather.data))
    wheat_timing = IterWithDelays(*time_control(seq, every_24h, weather.data))
    septo_timing = IterWithDelays(*time_control(seq, every_h, weather.data))
    rain_timing = IterWithDelays(*time_control(seq, every_rain, weather.data))

    # Simulation ############################################################
    for i, controls in enumerate(zip(weather_timing, wheat_timing, septo_timing, rain_timing)):
        weather_eval, wheat_eval, septo_eval, rain_eval = controls
        
        # Get weather for date and add it as properties on leaves
        if weather_eval:
            # set_properties(g,label = 'LeafElement',
                           # temp = weather_eval.value.temperature_air[0],
                           # wetness = weather_eval.value.wetness[0],
                           # relative_humidity = weather_eval.value.relative_humidity[0],
                           # wind_speed = weather_eval.value.wind_speed[0])
            set_properties(g,label = 'LeafElement',
                           temp = 22.,
                           wetness = True,
                           relative_humidity = 90,
                           wind_speed = 0.)
        if rain_eval:
            # set_properties(g,label = 'LeafElement',
                           # rain_intensity = rain_eval.value.rain.mean(),
                           # rain_duration = len(rain_eval.value.rain) if rain_eval.value.rain.sum() > 0 else 0.)
            set_properties(g,label = 'LeafElement',
                           rain_intensity = 0.,
                           rain_duration = 0.) 
             
        # Develop disease
        if septo_eval:
            # Update g for the disease
            update_healthy_area(g, label = 'LeafElement')
            
            # Inoculation
            if i==1:
                # if i<=2.5*24:
                    # nb_dus=i
                # else:
                    # nb_dus= i - (i/2.5*24)
                dus = [DU(nb_spores=1., status='deposited') for i in range(int(nb_dus))]
                try:
                    source_leaf.dispersal_units += dus
                except:
                    source_leaf.dispersal_units = dus
            
            # Update dispersal units and lesions
            infect(g, septo_eval.dt, label='LeafElement')
            
            # if i>=753:
                # import pdb
                # pdb.set_trace()
            update(g, septo_eval.dt, growth_controler, label='LeafElement')
        
            # Save outputs   
            inspector.update_variables(g)
            inspector.update_du_variables(g)
    return inspector
Beispiel #8
0
def run_simulation():
    # Initialization #####################################################
    # Set the seed of the simulation
    rd.seed(0)
    np.random.seed(0)

    # Read weather and adapt it to septoria (add wetness)
    meteo_path = shared_data(alinea.septo3d, 'meteo98-99.txt')
    weather = Weather(data_file=meteo_path)
    weather.check(varnames=['wetness'], models={'wetness': wetness_rapilly})
    seq = pandas.date_range(start="1998-10-01 01:00:00",
                            end="1999-07-01 01:00:00",
                            freq='H')

    # Initialize a wheat canopy
    g, wheat, domain_area, domain = initialize_stand(age=0.,
                                                     length=0.1,
                                                     width=0.2,
                                                     sowing_density=150,
                                                     plant_density=150,
                                                     inter_row=0.12,
                                                     seed=8)

    # Initialize the models for septoria
    # septoria = new_septoria(senescence_treshold=senescence_treshold)
    septoria = plugin_septoria()
    inoculator = RandomInoculation()
    growth_controler = NoPriorityGrowthControl()
    infection_controler = BiotrophDUPositionModel()
    sen_model = WheatSeptoriaPositionedSenescence(g, label='LeafElement')
    emitter = SeptoriaRainEmission(domain_area=domain_area)
    transporter = Septo3DSplash(reference_surface=domain_area)
    washor = RapillyWashing()

    # Define the schedule of calls for each model
    every_h = time_filter(seq, delay=1)
    every_24h = time_filter(seq, delay=24)
    every_rain = rain_filter(seq, weather)
    weather_timing = IterWithDelays(*time_control(seq, every_h, weather.data))
    wheat_timing = IterWithDelays(*time_control(seq, every_24h, weather.data))
    septo_timing = IterWithDelays(*time_control(seq, every_h, weather.data))
    rain_timing = IterWithDelays(*time_control(seq, every_rain, weather.data))

    # Call leaf inspectors for target blades (top 3)
    inspectors = {}
    # for rank in range(1,3):
    # inspectors[rank] = LeafInspector(g, blade_id=find_blade_id(g, leaf_rank = rank, only_visible=False))
    inspectors[1] = LeafInspector(g, blade_id=96)
    # inspectors[2] = LeafInspector(g, blade_id=88)
    # inspectors[3] = LeafInspector(g, blade_id=80)
    dates = []
    # Simulation #########################################################
    for i, controls in enumerate(
            zip(weather_timing, wheat_timing, septo_timing, rain_timing)):
        weather_eval, wheat_eval, septo_eval, rain_eval = controls

        # Update date
        date = weather_eval.value.index[0]
        dates.append(date)

        # Get weather for date and add it as properties on leaves
        if weather_eval:
            set_properties(
                g,
                label='LeafElement',
                temp=weather_eval.value.temperature_air[0],
                wetness=weather_eval.value.wetness[0],
                relative_humidity=weather_eval.value.relative_humidity[0],
                wind_speed=weather_eval.value.wind_speed[0])
        if rain_eval:
            set_properties(g,
                           label='LeafElement',
                           rain_intensity=rain_eval.value.rain.mean(),
                           rain_duration=len(rain_eval.value.rain)
                           if rain_eval.value.rain.sum() > 0 else 0.)

        # Grow wheat canopy
        if wheat_eval:
            print(date)
            g, _ = grow_canopy(g, wheat, wheat_eval.value)
            # Note : The position of senescence goes back to its initial value after
            # a while for undetermined reason
            # --> temporary hack for keeping senescence position low when it is over
            positions = g.property('position_senescence')
            are_green = g.property('is_green')
            areas = g.property('area')
            senesced_areas = g.property('senesced_area')
            leaves = get_leaves(g, label='LeafElement')
            vids = [leaf for leaf in leaves if leaf in g.property('geometry')]
            positions.update({
                vid: (0 if (positions[vid] == 1 and not are_green[vid]) or
                      (positions[vid] > 0 and round(areas[vid], 5) == round(
                          senesced_areas[vid], 5)) else positions[vid])
                for vid in vids
            })

        # Develop disease
        if septo_eval:
            sen_model.find_senescent_lesions(g, label='LeafElement')
            update_healthy_area(g, label='LeafElement')
            if rain_eval and i <= 500:
                # Refill pool of initial inoculum to simulate differed availability
                dispersal_units = generate_stock_du(nb_dus=rd.randint(0, 5),
                                                    disease=septoria)
                initiate(g, dispersal_units, inoculator)
            infect(g, septo_eval.dt, infection_controler, label='LeafElement')
            update(g,
                   septo_eval.dt,
                   growth_controler,
                   sen_model,
                   label='LeafElement')
        if rain_eval:
            if rain_eval.value.rain.mean() > 0:
                g, nb = disperse(g,
                                 emitter,
                                 transporter,
                                 "septoria",
                                 label='LeafElement')
                for inspector in inspectors.itervalues():
                    inspector.update_du_variables(g)
                wash(g,
                     washor,
                     rain_eval.value.rain.mean(),
                     label='LeafElement')
                # Save outputs after washing
                infection_controler.control_position(g)
                for inspector in inspectors.itervalues():
                    inspector.update_du_variables(g)
                    inspector.update_green_area(g)
                    inspector.update_healthy_area(g)
            else:
                for inspector in inspectors.itervalues():
                    inspector.nb_dus += [0, 0]
                    inspector.nb_dus_on_green += [0, 0]
                    inspector.nb_dus_on_healthy += [0, 0]
                    inspector.update_green_area(g)
                    inspector.update_healthy_area(g)
        else:
            for inspector in inspectors.itervalues():
                inspector.nb_dus += [0, 0]
                inspector.nb_dus_on_green += [0, 0]
                inspector.nb_dus_on_healthy += [0, 0]
                inspector.update_green_area(g)
                inspector.update_healthy_area(g)

        for inspector in inspectors.itervalues():
            inspector.compute_nb_infections(g)

        if wheat_eval:
            update_plot(g)
            # scene = plot3d(g)
            # index = i/24
            # if index < 10 :
            # image_name='./images_septo2/image0000%d.png' % index
            # elif index < 100 :
            # image_name='./images_septo2/image000%d.png' % index
            # elif index < 1000 :
            # image_name='./images_septo2/image00%d.png' % index
            # elif index < 10000 :
            # image_name='./images_septo2/image0%d.png' % index
            # else :
            # image_name='./images_septo/image%d.png' % index
            # save_image(scene, image_name=image_name)

    # Tout stocker dans un dataframe avec les dates en index
    outs = {
        'nb_dus': inspectors[1].nb_dus[::2],
        'nb_unwashed_dus': inspectors[1].nb_dus[1::2],
        'nb_dus_on_healthy': inspectors[1].nb_dus_on_healthy[1::2],
        'nb_infections': inspectors[1].nb_infections,
        'green_area': inspectors[1].leaf_green_area,
        'healthy_area': inspectors[1].leaf_healthy_area
    }
    outputs = pandas.DataFrame(data=outs, index=dates)
    return outputs
Beispiel #9
0
def run_simulation_septoria():
    # Initialization #####################################################
    # Set the seed of the simulation
    rd.seed(0)
    np.random.seed(0)

    # Choose dates of simulation and initialize the value of date
    start_date = datetime(2000, 10, 1, 1, 00, 00)
    end_date = datetime(2001, 07, 01, 00, 00)
    date = None

    # Read weather and adapt it to septoria (add wetness)
    weather = get_septoria_weather(data_file='meteo01.csv')

    # Initialize a wheat canopy
    g, wheat, domain_area, domain = initialize_stand(age=0.,
                                                     length=0.1,
                                                     width=0.2,
                                                     sowing_density=150,
                                                     plant_density=150,
                                                     inter_row=0.12)

    # Initialize the models for septoria
    septoria = plugin_septoria()
    inoculator = RandomInoculation()
    growth_controler = NoPriorityGrowthControl()
    infection_controler = BiotrophDUPositionModel()
    sen_model = WheatSeptoriaPositionedSenescence(g, label='LeafElement')
    emitter = SeptoriaRainEmission()
    transporter = Septo3DSplash(reference_surface=domain_area)
    washor = RapillyWashing()

    # Define the schedule of calls for each model
    nb_steps = len(pandas.date_range(start_date, end_date, freq='H'))
    weather_timing = TimeControl(delay=1, steps=nb_steps)
    wheat_timing = TimeControl(delay=24,
                               steps=nb_steps,
                               model=wheat,
                               weather=weather,
                               start_date=start_date)
    septo_timing = TimeControl(delay=1, steps=nb_steps)
    timer = TimeControler(weather=weather_timing,
                          wheat=wheat_timing,
                          disease=septo_timing)

    # Call leaf inspectors for target blades (top 3)
    inspectors = {}
    # for rank in range(1,3):
    # inspectors[rank] = LeafInspector(g, blade_id=find_blade_id(g, leaf_rank = rank, only_visible=False))
    inspectors[1] = LeafInspector(g, blade_id=96)
    inspectors[2] = LeafInspector(g, blade_id=88)
    inspectors[3] = LeafInspector(g, blade_id=80)
    inspectors[4] = LeafInspector(g, blade_id=72)
    dates = []
    # Simulation #########################################################
    for t in timer:
        # print(timer.numiter)
        # Update date
        date = (weather.next_date(t['weather'].dt, date)
                if date != None else start_date)
        dates.append(date)
        print(date)

        # Get weather for date and add it as properties on leaves
        _, data = weather.get_weather(t['weather'].dt, date)
        set_properties(g,
                       label='LeafElement',
                       wetness=data.wetness.values[0],
                       temp=data.temperature_air.values[0],
                       rain_intensity=data.rain.values[0],
                       rain_duration=data.rain_duration.values[0],
                       relative_humidity=data.relative_humidity.values[0],
                       wind_speed=data.wind_speed.values[0])

        # Grow wheat canopy
        grow_canopy(g, wheat, t['wheat'])
        update_healthy_area(g, label='LeafElement')
        # Note : The position of senescence goes back to its initial value after
        # a while for undetermined reason
        # --> temporary hack for keeping senescence position low when it is over
        positions = g.property('position_senescence')
        are_green = g.property('is_green')
        leaves = get_leaves(g, label='LeafElement')
        vids = [leaf for leaf in leaves if leaf in g.property('geometry')]
        positions.update({
            vid: (0 if positions[vid] == 1 and not are_green[vid] else
                  positions[vid])
            for vid in vids
        })

        # Develop disease
        if data.dispersal_event.values[
                0] == True and timer.numiter >= 1000 and timer.numiter <= 2000:
            # Refill pool of initial inoculum to simulate differed availability
            dispersal_units = generate_stock_du(nb_dus=10, disease=septoria)
            initiate(g, dispersal_units, inoculator)

        infect(g, t['disease'].dt, infection_controler, label='LeafElement')
        update(g,
               t['disease'].dt,
               growth_controler,
               sen_model,
               label='LeafElement')
        for inspector in inspectors.itervalues():
            inspector.compute_severity(g)
            inspector.update_disease_area(g)
            inspector.update_green_area(g)
            inspector.update_area(g)
        if data.dispersal_event.values[0] == True:
            disperse(g, emitter, transporter, "septoria", label='LeafElement')
            wash(g, washor, data.rain.values[0], label='LeafElement')

        # if timer.numiter%24 == 0:
        # update_plot(g)

    # Tout stocker dans un dataframe avec les dates en index
    outputs = {}
    for id, inspector in inspectors.iteritems():
        outs = {
            'severity': inspectors[id].severity,
            'disease_area': inspectors[id].leaf_disease_area,
            'green_area': inspectors[id].leaf_green_area,
            'total_area': inspectors[id].leaf_area
        }
        outputs[id] = pandas.DataFrame(data=outs, index=dates)
    return outputs
def run_simulation_septoria():
    # Initialization #####################################################
    # Set the seed of the simulation
    rd.seed(0)
    np.random.seed(0)

    # Choose dates of simulation and initialize the value of date
    start_date = datetime(2000, 10, 1, 1, 00, 00)
    end_date = datetime(2001, 07, 01, 00, 00)
    date = None

    # Read weather and adapt it to septoria (add wetness)
    weather = get_septoria_weather(data_file='meteo01.csv')

    # Initialize a wheat canopy
    g, wheat, domain_area, domain = initialize_stand(age=0., length=0.1, 
                                                     width=0.2, sowing_density=150,
                                                     plant_density=150, inter_row=0.12)

    # Initialize the models for septoria
    septoria = plugin_septoria()
    inoculator = RandomInoculation()
    growth_controler = NoPriorityGrowthControl()
    infection_controler = BiotrophDUPositionModel()
    sen_model = WheatSeptoriaPositionedSenescence(g, label='LeafElement')
    emitter = SeptoriaRainEmission()
    transporter = Septo3DSplash(reference_surface=domain_area)
    washor = RapillyWashing()

    # Define the schedule of calls for each model
    nb_steps = len(pandas.date_range(start_date, end_date, freq='H'))
    weather_timing = TimeControl(delay=1, steps=nb_steps)
    wheat_timing = TimeControl(delay=24, steps=nb_steps, model=wheat, weather=weather, start_date=start_date)
    septo_timing = TimeControl(delay=1, steps=nb_steps)
    timer = TimeControler(weather=weather_timing, wheat=wheat_timing, disease = septo_timing)

    # Call leaf inspectors for target blades (top 3)
    inspectors = {}
    # for rank in range(1,3):
        # inspectors[rank] = LeafInspector(g, blade_id=find_blade_id(g, leaf_rank = rank, only_visible=False))
    inspectors[1] = LeafInspector(g, blade_id=96)
    inspectors[2] = LeafInspector(g, blade_id=88)
    inspectors[3] = LeafInspector(g, blade_id=80)
    inspectors[4] = LeafInspector(g, blade_id=72)
    dates = []
    # Simulation #########################################################
    for t in timer:
        # print(timer.numiter)
        # Update date
        date = (weather.next_date(t['weather'].dt, date) if date!=None else start_date)
        dates.append(date)
        print(date)
        
        # Get weather for date and add it as properties on leaves
        _, data = weather.get_weather(t['weather'].dt, date)
        set_properties(g,label = 'LeafElement',
                        wetness = data.wetness.values[0],
                        temp = data.temperature_air.values[0],
                        rain_intensity = data.rain.values[0],
                        rain_duration = data.rain_duration.values[0],
                        relative_humidity = data.relative_humidity.values[0],
                        wind_speed = data.wind_speed.values[0])

        # Grow wheat canopy
        grow_canopy(g,wheat,t['wheat'])
        update_healthy_area(g, label = 'LeafElement')
        # Note : The position of senescence goes back to its initial value after
        # a while for undetermined reason
        # --> temporary hack for keeping senescence position low when it is over
        positions = g.property('position_senescence')
        are_green = g.property('is_green')
        leaves = get_leaves(g, label = 'LeafElement')
        vids = [leaf for leaf in leaves if leaf in g.property('geometry')]
        positions.update({vid:(0 if positions[vid]==1 and not are_green[vid] else positions[vid]) 
                          for vid in vids})
        
        # Develop disease
        if data.dispersal_event.values[0]==True and timer.numiter >= 1000 and timer.numiter <= 2000:
            # Refill pool of initial inoculum to simulate differed availability
            dispersal_units = generate_stock_du(nb_dus=10, disease=septoria)
            initiate(g, dispersal_units, inoculator)
          
        infect(g, t['disease'].dt, infection_controler, label='LeafElement')
        update(g, t['disease'].dt, growth_controler, sen_model, label='LeafElement')
        for inspector in inspectors.itervalues():
            inspector.compute_severity(g)
            inspector.update_disease_area(g)
            inspector.update_green_area(g)
            inspector.update_area(g)
        if data.dispersal_event.values[0]==True:
            disperse(g, emitter, transporter, "septoria", label='LeafElement')
            wash(g, washor, data.rain.values[0], label='LeafElement')

        # if timer.numiter%24 == 0:
            # update_plot(g)
            
    # Tout stocker dans un dataframe avec les dates en index
    outputs = {}
    for id, inspector in inspectors.iteritems():
        outs = {'severity':inspectors[id].severity,
                'disease_area': inspectors[id].leaf_disease_area,
                'green_area': inspectors[id].leaf_green_area,
                'total_area':inspectors[id].leaf_area}
        outputs[id] = pandas.DataFrame(data=outs, index=dates)
    return outputs
Beispiel #11
0
def test_growth_control(model="septoria_exchanging_rings"):
    """ Check if 'control_growth' from 'protocol.py' limits the lesion growth
        up to available surface on the leaf.

    Generate a wheat MTG and deposit sumultaneously 1000 lesions on a leaf element.
    Run a loop to compute update and growth. Check that the healthy surface of the
    leaf decreases up to 0. Check that lesion growth is stopped after this point.

    Parameters
    ----------
    model: model
        One version of the model of septoria lesion among:
        'septoria_exchanging_rings', 'septoria_with_rings', 'septoria_continuous'
    """
    # Generate a wheat MTG
    g = adel_one_leaf()
    initial_leaf_area = 5.
    set_properties(g,
                   label='LeafElement',
                   area=initial_leaf_area,
                   green_area=initial_leaf_area,
                   healthy_area=initial_leaf_area,
                   position_senescence=None)
    labels = g.property('label')
    total_initial_area = sum(
        g.node(vid).area for vid in labels.iterkeys()
        if labels[vid].startswith('LeafElement'))

    # Generate a stock of septoria dispersal units and distribute it on g
    distribute_lesions(g,
                       nb_lesions=1000,
                       disease_model=model,
                       initiation_model=RandomInoculation(),
                       label='LeafElement')

    # Call model of growth control
    controler = NoPriorityGrowthControl()

    # Initiation of healthy area the day before
    healthy_area_before = []

    # Loop of simulation
    septo_timing = TimeControl(delay=1, steps=100)
    timer = TimeControler(disease=septo_timing)
    for t in timer:
        # print(timer.numiter)
        # After infection, the lesion 'age_dday' will be added 1 DD by time step
        # Note : base temperature for septoria = -2 degrees celsius
        set_properties(g,
                       label='LeafElement',
                       wetness=True,
                       temp=22.,
                       rain_intensity=0.)

        # Update
        update(g,
               t['disease'].dt,
               controler,
               senescence_model=None,
               label='LeafElement')
        update_healthy_area(g, label='LeafElement')

        # Find the value of interest on the MTG (total healthy area of the leaf)
        lesions = g.property('lesions')
        healthy_areas = g.property('healthy_area')

        bids = (v for v, l in labels.iteritems() if l.startswith('blade'))
        for blade in bids:
            leaf = [
                vid for vid in g.components(blade)
                if labels[vid].startswith('LeafElement')
            ]
            leaf_healthy_area = sum(healthy_areas[lf] for lf in leaf)
            print(leaf_healthy_area)

        # Check that healthy area + lesion surface = initial healthy surface
        if lesions:
            leaf_lesion_area = sum(l.surface for les in lesions.itervalues()
                                   for l in les)
            assert round(leaf_healthy_area, 6) + round(
                leaf_lesion_area, 6) == round(total_initial_area, 6)

        # Check that healthy area decreases after emergence of the first lesion
        if lesions and not healthy_area_before:
            # Emergence of the first lesion
            healthy_area_before.append(leaf_healthy_area)
        elif lesions and healthy_area_before[0] > 0.:
            # Check that healthy area decreases
            assert leaf_healthy_area < healthy_area_before
            # Update of 'healthy_area_before' for next step
            healthy_area_before[0] = leaf_healthy_area
        elif lesions and healthy_area_before[0] == 0.:
            # Check that healthy area stays null
            assert leaf_healthy_area == 0.
            # Update of 'healthy_surface_before' for next step
            healthy_area_before[0] = leaf_healthy_area
def run_simulation():
    # Initialization #####################################################
    # Set the seed of the simulation
    rd.seed(0)
    np.random.seed(0)

    # Read weather and adapt it to septoria (add wetness)
    meteo_path = shared_data(alinea.septo3d, 'meteo98-99.txt')
    weather = Weather(data_file=meteo_path)
    weather.check(varnames=['wetness'], models={'wetness':wetness_rapilly})
    seq = pandas.date_range(start = "1998-10-01 01:00:00",
                            end = "1999-07-01 01:00:00", 
                            freq='H')

    # Initialize a wheat canopy
    g, wheat, domain_area, domain = initialize_stand(age=0., length=0.1, 
                                                    width=0.2, sowing_density=150,
                                                    plant_density=150, inter_row=0.12, 
                                                    seed=8)

    # Initialize the models for septoria
    # septoria = new_septoria(senescence_treshold=senescence_treshold)
    septoria = plugin_septoria()
    inoculator = RandomInoculation()
    growth_controler = NoPriorityGrowthControl()
    infection_controler = BiotrophDUPositionModel()
    sen_model = WheatSeptoriaPositionedSenescence(g, label='LeafElement')
    emitter = SeptoriaRainEmission(domain_area=domain_area)
    transporter = Septo3DSplash(reference_surface=domain_area)
    washor = RapillyWashing()

    # Define the schedule of calls for each model
    every_h = time_filter(seq, delay=1)
    every_24h = time_filter(seq, delay=24)
    every_rain = rain_filter(seq, weather)
    weather_timing = IterWithDelays(*time_control(seq, every_h, weather.data))
    wheat_timing = IterWithDelays(*time_control(seq, every_24h, weather.data))
    septo_timing = IterWithDelays(*time_control(seq, every_h, weather.data))
    rain_timing = IterWithDelays(*time_control(seq, every_rain, weather.data))
    
    # Call leaf inspectors for target blades (top 3)
    inspectors = {}
    # for rank in range(1,3):
        # inspectors[rank] = LeafInspector(g, blade_id=find_blade_id(g, leaf_rank = rank, only_visible=False))
    inspectors[1] = LeafInspector(g, blade_id=96)
    # inspectors[2] = LeafInspector(g, blade_id=88)
    # inspectors[3] = LeafInspector(g, blade_id=80)
    dates = []
    # Simulation #########################################################
    for i,controls in enumerate(zip(weather_timing, wheat_timing, 
                                    septo_timing, rain_timing)):
        weather_eval, wheat_eval, septo_eval, rain_eval = controls
        
        # Update date
        date = weather_eval.value.index[0]
        dates.append(date)
        
        # Get weather for date and add it as properties on leaves
        if weather_eval:
            set_properties(g,label = 'LeafElement',
                           temp = weather_eval.value.temperature_air[0],
                           wetness = weather_eval.value.wetness[0],
                           relative_humidity = weather_eval.value.relative_humidity[0],
                           wind_speed = weather_eval.value.wind_speed[0])
        if rain_eval:
            set_properties(g,label = 'LeafElement',
                           rain_intensity = rain_eval.value.rain.mean(),
                           rain_duration = len(rain_eval.value.rain) if rain_eval.value.rain.sum() > 0 else 0.)

        # Grow wheat canopy
        if wheat_eval:
            print(date)
            g,_ = grow_canopy(g, wheat, wheat_eval.value)
            # Note : The position of senescence goes back to its initial value after
            # a while for undetermined reason
            # --> temporary hack for keeping senescence position low when it is over
            positions = g.property('position_senescence')
            are_green = g.property('is_green')
            areas = g.property('area')
            senesced_areas = g.property('senesced_area')
            leaves = get_leaves(g, label = 'LeafElement')
            vids = [leaf for leaf in leaves if leaf in g.property('geometry')]
            positions.update({vid:(0 if (positions[vid]==1 and not are_green[vid]) or
                                        (positions[vid]>0 and round(areas[vid],5)==round(senesced_areas[vid],5))
                                        else positions[vid]) for vid in vids})
            
        # Develop disease
        if septo_eval:
            sen_model.find_senescent_lesions(g, label = 'LeafElement')
            update_healthy_area(g, label = 'LeafElement')
            if rain_eval and i <= 500:
                # Refill pool of initial inoculum to simulate differed availability
                dispersal_units = generate_stock_du(nb_dus=rd.randint(0,5), disease=septoria)
                initiate(g, dispersal_units, inoculator)
            infect(g, septo_eval.dt, infection_controler, label='LeafElement')
            update(g, septo_eval.dt, growth_controler, sen_model, label='LeafElement')
        if rain_eval:
            if rain_eval.value.rain.mean()>0:
                g, nb = disperse(g, emitter, transporter, "septoria", label='LeafElement')
                for inspector in inspectors.itervalues():
                    inspector.update_du_variables(g)
                wash(g, washor, rain_eval.value.rain.mean(), label='LeafElement')
                # Save outputs after washing
                infection_controler.control_position(g)
                for inspector in inspectors.itervalues():
                    inspector.update_du_variables(g)
                    inspector.update_green_area(g)
                    inspector.update_healthy_area(g)
            else:
                for inspector in inspectors.itervalues():
                    inspector.nb_dus += [0, 0]
                    inspector.nb_dus_on_green += [0, 0]
                    inspector.nb_dus_on_healthy += [0, 0]
                    inspector.update_green_area(g)
                    inspector.update_healthy_area(g)
        else:
            for inspector in inspectors.itervalues():
                inspector.nb_dus += [0, 0]
                inspector.nb_dus_on_green += [0, 0]
                inspector.nb_dus_on_healthy += [0, 0]
                inspector.update_green_area(g)
                inspector.update_healthy_area(g)
        
        for inspector in inspectors.itervalues():
            inspector.compute_nb_infections(g)
        
        if wheat_eval:
            update_plot(g)
            # scene = plot3d(g)
            # index = i/24
            # if index < 10 :
                # image_name='./images_septo2/image0000%d.png' % index
            # elif index < 100 :
                # image_name='./images_septo2/image000%d.png' % index
            # elif index < 1000 :
                # image_name='./images_septo2/image00%d.png' % index
            # elif index < 10000 :
                # image_name='./images_septo2/image0%d.png' % index
            # else :
                # image_name='./images_septo/image%d.png' % index
            # save_image(scene, image_name=image_name)
            
    # Tout stocker dans un dataframe avec les dates en index
    outs = {'nb_dus':inspectors[1].nb_dus[::2],
            'nb_unwashed_dus':inspectors[1].nb_dus[1::2],
            'nb_dus_on_healthy':inspectors[1].nb_dus_on_healthy[1::2],
            'nb_infections':inspectors[1].nb_infections,
            'green_area':inspectors[1].leaf_green_area,
            'healthy_area':inspectors[1].leaf_healthy_area}
    outputs = pandas.DataFrame(data=outs, index=dates)
    return outputs
Beispiel #13
0
     # --> temporary hack for keeping senescence position low when it is over
     positions = g.property('position_senescence')
     greens = g.property('is_green')
     areas = g.property('area')
     senesced_areas = g.property('senesced_area')
     leaves = get_leaves(g, label = 'LeafElement')
     vids = [leaf for leaf in leaves if leaf in g.property('geometry')]
     positions.update({vid:(0 if (positions[vid]==1 and not greens[vid]) or
                                 (positions[vid]>0 and round(areas[vid],5)==round(senesced_areas[vid],5))
                                 else positions[vid]) for vid in vids})
                                 
 # Develop disease
 if septo_eval:
     # Update g for the disease
     sen_model.find_senescent_lesions(g, label = 'LeafElement')
     update_healthy_area(g, label = 'LeafElement')
     
     # Possibly refill pool of initial inoculum to simulate differed availability
     if rain_eval and i <= 700 and source_leaf.geometry!=None:
         dus = generate_stock_du(nb_dus=rd.randint(0,5), disease=septoria)
         try:
             source_leaf.dispersal_units += dus
         except:
             source_leaf.dispersal_units = dus
     
     # Update dispersal units and lesions
     infect(g, septo_eval.dt, infection_controler, label='LeafElement')
     update(g, septo_eval.dt, growth_controler, sen_model, label='LeafElement')
     
 # Disperse and wash
 if rain_eval:
Beispiel #14
0
def run_simulation(start_year, variability=True, **kwds):
    # Set the seed of the simulation
    rd.seed(0)
    np.random.seed(0)

    # Read weather and adapt it to septoria (add wetness)
    weather_file = 'meteo' + str(start_year)[-2:] + '-' + str(start_year +
                                                              1)[-2:] + '.txt'
    meteo_path = shared_data(alinea.septo3d, weather_file)
    weather = Weather(data_file=meteo_path)
    weather.check(varnames=['wetness'], models={'wetness': wetness_rapilly})
    seq = pandas.date_range(start=str(start_year) + "-10-01 01:00:00",
                            end=str(start_year + 1) + "-07-01 01:00:00",
                            freq='H')

    # Initialize a wheat canopy
    g, wheat, domain_area, domain = initialize_stand(age=0.,
                                                     length=0.1,
                                                     width=0.2,
                                                     sowing_density=150,
                                                     plant_density=150,
                                                     inter_row=0.12,
                                                     seed=3)

    # Initialize the models for septoria
    if 'alinea.alep.septoria_age_physio' in sys.modules:
        del (sys.modules['alinea.alep.septoria_age_physio'])
    if variability == True:
        septoria = variable_septoria(**kwds)
    else:
        septoria = plugin_septoria(model="septoria_age_physio")
    DU = septoria.dispersal_unit()
    inoculator = RandomInoculation()
    growth_controler = NoPriorityGrowthControl()
    infection_controler = BiotrophDUPositionModel()
    sen_model = WheatSeptoriaPositionedSenescence(g, label='LeafElement')
    emitter = SeptoriaRainEmission(domain_area=domain_area)
    transporter = Septo3DSplash(reference_surface=domain_area)
    washor = RapillyWashing()

    # Define the schedule of calls for each model
    every_h = time_filter(seq, delay=1)
    every_24h = time_filter(seq, delay=24)
    every_rain = rain_filter(seq, weather)
    weather_timing = IterWithDelays(*time_control(seq, every_h, weather.data))
    wheat_timing = IterWithDelays(*time_control(seq, every_24h, weather.data))
    septo_timing = IterWithDelays(*time_control(seq, every_h, weather.data))
    rain_timing = IterWithDelays(*time_control(seq, every_rain, weather.data))

    # Call leaf inspectors for target blades (top 3)
    inspectors = {}
    first_blade = 80
    ind = 4.
    for blade in range(first_blade, 104, 8):
        ind -= 1
        inspectors[ind] = LeafInspector(g, blade_id=blade)

    # Simulation loop
    for i, controls in enumerate(
            zip(weather_timing, wheat_timing, septo_timing, rain_timing)):
        weather_eval, wheat_eval, septo_eval, rain_eval = controls

        # Update date
        date = weather_eval.value.index[0]

        # Get weather for date and add it as properties on leaves
        if weather_eval:
            set_properties(
                g,
                label='LeafElement',
                temp=weather_eval.value.temperature_air[0],
                wetness=weather_eval.value.wetness[0],
                relative_humidity=weather_eval.value.relative_humidity[0],
                wind_speed=weather_eval.value.wind_speed[0])
        if rain_eval:
            set_properties(g,
                           label='LeafElement',
                           rain_intensity=rain_eval.value.rain.mean(),
                           rain_duration=len(rain_eval.value.rain)
                           if rain_eval.value.rain.sum() > 0 else 0.)

        # Grow wheat canopy
        if wheat_eval:
            print(date)
            g, _ = grow_canopy(g, wheat, wheat_eval.value)
            # Note : The position of senescence goes back to its initial value after
            # a while for undetermined reason
            # --> temporary hack for keeping senescence position low when it is over
            positions = g.property('position_senescence')
            are_green = g.property('is_green')
            leaves = get_leaves(g, label='LeafElement')
            positions.update({
                leaf: (0 if positions[leaf] == 1 and not are_green[leaf] else
                       positions[leaf])
                for leaf in leaves
            })

        # Develop disease
        if septo_eval:
            sen_model.find_senescent_lesions(g, label='LeafElement')
            update_healthy_area(g, label='LeafElement')
            if rain_eval and i <= 500:
                # Refill pool of initial inoculum to simulate differed availability
                if rd.random() < 0.4:
                    dispersal_units = [
                        DU(nb_spores=rd.randint(1, 100), status='emitted')
                        for i in range(rd.randint(0, 3))
                    ]
                    initiate(g, dispersal_units, inoculator)
            infect(g, septo_eval.dt, infection_controler, label='LeafElement')
            update(g,
                   septo_eval.dt,
                   growth_controler,
                   sen_model,
                   label='LeafElement')

        les = g.property('lesions')
        lesions = sum([l for l in les.values()], [])

        print([l.fungus.degree_days_to_chlorosis for l in lesions])

        # if len(lesions)>10:
        # import pdb
        # pdb.set_trace()

        if rain_eval:
            g, nb = disperse(g,
                             emitter,
                             transporter,
                             "septoria",
                             label='LeafElement')
            wash(g, washor, rain_eval.value.rain.mean(), label='LeafElement')

        # Save outputs
        for inspector in inspectors.itervalues():
            inspector.update_variables(g)
            inspector.update_du_variables(g)

        if wheat_eval:
            plot_severity_by_leaf(g)

    return inspectors
def test_update(senescence_threshold=330.,
                sen_day=500.,
                model="septoria_exchanging_rings",
                **kwds):
    """ 
    """
    from alinea.alep.wheat import adel_one_leaf_element

    # Read weather and adapt it to septoria (add wetness)
    meteo_path = shared_data(alinea.septo3d, 'meteo00-01.txt')
    weather = Weather(data_file=meteo_path)
    weather.check(varnames=['wetness'], models={'wetness': wetness_rapilly})
    seq = pandas.date_range(start="2000-10-01 01:00:00",
                            end="2000-12-31 01:00:00",
                            freq='H')

    # Generate a wheat MTG
    g = adel_one_leaf_element()
    set_properties(g,
                   label='LeafElement',
                   area=5.,
                   green_area=5.,
                   healthy_area=5.,
                   position_senescence=1,
                   wetness=True,
                   temp=22.,
                   rain_intensity=0.,
                   relative_humidity=90.)

    # Generate one lesion of septoria and distribute it on g
    # septoria = new_septoria(senescence_threshold=senescence_threshold)
    septoria = plugin_septoria(model)
    Lesion = septoria.lesion(**kwds)
    leaf = g.node(10)
    leaf.lesions = [Lesion(nb_spores=1, position=[0.5, 0])]

    # Call model of growth control
    growth_controler = NoPriorityGrowthControl()
    sen_model = WheatSeptoriaPositionedSenescence(g, label='LeafElement')

    #Temp
    emitter = SeptoriaRainEmission(domain_area=0.0004)
    transporter = Septo3DSplash(reference_surface=0.0004)

    # Loop of simulation
    every_h = time_filter(seq, delay=1)
    every_rain = rain_filter(seq, weather)
    septo_timing = IterWithDelays(*time_control(seq, every_h, weather.data))
    rain_timing = IterWithDelays(*time_control(seq, every_rain, weather.data))
    surface = []
    surface_alive = []
    surface_empty = []
    nb_dus = []
    stock_spores = []
    for i, controls in enumerate(zip(septo_timing, rain_timing)):
        septo_eval, rain_eval = controls

        if i == sen_day:
            set_properties(g, label='LeafElement', position_senescence=0)
        if rain_eval:
            set_properties(g,
                           label='LeafElement',
                           rain_intensity=rain_eval.value.rain.mean(),
                           rain_duration=len(rain_eval.value.rain)
                           if rain_eval.value.rain.sum() > 0 else 0.)

        # Update healthy area
        sen_model.find_senescent_lesions(g, label='LeafElement')
        update_healthy_area(g, label='LeafElement')

        # Update
        update(g,
               septo_eval.dt,
               growth_controler,
               senescence_model=sen_model,
               label='LeafElement')

        if rain_eval:
            g, nb = disperse(g,
                             emitter,
                             transporter,
                             "septoria",
                             label='LeafElement')
        else:
            nb = 0.
        nb_dus.append(nb)

        # Check that the lesion is in the right status and has the right surface
        lesion = g.property('lesions')
        if lesion:
            assert sum(len(l) for l in lesion.itervalues()) == 1
            l = lesion.values()[0][0]
            surface.append(l.surface)
            surface_alive.append(l.surface_alive)
            surface_empty.append(l.surface_empty)
            stock_spores.append(l.stock_spores)
            # if i==299:
            # import pdb
            # pdb.set_trace()
            l.compute_all_surfaces()
            f = l.fungus
            print('lesion surface: %f' % round(l.surface, 6))

    return g, surface, surface_alive, surface_empty, nb_dus, stock_spores
Beispiel #16
0
def run_simulation():
    # Initialization #####################################################
    # Set the seed of the simulation
    rd.seed(0)
    np.random.seed(0)

    # Choose dates of simulation and initialize the value of date
    start_date = datetime(2001, 03, 1, 1, 00, 00)
    end_date = datetime(2001, 05, 1, 00, 00, 00)
    # end_date = datetime(2001, 07, 01, 00, 00)
    date = None

    # Read weather and adapt it to powdery mildew (add wetness)
    weather = Weather(data_file='meteo02.csv')
    weather = add_wetness(weather)
    
    # Initialize a vine canopy
    vine = Vine()
    g,_ = new_canopy(vine, age = 1)

    # Initialize the models for septoria
    diseases=plugin.discover('alep.disease')
    powdery_mildew = diseases['powdery_mildew'].load()
    inoculator = InoculationYoungLeaves(age_max=5.)
    growth_controler = GrowthControlVineLeaf()
    infection_controler = BiotrophDUProbaModel()
    emitter = PowderyMildewWindEmission()
    # transporter = PowderyMildewWindDispersal()
    transporter = NoDeposit()
    
    # Define the schedule of calls for each model
    nb_steps = len(pandas.date_range(start_date, end_date, freq='H'))
    weather_timing = TimeControl(delay=1, steps=nb_steps)
    vine_timing = TimeControl(delay=24, steps=nb_steps)
    mildew_timing = TimeControl(delay=1, steps=nb_steps)
    timer = TimeControler(weather=weather_timing, vine=vine_timing, disease = mildew_timing)

    # Call leaf inspectors for target blades (top 3)
    target_leaf = 6
    inspector = VineLeafInspector(leaf_id=target_leaf)
    dates = []
    # Simulation #########################################################
    for t in timer:
        # print(timer.numiter)
        # Update date
        date = (weather.next_date(t['weather'].dt, date) if date!=None else start_date)
        dates.append(date)
        print(date)
        
        # Get weather for date and add it as properties on leaves
        _, data = weather.get_weather(t['weather'].dt, date)
        set_properties(g,label = 'lf',
                        wetness = data.wetness.values[0],
                        temp = data.temperature_air.values[0],
                        rain_intensity = data.rain.values[0],
                        relative_humidity = data.relative_humidity.values[0],
                        wind_speed = data.wind_speed.values[0],
                        wind_direction = (1,0,0))

        # Grow vine canopy
        g,_ = grow_canopy(g, vine, t['vine'])
        add_area_topvine(g)
        update_healthy_area(g, label = 'lf')
        
        # Develop disease
        labels = g.property('label')
        # if timer.numiter < 1500 and labels[target_leaf]=='lf' and timer.numiter%50==0:
        if timer.numiter > 100 and timer.numiter < 170 and labels[target_leaf]=='lf' and timer.numiter%rd.randint(2,5)==0:
        # if timer.numiter < 1500 and timer.numiter%50==0:
            # Refill pool of initial inoculum to simulate differed availability
            dispersal_units = generate_stock_du(nb_dus=rd.randint(1,5), disease=powdery_mildew)
            try:
                g.node(target_leaf).dispersal_units += dispersal_units
            except:
                g.node(target_leaf).dispersal_units = dispersal_units
            # dispersal_units = generate_stock_du(nb_dus=1000, disease=powdery_mildew)
            # initiate(g, dispersal_units, inoculator, label='lf')
            
        infect(g, t['disease'].dt, infection_controler, label='lf')
        update(g, t['disease'].dt, growth_controler, label='lf')
        disperse(g, emitter, transporter, "powdery_mildew", label='lf')
        
        inspector.update_data(g)
            
        if timer.numiter%24 == 0:
            update_plot(g)
        
        outs = {'ratio_latent':inspector.ratio_latent,
                'ratio_spo':inspector.ratio_spo,
                'ratio_empty':inspector.ratio_empty}
        outputs = pandas.DataFrame(data=outs, index=dates)                   
    return outputs