Example #1
0
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)
Example #2
0
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
Example #3
0
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()
Example #4
0
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
Example #5
0
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