Index: sodar/trunk/sodar/data.py =================================================================== --- sodar/trunk/sodar/data.py (revision 65) +++ sodar/trunk/sodar/data.py (revision 66) @@ -59,5 +59,5 @@ import re - +import numpy as n class Data(list): @@ -75,4 +75,5 @@ [sample.strip() for sample in data.split('$')] if sample.strip()]) + self._normalize() def __getitem__(self, index): @@ -107,4 +108,44 @@ raise IndexError('Data index out of range') + def _normalize(self): + """Clean up data for analysis.""" + self._copy() + # self._convert() + # compute time interval + # correct for missing times + # compute minium altitude + # compute maximum overall altitude + # compute number of altitudes + # compute altitude interval + # correct for missing altitudes + # mark maximum altitude with good values for each sample + # mark minimum altitude with invalid values for each sample + # convert direction to radians + # compute u,v,c components + # compute colorspecs + # compute plotting parameters + + def _copy(self): + """Create a deep copy of all the samples in this Data instance.""" + self.samples = [(dict(sample.header), list(sample.body)) + for sample in self] + for sample in self.samples: + for altitude in sample[1]: + altitude = dict(altitude) + + def _convert(self): + """Convert to numbers and correct for invalid values.""" + INVALID = "-9999" + # convert to numbers and correct for invalid values + for sample in self.samples: + for altitude in sample[1]: + for key in altitude.keys(): + try: + if altitude[key] == INVALID: + raise ValueError + altitude[key] = float(altitude[key]) + except (ValueError, TypeError, KeyError): + altitude[key] = n.NaN + class Sample(object):