#!/usr/bin/env python3 from datetime import datetime, timedelta as td import os import sys import requests import numpy as np import mesoscale_util as cutil VDATE = os.environ['VDATE'] VHOUR = os.environ['VHOUR'] DAY = os.environ['DAY'] metplus_launcher = os.environ['metplus_launcher'] EVSINspcotlk = os.environ['EVSINspcotlk'] MET_PLUS_CONF = os.environ['MET_PLUS_CONF'] vdate_dt = datetime.strptime(VDATE,'%Y%m%d') VDATEp1 = (vdate_dt + td(days=1)).strftime('%Y%m%d') VDATEm1 = (vdate_dt - td(days=1)).strftime('%Y%m%d') VDATEm2 = (vdate_dt - td(days=2)).strftime('%Y%m%d') VDATEm3 = (vdate_dt - td(days=3)).strftime('%Y%m%d') if int(DAY) == 1: OTLKs = ['0100', '1200', '1300', '1630', '2000'] elif int(DAY) == 2: OTLKs = ['0600', '0700', '1730'] elif int(DAY) == 3: OTLKs = ['0730', '0830'] else: print(f"ERROR: Invalid day in DAYS: {DAY}") sys.exit(1) for OTLK in OTLKs: if int(DAY) == 1: if int(VHOUR) < 12: V2DATE = VDATE V1HOUR = OTLK if OTLK < '1200': V1DATE = VDATE IDATE = VDATE else: V1DATE = VDATEm1 IDATE = VDATEm1 elif int(VHOUR) >= 12: V1DATE = VDATE V1HOUR = OTLK IDATE = VDATE if OTLK < '1200': V2DATE = VDATE else: V2DATE = VDATEp1 else: print(f"ERROR: Invalid VHOUR: {VHOUR}") sys.exit(1) elif int(DAY) == 2: if int(VHOUR) < 12: V1DATE = VDATEm1 V2DATE = VDATE V1HOUR = '1200' IDATE = VDATEm2 elif int(VHOUR) >= 12: V1DATE = VDATE V2DATE = VDATEp1 V1HOUR = '1200' IDATE = VDATEm1 else: print(f"ERROR: Invalid VHOUR: {VHOUR}") sys.exit(1) elif int(DAY) == 3: if int(VHOUR) < 12: V1DATE = VDATEm1 V2DATE = VDATE V1HOUR = '1200' IDATE = VDATEm3 elif int(VHOUR) >= 12: V1DATE = VDATE V2DATE = VDATEp1 V1HOUR = '1200' IDATE = VDATEm2 else: print(f"ERROR: Invalid VHOUR: {VHOUR}") sys.exit(1) V2HOUR = '1200' YYYY = IDATE[0:4] SHP_FILE = f'day{DAY}otlk_{IDATE}_{OTLK}_cat' NEST_INPUT_TEMPLATE = ( f"spc_otlk.{VDATE}/{SHP_FILE}.shp" ) os.environ['SHP_FILE'] = SHP_FILE os.environ['NEST_INPUT_TEMPLATE'] = NEST_INPUT_TEMPLATE if os.path.isfile(os.path.join(EVSINspcotlk,NEST_INPUT_TEMPLATE)): try: N_REC = cutil.run_shell_command([ 'gis_dump_dbf', os.path.join(EVSINspcotlk,f"spc_otlk.{VDATE}/{SHP_FILE}.dbf"), '|', 'grep', 'n_records', '|', 'cut', '-d\'=\'', '-f2', '|', 'tr', '-d', '\' \'' ], capture_output=True) print(f"Processing {N_REC} records.") if int(N_REC) > 0: for REC in np.arange(int(N_REC)): NAME = cutil.run_shell_command([ 'gis_dump_dbf', os.path.join(EVSINspcotlk,f"spc_otlk.{VDATE}/{SHP_FILE}.dbf"), '|', 'egrep', '-A', '5', f'"^Record {REC}"', '|', 'tail', '-1', '|', 'cut', '-d\'"\'', '-f2' ], capture_output=True) NAME = NAME.replace('\n','') print(f"Processing Record #{REC}: {NAME}") MASK_FNAME = f"spc_otlk_d{DAY}_{OTLK}_{NAME}_v{V1DATE}{V1HOUR}-{V2DATE}{V2HOUR}_for{VHOUR}Z" if int(DAY) == 3: MASK_NAME = f"DAY{DAY}_{NAME}" else: MASK_NAME = f"DAY{DAY}_{OTLK}_{NAME}" os.environ['REC'] = str(REC) os.environ['MASK_FNAME'] = MASK_FNAME os.environ['MASK_NAME'] = MASK_NAME cutil.run_shell_command([ metplus_launcher, '-c', os.path.join(MET_PLUS_CONF, 'GenVxMask_SPC_OTLK.conf') ]) else: print(f"No day {DAY} outlook areas were issued at {OTLK}Z on {IDATE}") continue except IOError as e: print(f"ERROR: {e}") print(f"The following file was deleted or corrupted while trying " + f"to open it: {os.path.join(EVSINspcotlk,NEST_INPUT_TEMPLATE)}") sys.exit(1) else: print(f"No day {DAY} outlook areas were issued at {OTLK}Z on {IDATE}") continue