Beispiel #1
0
 def ResetOutputsPeriod(
     self,
     output_ids,  # type: Union[AnyStr, List[AnyStr]]
     stime,  # type: Union[datetime, List[datetime]]
     etime  # type: Union[datetime, List[datetime]]
 ):
     # type: (...) -> None
     """Reset the STARTTIME and ENDTIME of OUTPUTID(s)."""
     if not isinstance(output_ids, list):
         output_ids = [output_ids]
     if not isinstance(stime, list):
         stime = [stime]
     if not isinstance(etime, list):
         etime = [etime]
     read_model = ReadModelData(self.host, self.port, self.db_name)
     for idx, outputid in enumerate(output_ids):
         cur_stime = stime[0]
         if idx < len(stime):
             cur_stime = stime[idx]
         cur_etime = etime[0]
         if idx < len(etime):
             cur_etime = etime[idx]
         cur_stime_str = cur_stime.strftime('%Y-%m-%d %H:%M:%S')
         cur_etime_str = cur_etime.strftime('%Y-%m-%d %H:%M:%S')
         db = read_model.maindb
         db[DBTableNames.main_fileout].find_one_and_update(
             {'OUTPUTID': outputid}, {
                 '$set': {
                     'STARTTIME': cur_stime_str,
                     'ENDTIME': cur_etime_str
                 }
             })
Beispiel #2
0
    def clean(self,
              scenario_id=None,
              calibration_id=None,
              delete_scenario=False,
              delete_spatial_gfs=False):
        """Clean model outputs in OUTPUT<ScenarioID>-<CalibrationID> directory and/or
        GridFS files in OUTPUT collection.

        Examples:
            model.SetMongoClient()
            model.clean()
            model.UnsetMongoClient()
        """
        rmtree(self.OutputDirectory, ignore_errors=True)
        self.ConnectMongoDB()
        read_model = ReadModelData(self.mongoclient, self.db_name)
        if scenario_id is None:
            scenario_id = self.scenario_id
        if calibration_id is None:
            calibration_id = self.calibration_id
        read_model.CleanOutputGridFs(scenario_id, calibration_id)
        if delete_scenario:
            read_model.CleanScenariosConfiguration(scenario_id)
            if delete_spatial_gfs:
                read_model.CleanSpatialGridFs(scenario_id)
Beispiel #3
0
 def OutputItems(self):
     # type: (...) -> Dict[AnyStr, Union[List[AnyStr]]]
     """Read output items from database."""
     if self.output_items:
         return self.output_items
     read_model = ReadModelData(self.host, self.port, self.db_name)
     return read_model.OutputItems
Beispiel #4
0
 def OutputIDs(self):
     # type: (...) -> List[AnyStr]
     """Read output items from database."""
     if self.output_ids:
         return self.output_ids
     read_model = ReadModelData(self.host, self.port, self.db_name)
     self.output_ids, self.output_items = read_model.OutputItems()
     return self.output_ids
Beispiel #5
0
    def ReadOutletObservations(self, vars_list):
        # type: (List[AnyStr]) -> (List[AnyStr], Dict[datetime, List[float]])
        """

        Examples:
            model.SetMongoClient()
            model.ReadOutletObservations()
            model.UnsetMongoClient()
        """
        self.ConnectMongoDB()
        self.ReadMongoDBData()
        read_model = ReadModelData(self.mongoclient, self.db_name)
        self.obs_vars, self.obs_value = read_model.Observation(
            self.outlet_id, vars_list, self.start_time, self.end_time)
        return self.obs_vars, self.obs_value
