def do_plot(self, line): keys = matchItems(line, self.fetchSupportedKeys()) if len(keys) == 0: self.lastCommandFailed("Must have at least one GenData key") return False case_list = self.shellContext()["plot_settings"].getCurrentPlotCases() for key in keys: key, report_step = key.split("@", 1) report_step = int(report_step) plot = ShellPlot("%s at report step: %d" %(key, report_step)) for case_name in case_list: data = GenDataCollector.loadGenData(self.ert(), case_name, key, report_step) if not data.empty: plot.plotGenData(data, legend_label=case_name) obs_key = GenDataObservationCollector.getObservationKeyForDataKey(self.ert(), key, report_step) if obs_key is not None: obs_data = GenDataObservationCollector.loadGenDataObservations(self.ert(), case_name, [obs_key]) if not obs_data.empty: plot.plotObservations(obs_data, obs_key) plot.showLegend()
def test_gen_data_collector(self): config = self.createTestPath("local/snake_oil/snake_oil.ert") with ErtTestContext("python/enkf/export/gen_data_collector", config) as context: ert = context.getErt() with self.assertRaises(KeyError): data = GenDataCollector.loadGenData(ert, "default_0", "RFT_XX", 199) with self.assertRaises(ValueError): data = GenDataCollector.loadGenData(ert, "default_0", "SNAKE_OIL_OPR_DIFF", 198) data1 = GenDataCollector.loadGenData(ert, "default_0", "SNAKE_OIL_OPR_DIFF", 199) self.assertFloatEqual(data1[0][0], -0.008206) self.assertFloatEqual(data1[24][1], -0.119255) self.assertFloatEqual(data1[24][1000], -0.258516)
def gatherGenDataData(ert, case, key): """ :rtype: pandas.DataFrame """ key, report_step = key.split("@", 1) report_step = int(report_step) try: data = GenDataCollector.loadGenData(ert, case, key, report_step) except ValueError: data = DataFrame() return data.dropna() # removes all rows that has a NaN
def test_gen_data_collector(self): config = self.createTestPath("Statoil/config/with_GEN_DATA_RFT/config") with ErtTestContext("python/enkf/export/gen_data_collector", config) as context: ert = context.getErt() with self.assertRaises(KeyError): data = GenDataCollector.loadGenData(ert, "default" , "RFT_XX" , 5) with self.assertRaises(ValueError): data = GenDataCollector.loadGenData(ert, "default" , "RFT_WI_1" , 90) data1 = GenDataCollector.loadGenData(ert, "default" , "RFT_WI_1" , 9) data2 = GenDataCollector.loadGenData(ert, "default" , "RFT_WI_2" , 5) self.assertFloatEqual( data1[0][0] , 346.088074) self.assertFloatEqual( data1[24][1] , 364.461090) self.assertFloatEqual( data2[0][1] , 263.419434) self.assertTrue( math.isnan( data2[0][0] ) )
def test_gen_data_collector(self): config = self.createTestPath("Statoil/config/with_GEN_DATA_RFT/config") with ErtTestContext("python/enkf/export/gen_data_collector", config) as context: ert = context.getErt() with self.assertRaises(KeyError): data = GenDataCollector.loadGenData(ert, "default", "RFT_XX", 5) with self.assertRaises(ValueError): data = GenDataCollector.loadGenData(ert, "default", "RFT_WI_1", 90) data1 = GenDataCollector.loadGenData(ert, "default", "RFT_WI_1", 9) data2 = GenDataCollector.loadGenData(ert, "default", "RFT_WI_2", 5) self.assertFloatEqual(data1[0][0], 346.088074) self.assertFloatEqual(data1[24][1], 364.461090) self.assertFloatEqual(data2[0][1], 263.419434) self.assertTrue(math.isnan(data2[0][0]))
def do_print(self, line): keys = matchItems(line, self.fetchSupportedKeys()) if len(keys) == 0: self.lastCommandFailed("Must have at least one GenData key") return False case_name = self.ert().getEnkfFsManager().getCurrentFileSystem().getCaseName() for key in keys: key, report_step = key.split("@", 1) report_step = int(report_step) data = GenDataCollector.loadGenData(self.ert(), case_name, key, report_step) print(data)
def run(self, output_file, trajectory_path , case_list=None, infer_iteration=True): """The run method will export the RFT's for all wells and all cases. The successfull operation of this method hinges on two naming conventions: 1. All the GEN_DATA RFT observations have key RFT_$WELL 2. The trajectory files are in $trajectory_path/$WELL.txt """ wells = set() obs_pattern = "RFT_*" enkf_obs = self.ert().getObservations() obs_keys = enkf_obs.getMatchingKeys(obs_pattern , obs_type = EnkfObservationImplementationType.GEN_OBS) cases = [] if case_list is not None: cases = case_list.split(",") if case_list is None or len(cases) == 0: cases = [self.ert().getEnkfFsManager().getCurrentFileSystem().getCaseName()] data_frame = pandas.DataFrame() for index, case in enumerate(cases): case = case.strip() case_frame = pandas.DataFrame() if not self.ert().getEnkfFsManager().caseExists(case): raise UserWarning("The case '%s' does not exist!" % case) if not self.ert().getEnkfFsManager().caseHasData(case): raise UserWarning("The case '%s' does not have any data!" % case) if infer_iteration: iteration_number = self.inferIterationNumber(case) else: iteration_number = index for obs_key in obs_keys: well = obs_key.replace("RFT_","") wells.add( well ) obs_vector = enkf_obs[obs_key] data_key = obs_vector.getDataKey() report_step = obs_vector.activeStep() obs_node = obs_vector.getNode( report_step ) rft_data = GenDataCollector.loadGenData( self.ert() , case , data_key , report_step ) fs = self.ert().getEnkfFsManager().getFileSystem( case ) realizations = fs.realizationList( RealizationStateEnum.STATE_HAS_DATA ) # Trajectory trajectory_file = os.path.join( trajectory_path , "%s.txt" % well) trajectory = WellTrajectory( trajectory_file ) arg = ArgLoader.load( trajectory_file , column_names = ["utm_x" , "utm_y" , "md" , "tvd"]) tvd_arg = arg["tvd"] data_size = len(tvd_arg) # Observations obs = numpy.empty(shape = (data_size , 2 ) , dtype=numpy.float64) obs.fill( numpy.nan ) for (value,std,data_index) in obs_node: obs[data_index,0] = value obs[data_index,1] = std real_data = pandas.DataFrame( index = ["Realization","Well"]) for iens in realizations: realization_frame = pandas.DataFrame( data = {"TVD" : tvd_arg , "Pressure" : rft_data[iens], "ObsValue" : obs[:,0], "ObsStd" : obs[:,1]}, columns = ["TVD" , "Pressure" , "ObsValue" , "ObsStd"]) realization_frame["Realization"] = iens realization_frame["Well"] = well realization_frame["Case"] = case realization_frame["Iteration"] = iteration_number case_frame = pandas.concat( [case_frame , realization_frame] ) data_frame = pandas.concat([data_frame, case_frame]) data_frame.set_index(["Realization" , "Well" , "Case" , "Iteration"] , inplace = True) data_frame.to_csv(output_file) export_info = "Exported RFT information for wells: %s to: %s " % (", ".join(list(wells)) , output_file) return export_info