# crop.py
# Derek Groenendyk
# 2/15/2017
# reads input data from Excel workbook
from collections import OrderedDict
import logging
import numpy as np
import os
import sys
from cons2.cu import CONSUMPTIVE_USE
# from utils import excel
logger = logging.getLogger('crop')
logger.setLevel(logging.DEBUG)
[docs]class CROP(object):
"""docstring for CROP"""
[docs] def __init__(self, shrtname, longname, crop_type, mmnum, directory, sp):
self.sname = shrtname
self.lname = longname
self.crop_type = crop_type
self.directory = directory
if self.crop_type == 'ANNUAL':
self.mmnum = mmnum
if sp.et_method == 'fao':
self.stages = {}
self.kc = {}
# self.read_cropdev()
self.read_stages()
self.read_kc()
elif sp.et_method == 'scs':
self.get_nckc()
self.get_ckc()
# methods = {
# 'ANNUAL': ANNUAL,
# 'PERENNIAL': PERENNIAL
# }
# self.cu = methods[crop_type](sp, self)
self.cu = CONSUMPTIVE_USE(sp, self)
[docs] def read_cropdev(self):
try:
infile = open(os.path.join(self.directory,'data','crop_dev_coef.csv'),'r')
except TypeError:
logger_fn.critical('crop_dev_coef.csv file not found.')
raise
lines = infile.readlines()
infile.close()
# sline = lines[1].split(',')
# cname = sline[0].replace(' ','')
# temp_cname = cname
stage_flag = False
kc_flag = False
switch = False
i = 1
# while i < len(lines):
while i < len(lines):
sline = lines[i].split(',')
cname = sline[0].replace(' ','')
# print(cname,self.sname)
if cname != '':
if cname == self.sname:
# print(i)
if not switch:
stage = sline[1].lower()
self.stages[stage] = np.array([float(item) for item in sline[2:6]])
# print(1.0-np.sum(self.stages[stage]))
stage_flag = True
else:
num = int(sline[1].replace(' ',''))
self.kc[num] = np.array([float(item) for item in sline[2:5]])
kc_flag = True
else:
if switch:
break
i += 1
switch = True
i += 1
if stage_flag == False or kc_flag == False:
logger.critical('Crop, ' + self.sname + ', not found in crop_dev_coef.csv.') # include site??
raise
[docs] def read_stages(self):
try:
infile = open(os.path.join(self.directory,'data','fao_crop_stages.csv'),'r')
except TypeError:
logger_fn.critical('fao_crop_stages.csv file not found.')
raise
lines = infile.readlines()
infile.close()
flag = False
i = 1
while i < len(lines):
sline = lines[i].split(',')
cname = sline[0].replace(' ','')
if cname != '':
if cname == self.sname:
stage = sline[1].lower()
self.stages[stage] = np.array([float(item) for item in sline[2:6]])
flag = True
else:
if flag:
break
flag = False
i += 1
if not flag:
logger.critical('Crop, ' + self.sname + ', not found in fao_crop_stages.csv.') # include site??
raise
[docs] def read_kc(self):
try:
infile = open(os.path.join(self.directory,'data','fao_crop_coef.csv'),'r')
except TypeError:
logger_fn.critical('fao_crop_coef.csv file not found.')
raise
lines = infile.readlines()
infile.close()
flag = False
i = 1
while i < len(lines):
sline = lines[i].split(',')
cname = sline[0].replace(' ','')
if cname != '':
if cname == self.sname:
num = int(sline[1].replace(' ',''))
self.kc[num] = np.array([float(item) for item in sline[2:5]])
flag = True
else:
if flag:
break
flag = False
i += 1
if not flag:
logger.critical('Crop, ' + self.sname + ', not found in fao_crop_coef.csv.') # include site??
raise
[docs] def get_nckc(self):
"""
Reads in crop coefficients.
Parameters
----------
name: string
Name of the crop
Returns
-------
nckc: list
List of crop coefficients
"""
try:
infile = open(os.path.join(self.directory,'data','scs_crop_stages.csv'),'r')
except TypeError:
logger.critical('scs_crop_stages.csv file not found.')
raise
lines = infile.readlines()
infile.close()
nckca = [float(item) for item in lines[0].split(',')[1:]]
nckcp = [float(item) for item in lines[1].split(',')[1:]]
if self.crop_type == 'PERENNIAL':
self.nckc= nckcp
else:
self.nckc = nckca
[docs] def get_ckc(self):
"""
Reads in crop coefficients.
Parameters
----------
name: string
Name of the crop
Returns
-------
ckc: list
List of crop coefficients
"""
try:
infile = open(os.path.join(self.directory,'data','scs_crop_coef.csv'),'r')
except TypeError:
logger_fn.critical('scs_crop_coef.csv file not found.')
raise
else:
lines = infile.readlines()
infile.close()
if self.crop_type == 'PERENNIAL':
end = 26
else:
end = 22
for line in lines:
sline = line.split(',')
sline[-1] = sline[-1][:-1]
# print(sline[0],self.sname)
if sline[0] == self.sname:
vals = [float(item) for item in sline[1:end]]
self.ckc = vals
break