Beispiel #6
0
 def ResetSimulationPeriod(self):
     """Update simulation time range in MongoDB [FILE_IN]."""
     read_model = ReadModelData(self.host, self.port, self.db_name)
     if self.simu_stime and self.simu_etime:
         stime_str = self.simu_stime.strftime('%Y-%m-%d %H:%M:%S')
         etime_str = self.simu_etime.strftime('%Y-%m-%d %H:%M:%S')
         db = read_model.maindb
         db[DBTableNames.main_filein].find_one_and_update(
             {'TAG': 'STARTTIME'}, {'$set': {
                 'VALUE': stime_str
             }})
         db[DBTableNames.main_filein].find_one_and_update(
             {'TAG': 'ENDTIME'}, {'$set': {
                 'VALUE': etime_str
             }})
     self.start_time, self.end_time = read_model.SimulationPeriod
Beispiel #7
0
 def clean(self,
           scenario_id=None,
           calibration_id=None,
           delete_scenario=False):
     """Clean model outputs in OUTPUT<ScenarioID>-<CalibrationID> directory and/or
     GridFS files in OUTPUT collection.
     """
     rmtree(self.OutputDirectory, ignore_errors=True)
     read_model = ReadModelData(self.host, self.port, self.db_name)
     if scenario_id is None:
         scenario_id = self.scenario_id
     if calibration_id is None:
         calibration_id = self.calibration_id
     read_model.CleanOutputGridFs(scenario_id, calibration_id)
     if delete_scenario:
         read_model.CleanScenariosConfiguration(scenario_id)
Beispiel #8
0
    def ReadMongoDBData(self):
        """
        Examples:
            model.SetMongoClient()
            model.ReadMongoDBData()
            model.UnsetMongoClient()
        """
        if self.outlet_id >= 0:
            return

        self.ConnectMongoDB()
        read_model = ReadModelData(self.mongoclient, self.db_name)

        self.outlet_id = read_model.OutletID
        self.subbasin_count = read_model.SubbasinCount
        self.scenario_dbname = read_model.ScenarioDBName
        self.start_time, self.end_time = read_model.SimulationPeriod
        self.output_ids, self.output_items = read_model.OutputItems()
Beispiel #9
0
    def ResetSimulationPeriod(self):
        """Update simulation time range in MongoDB [FILE_IN].

        Examples:
            model.SetMongoClient()
            model.ResetSimulationPeriod()
            model.UnsetMongoClient()
        """
        self.ConnectMongoDB()
        read_model = ReadModelData(self.mongoclient, self.db_name)
        if self.simu_stime and self.simu_etime:
            stime_str = self.simu_stime.strftime('%Y-%m-%d %H:%M:%S')
            etime_str = self.simu_etime.strftime('%Y-%m-%d %H:%M:%S')
            db = read_model.maindb
            db[DBTableNames.main_filein].find_one_and_update(
                {'TAG': 'STARTTIME'}, {'$set': {
                    'VALUE': stime_str
                }})
            db[DBTableNames.main_filein].find_one_and_update(
                {'TAG': 'ENDTIME'}, {'$set': {
                    'VALUE': etime_str
                }})
        self.start_time, self.end_time = read_model.SimulationPeriod
