Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Python3 #21

Open
wants to merge 18 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion example/example_leaf_areas.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@

# Save variables
for plant in recorders:
for lf, recorder in recorders[plant].iteritems():
for lf, recorder in recorders[plant].items():
recorder.update_vids_with_labels(adel_ids = adel_ids(g))
recorder.record_only_leaf_data(g, date, degree_days = canopy_iter.value.degree_days[-1])

Expand Down
2 changes: 1 addition & 1 deletion example/reconstruction_digit.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,6 @@
stand = AgronomicStand(sowing_density=500, plant_density=500, inter_row=0.15, noise=0.03)
adel = AdelDress(dimT=dimT, leaves=leaves, stand=stand)
g = adel.canopy(nplants=10, species = {'soissons':0.5, 'cap_horn':0.5}, relative_inclination = {'soissons':1.5, 'cap_horn':1})
print [v for k, v in g.property('species').iteritems() if k in g.vertices(1)]
print [v for k, v in g.property('species').items() if k in g.vertices(1)]
print adel.plot_statistics(g)

2 changes: 1 addition & 1 deletion example/test_adelR.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,4 +122,4 @@ def testdyn(nplants=1,start = 100,step = 50, nstep=30,dec=10,az=0):
# import numpy as np
# from alinea.popdrops.Rain import get_area_and_normal
# a1,_=get_area_and_normal(g1.property('geometry'))
# a1 = dict(((k,np.sum(v)) for k,v in a1.iteritems()))
# a1 = dict(((k,np.sum(v)) for k,v in a1.items()))
4 changes: 2 additions & 2 deletions metainfo.ini
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

[metainfo]
version = 1.6.0
release = 1.6
version = 1.7.0
release = 1.7
; must be in [openalea, vplants, alinea]
project = alinea
; the filename of the egg
Expand Down
4 changes: 2 additions & 2 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ build_requires = python >= 2.6
python-devel >= 2.6
python-setuptools >= 0.6
python-OpenAlea.Deploy >= 0.9
provides = %{name} = %{version}
obsoletes = %{name} < %{version}
provides = %%{name} = %%{version}
obsoletes = %%{name} < %%{version}
doc_files = AUTHORS.txt ChangeLog.txt README.txt LICENSE.txt
python = /usr/bin/python
packager = OpenAlea Consortium
56 changes: 22 additions & 34 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,66 +1,54 @@
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-


import os, sys
from setuptools import setup, find_packages
from openalea.deploy.metainfo import read_metainfo
import os, sys
from setuptools import setup, find_namespace_packages
#from openalea.deploy.metainfo import read_metainfo
pj = os.path.join

version = '2.0.0'
name = 'alinea.adel'

description= '3D plant simulation of graminae crops'
long_description= 'The Adel package characterise 3D plant development for graminae crops.'

# Reads the metainfo file
metadata = read_metainfo('metainfo.ini', verbose=True)
for key,value in metadata.iteritems():
exec("%s = '%s'" % (key, value))
authors= 'Christian Fournier, Christophe Pradal'
authors_email = 'christian fournier at inrae fr'


# #retrieving packages
# pkg_root_dir = '.'
# pkgs = [ pkg for pkg in find_packages(pkg_root_dir) if namespace not in pkg]
# top_pkgs = [pkg for pkg in pkgs if len(pkg.split('.')) < 2]
# packages = [ namespace + "." + pkg for pkg in pkgs]
# package_dir = dict( [('',pkg_root_dir)] + [(namespace + "." + pkg, pkg_root_dir + "/" + pkg) for pkg in top_pkgs] )
# wralea_entry_points = ['%s = %s'%(pkg,namespace + '.' + pkg) for pkg in top_pkgs]
url = 'https://github.com/openalea-incubator/adel'
license = 'Cecill-C'

