def _analyzeNewest(self, dataNewest, stateNewest, hoursBack, fileType):
      if (dataNewest <= stateNewest):
         return

      # see if issue time has increased and if so, purge old stuff
      # create DataFile objects, which requires breaking the full
      # file into yymmdd/filename
      sind = stateNewest.find('/')
      if (sind < 0):
         raise FileNameMatchError('Cannot parse directory from ' + stateNewest)
      nind = dataNewest.find('/')
      if (nind < 0):
         raise FileNameMatchError('Cannot parse directory from ' + dataNewest)
      symd = stateNewest[:sind]
      sfile = stateNewest[sind+1:]
      nymd = dataNewest[:nind]
      nfile = dataNewest[nind+1:]
      WhfLog.debug("Checking %s / %s  against %s / %s", symd, sfile, nymd, nfile)
      try:
         df0 = df.DataFile(symd, sfile, fileType)
         df1 = df.DataFile(nymd, nfile, fileType)
      except FilenameMatchError as fe:
         WhfLog.debug("Cannot update due to %s", fe)
      except InvalidArgumentError as ie:
         WhfLog.debug("Cannot update due to %s", ie)

      if (df0._time.inputIsNewerIssueHour(df1._time)):
         WhfLog.debug("%s Issue hour has increased, purge now", fileType)
         self._update(df1._time, hoursBack, fileType)
    def updateWithNew(self, data, hoursBack):
        """ Update internal state with new data

      The dataType is used to determine which part of state to update

      Parameters
      ----------
      data: DataFiles
         The newest data
      hoursBack: int
         Maximum number of hours back to keep data in state

      Returns
      -------
      list[str]
          The data file names that are are newly added to state
      """

        ret = []
        fnames = data.getFnames()
        if (not fnames):
            return ret

        if (self.isEmpty()):
            WhfLog.debug("Adding to empty %s list")
        else:
            sname = self.newest()
            if (not sname):
                WhfLog.error("Expected file, got none")
                return ret
            if (fnames[-1] > sname):
                WhfLog.debug("Newer time encountered")
                # see if issue time has increased and if so, purge old stuff
                # create DataFile objects
                try:
                    df0 = df.DataFile(sname[0:8], sname[9:], 'CFS')
                    df1 = df.DataFile(fnames[-1][0:8], fnames[-1][9:], 'CFS')
                except FilenameMatchError as fe:
                    WhfLog.debug("Skipping file use due to %s", fe)
                except InvalidArgumentError as ie:
                    WhfLog.debug("Skipping file use due to %s", ie)

                if (df0._time.inputIsNewerIssueHour(df1._time)):
                    WhfLog.debug("Issue hour has increased, purge now")
                    self.update(df1._time, hoursBack)

        for f in fnames:
            if (self.addFileIfNew(f)):
                ret.append(f)

        self.sortFiles()
        return ret
def regridIfZeroHr(configFile, fileType, fname):
   """If it is a 0 hour forecast (RAP or HRRR) regrid in a special way
   Parameters
   ----------
   configFile : str
      configuration file with all settings
   fileType: str
      HRRR, RAP, ... string
   fname: str
      name of file to regrid and downscale, with yyyymmdd parent dir

   Returns
   -------
   None
   """
   # check for 0 hour by creating a DataFile and checking forecast hour
   try:
      f = df.DataFile(fname[0:8], fname[9:], fileType)
   except FilenameMatchError as fe:
      WhfLog.debug("Cannot check for 0 hour data due to %s", fe)
      raise
   except InvalidArgumentError as ie:
      WhfLog.debug("Cannot check for 0 hour data due to %s", ie)
      raise
   if (f._time._forecastHour == 0):
      WhfLog.setConfigType('AA')
      WhfLog.debug("SPECIAL 0 hour case %s", fname[9:0])
      aaf.forcing(configFile, 'regrid', fileType, fname[9:])
      WhfLog.setConfigType('Short')