Beispiel #10
0
    def __init__(self, cfg):
        # type: (PostConfig) -> None
        """Constructor"""
        self.model = MainSEIMS(args_dict=cfg.model_cfg.ConfigDict)
        self.ws = self.model.OutputDirectory
        if not FileClass.is_dir_exists(self.ws):
            raise ValueError('The output directory %s is not existed!' %
                             self.ws)
        self.plot_vars = cfg.plot_vars
        self.plot_cfg = cfg.plot_cfg  # type: PlotConfig
        # UTCTIME, calibration period
        self.stime = cfg.cali_stime
        self.etime = cfg.cali_etime
        self.subbsnID = cfg.plt_subbsnid
        # validation period
        self.vali_stime = cfg.vali_stime
        self.vali_etime = cfg.vali_etime

        # Read model data from MongoDB, the time period of simulation is read from FILE_IN.
        mongoclient = ConnectMongoDB(self.model.host,
                                     self.model.port).get_conn()
        self.readData = ReadModelData(mongoclient, self.model.db_name)
        self.mode = self.readData.Mode
        self.interval = self.readData.Interval
        # check start and end time of calibration
        st, et = self.readData.SimulationPeriod
        self.plot_validation = True
        if st > self.stime:
            self.stime = st
        if et < self.etime:
            self.etime = et
        if st > self.etime > self.stime:
            self.stime = st
            self.etime = et
            # in this circumstance, no validation should be calculated.
            self.vali_stime = None
            self.vali_etime = None
            self.plot_validation = False
        # check validation time period
        if self.vali_stime and self.vali_etime:
            if self.vali_stime >= self.vali_etime or st > self.vali_etime > self.vali_stime \
                or self.vali_stime >= et:
                self.vali_stime = None
                self.vali_etime = None
                self.plot_validation = False
            elif st > self.vali_stime:
                self.vali_stime = st
            elif et < self.vali_etime:
                self.vali_etime = et
        else:
            self.plot_validation = False
        # Set start time and end time of both calibration and validation periods
        start = self.stime
        end = self.etime
        if self.plot_validation:
            start = self.stime if self.stime < self.vali_stime else self.vali_stime
            end = self.etime if self.etime > self.vali_etime else self.vali_etime
        self.outletid = self.readData.OutletID
        # read precipitation
        self.pcp_date_value = self.readData.Precipitation(
            self.subbsnID, start, end)
        # read simulated data and update the available variables
        self.plot_vars, self.sim_data_dict = read_simulation_from_txt(
            self.ws, self.plot_vars, self.outletid, start, end)
        self.sim_data_value = list(
        )  # type: List[List[Union[datetime, float]]]
        for d, vs in self.sim_data_dict.items():
            self.sim_data_value.append([d] + vs[:])
        # reset start time and end time
        if len(self.sim_data_value) == 0:
            raise RuntimeError(
                'No available simulate data, please check the start and end time!'
            )
        # read observation data from MongoDB
        self.obs_vars, self.obs_data_dict = self.readData.Observation(
            self.subbsnID, self.plot_vars, start, end)

        # Calibration period
        self.sim_obs_dict = match_simulation_observation(self.plot_vars,
                                                         self.sim_data_dict,
                                                         self.obs_vars,
                                                         self.obs_data_dict,
                                                         start_time=self.stime,
                                                         end_time=self.etime)
        calculate_statistics(self.sim_obs_dict)
        # Validation period if existed
        self.vali_sim_obs_dict = dict()
        if self.plot_validation:
            self.vali_sim_obs_dict = match_simulation_observation(
                self.plot_vars,
                self.sim_data_dict,
                self.obs_vars,
                self.obs_data_dict,
                start_time=self.vali_stime,
                end_time=self.vali_etime)
            calculate_statistics(self.vali_sim_obs_dict)
Beispiel #11
0
 def ReadOutletObservations(self, vars_list):
     # type: (List[AnyStr]) -> (List[AnyStr], Dict[datetime, List[float]])
     read_model = ReadModelData(self.host, self.port, self.db_name)
     self.obs_vars, self.obs_value = read_model.Observation(
         self.outlet_id, vars_list, self.start_time, self.end_time)
     return self.obs_vars, self.obs_value
Beispiel #12
0
 def SimulatedPeriod(self):
     # type: (...) -> (datetime, datetime)
     read_model = ReadModelData(self.host, self.port, self.db_name)
     return read_model.SimulationPeriod
Beispiel #13
0
 def ScenarioDBName(self):
     # type: (...) -> AnyStr
     read_model = ReadModelData(self.host, self.port, self.db_name)
     return read_model.ScenarioDBName
Beispiel #14
0
 def SubbasinCount(self):
     # type: (...) -> int
     read_model = ReadModelData(self.host, self.port, self.db_name)
     return read_model.SubbasinCount
Beispiel #15
0
 def OutletID(self):
     # type: (...) -> int
     read_model = ReadModelData(self.host, self.port, self.db_name)
     return read_model.OutletID