# Main setup
setup(
name=name,
version=version,
description=description,
long_description=long_description,
authors=authors,
authors_email=authors_email,
author=authors,
author_email=authors_email,
url=url,
license=license,

namespace_packages = [namespace],
create_namespaces = True,

py_modules = [],
#py_modules = [],
# pure python packages
packages= find_packages('src'),
packages= find_namespace_packages(where='src',
include=['alinea.*', 'alinea']),
# python packages directory
package_dir= {'': 'src'},



# Namespace packages creation by deploy
# Add package platform libraries if any
include_package_data=True,
package_data = {'' : ['*.RData', '*.R', '*.8', '*.h', '*.str','*.txt', '*.l', '*.map', '*.csv', '*.png'],},
share_dirs = {os.path.join(*('alinea', 'adel', 'data')): os.path.join(*('src', 'alinea','adel', 'data'))},
share_dirs = {pj(*('alinea', 'adel', 'data')): pj(*('src', 'alinea','adel', 'data')),
pj(*('alinea', 'adel', 'echap_leaf_data')): pj(*('src', 'alinea','adel', 'echap_leaf_data'))},

# Add package platform libraries if any
zip_safe = False,


# Scripts
entry_points = { 'wralea': [ 'adel= alinea.adel',] },

# Dependencies (other are listed in doc to avoid setputools/pip/conda possible conflicts in automatic installs)
setup_requires = ['openalea.deploy'],
install_requires = [],
dependency_links = [],
)




)
8 changes: 0 additions & 8 deletions src/alinea/__init__.py

This file was deleted.

14 changes: 2 additions & 12 deletions src/alinea/adel/AdelR.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ def dataframe(d):
if d is None:
return r('as.null()')
else:
for k, v in d.iteritems():
for k, v in d.items():
rval = numpy2ri(numpy.array(v))
if not _is_iterable(v):
v = [v]
Expand Down Expand Up @@ -211,17 +211,7 @@ def setAdel(devT,RcodegeoLeaf,RcodegeoAxe,nplants = 1,seed = None, xydb = None,
ssipars = robj.r['list'](**ssipars)
p = RsetAdel(RdevT,geoLeaf,geoAxe,nplants,sample,rseed,rxydb,rsrdb,ssipars)
return p

def leaf_keys(lindex, lseed, db):
""" convert R-style lindex/lseed (also called LcType/Lindex in canopy table)
into (keys,index) of python xy/sr data bases
"""
if 1 > lindex or lindex > len(db) or lseed < 1:
raise KeyError('invalid index for leaf shape database')
keys = db.keys()
keys.sort()
return keys[lindex - 1], lseed -1



def plantSample(setAdelPars):
"""return id of plants used by setAdel to setup the canopy """
Expand Down
20 changes: 10 additions & 10 deletions src/alinea/adel/adel.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,19 @@ def flat_list(nested_list):

def balanced_sample(n, proba):
""" return a list of n keys found in proba, repecting probalities of proba values"""
card = {k: int(v * n) for k, v in proba.iteritems()}
card = {k: int(v * n) for k, v in proba.items()}
missing = int(n - sum(card.values()))
while (missing > 0):
# current frequencies
freq = {k: float(v) / n for k, v in card.iteritems()}
freq = {k: float(v) / n for k, v in card.items()}
# diff with probabilities
dp = {k: abs(freq[k] - proba[k]) for k in freq}
sorted_p = sorted(dp.iteritems(), key=operator.itemgetter(1), reverse=True)
sorted_p = sorted(dp.items(), key=operator.itemgetter(1), reverse=True)
k = sorted_p[0][0]
card[k] += 1
missing -= 1
card = {k: v for k, v in card.iteritems() if v > 0}
items = flat_list([[key] * val for key, val in card.iteritems()])
card = {k: v for k, v in card.items() if v > 0}
items = flat_list([[key] * val for key, val in card.items()])
numpy.random.shuffle(items)
return items

Expand Down Expand Up @@ -310,8 +310,8 @@ def save(self, g, index=0, dir='./adel_saved', basename=None,
fgeom = basename_geom + '.bgeom'
fg = basename_adel + '.pckl'
s.save(fgeom, 'BGEOM')
with open(fg, 'w') as output:
pickle.dump(g, output)
with open(fg, 'wb') as output:
pickle.dump(g, output, protocol=2)
# restore geometry
g.add_property('geometry')
g.property('geometry').update(geom)
Expand All @@ -331,8 +331,8 @@ def load(index=0, dir='./adel_saved', basename=None, load_geom=True):
if not os.path.exists(fgeom) or not os.path.exists(fg):
raise IOError('adel cannot find saved files')

f = open(fg)
g = pickle.load(f)
f = open(fg, 'rb')
g = pickle.load(f, encoding='bytes')
f.close()

# backward compatibility
Expand Down Expand Up @@ -374,7 +374,7 @@ def get_midribs(self, g, resample=False):
vid
in midribs}
hins = {k: v[0][2] + midribs[k][2] for k, v in
midribs_anchor.iteritems() if len(v) > 0}
midribs_anchor.items() if len(v) > 0}

