def main(argv): #---------------- # Initializations #---------------- #------------ # Directories #------------ wrkDir = os.getcwd() # Set current directory as the data directory binDir = '/data/bin' # Default binary directory. Used of nothing is specified on command line binDirVer = { 'v1': '/data/ebaumer/Code/sfit-core-code/src/', # Version 1 for binary directory (Eric) 'v2': '/data/tools/400/sfit-core/src/', # Version 2 for binary directory (Jim) 'v3': '/Users/jamesw/FDP/sfit/400/sfit-core/src/', # Version 2 for binary directory (Jim) 'v4': '/home/ebaumer/Code/sfit4/src/', 'v5': '/Users/jamesw/FDP/sfit/400/src/src-irwg14-mp' } #---------- # Run flags #---------- hbinFlg = False # Flag to run hbin pspecFlg = False # Flag to run pspec sfitFlg = False # Flag to run sfit4 errFlg = False # Flag to run error analysis clnFlg = False # Flag to clean directory of output files listed in ctl file #-------------------------------- # Retrieve command line arguments #-------------------------------- try: opts, args = getopt.getopt(sys.argv[1:], 'i:b:f:?') except getopt.GetoptError as err: print str(err) usage(binDirVer) sys.exit() #----------------------------- # Parse command line arguments #----------------------------- for opt, arg in opts: # Data directory if opt == '-i': wrkDir = arg sc.ckDir(wrkDir, exitFlg=True) # Binary directory elif opt == '-b': if not sc.ckDir(arg, exitFlg=False, quietFlg=True): try: binDir = binDirVer[arg.lower()] except KeyError: print '{} not a recognized version for -b option'.format( arg) sys.exit() else: binDir = arg if not (binDir.endswith('/')): binDir = binDir + '/' # Run flags elif opt == '-f': flgs = list(arg) for f in flgs: if f.lower() == 'h': hbinFlg = True elif f.lower() == 'p': pspecFlg = True elif f.lower() == 's': sfitFlg = True elif f.lower() == 'e': errFlg = True elif f.lower() == 'c': clnFile = True else: print '{} not an option for -f ... ignored'.format(f) elif opt == '-?': usage(binDirVer) sys.exit() else: print 'Unhandled option: {}'.format(opt) sys.exit() #-------------------------------------- # If necessary change working directory # to directory with input data. #-------------------------------------- if os.path.abspath(wrkDir) != os.getcwd(): os.chdir(wrkDir) if not (wrkDir.endswith('/')): wrkDir = wrkDir + '/' #-------------------------- # Initialize sfit ctl class #-------------------------- if sc.ckFile(wrkDir + 'sfit4.ctl'): ctlFileName = wrkDir + 'sfit4.ctl' else: Tk().withdraw() ctlFileName = askopenfilename(initialdir=wrkDir, message='Please select sfit ctl file') ctlFile = sc.CtlInputFile(ctlFileName) ctlFile.getInputs() #------------------------ # Initialize sb ctl class #------------------------ if errFlg: if sc.ckFile(wrkDir + 'sb.ctl'): sbCtlFileName = wrkDir + 'sb.ctl' else: TK().withdraw() sbCtlFileName = askopenfilename( initialdir=wrkDir, message='Please select sb ctl file') sbCtlFile = sc.CtlInputFile(sbCtlFileName) sbCtlFile.getInputs() #--------------------------- # Clean up output from sfit4 #--------------------------- if clnFlg: for k in ctlFile.inputs['file.out']: if 'file.out' in k: try: os.remove(wrkDir + ctlFile.inputs[k]) except OSError: pass #---------- # Run pspec #---------- if pspecFlg: print '*************' print 'Running pspec' print '*************' rtn = sc.subProcRun([binDir + 'pspec']) #---------- # Run hbin #---------- if hbinFlg: print '************' print 'Running hbin' print '************' rtn = sc.subProcRun([binDir + 'hbin']) #---------- # Run sfit4 #---------- if sfitFlg: print '************' print 'Running sfit' print '************' rtn = sc.subProcRun([binDir + 'sfit4']) #------------------- # Run error analysis #------------------- if errFlg: print '**********************' print 'Running error analysis' print '**********************' rtn = errAnalysis(ctlFile, sbCtlFile, wrkDir)
def main(argv): #------------------ # Set default flags #------------------ logFile = False lstFlg = False pauseFlg = False #-------------------------------- # Retrieve command line arguments #-------------------------------- try: opts, args = getopt.getopt(sys.argv[1:], 'i:P:L:l?') except getopt.GetoptError as err: print str(err) usage() sys.exit() #----------------------------- # Parse command line arguments #----------------------------- for opt, arg in opts: # Check input file flag and path if opt == '-i': # Input file instance mainInF = sc.Layer1InputFile(arg) # Pause after skip option elif opt == '-P': if not arg or arg.startswith('-'): usage() sys.exit() pauseFlg = True try: nskips = int(arg) - 1 if nskips < 0: raise ValueError except ValueError: print 'Argument for -P flag: %s, needs to be an integer > 0' % arg sys.exit() # Show all command line flags elif opt == '-?': usage() sys.exit() # Option for Log File elif opt == '-l': logFile = True # Option for List file elif opt == '-L': if not arg or arg.startswith('-'): usage() sys.exit() lstFlg = True lstFnameFlg = int(arg) else: print 'Unhandled option: ' + opt sys.exit() #---------------------------------------------- # Initialize main input variables as dicitonary #---------------------------------------------- mainInF.getInputs() #-------------------- # Initialize log file #-------------------- # Write initial log data if logFile: log_fpath = mainInF.inputs['logDirOutput'] # check if '/' is included at end of path if not (log_fpath.endswith('/')): log_fpath = log_fpath + '/' # check if path is valide ckDir(log_fpath) logFile = logging.getLogger('1') logFile.setLevel(logging.INFO) hdlr1 = logging.FileHandler(log_fpath + mainInF.inputs['ctlList'][0][2] + '.log', mode='w') fmt1 = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s', '%a, %d %b %Y %H:%M:%S') hdlr1.setFormatter(fmt1) logFile.addHandler(hdlr1) logFile.info( '**************** Starting Logging ***********************') logFile.info('Input data file: ' + mainInF.fname) logFile.info('Log file path: ' + log_fpath) logFile.info('Station location: ' + mainInF.inputs['loc']) #--------------------- # Initialize list file #--------------------- if lstFlg: lst_fpath = mainInF.inputs['logDirOutput'] # check if '/' is included at end of path if not (lst_fpath.endswith('/')): lst_fpath = lst_fpath + '/' # check if path is valide ckDir(lst_fpath) lstFile = logging.getLogger('2') lstFile.setLevel(logging.INFO) if lstFnameFlg: hdlr2 = logging.FileHandler( lst_fpath + mainInF.inputs['ctlList'][0][2] + '.lst', mode='w') else: hdlr2 = logging.FileHandler(lst_fpath + 'testing.lst', mode='w') fmt2 = logging.Formatter('') hdlr2.setFormatter(fmt2) lstFile.addHandler(hdlr2) #----------------------------- # Check the existance of files #----------------------------- # Spectral Database file ckFile(mainInF.inputs['spcdbFile'], logFlg=logFile, exit=True) # WACCM profile file #ckFile(mainInF.inputs['WACCMfile'],logFlg=logFile,exit=True) # ctl files for ctlFile in mainInF.inputs['ctlList']: ckFile(ctlFile[0], logFlg=logFile, exit=True) #-------------------------------------------- # Program Looping structure. See Notes # Level1 - LOC (Input/Output) # Level2 - ctl file (Output) # Level3 - Spectral db (Output) # --Check I/O directory structure #-------------------------------------------- # Establish Date Range inDateRange = sc.DateRange(mainInF.inputs['iyear'], mainInF.inputs['imnth'], mainInF.inputs['iday'], mainInF.inputs['fyear'], mainInF.inputs['fmnth'], mainInF.inputs['fday']) #-------------------- # Level 1 -- LOC #-------------------- if not (isinstance(mainInF.inputs['loc'], list)): mainInF.inputs['loc'] = [mainInF.inputs['loc']] for loc in mainInF.inputs['loc']: #------------------------------------------- # Check for existance of Input folder. Also, # check if '/' is included at end of path #------------------------------------------- if not (mainInF.inputs['BaseDirInput'].endswith('/')): wrkInputDir1 = mainInF.inputs['BaseDirInput'] + '/' + loc + '/' else: wrkInputDir1 = mainInF.inputs['BaseDirInput'] + loc + '/' ckDir(wrkInputDir1, logFlg=logFile, exit=True) #----------------------------------------------------------- # Check for the existance of Output folder and create if DNE # Also, check if '/' is included at end of path #----------------------------------------------------------- if not (mainInF.inputs['BaseDirOutput'].endswith('/')): wrkOutputDir1 = mainInF.inputs['BaseDirOutput'] + '/' else: wrkOutputDir1 = mainInF.inputs['BaseDirOutput'] ckDirMk(wrkOutputDir1, logFile) #-------------------------------------- # Find spectral db file and initialize # instance and get inputs #-------------------------------------- dbData = sc.DbInputFile(mainInF.inputs['spcdbFile'], logFile) dbData.getInputs() #----------------------------- # Initial filter of data based # on input date range #----------------------------- dbFltData_1 = dbData.dbFilterDate(inDateRange) #--------------------------------- # Initialize error control file # instance and get inputs (sb.ctl) #--------------------------------- if mainInF.inputs['errFlg']: ckFile(mainInF.inputs['sbCtlFile'], logFlg=logFile, exit=True) SbctlFileVars = sc.CtlInputFile(mainInF.inputs['sbCtlFile']) SbctlFileVars.getInputs() #-------------------------------------- # Level 2 -- Loop through control files #-------------------------------------- for ctl_ind, ctlFileList in enumerate(mainInF.inputs['ctlList']): #----------------------------- # Initialize ctl file instance # and get inputs #----------------------------- ctlFile = ctlFileList[0] ctlFileGlb = sc.CtlInputFile(ctlFile, logFile) ctlFileGlb.getInputs() #----------------------------- # Write Meta-data to list file #----------------------------- if lstFlg: lstFile.info('# Begin List File Meta-Data') lstFile.info('Start Date = ' + str(inDateRange.dateList[0])) lstFile.info('End Date = ' + str(inDateRange.dateList[-1])) lstFile.info('WACCM_File = ' + mainInF.inputs['WACCMfile']) lstFile.info('ctl_File = ' + mainInF.inputs['ctlList'][ctl_ind][0]) lstFile.info('FilterID = ' + mainInF.inputs['ctlList'][ctl_ind][1]) lstFile.info('VersionName = ' + mainInF.inputs['ctlList'][ctl_ind][2]) lstFile.info('Site = ' + mainInF.inputs['loc'][0]) lstFile.info('statnLyrs_file = ' + ctlFileGlb.inputs['file.in.stalayers'][0]) lstFile.info('primGas = ' + ctlFileGlb.primGas) lstFile.info('specDBfile = ' + mainInF.inputs['spcdbFile']) lstFile.info('Coadd flag = ' + str(mainInF.inputs['coaddFlg'])) lstFile.info('nBNRfiles = ' + str(mainInF.inputs['nBNRfiles'])) lstFile.info('ilsFlg = ' + str(mainInF.inputs['ilsFlg'])) lstFile.info('pspecFlg = ' + str(mainInF.inputs['pspecFlg'])) lstFile.info('refmkrFlg = ' + str(mainInF.inputs['refmkrFlg'])) lstFile.info('sfitFlg = ' + str(mainInF.inputs['sfitFlg'])) lstFile.info('lstFlg = ' + str(mainInF.inputs['lstFlg'])) lstFile.info('errFlg = ' + str(mainInF.inputs['errFlg'])) lstFile.info('zptFlg = ' + str(mainInF.inputs['zptFlg'])) lstFile.info('refMkrLvl = ' + str(mainInF.inputs['refMkrLvl'])) lstFile.info('wVer = ' + str(mainInF.inputs['wVer'])) lstFile.info('# End List File Meta-Data') lstFile.info('') lstFile.info('Date TimeStamp Directory ') #------------------------- # Filter spectral db based # on wavenumber bounds in # ctl file #------------------------- # Find the upper and lower bands from the ctl file nu = [] for band in ctlFileGlb.inputs['band']: bandstr = str(int(band)) nu.append(ctlFileGlb.inputs['band.' + bandstr + '.nu_start'][0]) nu.append(ctlFileGlb.inputs['band.' + bandstr + '.nu_stop'][0]) nu.sort() # Sort wavenumbers nuUpper = nu[-1] # Get upper wavenumber nuLower = nu[0] # Get lower wavenumber # Filter spectral DB based on wave number dbFltData_2 = dbData.dbFilterNu(nuUpper, nuLower, dbFltData_1) if not (dbFltData_2): continue # Test for empty dicitonary (i.e. no data) #------------------------------------------------------------------------------------------------ # In addition to filtering db based on wavenumbers in ctl file one can filter spectral db based # on filter ID. Using this can help avoid the bug when pspec tries to apply a filter band outside # spectral region of a bnr file. #------------------------------------------------------------------------------------------------ if mainInF.inputs['ctlList'][ctl_ind][1]: dbFltData_2 = dbData.dbFilterFltrID( mainInF.inputs['ctlList'][ctl_ind][1], dbFltData_2) if not (dbFltData_2): continue # Test for empty dicitonary (i.e. no data) #--------------------------------------------------------------------- # Check for the existance of Output folder <Version> and create if DNE #--------------------------------------------------------------------- if mainInF.inputs['ctlList'][ctl_ind][2]: wrkOutputDir2 = wrkOutputDir1 + mainInF.inputs['ctlList'][ ctl_ind][2] + '/' ckDirMk(wrkOutputDir2, logFile) else: wrkOutputDir2 = wrkOutputDir1 #----------------------------------------------- # Create a folder within the output directory to # store various input files: ctl, hbin, isotope #----------------------------------------------- ctlPath, ctlFname = os.path.split( mainInF.inputs['ctlList'][ctl_ind][0]) archDir = wrkOutputDir2 + 'inputFiles' + '/' if ckDirMk(archDir, logFile): for f in glob.glob(archDir + '*'): os.remove(f) shutil.copy(mainInF.inputs['ctlList'][ctl_ind][0], archDir) # Copy ctl file for file in glob.glob(ctlPath + '/*hbin*'): # Copy hbin files shutil.copy(file, archDir) for file in glob.glob(ctlPath + '/isotope*'): # Copy isotope file shutil.copy(file, archDir) #------------------------------------------ # Level 3 -- Loop through spectral db lines #------------------------------------------ nobs = len(dbFltData_2['Date']) for spcDBind in range(0, nobs): #----------------------------------------------------------- # Grab spectral data base information for specific retrieval #----------------------------------------------------------- # Get current date and time of spectral database entry currntDayStr = str(int(dbFltData_2['Date'][spcDBind])) currntDay = dt.datetime( int(currntDayStr[0:4]), int(currntDayStr[4:6]), int(currntDayStr[6:]), int(dbFltData_2['Time'][spcDBind][0:2]), int(dbFltData_2['Time'][spcDBind][3:5]), int(dbFltData_2['Time'][spcDBind][6:])) # Get dictionary with specific date specDBone = dbData.dbFindDate(currntDay, fltDict=dbFltData_2) brkFlg = True # Flag to break out of while statement while True: # While statement is for the repeat function #------------------------------------------------------------- # If pause after skip flag is initialized, do several things: # 1) Check if number of skips exceeds total number of filtered # observations # 2) Skip to specified starting point # 3) Pause after first run #------------------------------------------------------------- if pauseFlg and (nskips > len(dbFltData_2['Date'])): print 'Specified starting point in -P option (%d) is greater than number of observations in filtered database (%d)' % ( nskips, nobs) if logFile: logFile.critical( 'Specified starting point in -P option (%d) is greater than number of observations in filtered database (%d)' % (nskips, nobs)) sys.exit() if pauseFlg and (spcDBind < nskips): break # Get date of observations daystr = str(int(dbFltData_2['Date'][spcDBind])) obsDay = dt.datetime(int(daystr[0:4]), int(daystr[4:6]), int(daystr[6:])) #---------------------------------------- # Check the existance of input and output # directory structure #---------------------------------------- # Find year month and day strings yrstr = "{0:02d}".format(obsDay.year) mnthstr = "{0:02d}".format(obsDay.month) daystr = "{0:02d}".format(obsDay.day) datestr = yrstr + mnthstr + daystr # Check for existance of YYYYMMDD Input folder # If this folder does not exist => there is no # Data for this day wrkInputDir2 = wrkInputDir1 + yrstr + mnthstr + daystr + '/' ckDir(wrkInputDir2, logFlg=logFile, exit=True) #----------------------------------------- # Check for the existance of Output folder # <Date>.<TimeStamp> and create if DNE #----------------------------------------- wrkOutputDir3 = wrkOutputDir2 + datestr + '.' + "{0:06}".format( int(dbFltData_2['TStamp'][spcDBind])) + '/' if ckDirMk(wrkOutputDir3, logFile): # Remove all files in Output directory if previously exists!! for f in glob.glob(wrkOutputDir3 + '*'): os.remove(f) #------------------------------- # Copy relavent files from input # directory to output directoy #------------------------------- #----------------------------------- # Copy control file to Output folder # First check if location to copy ctl is # the same location as original ctl file #----------------------------------- try: shutil.copyfile(mainInF.inputs['ctlList'][ctl_ind][0], wrkOutputDir3 + 'sfit4.ctl') except IOError: print 'Unable to copy template ctl file to working directory: %s' % wrkOutputDir3 if logFile: logFile.critical( 'Unable to copy template ctl file to working directory: %s' % wrkOutputDir3) sys.exit() #------------------------------------- # Copy sb.ctl file to output directory # if error analysis is chosen #------------------------------------- if mainInF.inputs['errFlg']: try: shutil.copyfile(mainInF.inputs['sbCtlFile'], wrkOutputDir3 + 'sb.ctl') except IOError: print 'Unable to copy template sb.ctl file to working directory: %s' % wrkOutputDir3 if logFile: logFile.critical( 'Unable to copy template sb.ctl file to working directory: %s' % wrkOutputDir3) sys.exit() #---------------------------------- # Copy hbin details to output folder # ** Assuming that the hbin.dtl and # hbin.input files are in the same # location as the global ctl file #---------------------------------- try: shutil.copyfile(ctlPath + '/hbin.dtl', wrkOutputDir3 + '/hbin.dtl') # Copy hbin.dtl file except IOError: print 'Unable to copy file: %s' % (ctlPath + '/hbin.dtl') if logFile: logFile.error(IOError) try: shutil.copyfile(ctlPath + '/hbin.input', wrkOutputDir3 + '/hbin.input') # Copy hbin.input file except IOError: print 'Unable to copy file: %s' % (ctlPath + '/hbin.input') if logFile: logFile.error(IOError) # Create instance of local control file (ctl file in working directory) ctlFileLcl = sc.CtlInputFile(wrkOutputDir3 + 'sfit4.ctl', logFile) #------------------------------------------------- # Determine whether to use ILS file. Empty string # '' => no ILS file. #------------------------------------------------- if mainInF.inputs['ilsDir'] and mainInF.inputs['ilsFlg']: #------------------------------------------- # Determine if ilsDir is a file or directory #------------------------------------------- # If directory..... if os.path.isdir(mainInF.inputs['ilsDir']): # Determine which ILS file to use ilsFileList = glob.glob(mainInF.inputs['ilsDir'] + 'ils*') # Create a date list of ils files present ilsYYYYMMDD = [] for ilsFile in ilsFileList: ilsFileNpath = os.path.basename(ilsFile) match = re.match( r'\s*ils(\d\d\d\d)(\d\d)(\d\d).*', ilsFileNpath) ilsYYYYMMDD.append([ int(match.group(1)), int(match.group(2)), int(match.group(3)) ]) ilsDateList = [ dt.date(ilsyear, ilsmonth, ilsday) for ilsyear, ilsmonth, ilsday in ilsYYYYMMDD ] # Find the ils date nearest to the current day nearstDay = sc.nearestDate(ilsDateList, obsDay.year, obsDay.month, obsDay.day) nearstDayMnth = "{0:02d}".format(nearstDay.month) nearstDayYr = "{0:02d}".format(nearstDay.year) nearstDayDay = "{0:02d}".format(nearstDay.day) nearstDaystr = nearstDayYr + nearstDayMnth + nearstDayDay # Get File path and name for nearest ils file for ilsFile in ilsFileList: if nearstDaystr in os.path.basename(ilsFile): ilsFname = ilsFile # If file..... elif os.path.isfile(mainInF.inputs['ilsDir']): ilsFname = mainInF.inputs['ilsDir'] if logFile: logFile.info('Using ils file: ' + ilsFname) # Replace ils file name in local ctl file (within working directory) teststr = [ r'file.in.modulation_fcn', r'file.in.phase_fcn' ] repVal = [ilsFname, ilsFname] ctlFileLcl.replVar(teststr, repVal) # Write FOV from spectral database file to ctl file (within working directory) ctlFileLcl.replVar([r'band\.\d+\.omega'], [str(specDBone['FOV'])]) #--------------------------- # Message strings for output #--------------------------- msgstr1 = mainInF.inputs['ctlList'][ctl_ind][0] msgstr2 = datestr + '.' + "{0:06}".format( int(dbFltData_2['TStamp'][spcDBind])) #----------------------------# # # # --- Run pspec--- # # # #----------------------------# if mainInF.inputs['pspecFlg']: print '*****************************************************' print 'Running PSPEC for ctl file: %s' % msgstr1 print 'Processing spectral observation date: %s' % msgstr2 print '*****************************************************' rtn = t15ascPrep(dbFltData_2, wrkInputDir2, wrkOutputDir3, mainInF, spcDBind, ctl_ind, logFile) if logFile: logFile.info('Ran PSPEC for ctl file: %s' % msgstr1) logFile.info( 'Processed spectral observation date: %s' % msgstr2) #----------------------------# # # # --- Run Refmaker--- # # # #----------------------------# if mainInF.inputs['refmkrFlg']: #------------- # Run Refmaker #------------- print '*****************************************************' print 'Running REFMKRNCAR for ctl file: %s' % msgstr1 print 'Processing spectral observation date: %s' % msgstr2 print '*****************************************************' rtn = refMkrNCAR(wrkInputDir2, mainInF.inputs['WACCMfile'], wrkOutputDir3, \ mainInF.inputs['refMkrLvl'], mainInF.inputs['wVer'], mainInF.inputs['zptFlg'],\ dbFltData_2, spcDBind, logFile) if logFile: logFile.info('Ran REFMKRNCAR for ctl file: %s' % msgstr1) logFile.info( 'Processed spectral observation date: %s' % msgstr2) #----------------------------# # # # --- Run sfit4--- # # # #----------------------------# #-------------- # Call to sfit4 #-------------- if mainInF.inputs['sfitFlg']: print '*****************************************************' print 'Running SFIT4 for ctl file: %s' % msgstr1 print 'Processing spectral observation date: %s' % msgstr2 print 'Ouput Directory: %s' % wrkOutputDir3 print '*****************************************************' if logFile: logFile.info('Ran SFIT4 for ctl file: %s' % msgstr1) logFile.info( 'Processed spectral observation date: %s' % msgstr2) #------------------------------ # Change working directory to # output directory to run pspec #------------------------------ try: os.chdir(wrkOutputDir3) except OSError as errmsg: if logFile: logFile.error(errmsg) sys.exit() #--------------------- # Run sfit4 executable #--------------------- sc.subProcRun([mainInF.inputs['binDir'] + 'sfit4'], logFile) #if ( stderr is None or not stderr): #if log_flg: #logFile.info('Finished running sfit4\n' + stdout) #else: #print 'Error running sfit4!!!' #if log_flg: #logFile.error('Error running sfit4 \n' + stdout) #sys.exit() #----------------------------------- # Change permissions of all files in # working directory #----------------------------------- for f in glob.glob(wrkOutputDir3 + '*'): os.chmod(f, 0777) #---------------------------------------------- # If succesfull run, write details to list file #---------------------------------------------- if lstFlg: fname = wrkOutputDir3 + 'sfit4.dtl' cmpltFlg = False with open(fname, 'r') as fopen: for ind, line in enumerate( reversed(fopen.readlines())): if ind < 10: if r'RDRV: DONE.' in line: cmpltFlg = True else: break if cmpltFlg and lstFile: lstFile.info( "{0:<13}".format( int(dbFltData_2['Date'][spcDBind])) + "{0:06}".format( int(dbFltData_2['TStamp'][spcDBind])) + ' ' + wrkOutputDir3) #----------------------------# # # # --- Error Analysis --- # # # #----------------------------# if mainInF.inputs['errFlg']: if logFile: logFile.info('Ran SFIT4 for ctl file: %s' % msgstr1) #----------------------------------- # Enter into Error Analysis function #----------------------------------- rtn = errAnalysis(ctlFileGlb, SbctlFileVars, wrkOutputDir3, logFile) #--------------------------- # Continuation for Pause flg #--------------------------- if pauseFlg: while True: user_input = raw_input( 'Paused processing....\n Enter: 0 to exit, -1 to repeat, 1 to continue to next, 2 to continue all\n >>> ' ) try: user_input = int(user_input) if not any(user_input == val for val in [-1, 0, 1, 2]): raise ValueError break except ValueError: print 'Please enter -1, 0, 1, or 2' if user_input == 0: sys.exit() # Exit program elif user_input == 1: brkFlg = True # Exit while loop (Do not repeat) elif user_input == 2: # Stop pause and exit while loop pauseFlg = False brkFlg = True elif user_input == -1: # Repeat loop brkFlg = False # Need to implement functionality to recopy ctl file, bnr file, etc #----------------------- # Exit out of while loop #----------------------- if brkFlg: break
def main(): #----------------------------------------------------------------------------------------- # Initialization #----------------------------------------------------------------------------------------- loc = 'tab' # LOCATION gas = 'pan' # GAS alpha = [0.1, 1, 10, 100, 1000, 10000, 100000, 1000000] # ALPHA VALUES TO TEST #alpha = [10000]#, 1000, 1e4] # ALPHA VALUES TO TEST TikOut = '/data1/ebaumer/'+loc.lower()+'/'+gas.lower()+'/x.'+gas.lower()+'/' # PATH TO SAVE THE TIK MATRIX binDir = '/data/ebaumer/Code/sfit-core-code/src/' # PATH FOR THE SFIT4 SOURCE CODE errFlg = False # ERROR ANALYSIS? saveFlg = True # SAVE PDF FILE? TransFlg = True # OPTIONAL = TRANSFORMATION IN CASE IN CASE NON-CONSTANT RETRIEVAL GRID (e.g., http://www.atmos-meas-tech.net/4/1943/2011/) if saveFlg: pltFile = TikOut + 'TikOpt.pdf' #----------------------------------------------------------------------------------------- # START #----------------------------------------------------------------------------------------- ckDir(TikOut, logFlg=False, exit=True) if TransFlg: fileLayers = '/data/Campaign/'+loc.upper()+'/local/station.layers' ckFile(fileLayers, exit=True) cols, indexToName = getColumns(fileLayers, headerrow=2, delim=' ', header=True) midpnt = np.asarray(cols['midpnt'][0:-1]).astype(np.float) thick = np.asarray(cols['thick'][0:-1]).astype(np.float) level = np.asarray(cols['level']).astype(np.float) else: if loc == 'fl0': nlayer = 44 elif loc == 'mlo': nlayer = 41 elif loc == 'tab': nlayer = 47 else: print "nlayer is not known for your location\nModify TikOpt to accomodate nlayer" exit() #----------------------------------------------------------------------------------------- # Define variable to save #----------------------------------------------------------------------------------------- totCol = [] dof = [] rms = [] chi2y = [] tot_rnd = [] tot_sys = [] tot_std = [] tot_smt = [] tot_msr = [] #Find Current Directory cwd = os.getcwd() #----------------------------------------------------------------------------------------- # Run Sfit #----------------------------------------------------------------------------------------- for ai in alpha: if TransFlg: tikCov_Trans(np.sort(level), ai, TikOut, transflag=True,normalizeflag=False) else: tikCov(nlayer, ai, TikOut) print '************************************************************************' print 'Running sfit4 - Tikhonov approach, alpha = {0:.3f}'.format(ai) print '************************************************************************' rtn = sc.subProcRun( [binDir + 'sfit4'] ) wrkDir = os.getcwd() if not(wrkDir.endswith('/')): wrkDir = wrkDir + '/' #------------------- # Run error analysis #------------------- if errFlg: print '**********************************************************************************' print 'Running error analysis - Tikhonov approach, alpha = {0:.3f}\n'.format(ai) print '**********************************************************************************' ckFile('sfit4.ctl', exit=True) ckFile('sb.ctl', exit = True) ctlFile = sc.CtlInputFile('sfit4.ctl') ctlFile.getInputs() sbCtlFile = sc.CtlInputFile('sb.ctl') sbCtlFile.getInputs() rtn = errAnalysis(ctlFile,sbCtlFile,wrkDir) gas = dc.PlotData(wrkDir,wrkDir+'sfit4.ctl') gas.readsummary() totCol.append(np.asarray(gas.summary[gas.PrimaryGas.upper()+'_RetColmn'])) rms.append(np.asarray(gas.summary[gas.PrimaryGas.upper()+'_FITRMS'])) dof.append(np.asarray(gas.summary[gas.PrimaryGas.upper()+'_DOFS_TRG'])) chi2y.append(np.asarray(gas.summary[gas.PrimaryGas.upper()+'_CHI_2_Y'])) if errFlg: gas.readError(totFlg=True,sysFlg=False,randFlg=False,vmrFlg=False,avkFlg=False,KbFlg=False) tot_rnd.append(np.array(gas.error['Total random uncertainty'])) tot_sys.append(np.array(gas.error['Total systematic uncertainty'])) tot_std.append(np.sqrt((np.array(gas.error['Total random uncertainty']))**2 + (np.array(gas.error['Total systematic uncertainty']))**2)) tot_smt.append(np.array(gas.error['Smoothing error (Ss)'])) #--> Eric's routine #tot_smt.append(np.array(gas.error['Smoothing error (Ss, using sa)'])) #--> Bavo's routine tot_msr.append(np.array(gas.error['Measurement error (Sm)'])) totCol = np.asarray(totCol) dof = np.asarray(dof) rms = np.asarray(rms) chi2y = np.asarray(chi2y) if errFlg: tot_rnd = np.asarray(tot_rnd) tot_sys = np.asarray(tot_sys) tot_std = np.asarray(tot_std) tot_smt = np.asarray(tot_smt) tot_msr = np.asarray(tot_msr) #------------------- # Plots #------------------- print '**********************' print ' Plots ' print '**********************' if saveFlg: pdfsav = PdfPages(pltFile) if errFlg: fig, ( (ax, ax2), (ax3, ax4) ) = plt.subplots(2, 2, sharex=True, figsize=(10, 8)) else: fig, (ax, ax2, ax3) = plt.subplots(3, 1, sharex=True) #-------------------Total Column------------------- ax.plot(alpha,totCol,label='totCol') ax.scatter(alpha,totCol) ax.grid(True,which='both') ax.tick_params(which='both',labelsize=11) ax.set_title('Total Column', multialignment='center') ax.set_ylabel('Total Column [molec/cm$^2$]') plt.xscale('log') #-------------------rms------------------- ax2.plot(alpha,rms,label='rms') ax2.scatter(alpha,rms) ax2.grid(True,which='both') ax2.tick_params(which='both',labelsize=11) ax2.set_title('RMS', multialignment='center') ax2.set_ylabel('RMS [%]') ax2.yaxis.set_major_formatter(FormatStrFormatter('%.4f')) #-------------------dof------------------- ax3.plot(alpha,dof,label='dof') ax3.scatter(alpha,dof) ax3.grid(True,which='both') ax3.tick_params(which='both',labelsize=11) ax3.set_title('DOF', multialignment='center') ax3.set_ylabel('DOF') ax3.set_xlabel('Regularization strength, alpha') #-------------------Error------------------- if errFlg: ax4.plot(alpha,tot_smt, color='blue', label='smoothing') ax4.scatter(alpha,tot_smt, color='blue') ax4.plot(alpha,tot_msr, color='green', label='measurement') ax4.scatter(alpha,tot_msr, color='green') ax4.plot(alpha,np.sqrt(tot_msr**2 + tot_smt**2) , color='gray', label='Total (measurement + smoothing)') ax4.scatter(alpha,np.sqrt(tot_msr**2 +tot_smt**2), color='gray') ax4.grid(True,which='both') ax4.tick_params(which='both',labelsize=11) ax4.set_title('Error', multialignment='center') ax4.set_ylabel('Error [%]') ax4.set_xlabel('Regularization strength, alpha') ax4.legend(prop={'size':10}, loc = 1) fig.suptitle(cwd) fig.tight_layout() fig.subplots_adjust(left=0.1, right=0.95, top=0.9) if saveFlg: pdfsav.savefig(fig,dpi=200) pdfsav.close() else: plt.show(block=False) user_input = raw_input('Press any key to exit >>> ') sys.exit()
def main(argv): #------------------ # Set default flags #------------------ logFile = False lstFlg = False pauseFlg = False #-------------------------------- # Retrieve command line arguments #-------------------------------- try: opts, args = getopt.getopt(sys.argv[1:], 'i:P:L:l?') except getopt.GetoptError as err: print str(err) usage() sys.exit() #----------------------------- # Parse command line arguments #----------------------------- for opt, arg in opts: # Check input file flag and path if opt == '-i': # Input file instance mainInF = sc.Layer1InputFile(arg) # Pause after skip option elif opt == '-P': if not arg or arg.startswith('-'): usage() sys.exit() pauseFlg = True try: nskips = int(arg) - 1 if nskips < 0: raise ValueError except ValueError: print 'Argument for -P flag: %s, needs to be an integer > 0' % arg sys.exit() # Show all command line flags elif opt == '-?': usage() sys.exit() # Option for Log File elif opt == '-l': logFile = True # Option for List file elif opt == '-L': if not arg or arg.startswith('-'): usage() sys.exit() lstFlg = True lstFnameFlg = int(arg) else: print 'Unhandled option: ' + opt sys.exit() #---------------------------------------------- # Initialize main input variables as dicitonary #---------------------------------------------- mainInF.getInputs() #-------------------- # Initialize log file #-------------------- # Write initial log data if logFile: log_fpath = mainInF.inputs['logDirOutput'] # check if '/' is included at end of path if not( log_fpath.endswith('/') ): log_fpath = log_fpath + '/' # check if path is valide ckDir(log_fpath) logFile = logging.getLogger('1') logFile.setLevel(logging.INFO) hdlr1 = logging.FileHandler(log_fpath + mainInF.inputs['ctlList'][0][2] + '.log',mode='w') fmt1 = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s','%a, %d %b %Y %H:%M:%S') hdlr1.setFormatter(fmt1) logFile.addHandler(hdlr1) logFile.info('**************** Starting Logging ***********************') logFile.info('Input data file: ' + mainInF.fname ) logFile.info('Log file path: ' + log_fpath ) logFile.info('Station location: ' + mainInF.inputs['loc']) #--------------------- # Initialize list file #--------------------- if lstFlg: lst_fpath = mainInF.inputs['logDirOutput'] # check if '/' is included at end of path if not( lst_fpath.endswith('/') ): lst_fpath = lst_fpath + '/' # check if path is valide ckDir(lst_fpath) lstFile = logging.getLogger('2') lstFile.setLevel(logging.INFO) if lstFnameFlg: hdlr2 = logging.FileHandler(lst_fpath + mainInF.inputs['ctlList'][0][2] + '.lst',mode='w') else: hdlr2 = logging.FileHandler(lst_fpath + 'testing.lst',mode='w') fmt2 = logging.Formatter('') hdlr2.setFormatter(fmt2) lstFile.addHandler(hdlr2) #----------------------------- # Check the existance of files #----------------------------- # Spectral Database file ckFile(mainInF.inputs['spcdbFile'],logFlg=logFile,exit=True) # WACCM profile file #ckFile(mainInF.inputs['WACCMfile'],logFlg=logFile,exit=True) # ctl files for ctlFile in mainInF.inputs['ctlList']: ckFile(ctlFile[0],logFlg=logFile,exit=True) #-------------------------------------------- # Program Looping structure. See Notes # Level1 - LOC (Input/Output) # Level2 - ctl file (Output) # Level3 - Spectral db (Output) # --Check I/O directory structure #-------------------------------------------- # Establish Date Range inDateRange = sc.DateRange(mainInF.inputs['iyear'],mainInF.inputs['imnth'],mainInF.inputs['iday'], mainInF.inputs['fyear'],mainInF.inputs['fmnth'],mainInF.inputs['fday']) #-------------------- # Level 1 -- LOC #-------------------- if not( isinstance(mainInF.inputs['loc'], list) ): mainInF.inputs['loc'] = [mainInF.inputs['loc']] for loc in mainInF.inputs['loc']: #------------------------------------------- # Check for existance of Input folder. Also, # check if '/' is included at end of path #------------------------------------------- if not( mainInF.inputs['BaseDirInput'].endswith('/') ): wrkInputDir1 = mainInF.inputs['BaseDirInput'] + '/'+ loc + '/' else: wrkInputDir1 = mainInF.inputs['BaseDirInput'] + loc + '/' ckDir( wrkInputDir1, logFlg=logFile, exit=True ) #----------------------------------------------------------- # Check for the existance of Output folder and create if DNE # Also, check if '/' is included at end of path #----------------------------------------------------------- if not( mainInF.inputs['BaseDirOutput'].endswith('/') ): wrkOutputDir1 = mainInF.inputs['BaseDirOutput'] + '/' else: wrkOutputDir1 = mainInF.inputs['BaseDirOutput'] ckDirMk( wrkOutputDir1, logFile ) #-------------------------------------- # Find spectral db file and initialize # instance and get inputs #-------------------------------------- dbData = sc.DbInputFile(mainInF.inputs['spcdbFile'],logFile) dbData.getInputs() #----------------------------- # Initial filter of data based # on input date range #----------------------------- dbFltData_1 = dbData.dbFilterDate(inDateRange) #--------------------------------- # Initialize error control file # instance and get inputs (sb.ctl) #--------------------------------- if mainInF.inputs['errFlg']: ckFile(mainInF.inputs['sbCtlFile'],logFlg=logFile,exit=True) SbctlFileVars = sc.CtlInputFile(mainInF.inputs['sbCtlFile']) SbctlFileVars.getInputs() #-------------------------------------- # Level 2 -- Loop through control files #-------------------------------------- for ctl_ind,ctlFileList in enumerate(mainInF.inputs['ctlList']): #----------------------------- # Initialize ctl file instance # and get inputs #----------------------------- ctlFile = ctlFileList[0] ctlFileGlb = sc.CtlInputFile(ctlFile,logFile) ctlFileGlb.getInputs() #----------------------------- # Write Meta-data to list file #----------------------------- if lstFlg: lstFile.info('# Begin List File Meta-Data') lstFile.info('Start Date = ' + str(inDateRange.dateList[0]) ) lstFile.info('End Date = ' + str(inDateRange.dateList[-1]) ) lstFile.info('WACCM_File = ' + mainInF.inputs['WACCMfile'] ) lstFile.info('ctl_File = ' + mainInF.inputs['ctlList'][ctl_ind][0] ) lstFile.info('FilterID = ' + mainInF.inputs['ctlList'][ctl_ind][1] ) lstFile.info('VersionName = ' + mainInF.inputs['ctlList'][ctl_ind][2] ) lstFile.info('Site = ' + mainInF.inputs['loc'][0] ) lstFile.info('statnLyrs_file = ' + ctlFileGlb.inputs['file.in.stalayers'][0]) lstFile.info('primGas = ' + ctlFileGlb.primGas ) lstFile.info('specDBfile = ' + mainInF.inputs['spcdbFile'] ) lstFile.info('Coadd flag = ' + str(mainInF.inputs['coaddFlg']) ) lstFile.info('nBNRfiles = ' + str(mainInF.inputs['nBNRfiles']) ) lstFile.info('ilsFlg = ' + str(mainInF.inputs['ilsFlg']) ) lstFile.info('pspecFlg = ' + str(mainInF.inputs['pspecFlg']) ) lstFile.info('refmkrFlg = ' + str(mainInF.inputs['refmkrFlg']) ) lstFile.info('sfitFlg = ' + str(mainInF.inputs['sfitFlg']) ) lstFile.info('lstFlg = ' + str(mainInF.inputs['lstFlg']) ) lstFile.info('errFlg = ' + str(mainInF.inputs['errFlg']) ) lstFile.info('zptFlg = ' + str(mainInF.inputs['zptFlg']) ) lstFile.info('refMkrLvl = ' + str(mainInF.inputs['refMkrLvl']) ) lstFile.info('wVer = ' + str(mainInF.inputs['wVer']) ) lstFile.info('jerr = ' + str(mainInF.inputs['jsterrFlg']) ) lstFile.info('nbands = ' + str(len(ctlFileGlb.inputs['band'])) ) lstFile.info('# End List File Meta-Data') lstFile.info('') lstFile.info('Date TimeStamp Directory ') #---------------------- # Filtering spectral DB #---------------------- #------------------------- # Filter spectral db based # on wavenumber bounds in # ctl file #------------------------- # Find the upper and lower bands from the ctl file nu = [] for band in ctlFileGlb.inputs['band']: bandstr = str(int(band)) nu.append(ctlFileGlb.inputs['band.'+bandstr+'.nu_start'][0]) nu.append(ctlFileGlb.inputs['band.'+bandstr+'.nu_stop'][0] ) nu.sort() # Sort wavenumbers nuUpper = nu[-1] # Get upper wavenumber nuLower = nu[0] # Get lower wavenumber # Filter spectral DB based on wave number dbFltData_2 = dbData.dbFilterNu(nuUpper,nuLower,dbFltData_1) if not(dbFltData_2): continue # Test for empty dicitonary (i.e. no data) #------------------------------------------------------------------------------------------------ # In addition to filtering db based on wavenumbers in ctl file one can filter spectral db based # on filter ID. Using this can help avoid the bug when pspec tries to apply a filter band outside # spectral region of a bnr file. #------------------------------------------------------------------------------------------------ if mainInF.inputs['ctlList'][ctl_ind][1]: dbFltData_2 = dbData.dbFilterFltrID(mainInF.inputs['ctlList'][ctl_ind][1], dbFltData_2) if not(dbFltData_2): continue # Test for empty dicitonary (i.e. no data) #-------------------------------------------------------- # Filter database based on forward and backward scan flag #-------------------------------------------------------- if mainInF.inputs['scnFlg'] > 0: dbFltData_2 = dbData.dbFilterScn(mainInF.inputs['scnFlg'], dbFltData_2 ) #--------------------------------------------------------------------- # Check for the existance of Output folder <Version> and create if DNE #--------------------------------------------------------------------- if mainInF.inputs['ctlList'][ctl_ind][2]: wrkOutputDir2 = wrkOutputDir1 + mainInF.inputs['ctlList'][ctl_ind][2] + '/' ckDirMk( wrkOutputDir2, logFile ) else: wrkOutputDir2 = wrkOutputDir1 #----------------------------------------------- # Create a folder within the output directory to # store various input files: ctl, hbin, isotope #----------------------------------------------- ctlPath,ctlFname = os.path.split(mainInF.inputs['ctlList'][ctl_ind][0]) archDir = wrkOutputDir2 + 'inputFiles' + '/' if ckDirMk(archDir, logFile): for f in glob.glob(archDir + '*'): os.remove(f) shutil.copy(mainInF.inputs['ctlList'][ctl_ind][0], archDir) # Copy ctl file for file in glob.glob(ctlPath + '/*hbin*'): # Copy hbin files shutil.copy(file, archDir) for file in glob.glob(ctlPath + '/isotope*'): # Copy isotope file shutil.copy(file,archDir) #------------------------------------------ # Level 3 -- Loop through spectral db lines #------------------------------------------ nobs = len(dbFltData_2['Date']) for spcDBind in range(0, nobs): #----------------------------------------------------------- # Grab spectral data base information for specific retrieval #----------------------------------------------------------- # Get current date and time of spectral database entry currntDayStr = str(int(dbFltData_2['Date'][spcDBind])) currntDay = dt.datetime(int(currntDayStr[0:4]),int(currntDayStr[4:6]),int(currntDayStr[6:]),int(dbFltData_2['Time'][spcDBind][0:2]),int(dbFltData_2['Time'][spcDBind][3:5]),int(dbFltData_2['Time'][spcDBind][6:]) ) # Get dictionary with specific date specDBone = dbData.dbFindDate(currntDay,fltDict=dbFltData_2) #---------------------------------------- # Check the existance of input and output # directory structure #---------------------------------------- # Get date of observations daystr = str(int(dbFltData_2['Date'][spcDBind])) obsDay = dt.datetime(int(daystr[0:4]),int(daystr[4:6]),int(daystr[6:])) # Find year month and day strings yrstr = "{0:02d}".format(obsDay.year) mnthstr = "{0:02d}".format(obsDay.month) daystr = "{0:02d}".format(obsDay.day) datestr = yrstr + mnthstr + daystr # Check for existance of YYYYMMDD Input folder # If this folder does not exist => there is no # Data for this day wrkInputDir2 = wrkInputDir1 + yrstr + mnthstr + daystr + '/' ckDir( wrkInputDir2, logFlg=logFile, exit=True ) #-------------------------------------- # If just error analysis (SFIT, PSPEC, Refmaker are not run ) # This is useful when kb is already created by SFIT4 and post error analysis in kb is modified #------------------------------------- if mainInF.inputs['jsterrFlg']: print '\n' print '*************************************************' print '******Running post-error analysis (ONLY)*********' print '*************************************************' #----------------------------------------- # Check for the existance of Output folder # <Date>.<TimeStamp> and create if DNE #----------------------------------------- wrkOutputDir3 = wrkOutputDir2 + datestr + '.' + "{0:06}".format(int(dbFltData_2['TStamp'][spcDBind])) + '/' ckDir( wrkInputDir2, logFlg=logFile, exit=True ) print 'Folder: %s' %str( wrkOutputDir3 ) #----------------------------------- # Enter into Error Analysis function #----------------------------------- rtn = errAnalysis( ctlFileGlb, SbctlFileVars, wrkOutputDir3, logFile ) else: brkFlg = True # Flag to break out of while statement while True: # While statement is for the repeat function print '\n\n\n' print '*************************************************' print '*************Begin New Retrieval*****************' print '*************************************************' #------------------------------------------------------------- # If pause after skip flag is initialized, do several things: # 1) Check if number of skips exceeds total number of filtered # observations # 2) Skip to specified starting point # 3) Pause after first run #------------------------------------------------------------- if pauseFlg and (nskips > len(dbFltData_2['Date'])): print 'Specified starting point in -P option (%d) is greater than number of observations in filtered database (%d)' %(nskips,nobs) if logFile: logFile.critical('Specified starting point in -P option (%d) is greater than number of observations in filtered database (%d)' %(nskips,nobs)) sys.exit() if pauseFlg and (spcDBind < nskips): break #----------------------------------------- # Check for the existance of Output folder # <Date>.<TimeStamp> and create if DNE #----------------------------------------- wrkOutputDir3 = wrkOutputDir2 + datestr + '.' + "{0:06}".format(int(dbFltData_2['TStamp'][spcDBind])) + '/' if ckDirMk( wrkOutputDir3, logFile ): # Remove all files in Output directory if previously exists!! for f in glob.glob(wrkOutputDir3 + '*'): os.remove(f) #------------------------------- # Copy relavent files from input # directory to output directoy #------------------------------- #----------------------------------- # Copy control file to Output folder # First check if location to copy ctl is # the same location as original ctl file #----------------------------------- try: shutil.copyfile(mainInF.inputs['ctlList'][ctl_ind][0], wrkOutputDir3 + 'sfit4.ctl') except IOError: print 'Unable to copy template ctl file to working directory: %s' % wrkOutputDir3 if logFile: logFile.critical('Unable to copy template ctl file to working directory: %s' % wrkOutputDir3) sys.exit() #------------------------------------- # Copy sb.ctl file to output directory # if error analysis is chosen #------------------------------------- if mainInF.inputs['errFlg']: try: shutil.copyfile(mainInF.inputs['sbCtlFile'], wrkOutputDir3 + 'sb.ctl') except IOError: print 'Unable to copy template sb.ctl file to working directory: %s' % wrkOutputDir3 if logFile: logFile.critical('Unable to copy template sb.ctl file to working directory: %s' % wrkOutputDir3) sys.exit() #---------------------------------- # Copy hbin details to output folder # ** Assuming that the hbin.dtl and # hbin.input files are in the same # location as the global ctl file #---------------------------------- try: shutil.copyfile(ctlPath + '/hbin.dtl', wrkOutputDir3 + '/hbin.dtl') # Copy hbin.dtl file except IOError: print 'Unable to copy file: %s' % (ctlPath + '/hbin.dtl') if logFile: logFile.error(IOError) try: shutil.copyfile(ctlPath + '/hbin.input', wrkOutputDir3 + '/hbin.input') # Copy hbin.input file except IOError: print 'Unable to copy file: %s' % (ctlPath + '/hbin.input') if logFile: logFile.error(IOError) # Create instance of local control file (ctl file in working directory) ctlFileLcl = sc.CtlInputFile(wrkOutputDir3 + 'sfit4.ctl',logFile) #------------------------------------------------- # Determine whether to use ILS file. Empty string # '' => no ILS file. #------------------------------------------------- if mainInF.inputs['ilsDir'] and mainInF.inputs['ilsFlg']: #------------------------------------------- # Determine if ilsDir is a file or directory #------------------------------------------- # If directory..... if os.path.isdir(mainInF.inputs['ilsDir']): # Determine which ILS file to use ilsFileList = glob.glob(mainInF.inputs['ilsDir'] + 'ils*') # Create a date list of ils files present ilsYYYYMMDD = [] for ilsFile in ilsFileList: ilsFileNpath = os.path.basename(ilsFile) match = re.match(r'\s*ils(\d\d\d\d)(\d\d)(\d\d).*',ilsFileNpath) ilsYYYYMMDD.append([int(match.group(1)),int(match.group(2)),int(match.group(3))]) ilsDateList = [ dt.date(ilsyear,ilsmonth,ilsday) for ilsyear, ilsmonth, ilsday in ilsYYYYMMDD ] # Find the ils date nearest to the current day nearstDay = sc.nearestDate(ilsDateList,obsDay.year,obsDay.month,obsDay.day) nearstDayMnth = "{0:02d}".format(nearstDay.month) nearstDayYr = "{0:02d}".format(nearstDay.year) nearstDayDay = "{0:02d}".format(nearstDay.day) nearstDaystr = nearstDayYr + nearstDayMnth + nearstDayDay # Get File path and name for nearest ils file for ilsFile in ilsFileList: if nearstDaystr in os.path.basename(ilsFile): ilsFname = ilsFile # If file..... elif os.path.isfile(mainInF.inputs['ilsDir']): ilsFname = mainInF.inputs['ilsDir'] if logFile: logFile.info('Using ils file: ' + ilsFname) # Replace ils file name in local ctl file (within working directory) teststr = [r'file.in.modulation_fcn', r'file.in.phase_fcn'] repVal = [ilsFname , ilsFname ] ctlFileLcl.replVar(teststr,repVal) # Write FOV from spectral database file to ctl file (within working directory) ctlFileLcl.replVar([r'band\.\d+\.omega'],[str(specDBone['FOV'])]) #--------------------------- # Message strings for output #--------------------------- msgstr1 = mainInF.inputs['ctlList'][ctl_ind][0] msgstr2 = datestr+'.'+"{0:06}".format(int(dbFltData_2['TStamp'][spcDBind])) #--------------------------- # Modification of Layer 1 (In case the ctl file should Use the OPD from the Spectra DataBase) #--------------------------- # Write OPD from spectral database file to ctl file (within working directory) #ctlFileLcl.replVar([r'band\.\d+\.max_opd'],[str(1.0/specDBone['Reso']*0.9)]) #----------------------------# # # # --- Run pspec--- # # # #----------------------------# if mainInF.inputs['pspecFlg']: print '*****************************************************' print 'Running PSPEC for ctl file: %s' % msgstr1 print 'Processing spectral observation date: %s' % msgstr2 print '*****************************************************' rtn = t15ascPrep(dbFltData_2, wrkInputDir2, wrkOutputDir3, mainInF, spcDBind, ctl_ind, logFile) if logFile: logFile.info('Ran PSPEC for ctl file: %s' % msgstr1) logFile.info('Processed spectral observation date: %s' % msgstr2) #----------------------------# # # # --- Run Refmaker--- # # # #----------------------------# if mainInF.inputs['refmkrFlg']: #------------- # Run Refmaker #------------- print '*****************************************************' print 'Running REFMKRNCAR for ctl file: %s' % msgstr1 print 'Processing spectral observation date: %s' % msgstr2 print '*****************************************************' rtn = refMkrNCAR(wrkInputDir2, mainInF.inputs['WACCMfile'], wrkOutputDir3, \ mainInF.inputs['refMkrLvl'], mainInF.inputs['wVer'], mainInF.inputs['zptFlg'],\ dbFltData_2, spcDBind, logFile) if logFile: logFile.info('Ran REFMKRNCAR for ctl file: %s' % msgstr1) logFile.info('Processed spectral observation date: %s' % msgstr2) #----------------------------# # # # --- Run sfit4--- # # # #----------------------------# #-------------- # Call to sfit4 #-------------- if mainInF.inputs['sfitFlg']: print '*****************************************************' print 'Running SFIT4 for ctl file: %s' % msgstr1 print 'Processing spectral observation date: %s' % msgstr2 print 'Ouput Directory: %s' % wrkOutputDir3 print '*****************************************************' if logFile: logFile.info('Ran SFIT4 for ctl file: %s' % msgstr1) logFile.info('Processed spectral observation date: %s' % msgstr2) #------------------------------ # Change working directory to # output directory to run pspec #------------------------------ try: os.chdir(wrkOutputDir3) except OSError as errmsg: if logFile: logFile.error(errmsg) sys.exit() #--------------------- # Run sfit4 executable #--------------------- sc.subProcRun( [mainInF.inputs['binDir'] + 'sfit4'] ,logFile) #if ( stderr is None or not stderr): #if log_flg: #logFile.info('Finished running sfit4\n' + stdout) #else: #print 'Error running sfit4!!!' #if log_flg: #logFile.error('Error running sfit4 \n' + stdout) #sys.exit() #----------------------------------- # Change permissions of all files in # working directory #----------------------------------- for f in glob.glob(wrkOutputDir3 + '*'): os.chmod(f,0777) #---------------------------------------------- # If succesfull run, write details to list file #---------------------------------------------- if lstFlg: fname = wrkOutputDir3 +'sfit4.dtl' cmpltFlg = False with open(fname,'r') as fopen: for ind,line in enumerate(reversed(fopen.readlines())): if ind < 10: if r'RDRV: DONE.' in line: cmpltFlg = True else: break if cmpltFlg and lstFile: lstFile.info("{0:<13}".format(int(dbFltData_2['Date'][spcDBind])) + "{0:06}".format(int(dbFltData_2['TStamp'][spcDBind])) + ' ' + wrkOutputDir3) #----------------------------# # # # --- Error Analysis --- # # # #----------------------------# if mainInF.inputs['errFlg']: if logFile: logFile.info('Ran SFIT4 for ctl file: %s' % msgstr1) #----------------------------------- # Enter into Error Analysis function #----------------------------------- rtn = errAnalysis( ctlFileGlb, SbctlFileVars, wrkOutputDir3, logFile ) #--------------------------- # Continuation for Pause flg #--------------------------- if pauseFlg: while True: user_input = raw_input('Paused processing....\n Enter: 0 to exit, -1 to repeat, 1 to continue to next, 2 to continue all, 3 plot retrieval results\n >>> ') plt.close('all') try: user_input = int(user_input) if not any(user_input == val for val in [-1,0,1,2,3]): raise ValueError except ValueError: print 'Please enter -1, 0, 1, 2, or 3' if user_input == 0: sys.exit() # Exit program elif user_input == 1: # Exit while loop (Do not repeat) brkFlg = True break elif user_input == 2: # Stop pause and exit while loop pauseFlg = False brkFlg = True break elif user_input == 3: # Plot retrieval results #---------------------- # Initialize Plot Class #---------------------- gas = dc.PlotData(wrkOutputDir3,wrkOutputDir3+'sfit4.ctl') #-------------------------- # Call to plot spectral fit #-------------------------- gas.pltSpectra() #---------------------- # Call to plot profiles #---------------------- try: gas.pltPrf(allGas=True,errFlg=True) except: gas.pltPrf(allGas=True) #----------------- # Call to plot AVK #----------------- try: if ('gas.profile.list' in gas.ctl) and gas.ctl['gas.profile.list']: gas.pltAvk() except: print "Unable to plot AVK!!" #----------------------------- # Print summary file to screen #----------------------------- if ckFile(wrkOutputDir3+'summary'): with open(wrkOutputDir3+'summary','r') as fopen: info = fopen.read() print '****************SUMMARY FILE****************' print (info) print '****************END OF SUMMARY FILE****************' elif user_input == -1: # Repeat loop brkFlg = False break #----------------------- # Exit out of while loop #----------------------- if brkFlg: break
def t15ascPrep(dbFltData_2, wrkInputDir2, wrkOutputDir5, mainInF, spcDBind, ctl_ind, logFile): if mainInF.inputs['coaddFlg']: bnrExt = '.bnrc' else: bnrExt = '.bnr' bnrFname = "{0:06}".format(int(dbFltData_2['TStamp'][spcDBind])) + bnrExt if not os.path.isfile(wrkOutputDir5 + bnrFname): try: shutil.copy(wrkInputDir2 + bnrFname, wrkOutputDir5) except IOError as errmsg: print errmsg if logFile: logFile.error(errmsg) return False #-------------------------------------- # Create pspec.input file for pspec.f90 #-------------------------------------- with open(wrkOutputDir5 + 'pspec.input', 'w') as fname: # Write header information pWrtStr = ps.pspecInputStr() fname.writelines(pWrtStr[0:7]) fname.write(str(dbFltData_2['N_Lat'][spcDBind]) + '\n') fname.writelines(pWrtStr[7:8]) fname.write(str(dbFltData_2['W_Lon'][spcDBind]) + '\n') fname.writelines(pWrtStr[8:9]) fname.write(str(dbFltData_2['Alt'][spcDBind]) + '\n') fname.writelines(pWrtStr[9:19]) fname.write('{:<5d}{:<5d}\n'.format(mainInF.inputs['outFlg'], mainInF.inputs['verbFlg'])) fname.writelines(pWrtStr[19:24]) fname.write(mainInF.inputs['fltrBndInputs']) fname.writelines(pWrtStr[24:26]) fname.write(str(mainInF.inputs['nBNRfiles']) + '\n') fname.writelines(pWrtStr[26:]) fname.write(bnrFname + '\n') fname.write('{0:<10.1f}{1:<5d}{2:<5d}{3:<5d}{4:<5d}'.format( dbFltData_2['ROE'][spcDBind], # ROE mainInF.inputs['nterpFlg'], # nterp mainInF.inputs['ratioFlg'], # rflag mainInF.inputs['fileFlg'], # fflag mainInF.inputs['zFlg'])) # zflag #------------------------------ # Change working directory to # output directory to run pspec #------------------------------ try: os.chdir(wrkOutputDir5) except OSError as errmsg: if logFile: logFile.error(errmsg) return False #-------------- # Call to pspec #-------------- print 'Running pspec for ctl file: ' + mainInF.inputs['ctlList'][ctl_ind][0] sc.subProcRun([mainInF.inputs['binDir'] + 'pspec' ]) # Subprocess call to run pspec #if ( stderr is None or not stderr ): #if log_flg: #logFile.info( stdout ) #logFile.info('Finished running pspec\n' + stdout) #else: #print 'Error running pspec!!!' #if log_flg: #logFile.error('Error running pspec \n' + stdout) #return False return True