Source code for tradssat.tmpl.output
import os
import re
import numpy as np
from .file import File
from .input import InpFile
from .vals import ValueSubSection
[docs]class OutFile(File):
"""
Parent class for (nearly all) DSSAT output files.
"""
filename = None # type: str
def __init__(self, folder):
if os.path.isdir(folder):
file = os.path.join(folder, self.filename)
else:
file = folder
super().__init__(file)
def _process_section_header(self, lines):
section_name = lines[0][1:]
self._values.add_section(section_name)
i = 0
run_no = None
for l in lines:
if "RUN" in l:
run_no = l.split(' : ')[0].strip()
run_no = re.search('\d+$', run_no).group(0)
if 'TREATMENT' in l:
trt_no = l.split(' : ')[0].strip()
trt_no = re.search('\d+$', trt_no).group(0)
if run_no is None:
l_vals = np.array([trt_no], dtype=int)
l_vars = ['TREATMENT']
else:
l_vals = np.array([run_no, trt_no], dtype=int)
l_vars = ['RUN', 'TREATMENT']
subsect = ValueSubSection(l_vars, l_vals=l_vals)
self._values[section_name].set_header_vars(subsect)
elif '@' in l:
break
i += 1
return section_name, lines[i:]
def _get_var_info(self):
raise NotImplementedError
[docs] @classmethod
def matches_file(cls, file):
"""
Checks whether a given file can be read by this class.
Parameters
----------
file: str
The filename or full path to be read.
Returns
-------
bool
``True`` if the file matches; ``False`` otherwise.
"""
fname = os.path.split(file)[1]
return fname.lower() == cls.filename.lower()
def get_var_spc(self, var, sect=None, **kwargs):
header = kwargs.get('header')
match = re.search(var, header)
spc = re.search("[ @]+$", header[:(match.start())]).group(0)
return len(spc)
class FinalOutFile(InpFile):
filename = None # type: str
def __init__(self, folder):
if os.path.isdir(folder):
file = os.path.join(folder, self.filename)
else:
file = folder
super().__init__(file)
@classmethod
def matches_file(cls, file):
fname = os.path.split(file)[1]
return fname.lower() == cls.filename.lower()
def _get_var_info(self):
raise NotImplementedError