ntop = g.property('ntop')
res = [pandas.DataFrame({'vid': vid,
Expand Down
29 changes: 14 additions & 15 deletions src/alinea/adel/adel_dynamic.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
""" Prototype adel model that uses mtg edition functions"""
from openalea.mtg import MTG
from alinea.adel.astk_interface import AdelWheat
from alinea.adel.adel import Adel
from alinea.adel.mtg_editions import find_metamers, add_plant, add_vegetative_metamer, new_mtg_factory, update_organ_elements
from alinea.adel.AdelR import plantSample
from alinea.adel.mtg_interpreter import mtg_interpreter, transform_geom


class AdelWheatDyn(AdelWheat):
class AdelDyn(Adel):

def build_stand(self):
def build_stand(self, axeTable):

g = MTG()
plants = self.axeT()
sample = [int(p) for p in plantSample(self.pars)]
plants = axeTable
sample = self.plant_references
for i, plant in plants.groupby('plant'):
plant_properties = {'position': self.positions[i - 1],
'azimuth': self.plant_azimuths[i - 1],
Expand All @@ -21,16 +20,16 @@ def build_stand(self):
ms_properties = {'HS_final': float(ms['HS_final'][0]),
'nff': int(ms['nf'][0]),
'hasEar': bool(int(ms['hasEar'][0])),
'azimuth': float(ms['azTb'][0])}
'azimuth': 0}
add_plant(g, i, plant_properties=plant_properties,
axis_properties=ms_properties)
return g

def add_metamer(self, g, plant=1, axe='MS'):
def add_metamer(self, g, phytoT, plant=1, axe='MS'):
vid_plant, vid_axe, metamers = find_metamers(g, plant, axe)
nff = g.property('nff')[vid_axe]
num_metamer = len(metamers)
df = self.phytoT(axe)
df = phytoT.loc[phytoT['axe'] == axe,:]
m = df.loc[df['n'] == num_metamer, :].to_dict('list')
metamer_properties = {'L_shape': m['Ll'][0]}
ntop = nff - num_metamer + 1
Expand Down Expand Up @@ -65,7 +64,7 @@ def build_mtg(self, parameters, stand, **kwds):
face_up=self.face_up)
return g

def update_geometry(self, g, SI_units=False, properties_to_convert={'lengths':[], 'areas':[]}):
def update_geometry(self, g, phyllochron={'MS':88.92, 'T1':91.6}, SI_units=False, properties_to_convert={'lengths':[], 'areas':[]}):
"""Update MTG geometry.

:Parameters:
Expand All @@ -82,7 +81,7 @@ def update_geometry(self, g, SI_units=False, properties_to_convert={'lengths':[]
self.convert_to_ADEL_units(g, properties_to_convert)

# update elements
g = update_organ_elements(g, self.leaves, self.split, self.phyllochron())
g = update_organ_elements(g, self.leaves, self.split, phyllochron)
g = mtg_interpreter(g, self.leaves, face_up=self.face_up,
classic=self.classic)
pos = g.property('position')
Expand All @@ -105,11 +104,11 @@ def convert_to_ADEL_units(self, g, properties_to_convert):
- `properties_to_convert` (:class:`dict` of :class:`pandas.DataFrame`) - A dictionnary with the list of length properties area properties to be converted.
"""
for length_property in properties_to_convert['lengths']:
for vid, length in g.properties()[length_property].iteritems():
for vid, length in g.properties()[length_property].items():
g.properties()[length_property][vid] = length * 100 # Converts m to cm

for area_property in properties_to_convert['areas']:
for vid, area in g.properties()[area_property].iteritems():
for vid, area in g.properties()[area_property].items():
g.properties()[area_property][vid] = area * 10000 # Converts m2 to cm2

def convert_to_SI_units(self, g, properties_to_convert):
Expand All @@ -120,9 +119,9 @@ def convert_to_SI_units(self, g, properties_to_convert):
- `properties_to_convert` (:class:`dict` of :class:`pandas.DataFrame`) - A dictionnary with the list of length properties area properties to be converted.
"""
for length_property in properties_to_convert['lengths']:
for vid, length in g.properties()[length_property].iteritems():
for vid, length in g.properties()[length_property].items():
g.properties()[length_property][vid] = length / 100 # Converts cm to m

for area_property in properties_to_convert['areas']:
for vid, area in g.properties()[area_property].iteritems():
for vid, area in g.properties()[area_property].items():
g.properties()[area_property][vid] = area / 10000 # Converts cm2 to m2
Loading