#!PYTHONEXE """This script is the old version of isprint that worked with Madrigal 2.X Cedar format files. It exists only to help the conversion process from Madrigal 2.X to Madrigal 3.0. Deprecated notes: This script replaces the command line version of the isprint Fortran application. It is based on the maddata engine as found in madc/madrec, and exposed to python via _Madrec.c. It is different from the old isprint application in the following ways: 1. It works with any legal Cedar file format, not just the Madrigal format. 2. It allows any parameter to be used in filters, not just the few offered by the Fortran isprint application It is similar in that it supports most of the options that the Fortran isprint application did $Id: isprint_deprecated.py 7046 2019-10-07 19:57:14Z brideout $ """ import sys import os import traceback usageStr = """Usage: isprint_deprecated.py file= date1= time1= date2= time2= (in the follow arguments, any value missing may be used to indicate no lower or upper limit) z=,[or,...] (km) az=,[or,...] (from -180 to 180) el=,[or,...] (from 0 to 90) plen=,[or,...] (pulse len in sec) header= (defaults to header=t, show headers) summary= (defaults to summary=t, show summary) badval= (defaults to "missing") assumed= (defaults to "assumed") knownbad= (defaults to "knownbad") mxchar= (minimum 50 - defaults to no maximum) filter=<[mnemonic] or [mnemonic1,[+-*/]mnemonic2]>,,[or,...] (any number of filters may be added) (will be show in order listed) Example: isprint_deprecated.py file=/opt/madrigal/experiments/1998/mlh/20jan98/mil980120g.003 date1=01/20/1998 time1=15:00:00 date2=01/20/1998 time2=16:00:00 z=200,300or500,600 badval=noData filter=gdalt,-,sdwht,0, filter=ti,500,1000 uth gdalt gdlat glon ti te This example would show data from mil980120g.003 between 15 and 16 UT on 01/20/1998 where altitude is either between 200 and 300 km or between 500 and 600 km, and where gdalt-sdwht is greater than 0 (point is in sunlight), and where ti is between 500 and 1000. "noData" would be printed if data was not available. See complete instructions at http://www.haystack.mit.edu/madrigal/isprint.html """ def appendFilter(filter, type, parm1, parm2, numRanges, lowRangeList, highRangeList): """ appendFilter adds to the lists that make up a filter, which is a list of lists. Inputs: filter - the existing list of 6 lists to be appended to type - '1','*','/','+', or '-'. If '1', parm2 not needed parm1 - filter mnemonic 1 parm2 - filter mnemonic 1 - may be None if type = 1 numRanges - number of ranges to add for this filter lowRangeList - list of lower limits; len must = numRanges highRangeList - list of upper limits; len must = numRanges Outputs: None Affects: Appends to the following 6 lists in the filter: filtTypeList: filter types, len = # filters, chars are '1','*','/','+', or '-' filtParm1List: mnemonics of filter parameter 1 (items = # filters) filtParm2List: mnemonics of filter parameter 2 (items = # filters) (may be None) filtNumRangeList: number of ranges per filter (items = # filters) filterLowList: doubles of filter lower limits (items = sum of number of ranges above) filterHighList: doubles of filter upper limits (items = sum of number of ranges above) """ # type if type not in ['1', '+', '-', '*', '/']: raise IOError("Illegal type: " + str(type)) filter[0].append(type) #parm1 filter[1].append(parm1) #parm2 if type != '1': filter[2].append(parm2) else: filter[2].append(None) # numRanges filter[3].append(numRanges) #lowRangeList if len(lowRangeList) != numRanges: raise IOError("Wrong number of items in lowRangeList: " + str(numRanges) + ' ' + str(lowRangeList)) for item in lowRangeList: if len(item) != 0: filter[4].append(float(item)) else: filter[4].append(None) #highRangeList if len(highRangeList) != numRanges: raise IOError("Wrong number of items in highRangeList") for item in highRangeList: if len(item) != 0: filter[5].append(float(item)) else: filter[5].append(None) # ********* main script begins here *************** # catch any exception, and write an appropriate message try: # check if pythonlibpath env variable exists # written 'PYTHON' + 'LIBPATH' to stop automatic replacement during setup temp = os.environ.get('PYTHON' + 'LIBPATH') if temp != None: sys.path.append(temp) # append path madroot/lib (needed only if python not installed by setup) sys.path.append('MADROOT/lib/python') # prepare to handle MadrigalError import madrigal.admin except ImportError: # Fatal error - madpy library not found print("Unable to import the madrigal python library - please alert the sys admin!") sys.exit(0) # try to run script, and report all errors to Madrigal sys admin try: import madrigal.metadata import madrigal.data import madrigal._Madrec # create MadrigalDB obj madDBObj = madrigal.metadata.MadrigalDB() # create MadrigalParm obj madParmObj = madrigal.data._DeprecatedMadrigalParameters(madDBObj) # create an empty filter filter = [[],[],[],[],[],[]] # inital values desiredParmList = [] filename = '' header = 1 summary = 1 badvalStr = 'missing' assumedStr = 'assumed' knownbadStr = 'knownbad' mxchar = 10000 date1 = '' time1 = '' date2 = '' time2 = '' # parse arguments if len(sys.argv) == 1: print(usageStr) sys.exit(0) for arg in sys.argv[1:]: lowerLimList = [] upperLimList = [] # skip isprint command if arg.find('isprint_deprecated.py') != -1: continue # check if its a parameter if arg.find('=') == -1: if madParmObj.getParmType(arg) == -1: raise IOError("Illegal parameter: " + str(arg)) desiredParmList.append(madParmObj.getParmMnemonic(arg)) continue # check if its a file if arg.find('file=') != -1: filename = arg[arg.find('=')+1:] continue # check for header if arg[:7] == 'header=': if arg[7] in ['f', 'F']: header = 0 elif arg[7] not in ['t', 'T']: raise IOError("Bad argument for header, must be t or f") continue # check for summary if arg[:8] == 'summary=': if arg[8] in ['f', 'F']: summary = 0 elif arg[8] not in ['t', 'T']: raise IOError("Bad argument for summary, must be t or f") continue # check for badval if arg[:7] == 'badval=': badvalStr = arg[7:] continue # check for assumed if arg[:8] == 'assumed=': assumedStr = arg[8:] continue # check for knownbad if arg[:9] == 'knownbad=': knownbadStr = arg[9:] continue # check for mxchar if arg[:7] == 'mxchar=': try: mxchar = int(arg[7:]) if mxchar < 50: print("Lowest limit for mxchar is 50 - setting to 50") mxchar = 50 except: raise IOError("Illegal argument for mxchar: " + str(arg[7:])) continue # check if its date1 if arg[:6] == 'date1=': date1 = arg[arg.find('=')+1:] continue # check if its time1 if arg[:6] == 'time1=': time1 = arg[arg.find('=')+1:] continue # check if its date2 if arg[:6] == 'date2=': date2 = arg[arg.find('=')+1:] continue # check if its time2 if arg[:6] == 'time2=': time2 = arg[arg.find('=')+1:] continue # check if its z argument if arg[:2] == 'z=': argStr = arg[arg.find('=')+1:] # get number of ranges zRangeList = argStr.split('or') for zRange in zRangeList: limList = zRange.split(',') if len(limList) != 2: raise IOError("Illegal range in z filter") lowerLimList.append(limList[0]) upperLimList.append(limList[1]) #append filter appendFilter(filter, '1', 'gdalt', '', len(zRangeList), lowerLimList, upperLimList) continue # check if its az argument if arg[:3] == 'az=': argStr = arg[arg.find('=')+1:] # get number of ranges azList = argStr.split('or') for az in azList: limList = az.split(',') if len(limList) != 2: raise IOError("Illegal range in az filter") lowerLimList.append(limList[0]) upperLimList.append(limList[1]) # check for valid az if float(limList[0]) < -180.0 or float(limList[0]) > 180.0: raise IOError("Illegal az - must be -180 to 180: " + str(limList[0])) if float(limList[1]) < -180.0 or float(limList[1]) > 180.0: raise IOError("Illegal az - must be -180 to 180: " + str(limList[1])) #append filter appendFilter(filter, '1', 'azm', '', len(azList), lowerLimList, upperLimList) continue # check if its el argument if arg[:3] == 'el=': argStr = arg[arg.find('=')+1:] # get number of ranges elList = argStr.split('or') for el in elList: limList = el.split(',') if len(limList) != 2: raise IOError("Illegal range in el filter") lowerLimList.append(limList[0]) upperLimList.append(limList[1]) # check for valid el if float(limList[0]) < 0.0 or float(limList[0]) > 90.0: raise IOError("Illegal el - must be 0 to 90: " + str(limList[0])) if float(limList[1]) < 0.0 or float(limList[1]) > 90.0: raise IOError("Illegal el - must be 0 to 90: " + str(limList[1])) #append filter appendFilter(filter, '1', 'elm', '', len(elList), lowerLimList, upperLimList) continue # check if its plen argument if arg[:5] == 'plen=': argStr = arg[arg.find('=')+1:] # get number of ranges plList = argStr.split('or') for pl in plList: limList = pl.split(',') if len(limList) != 2: raise IOError("Illegal range in pulse length filter") lowerLimList.append(limList[0]) upperLimList.append(limList[1]) #append filter appendFilter(filter, '1', 'pl', '', len(plList), lowerLimList, upperLimList) continue # finally, check if its a filter argument if arg[:7] == 'filter=': argStr = arg[arg.find('=')+1:] #get mnemonic string itemList = argStr.split(',') if itemList[1] in ['+','-','*','/']: # two mnemonics used twoMnem = 1 mnem1 = itemList[0] operator = itemList[1] mnem2 = itemList[2] # check that both are valid if madParmObj.getParmType(mnem1) == -1: raise IOError("Illegal parameter: " + str(mnem1)) if madParmObj.getParmType(mnem2) == -1: raise IOError("Illegal parameter: " + str(mnem2)) else: # one menmonic twoMnem = 0 mnem1 = itemList[0] operator = '1' mnem2 = '' # check mnem1 is valid if madParmObj.getParmType(mnem1) == -1: raise IOError("Illegal parameter: " + str(mnem1)) # get ranges delimiter = ',' rangeStr = delimiter.join(itemList[1 + 2*twoMnem:]) rangeList = rangeStr.split('or') for thisRange in rangeList: limList = thisRange.split(',') if len(limList) != 2: raise IOError("Illegal range in filter") lowerLimList.append(limList[0]) upperLimList.append(limList[1]) #append filter appendFilter(filter, operator, mnem1, mnem2, len(rangeList), lowerLimList, upperLimList) continue # unknown argument print('Argument %s is unknown - see usage' % (arg)) print('\n') print(usageStr) sys.exit(0) # command line fully parsed - finally set up the time filter based on # date, time args if needed if len(date1) or len(time1) or len(date2) or len(time2): # if time1 is given but not date1, set up a UTH filter if len(time1) and len(date1)==0: time1List = time1.split(':') if len(time1List) != 3: raise IOError("Illegal value for time1: " + time1) beg_uth = float(time1List[0]) beg_uth += float(time1List[1])/60.0 beg_uth += float(time1List[2])/3600.0 appendFilter(filter, '1', 'UTH', '', 1, [str(beg_uth)], ['']) # if time2 is given but not date1 or date2, set up a UTH filter if len(time2) and len(date1)==0 and len(date2)==0: time2List = time2.split(':') if len(time2List) != 3: raise IOError("Illegal value for time2: " + time2) end_uth = float(time2List[0]) end_uth += float(time2List[1])/60.0 end_uth += float(time2List[2])/3600.0 appendFilter(filter, '1', 'UTH', '', 1, [''], [str(end_uth)]) # set up UT1 filter if both date and times given beg_ut1 = '' end_ut1 = '' if (date1): if time1 == '': time1 = '00:00:00' time1List = time1.split(':') if len(time1List) != 3: raise IOError("Illegal value for time1: " + time1) date1List = date1.split('/') if len(date1List) != 3: raise IOError("Illegal value for date1: " + date1) beg_ut1 = madrigal._Madrec.getUtFromDate(int(date1List[2]), int(date1List[0]), int(date1List[1]), int(time1List[0]), int(time1List[1]), int(time1List[2]), 0) beg_ut1 = str(beg_ut1) # now check for the case that time2 given, but not date2 # in which case time2 referes to date1 if len(time2) and len(date2)==0: end_ut1 = madrigal._Madrec.getUtFromDate(int(date1List[2]), int(date1List[0]), int(date1List[1]), 0, 0, 0, 0) time2List = time2.split(':') if len(time2List) != 3: raise IOError("Illegal value for time2: " + time2) end_ut1 += float(time2List[0]) * 3600.0 end_ut1 += float(time2List[1]) * 60.0 end_ut1 += float(time2List[2]) end_ut1 = str(end_ut1) if len(date2): if time2 == '': time2 = '00:00:00' time2List = time2.split(':') if len(time2List) != 3: raise IOError("Illegal value for time2: " + time2) date2List = date2.split('/') if len(date2List) != 3: raise IOError("Illegal value for date2: " + date2) end_ut1 = madrigal._Madrec.getUtFromDate(int(date2List[2]), int(date2List[0]), int(date2List[1]), int(time2List[0]), int(time2List[1]), int(time2List[2]), 0) end_ut1 = str(end_ut1) # append ut1 filter if needed if len(beg_ut1) != 0 or len(end_ut1) != 0: appendFilter(filter, '1', 'UT1', '', 1, [beg_ut1], [end_ut1]) # check that filename was given if len(filename) == 0: raise IOError('Required argument file missing') madrigal._Madrec.getIsprintReport(filename, '', desiredParmList, filter[0], filter[1], filter[2], filter[3], filter[4], filter[5], header, summary, int(mxchar), badvalStr, assumedStr, knownbadStr, 'stdout') except: # handle an error # if a normal SystemExit, simply terminate if str(sys.exc_info()[0]).find('exceptions.SystemExit') != -1: sys.exit(0) if sys.exc_info()[0] != None: print('\n**** ' + str(sys.exc_info()[0]) + ' ****\n') if sys.exc_info()[1] != None: print('\n**** ' + str(sys.exc_info()[1]) + ' ****\n') if sys.exc_info()[0] == None and sys.exc_info()[1] == None: print() traceback.print_exc() # end script