Source code for openalea.colzette.colzette

"""
Colzette library
"""

import numpy as np
import pandas as pd

import openalea.plantgl.all as pgl
from openalea.mtg import MTG, fat_mtg
from openalea.plantgl.all import Vector3, Color3, Viewer

[docs] def get_params_monocrop(species, param_file, option_parameters): df_par = param_file dict_params = {} if option_parameters == "One simulation": dict_params = {} dict_params[species] = {} for par in df_par['Parameter'].unique(): dict_params[species][par] = df_par.loc[df_par['Parameter']==par,'Value'].iloc[0] elif option_parameters == "DOE": dict_params = {} dict_params[species] = {} dict_params_id = {} for id in df_par.index: df_par2 = df_par.iloc[id] dict_params_sp = {} for par in df_par2.keys(): dict_params_sp[par] = df_par2[par] # here also set default parameter values dict_params_id[id] = dict_params_sp dict_params[species] = dict_params_id return dict_params
[docs] def get_params_intercrop(species_brassica, species_legume, param_file_brassica, param_file_legume, option_parameters): if option_parameters == "One simulation": df_par = pd.concat([param_file_brassica, param_file_legume]) dict_params = {} for sp in df_par['Species'].unique(): dict_params_sp = {} df_par2 = df_par[df_par['Species']==sp] for par in df_par2['Parameter'].unique(): dict_params_sp[par] = df_par2.loc[df_par2['Parameter']==par,'Value'].iloc[0] dict_params[sp] = dict_params_sp elif option_parameters == "DOE": dict_params = {} for sp in [species_brassica, species_legume]: # here in mixture select columns for species parameters, df_par = ... if sp == species_brassica: df_par = param_file_brassica else: df_par = param_file_legume # loop for sp in vec_species dict_params_id = {} for id in df_par.index: df_par2 = df_par.iloc[id] dict_params_sp = {} for par in df_par2.keys(): dict_params_sp[par] = df_par2[par] # here also set default parameter values dict_params_id[id] = dict_params_sp dict_params[sp] = dict_params_id return dict_params
""" def df_to_dict(data_dir,option_parameters,Type_simul,par_DOE,par_DOE2): elif option_parameters == "DOE": if Type_simul == "DOE_rapeseed": vec_species=['Rapeseed'] elif Type_simul == "DOE_fababean": vec_species = ['Fababean'] else: vec_species = ['Rapeseed','Fababean'] dict_params = {} for sp in vec_species: # here in mixture select columns for species parameters, df_par = ... if sp == "Rapeseed": df_par = par_DOE else: df_par = par_DOE2 # loop for sp in vec_species dict_params_id = {} for id in df_par.index: df_par2 = df_par.iloc[id] dict_params_sp = {} for par in df_par2.keys(): dict_params_sp[par] = df_par2[par] # here also set default parameter values dict_params_id[id] = dict_params_sp dict_params[sp] = dict_params_id else: params_fn_rape = data_dir / 'parameters' / 'type_params_rapeseed.csv' params_fn_faba = data_dir / 'parameters' / 'type_params_fababean.csv' params_fn_came = data_dir / 'parameters' / 'type_params_camelina.csv' params_fn_lent = data_dir / 'parameters' / 'type_params_lentil.csv' df_par_came = pd.read_csv(params_fn_came,sep=';') df_par_lent = pd.read_csv(params_fn_lent,sep=';') if Type_simul == "monocrop_aviso" or Type_simul == "monocrop_vigo": df_par = df_par_rape df_par = df_par[df_par['Treatment'] == Type_simul] elif Type_simul == "monocrop_faba": df_par = df_par_faba df_par = df_par[df_par['Treatment'] == Type_simul] elif Type_simul == "intercrop_aviso_RRF" or Type_simul == "intercrop_vigo": if Type_simul == "intercrop_aviso_RRF": Type_simul2 = "intercrop_faba_aviso_RRF" elif Type_simul == "intercrop_vigo": Type_simul2 = "intercrop_faba_vigo" df_par_rape = df_par_rape[df_par_rape['Treatment'] == Type_simul] df_par_faba = df_par_faba[df_par_faba['Treatment'] == Type_simul2] df_par = pd.concat([df_par_rape, df_par_faba]) elif Type_simul == "monocrop_camelina": df_par = df_par_came df_par = df_par[df_par['Treatment'] == Type_simul] elif Type_simul == "monocrop_lentil": df_par = df_par_lent df_par = df_par[df_par['Treatment'] == Type_simul] elif Type_simul == "intercrop_camelina_lentil": df_par_came = df_par_came[df_par_came['Treatment'] == Type_simul] df_par_lent = df_par_lent[df_par_lent['Treatment'] == Type_simul] df_par = pd.concat([df_par_lent, df_par_came]) df_par = df_par[df_par['Level'] == 'Default'] dict_params = {} for sp in df_par['Species'].unique(): dict_params_sp = {} df_par2 = df_par[df_par['Species']==sp] for par in df_par2['Parameter'].unique(): dict_params_sp[par] = df_par2.loc[df_par2['Parameter']==par,'Value'].iloc[0] dict_params[sp] = dict_params_sp return(dict_params) """
[docs] def compute_thermal_time(vec_temp, idx_begin, Tb): vec_temp2 = vec_temp - Tb vec_temp2[vec_temp2 < 0] = 0 vec_temp2[:idx_begin] = 0 vec_TT = vec_temp2.cumsum() return vec_TT
[docs] def get_nb_leaflets(rank): if rank <= 6: nb_leaflets = 2.0 elif rank == 7: nb_leaflets = 3.0 elif rank >= 10: nb_leaflets = 5.0 elif (rank >= 8 & rank <= 9): nb_leaflets = 4.0 return nb_leaflets
[docs] class Plant: """ Define a plant as an above and below ground MTG. Some usefull functions can be defined as proxies. """ def __init__(self, name='', above=None, below=None): self.name = name self.above = self.init_above_mtg() if above is None else above self.below = self.init_below_mtg() if below is None else below
[docs] @staticmethod def init_above_mtg(): """ Simple function to create a simple aerial MTG""" g = MTG() # Add a plant (scale is 1) vid = g.add_component(g.root, label='Plant') #vid = g.add_component(vid, label='Axis') #vid = g.add_component(vid, label='Phytomer') # Last scale vid = g.add_component(vid, label='Internode') leaf_id = g.add_child(vid, edge_type='+', label='Leaf') #bud_id = g.add_component(vid, edge_type='<', label='Bud') #fat_mtg(g) return g
[docs] @staticmethod def init_below_mtg(): """ Simple function to create a simple belowground MTG or RootSystem Architecture""" g = MTG() # Add a plant (scale is 1) vid = g.add_component(g.root, label='RSA') vid = g.add_component(vid, label='Root') # Last scale vid = g.add_component(vid, label='Segment') fat_mtg(g) return g
[docs] def update_MTG(g, outputs): """ Update the MTG :param dict outputs: {'param1': { vid1: , vid2, ...}, 'param2': { vid1: , vid2, ...}} """ # add the missing property for param in outputs.keys(): if param not in g.properties(): g.add_property(param) # update the MTG g.property(param).update(outputs[param])
[docs] def bell_shaped_dist(total_area=1, nb_phy=15, rmax=.7, skewness=5): """ OLD, use generate_normalized_bell_curve_points() instead returns the leaf area of individual leaves along a bell shaped model, as a proportion of the total leaf area """ r = np.linspace(1./nb_phy, 1, nb_phy) k = skewness relative_surface = np.exp(-k / rmax * ( 2 * (r - rmax)**2 + (r - rmax)**3)) leaf_area = relative_surface / relative_surface.sum() * total_area return leaf_area.tolist()
[docs] def setting_PGLViewer(width=1200, height=1200, x_center=0., y_center=0., z_center=0., x_cam=0., y_cam=0., z_cam=-0.2, grid=True, background_color=[255, 255, 255]): """ This function sets the center of the graph and the relative position of the camera for displaying a scene in PGL. :param width: width of the window (pixels) :param height: height of the window (pixels) :param x_center: x-coordinate of the center at which the camera looks :param y_center: y-coordinate of the center at which the camera looks :param z_center: z-coordinate of the center at which the camera looks :param x_cam: x-coordinate of the camera position :param y_cam: y-coordinate of the camera position :param z_cam: z-coordinate of the camera position :param grid: if True, all grids will be displayed :param background_color: a RGB vector corresponding to the background color of the graph :return: """ # We define the coordinates of the point cam_target that will be the center of the graph: cam_target = pgl.Vector3(x_center, y_center, z_center) # We define the coordinates of the point cam_pos that represents the position of the camera: cam_pos = pgl.Vector3(x_cam, y_cam, z_cam) # We position the camera in the scene relatively to the center of the scene: pgl.Viewer.camera.lookAt(cam_pos, cam_target) # We define the dimensions of the graph: pgl.Viewer.frameGL.setSize(width, height) # We define the background of the scene: pgl.Viewer.frameGL.setBgColor(background_color[0], background_color[1], background_color[2]) # We define whether grids are displayed or not: pgl.Viewer.grids.set(grid, grid, grid, grid) return