## # This software was developed and / or modified by Raytheon Company, # pursuant to Contract DG133W-05-CQ-1067 with the US Government. # # U.S. EXPORT CONTROLLED TECHNICAL DATA # This software product contains export-restricted data whose # export/transfer/disclosure is restricted by U.S. law. Dissemination # to non-U.S. persons whether in the United States or abroad requires # an export license or other authorization. # # Contractor Name: Raytheon Company # Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 # 402.291.0100 # # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. ## # # VTEC Partner configuration # # SOFTWARE HISTORY # # Date Ticket# Engineer Description # ------------- -------- --------- --------------------------------------------- # Jun 11, 2013 2083 randerso Fixed getISCSites to look in configured # Feb 20, 2014 2824 randerso Added log message when no # localVTECPartners file is found # Apr 25, 2015 4952 njensen Updated for new JEP API # Sep 30, 2015 18141 ryu Added PHFO to VTEC_TPC_SITE # Apr 29, 2020 8151 randerso Added BackupDict entries for NHA and NHP # Apr 29, 2020 8151 randerso Use SiteMap.getSite4LetterId() # Dec 14, 2020 8306 randerso Improve error handling on import of # localVectPartners ## ## # This is an incremental override file, indicating that the files at different # localization levels will be combined. Incremental overrides are achieved by # creating a localVTECPartners file at a higher priority localization level # that is imported by this base file. # # See the Configuration Guides->Server Configuration->Syntax for # localVTECpartners.py section of the GFE Online Help for more information. ## import LogStream #VTEC_Partners.py - configuration file to control filtering and merging #of VTEC active table. # The following list is a set of AWIPS WAN IDs (typically WFO IDs) which # identifies the locations from which we will request their active VTEC # table for merge purposes. These are 3-letter WFO IDs, e.g., BOU. VTEC_TABLE_REQUEST_SITES = [] # Name of site identifier for SPC and TCV bulletins. 4-characters. VTEC_SPC_SITE = ['KWNS'] VTEC_TPC_SITE = ['KNHC', 'PHFO'] # The following list is a set of office identifiers which is used # in the ingestAT/MergeVTEC software to filter out records from offices # that aren't in our area of responsibility. Our site and the spc site # are automatically added to this list in the software. These are 4-character # site identifiers, e.g., KBOU. VTEC_MERGE_SITES = [] # The following list is a set of office identifiers which is used # in the VTECDecoder software to filter out records from offices # that aren't in our area of responsibility. Our site and the spc site # are automatically added to this list in the software. These are # 4-letter WFO ids, e.g., KBOU. VTEC_DECODER_SITES = [] # The following list is a set of product categories (e.g., ZFP, WOU) that # when decoded, the text for each segment is captured. The text is not # normally needed to be captured except for warning-style products. VTEC_CAPTURE_TEXT_CATEGORIES = ['WSW', 'NPW', 'RFW', 'FFA', 'CFW', 'MWS', 'HLS', 'MWW', 'TCV'] # Remapping of product pils. This is required for certain VTEC events # if a hazard is created in one pil and then updated or cancelled in another # pil. Example is the TO.W (Tornado Warning), which is issued in the TOR # pil but updated/cancelled in the SVS pil. In order for the table matching # purging to work correctly, the pils in the followup products must be # mapped back to the original. This is *only* for use for non-GFE/GHG # issued products since the GHG logic uses the pil information to calculate # VTEC. This is a dictionary of (phen,sig,pil) with the remapped pil as the # value. VTEC_MAPPED_PILS = { ('TO', 'W', 'SVS'): 'TOR', ('SV', 'W', 'SVS'): 'SVR', ('FF', 'W', 'FFS'): 'FFW', ('FL', 'W', 'FLS'): 'FLW', ('MA', 'W', 'MWS'): 'SMW', ('EW', 'W', 'SVS'): 'EWW', ('FA', 'W', 'FLS'): 'FLW', } # Frequency of requests for table updates in seconds #VTEC_REMOTE_TABLE_FETCH_TIME = 60*60 #normal operations VTEC_REMOTE_TABLE_FETCH_TIME = 0 #disable # Purge parameter for backups of the active table in hours VTEC_BACKUP_TABLE_PURGE_TIME = 168 * 4 # Allow my site to respond to VTEC table requests #VTEC_RESPOND_TO_TABLE_REQUESTS = 1 #normal operations (non-RPP) VTEC_RESPOND_TO_TABLE_REQUESTS = 0 #disable #---------------------------------------- #DO NOT CHANGE ANY CODE BELOW THIS NOTICE #---------------------------------------- # Default configuration based on list of primary/secondary backup sites # Format: disabled WFO site: (1stBackup, 2ndBackup) # Note: You must have at least 2 entries for each site. BackupDict = { 'ABR': ('FSD', 'BIS'), 'ABQ': ('EPZ', 'AMA'), 'AER': ('AJK', 'AFG'), 'AFG': ('AER', 'ALU', 'AJK'), 'AJK': ('AER', 'ALU', 'AFG'), 'AKQ': ('MHX', 'RAH'), 'ALU': ('AJK', 'AFG'), 'ALY': ('BTV', 'BGM'), 'AMA': ('LUB', 'ABQ'), 'APX': ('MQT', 'DTX'), 'ARX': ('DMX', 'DVN'), 'BGM': ('CTP', 'ALY'), 'BIS': ('FGF', 'ABR'), 'BMX': ('FFC', 'HUN'), 'BOI': ('PIH', 'PDT'), 'BOU': ('PUB', 'CYS'), 'BOX': ('OKX', 'GYX'), 'BRO': ('LCH', 'EWX'), 'BTV': ('ALY', 'CAR'), 'BUF': ('CLE', 'PBZ'), 'BYZ': ('GGW', 'RIW'), 'CAE': ('GSP', 'CHS'), 'CAR': ('GYX', 'BTV'), 'CHS': ('ILM', 'CAE'), 'CLE': ('BUF', 'ILN'), 'CRP': ('EWX', 'HGX'), 'CTP': ('BGM', 'LWX'), 'CYS': ('RIW', 'UNR'), 'DDC': ('GLD', 'ICT'), 'DLH': ('MPX', 'FGF'), 'DMX': ('DVN', 'OAX'), 'DTX': ('GRR', 'APX'), 'DVN': ('ARX', 'DMX'), 'EAX': ('SGF', 'TOP'), 'EKA': ('MFR', 'MTR'), 'EPZ': ('ABQ', 'MAF'), 'EWX': ('CRP', 'BRO'), 'FFC': ('BMX', 'MRX'), 'FGF': ('BIS', 'DLH'), 'FGZ': ('VEF', 'PSR'), 'FSD': ('ABR', 'MPX'), 'FWD': ('SHV', 'OUN'), 'GGW': ('BYZ', 'TFX'), 'GID': ('OAX', 'LBF'), 'GJT': ('SLC', 'BOU'), 'GLD': ('DDC', 'PUB'), 'GRB': ('MKX', 'MQT'), 'GRR': ('DTX', 'IWX'), 'GSP': ('CAE', 'RNK'), 'GUM': ('HFO', 'HFO'), 'GYX': ('CAR', 'BOX'), 'HFO': ('GUM', 'MTR'), 'HGX': ('LCH', 'CRP'), 'HNX': ('STO', 'SGX'), 'HPA': ('HFO', 'NH1'), 'HUN': ('JAN', 'BMX'), 'ICT': ('TOP', 'DDC'), 'ILM': ('CHS', 'MHX'), 'ILN': ('JKL', 'CLE', 'IND', 'LMK'), 'ILX': ('LOT', 'LSX'), 'IND': ('IWX', 'LMK'), 'IWX': ('IND', 'GRR'), 'JAN': ('HUN', 'SHV'), 'JAX': ('TAE', 'CHS'), 'JKL': ('ILN', 'RLX', 'LMK'), 'KEY': ('MFL', 'TBW'), 'LBF': ('UNR', 'GID'), 'LCH': ('HGX', 'LIX'), 'LIX': ('MOB', 'LCH'), 'LKN': ('REV', 'BOI'), 'LMK': ('PAH', 'IND'), 'LOT': ('ILX', 'MKX'), 'LOX': ('SGX', 'MTR'), 'LSX': ('EAX', 'ILX'), 'LUB': ('AMA', 'SJT'), 'LWX': ('PHI', 'CTP'), 'LZK': ('MEG', 'TSA'), 'MAF': ('SJT', 'EPZ'), 'MEG': ('LZK', 'OHX'), 'MFL': ('MLB', 'TBW'), 'MFR': ('EKA', 'MTR'), 'MHX': ('AKQ', 'ILM'), 'MKX': ('GRB', 'LOT'), 'MLB': ('TBW', 'SJU'), 'MOB': ('LIX', 'TAE'), 'MPX': ('DLH', 'ARX'), 'MQT': ('APX', 'GRB'), 'MRX': ('OHX', 'FFC'), 'MSO': ('TFX', 'GGW'), 'MTR': ('LOX', 'EKA'), 'NH1': ('NH2', 'ONP'), 'NH2': ('NH1', 'ONA'), 'NHA': ('HUS', 'HUS'), 'NHP': ('HPA', 'HPA'), 'OAX': ('GID', 'FSD'), 'OHX': ('MRX', 'MEG'), 'OKX': ('BOX', 'PHI'), 'ONA': ('ONP', 'NH2'), 'ONP': ('ONA', 'NH1'), 'OTX': ('PDT', 'MSO'), 'OUN': ('TSA', 'FWD'), 'PAH': ('LMK', 'SGF'), 'PBZ': ('RLX', 'BUF'), 'PDT': ('OTX', 'SEW'), 'PHI': ('LWX', 'OKX'), 'PIH': ('BOI', 'SLC'), 'PQR': ('SEW', 'MFR'), 'PSR': ('TWC', 'VEF'), 'PUB': ('BOU', 'GLD'), 'RAH': ('RNK', 'AKQ'), 'REV': ('LKN', 'STO'), 'RIW': ('CYS', 'BYZ'), 'RLX': ('PBZ', 'JKL'), 'RNK': ('RAH', 'GSP'), 'SEW': ('PQR', 'MFR'), 'SGF': ('LSX', 'PAH'), 'SGX': ('LOX', 'MTR'), 'SHV': ('FWD', 'JAN'), 'SJT': ('MAF', 'LUB'), 'SJU': ('MFL', 'MLB'), 'SLC': ('GJT', 'PIH'), 'STO': ('HNX', 'REV'), 'TAE': ('JAX', 'MOB'), 'TBW': ('MLB', 'MFL'), 'TFX': ('MSO', 'OTX'), 'TOP': ('ICT', 'EAX'), 'TSA': ('OUN', 'LZK'), 'TWC': ('PSR', 'FGZ'), 'UNR': ('LBF', 'CYS'), 'VEF': ('FGZ', 'PSR'), } #convert 3 letter to 4 letter site ids def get4ID(siteId): from com.raytheon.uf.common.site import SiteMap return SiteMap.getInstance().getSite4LetterId(siteId) # returns list of ISC sites within my defined domain. We use # the generated ISC edit areas to determine this. Returned names # are 3-letter identifiers. def getISCSites(): import glob, os.path from com.raytheon.uf.common.localization import PathManagerFactory from com.raytheon.uf.common.localization import LocalizationContext LocalizationType = LocalizationContext.LocalizationType LocalizationLevel = LocalizationContext.LocalizationLevel pathMgr = PathManagerFactory.getPathManager() commonStaticCfg = pathMgr.getContext(LocalizationType.COMMON_STATIC, LocalizationLevel.CONFIGURED) commonStaticCfg.setContextName(siteConfig.GFESUITE_SITEID) eaDir = pathMgr.getFile(commonStaticCfg, "gfe/editAreas").getCanonicalPath() files = glob.glob(eaDir + "/ISC_???.xml") sites = [] for f in files: fb = os.path.basename(f) if len(fb) == 11 and fb[0:4] == "ISC_": site = fb[4:7] #ensure it is a known WFO site if site in BackupDict: sites.append(site) #remove our own site if siteConfig.GFESUITE_SITEID in sites: del sites[sites.index(siteConfig.GFESUITE_SITEID)] return sites # returns list of site ids given the host siteID (3letters), letter3 is # 1 for returning 3-letter ids, 0 for 4-letter ids. Our own site id # is not returned. The passed in iscSites is the list of surrounding # sites based on the isc domains. def siteList(siteID, letter3, iscSites): ids = [] # add in primary and secondary backup sites, if this WFO fails if siteID in BackupDict: for e in BackupDict[siteID]: ids.append(e) # add in failed site for which this WFO serves as primary or # secondary backup sites for k, sites in BackupDict.items(): if siteID in sites: if k not in ids: ids.append(k) # add in the isc sites if not already in the list for site in iscSites: if site not in ids: ids.append(site) if letter3: return ids else: #add in the 4th letter ("T", "K", "P") for x in range(len(ids)): ids[x] = get4ID(ids[x]) return ids #auto-configure try: import siteConfig iscSites = getISCSites() VTEC_TABLE_REQUEST_SITES = siteList(siteConfig.GFESUITE_SITEID, 1, []) VTEC_MERGE_SITES = siteList(siteConfig.GFESUITE_SITEID, 0, iscSites) VTEC_DECODER_SITES = siteList(siteConfig.GFESUITE_SITEID, 0, iscSites) except: pass #allow overrides try: from localVTECPartners import * except ModuleNotFoundError as e: if (e.name == "localVTECPartners"): LogStream.logEvent("No localVTECPartners file found, using baseline settings.") else: raise