Esempio n. 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)
def main(argv):
    #--------------------------------
    # Retrieve command line arguments
    #--------------------------------
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'i:N:d:?')

    except getopt.GetoptError as err:
        print str(err)
        usage()
        sys.exit()

    #-----------------------------
    # Parse command line arguments
    #-----------------------------
    for opt, arg in opts:

        # Layer1 input path and name
        if opt == '-i':
            inputFile = arg

        # Output list file name and directory
        elif opt == '-N':
            outputFile = arg

        # Base Directory for data
        elif opt == '-d':
            baseDir = arg

        # Show all command line flags
        elif opt == '-?':
            usage()
            sys.exit()

        else:
            print 'Unhandled option: ' + opt
            sys.exit()

    #---------------------------------
    # Initialize list file as log file
    #---------------------------------
    lstFile = logging.getLogger('1')
    lstFile.setLevel(logging.INFO)
    hdlr1 = logging.FileHandler(outputFile, mode='w')
    fmt1 = logging.Formatter('')
    hdlr1.setFormatter(fmt1)
    lstFile.addHandler(hdlr1)

    #----------------------------------
    # Check the existance of input file
    #----------------------------------
    ckFile(inputFile, exit=True)

    #--------------------------------------
    # Check the existance of base directory
    #--------------------------------------
    ckDir(baseDir, exit=True)
    # check if '/' is included at end of path
    if not (baseDir.endswith('/')):
        baseDir = baseDir + '/'

    #-------------------------
    # Get data from input file
    #-------------------------
    inVars = sc.Layer1InputFile(inputFile)
    inVars.getInputs()

    #--------------------------------
    # Check the existance of ctl file
    #--------------------------------
    ckFile(inVars.inputs['ctlList'][0][0], exit=True)

    #------------------
    # Get ctl file data
    #------------------
    ctlData = sc.CtlInputFile(inVars.inputs['ctlList'][0][0])
    ctlData.getInputs()

    #------------------------
    # Write data to list file
    #------------------------
    lstFile.info('# Begin List File Meta-Data')
    lstFile.info('Start Date     = ')
    lstFile.info('End Date       = ')
    lstFile.info('WACCM_File     = ' + inVars.inputs['WACCMfile'])
    lstFile.info('ctl_File       = ' + inVars.inputs['ctlList'][0][0])
    lstFile.info('FilterID       = ' + inVars.inputs['ctlList'][0][1])
    lstFile.info('VersionName    = ' + inVars.inputs['ctlList'][0][2])
    lstFile.info('Site           = ' + inVars.inputs['loc'])
    lstFile.info('statnLyrs_file = ' + ctlData.inputs['file.in.stalayers'][0])
    lstFile.info('primGas        = ' + ctlData.primGas)
    lstFile.info('specDBfile     = ' + inVars.inputs['spcdbFile'])
    lstFile.info('Coadd flag     = ' + str(inVars.inputs['coaddFlg']))
    lstFile.info('nBNRfiles      = ' + str(inVars.inputs['nBNRfiles']))
    lstFile.info('ilsFlg         = ' + str(inVars.inputs['ilsFlg']))
    lstFile.info('pspecFlg       = ' + str(inVars.inputs['pspecFlg']))
    lstFile.info('refmkrFlg      = ' + str(inVars.inputs['refmkrFlg']))
    lstFile.info('sfitFlg        = ' + str(inVars.inputs['sfitFlg']))
    lstFile.info('lstFlg         = ' + str(inVars.inputs['lstFlg']))
    lstFile.info('errFlg         = ' + str(inVars.inputs['errFlg']))
    lstFile.info('zptFlg         = ' + str(inVars.inputs['zptFlg']))
    lstFile.info('refMkrLvl      = ' + str(inVars.inputs['refMkrLvl']))
    lstFile.info('wVer           = ' + str(inVars.inputs['wVer']))
    lstFile.info('# End List File Meta-Data')
    lstFile.info('')
    lstFile.info('Date         TimeStamp    Directory ')

    #-----------------------------------------------------
    # Loop through directory to find all valid retreivals.
    # Retrieval is valid when summary file exists.
    #-----------------------------------------------------
    #----------------------------------------
    # Walk through first level of directories
    #----------------------------------------
    lstDict = {}
    for drs in os.walk(baseDir).next()[1]:
        YYYYMMDD = drs[0:4] + drs[4:6] + drs[6:8]
        hhmmss = drs[9:11] + drs[11:13] + drs[13:]
        if os.path.isfile(baseDir + drs + '/summary'):
            lstDict.setdefault('date', []).append(
                dt.datetime(int(drs[0:4]), int(drs[4:6]), int(drs[6:8]),
                            int(drs[9:11]), int(drs[11:13]), int(drs[13:])))
            lstDict.setdefault('YYYYMMDD', []).append(YYYYMMDD)
            lstDict.setdefault('hhmmss', []).append(hhmmss)
            lstDict.setdefault('directory', []).append(baseDir + drs)

    lstDict = sortDict(lstDict, 'date')
    for ind, val in enumerate(lstDict['date']):
        lstFile.info("{0:<13}".format(lstDict['YYYYMMDD'][ind]) +
                     "{0:6}".format(lstDict['hhmmss'][ind]) + '       ' +
                     lstDict['directory'][ind] + '/')
Esempio n. 3
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
Esempio n. 4
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()