Index: sodar/branches/scintec-branch/sodar/scintec/maindata.py =================================================================== --- sodar/branches/scintec-branch/sodar/scintec/maindata.py (revision 269) +++ sodar/branches/scintec-branch/sodar/scintec/maindata.py (revision 270) @@ -21,16 +21,56 @@ Parse a known good .mnd file: >>> main_data = MainData(good_mnd) - - Parse the profile data: >>> len(main_data) 48 + >>> main_data.format + 'FORMAT-1' + >>> main_data.first + datetime.datetime(2009, 11, 17, 0, 30) + >>> main_data.file_count + 0 + >>> main_data.comment_count + 6 + >>> main_data.variable_count + 6 + >>> main_data.elevation_count + 39 + >>> main_data.comments == {'device serial number':'A-F-0050', + ... 'station code':'billymitchell', + ... 'software version':'APRun 1.31', + ... 'antenna azimuth angle [deg]':'0', + ... 'height above ground [m]':'0', + ... 'height above sea level [m]':'0'} + True + >>> main_data.variables == [{'label':'height','symbol':'z', + ... 'units':'m','type':'Z1', + ... 'mask':'0','gap':'99999',}, + ... {'label':'wind speed','symbol':'speed', + ... 'units':'m/s','type':'G1', + ... 'mask':'0','gap':'99.99',}, + ... {'label':'wind direction','symbol':'dir', + ... 'units':'deg','type':'R1', + ... 'mask':'0','gap':'999.9',}, + ... {'label':'wind W','symbol':'W', + ... 'units':'m/s','type':'S', + ... 'mask':'0','gap':'99.99',}, + ... {'label':'sigma W','symbol':'sigW', + ... 'units':'m/s','type':'S', + ... 'mask':'0','gap':'99.99',}, + ... {'label':'backscatter','symbol':'bck', + ... 'units':'','type':'S', + ... 'mask':'0','gap':'9.99E+37',},] + True + >>> main_data.error == {'label':'error code', + ... 'bits':'- - - - - - - - groundclutter - - - - - - -', + ... 'mask':'IIIIIIIIWIIIIIII',} + True Parse the first profile: >>> len(main_data[0]) 39 - >>> main_data[0].start + >>> main_data(datetime(2009, 11, 17, 0, 30)).stop + datetime.datetime(2009, 11, 17, 0, 30) + >>> main_data(datetime(2009, 11, 17, 0, 0),True).start datetime.datetime(2009, 11, 17, 0, 0) - >>> main_data[0].stop - datetime.datetime(2009, 11, 17, 0, 30) >>> main_data[0].variables ['z', 'speed', 'dir', 'W', 'sigW', 'bck', 'error'] @@ -51,16 +91,12 @@ ... 'error':'0'} True - >>> main_data(datetime(2009, 11, 17, 0, 30)).stop - datetime.datetime(2009, 11, 17, 0, 30) - >>> main_data(datetime(2009, 11, 17, 0, 0),True).start - datetime.datetime(2009, 11, 17, 0, 0) Parse the last profile: >>> len(main_data[-1]) 39 - >>> main_data[-1].start - datetime.datetime(2009, 11, 17, 23, 30) - >>> main_data[-1].stop + >>> main_data(datetime(2009, 11, 18, 0, 0)).stop datetime.datetime(2009, 11, 18, 0, 0) + >>> main_data(datetime(2009, 11, 17, 23, 0),True).start + datetime.datetime(2009, 11, 17, 23, 0) >>> main_data[-1].variables ['z', 'speed', 'dir', 'W', 'sigW', 'bck', 'error'] @@ -81,8 +117,4 @@ ... 'error':'0'} True - >>> main_data(datetime(2009, 11, 18, 0, 0)).stop - datetime.datetime(2009, 11, 18, 0, 0) - >>> main_data(datetime(2009, 11, 17, 23, 0),True).start - datetime.datetime(2009, 11, 17, 23, 0) """ @@ -105,5 +137,4 @@ Parse a known good .mnd file: - >>> main_data = MainData(good_mnd) >>> main_data = MainData(good_mnd,good_name) @@ -142,4 +173,26 @@ in blocks[0].split('\n') if line.strip()] + + self.format = format_header_spec[0] + + timestamp = format_header_spec[1] + date, first, file_count = timestamp.split() + date_year, date_month, date_day = date.split('-') + first_hour, first_minute, first_second = first.split(':') + self.first = datetime(int(date_year), + int(date_month), + int(date_day), + int(first_hour), + int(first_minute), # omit optional microseconds + int(first_second)) # and tzinfo + self.file_count = int(file_count) + + self.instrument_type = format_header_spec[2] + + comment_count, variable_count, elevation_count = \ + format_header_spec[3].split() + self.comment_count = int(comment_count) + self.variable_count = int(variable_count) + self.elevation_count = int(elevation_count) # The second block is the body of the format header. @@ -148,5 +201,27 @@ for line in blocks[1].split('\n') - if line.strip()] + if not line.strip().startswith('#')] + self.comments = dict([(name.strip(),value.strip()) + for line + in file_header_body[0:self.comment_count] + for name,value + in (line.split(':'),)]) + self.file_type = file_header_body[self.comment_count] + self.variables = [{'label':label.strip(), + 'symbol':symbol.strip(), + 'units':units.strip(), + 'type':vtype.strip(), + 'mask':mask.strip(), + 'gap':gap.strip(),} + for line + in file_header_body[self.comment_count + 1:-1] + for label,symbol,units,vtype,mask,gap + in (line.split('#'),)] + self.error = [{'label':label.strip(), + 'bits':bits.strip(), + 'mask':mask.strip(),} + for label,bits,units,vtype,mask + in (file_header_body[-1].split('#'),)][0] + # All the remaing blocks are individual profiles @@ -187,5 +262,5 @@ >>> main_data(datetime(2009, 11, 16, 0, 30)) Traceback (most recent call last): - ... + ... ValueError: Timestamp datetime.datetime(2009, 11, 16, 0, 30) not found in 'MainData' object