""" This section contains all the utility definitions and functions for gathering the PGE03 inputs. """ import os import glob from datetime import datetime, timedelta PGE03_INSTALL = os.environ['PGE03_INSTALL'] NCFTPGET = os.environ['NCFTPGET'] # THESE SHOULDNT BE MESSED WITH ON MODISCODE, ADD TO ENVIRON EVENTUALLY? MODAPSCONF = "$HOME/pyPGE03/conf.csh" PERL = "/data/common/programfiles/bin/perl" # ----------------------------------------------------------- M02QKM_DIR = os.environ['M02QKM_DIR'] M021KM_DIR = os.environ['M021KM_DIR'] GFS_DIR = os.environ['GFS_DIR' ] SST_DIR = os.environ['SST_DIR' ] ENG_DIR = os.environ['ENG_DIR' ] NISE_DIR = os.environ['NISE_DIR' ] WORK_DIR = os.environ['WORK_DIR' ] # "/work/y%(yyyy)s_m%(mm)s_d%(dd)s_h%(hh)s_M%(MM)s" M02QKM_PATTERN = M02QKM_DIR + "/MOD02QKM.A%(yyyy)s%(jjj)s.%(hh)s%(MM)s.*" # MOD02QKM.A2011209.1655.005.flo.hdf M021KM_PATTERN = M021KM_DIR + "/MOD021KM.A%(yyyy)s%(jjj)s.%(hh)s%(MM)s.*" # MOD021KM.A2011171.1555.005.flo.hdf GFS_PATTERN = GFS_DIR + "/gdas1.PGrbF00.%(yy)s%(mm)s%(dd)s.%(hh)sz" # gdas1.PGrbF00.110620.00z SST_PATTERN = SST_DIR + "/oisst.%(yyyy)s%(mm)s%(dd)s" # oisst.20110615 ENG_PATTERN = ENG_DIR + "/eng.%(yy)s%(mm)s%(dd)s" # eng.110620 NISE_PATTERN = NISE_DIR + "/NISE_SSMIF13_%(yyyy)s%(mm)s%(dd)s.HDFEOS" # NISE_SSMIF13_20110620.HDFEOS REMOTE_GFS = "/pub/eosdb/ancillary/%(yyyy)s_%(mm)s_%(dd)s_%(jjj)s/gdas1.PGrbF00.%(yy)s%(mm)s%(dd)s.*" REMOTE_ENG = "/pub/eosdb/ancillary/%(yyyy)s_%(mm)s_%(dd)s_%(jjj)s/eng.%(yy)s%(mm)s%(dd)s" REMOTE_NISE = "/pub/eosdb/ancillary/%(yyyy)s_%(mm)s_%(dd)s_%(jjj)s/NISE_SSMIF13_%(yyyy)s%(mm)s%(dd)s.HDFEOS" REMOTE_SST = "/pub/eosdb/ancillary/SST/oisst.%(yyyy)s%(mm)s%(dd)s" # ----------------------------------------------------------- def mk_remote(pattern, date): return date_fill_unsafe(pattern, date) def mk_sst_remote(pattern, date): date = get_sst_date(date) return mk_remote(pattern, date) # Local filenames need to be checked if they exist - can't do that very well with remote! def date_fill_safe(pattern, date): reps = make_rep_dict(date) fpattern = pattern % reps files = glob.glob(fpattern) if len(files) > 1: raise IOError, "Too many files match: %s" % (fpattern) if len(files) < 1: # raise IOError, "No files match: %s" % (fpattern) print "Warning: no files match: %s" % (fpattern) return "MISSING" fname = files[0] if not os.path.exists(fname): # This should never happen due to above checks, but just in case... raise IOError, "File not found: %s" % (fname) print fname return fname def date_fill_unsafe(pattern, date): reps = make_rep_dict(date) return pattern % reps # SST has 7 day gaps so we need to find the one before # FIXME: check that this algo is the right way to pick the SST to use! first_SST = datetime(2000, 1, 5) def get_sst_date(date): ofirst = first_SST.toordinal() odate = date.toordinal() odiff = odate - ofirst days_off = odiff % 7 # sst made every 7 days sst_date = date.fromordinal(odate - days_off) return sst_date def get_gfs_dates(date): gfs_early = date.replace(hour=(date.hour - (date.hour % 6)), minute=0) gfs_late = gfs_early + timedelta(hours=6) return gfs_early, gfs_late def jday(date): import datetime # FIXME: need the base 'datetime' for datetime.date below! return date.toordinal() - datetime.date(date.year,1,1).toordinal() + 1 def make_rep_dict(date): reps = {} reps["yyyy"] = "%04d" % (date.year) reps["yy"] = "%02d" % (date.year % 100) reps["mm"] = "%02d" % (date.month) reps["jjj"] = "%03d" % (jday(date)) reps["dd"] = "%02d" % (date.day) reps["hh"] = "%02d" % (date.hour) reps["MM"] = "%02d" % (date.minute) return reps # working dir doesn't always exist! def date2workdir(date): return date_fill_unsafe(WORK_DIR, date) def date2m02qkm(date): return date_fill_safe(M02QKM_PATTERN, date) def date2m021km(date): return date_fill_safe(M021KM_PATTERN, date) def date2eng(date): return date_fill_safe(ENG_PATTERN, date) def date2nise(date): return date_fill_safe(NISE_PATTERN, date) def date2gfs(date): egfs, lgfs = get_gfs_dates(date) efname = date_fill_safe(GFS_PATTERN, egfs) lfname = date_fill_safe(GFS_PATTERN, lgfs) return efname, lfname def date2sst(date): date = get_sst_date(date) return date_fill_safe(SST_PATTERN, date) # TESTS! if __name__ == "__main__": pass # OLD: now = datetime.now() # OLD: print jday(now) # OLD: print make_rep_dict(now) # OLD: print date2workdir(now) # OLD: print date2m02qkm(now) # OLD: print date2m021km(now) # OLD: print date2gfs(now) # OLD: print date2sst(now) # OLD: print date2eng(now) # OLD: print date2nise(now)