Esempio n. 1
0
def test_washing():
    """ Check if 'washing' from 'protocol.py' washes dispersal units out of the MTG.

    """
    g = adel_mtg()
    set_initial_properties_g(g, surface_leaf_element=5.)
    fungus = septoria(); SeptoriaDU.fungus = fungus
    stock = [SeptoriaDU(nb_spores=random.randint(1,100), status='emitted') for i in range(100)]
    inoculator = RandomInoculation()
    initiate(g, stock, inoculator)
    
    washor = RapillyWashing()
    
    dt = 1
    nb_steps = 100
    nb_DU = numpy.array([0. for i in range(nb_steps)])
    for i in range(nb_steps):
        # Update climate and force rain occurences       
        if i>2 and i%5 == 0 or (i-1)%5 == 0:
            global_rain_intensity = 4.
        else:
            global_rain_intensity = 0.
        update_climate_all(g, wetness=True, temp=22., rain_intensity = global_rain_intensity*0.75)
                
        # Compute washing 
        # (needs to be done even if no rain to update variables in the washing model)
        wash(g, washor, global_rain_intensity, DU_status='deposited')
           
        # Count of DU :
        nb_DU[i] = count_DU(g)

        # Display results
        if global_rain_intensity != 0. :
            print('\n')
            print('   _ _ _')
            print('  (pluie)')
            print(' (_ _ _ _)')
            print('   |  |')
            print('    |  | ')
            print('\n')
            print('Sur le MTG il y a %d DU actives en tout' % nb_DU[i])

    # Display results
    plot(nb_DU)
    ylim([0, 120])
    ylabel('Nombre de DU sur le MTG')
    xlabel('Pas de temps de simulation')
    show()
    
    return g
Esempio n. 2
0
def test_all(model="SeptoriaExchangingRings"):
    # Generate a MTG with required properties :
    g = adel_mtg2()
    set_initial_properties_g(g, surface_leaf_element=5.)
    
    # Deposit first dispersal units on the MTG :
    fungus = septoria(model=model); SeptoriaDU.fungus = fungus
    stock = [SeptoriaDU(nb_spores=rd.randint(1,100), status='emitted') for i in range(10)]
    inoculator = RandomInoculation()
    initiate(g, stock, inoculator)
    
    # Call the models that will be used during the simulation :
    controler = NoPriorityGrowthControl()
    washor = RapillyWashing()
    dispersor = RandomDispersal()
    position_checker = BiotrophDUProbaModel()
   
    # Prepare the simulation loop
    dt = 1
    nb_steps = 750
    nb_max_les = 0.
    nb_les = 0.
    for i in range(0,nb_steps,dt):
        # Update climate and force rain occurences       
        if i>400 and i%100 == 0:
            global_rain_intensity = 4.
        else:
            global_rain_intensity = 0.
        update_climate_all(g, wetness=True, temp=22., rain_intensity = global_rain_intensity*0.75)
        
        # grow(g)
        infect(g, dt, position_checker)
        update(g,dt, growth_control_model=controler)
        
        if global_rain_intensity != 0.:
            scene = plot3d(g)
            disperse(g, scene, dispersor, "Septoria")            
            wash(g, washor, global_rain_intensity, DU_status='deposited')
        
        # Count how many lesions are simultaneously active on the MTG at maximum charge
        nb_les = count_lesions(g)
        if nb_les > nb_max_les:
            nb_max_les = nb_les
    
    print('max number lesions %d' % nb_max_les)
    
    return g
Esempio n. 3
0
                                                 inter_row=0.12,
                                                 seed=3)

# Choose source leaf in canopy
# (Here the value of the leaf is known but it changes with another initialize_stand)
source_leaf = g.node(21943)

# Initialize the models for septoria
septoria = plugin_septoria()
inoculator = RandomInoculation()
growth_controler = NoPriorityGrowthControl()
infection_controler = BiotrophDUPositionModel()
sen_model = WheatSeptoriaPositionedSenescence(g, label='LeafElement')
emitter = SeptoriaRainEmission(domain_area=domain_area)
transporter = SeptoriaRainDispersal()
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))

# Simulation ############################################################
for i, controls in enumerate(
        zip(weather_timing, wheat_timing, septo_timing, rain_timing)):
    weather_eval, wheat_eval, septo_eval, rain_eval = controls
Esempio n. 4
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
Esempio n. 5
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
Esempio n. 6
0
def washor():            
    """ Instantiate the class RandomInoculation().
    
    """
    washor = RapillyWashing()
    return washor
Esempio n. 7
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