From 8e9cc52fdd914dacb97693847146a226e5ef2d93 Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Mon, 5 Aug 2024 15:19:46 +0000 Subject: [PATCH 01/54] working b2i 6 scripts with tests; initial refactoring of bufr2ioda_insitu --- test/soca/CMakeLists.txt | 51 ++- .../testinput/insitu_ARGO_2021063006.json | 12 + .../testinput/insitu_BATHY_2021063006.json | 12 + .../testinput/insitu_GLIDER_2021063006.json | 12 + .../testinput/insitu_TESAC_2021063006.json | 12 + .../testinput/insitu_TRKOB_2021063006.json | 12 + .../testinput/insitu_XBTCTD_2021063006.json | 12 + test/soca/testref/insitu_ARGO_2021063006.ref | 12 + test/soca/testref/insitu_BATHY_2021063006.ref | 9 + .../soca/testref/insitu_GLIDER_2021063006.ref | 12 + test/soca/testref/insitu_TESAC_2021063006.ref | 12 + test/soca/testref/insitu_TRKOB_2021063006.ref | 10 + .../soca/testref/insitu_XBTCTD_2021063006.ref | 12 + ush/ioda/bufr2ioda/marine/b2i/ALTKOB.py | 34 ++ ush/ioda/bufr2ioda/marine/b2i/ARGO.py | 32 ++ ush/ioda/bufr2ioda/marine/b2i/BATHY.py | 31 ++ ush/ioda/bufr2ioda/marine/b2i/GLIDER.py | 36 ++ ush/ioda/bufr2ioda/marine/b2i/MARINEMAMMAL.py | 31 ++ ush/ioda/bufr2ioda/marine/b2i/TESAC.py | 31 ++ ush/ioda/bufr2ioda/marine/b2i/TODO | 2 + ush/ioda/bufr2ioda/marine/b2i/TRKOB.py | 37 ++ ush/ioda/bufr2ioda/marine/b2i/XBTCTD.py | 37 ++ .../marine/b2i/altkob_ioda_variables.py | 66 +++ .../marine/b2i/argo_ioda_variables.py | 86 ++++ .../marine/b2i/bathy_ioda_variables.py | 70 ++++ .../bufr2ioda/marine/b2i/bufr2ioda_config.py | 72 ++++ .../marine/b2i/bufr2ioda_converter.py | 141 +++++++ .../marine/b2i/glider_ioda_variables.py | 93 +++++ .../bufr2ioda/marine/b2i/ioda_variables.py | 249 ++++++++++++ .../marine/b2i/marinemammal_ioda_variables.py | 89 ++++ ush/ioda/bufr2ioda/marine/b2i/ocean.py | 380 ++++++++++++++++++ .../marine/b2i/tesac_ioda_variables.py | 89 ++++ .../marine/b2i/trkob_ioda_variables.py | 74 ++++ ush/ioda/bufr2ioda/marine/b2i/util.py | 207 ++++++++++ .../marine/b2i/xbtctd_ioda_variables.py | 57 +++ 35 files changed, 2128 insertions(+), 6 deletions(-) create mode 100644 test/soca/testinput/insitu_ARGO_2021063006.json create mode 100644 test/soca/testinput/insitu_BATHY_2021063006.json create mode 100644 test/soca/testinput/insitu_GLIDER_2021063006.json create mode 100644 test/soca/testinput/insitu_TESAC_2021063006.json create mode 100644 test/soca/testinput/insitu_TRKOB_2021063006.json create mode 100644 test/soca/testinput/insitu_XBTCTD_2021063006.json create mode 100644 test/soca/testref/insitu_ARGO_2021063006.ref create mode 100644 test/soca/testref/insitu_BATHY_2021063006.ref create mode 100644 test/soca/testref/insitu_GLIDER_2021063006.ref create mode 100644 test/soca/testref/insitu_TESAC_2021063006.ref create mode 100644 test/soca/testref/insitu_TRKOB_2021063006.ref create mode 100644 test/soca/testref/insitu_XBTCTD_2021063006.ref create mode 100755 ush/ioda/bufr2ioda/marine/b2i/ALTKOB.py create mode 100755 ush/ioda/bufr2ioda/marine/b2i/ARGO.py create mode 100755 ush/ioda/bufr2ioda/marine/b2i/BATHY.py create mode 100755 ush/ioda/bufr2ioda/marine/b2i/GLIDER.py create mode 100755 ush/ioda/bufr2ioda/marine/b2i/MARINEMAMMAL.py create mode 100755 ush/ioda/bufr2ioda/marine/b2i/TESAC.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/TODO create mode 100755 ush/ioda/bufr2ioda/marine/b2i/TRKOB.py create mode 100755 ush/ioda/bufr2ioda/marine/b2i/XBTCTD.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py create mode 100755 ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_converter.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py create mode 100755 ush/ioda/bufr2ioda/marine/b2i/ocean.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/util.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py diff --git a/test/soca/CMakeLists.txt b/test/soca/CMakeLists.txt index 8a07298bb..d8cae9e12 100644 --- a/test/soca/CMakeLists.txt +++ b/test/soca/CMakeLists.txt @@ -1,18 +1,23 @@ # Copy the bkg files # ------------------ -set( TESTDATA ${PROJECT_BINARY_DIR}/test/testdata ) +set(TESTDATA ${PROJECT_BINARY_DIR}/test/testdata ) + # Symlink test input yaml files # ----------------------------- # create testinput dir -file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/test/soca/testinput) +set (TESTINPUT_DIR ${PROJECT_BINARY_DIR}/test/soca/testinput) + +file(MAKE_DIRECTORY ${TESTINPUT_DIR}) +message(">>>>>>>>>>>>>>>>>>>>>>> created ${TESTINPUT_DIR}") # symlink foreach(FILENAME ${test_input}) - get_filename_component(filename ${FILENAME} NAME ) - execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink - ${FILENAME} - ${PROJECT_BINARY_DIR}/test/soca/testinput/${filename} ) + get_filename_component(filename ${FILENAME} NAME) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink + ${FILENAME} + ${TESTINPUT_DIR} + ) endforeach(FILENAME) # install @@ -32,3 +37,37 @@ set_tests_properties( test_gdasapp_soca_nsst_increment_to_mom6 PROPERTIES ENVIRONMENT "data=${TESTDATA};PYTHONPATH=${PROJECT_BINARY_DIR}/ush:$ENV{PYTHONPATH}") + + + + + +set(MARINE_BUFR2IODA_DIR ${PROJECT_SOURCE_DIR}/ush/ioda/bufr2ioda/marine) +set(MARINE_BUFR2IODA_DIR ${MARINE_BUFR2IODA_DIR}/b2i) +set(CONFIG_DIR ${PROJECT_SOURCE_DIR}/test/soca/testinput) +# set(TESTREF_DIR ${PROJECT_BINARY_DIR}/test/soca/testref) +set(TESTREF_DIR ${PROJECT_SOURCE_DIR}/test/soca/testref) + +function(ADD_INSITU_TEST testname) + # set(TEST insitu_${testname}) + set(TEST ${testname}) + message(".....................adding test ${TEST}") + set(CONFIG_FILE insitu_${TEST}_2021063006.json) + set(TESTREF_FILE insitu_${TEST}_2021063006.ref) + + add_test( + NAME test_insitu_bufr2ioda_${TEST} + COMMAND ${MARINE_BUFR2IODA_DIR}/${TEST}.py -c ${CONFIG_DIR}/${CONFIG_FILE} -t ${TESTREF_DIR}/${TESTREF_FILE} + WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/test/soca + ) +endfunction() + + +# ADD_INSITU_TEST(ALTKOB) +ADD_INSITU_TEST(ARGO) +ADD_INSITU_TEST(BATHY) +ADD_INSITU_TEST(GLIDER) +ADD_INSITU_TEST(TESAC) +ADD_INSITU_TEST(XBTCTD) +ADD_INSITU_TEST(TRKOB) + diff --git a/test/soca/testinput/insitu_ARGO_2021063006.json b/test/soca/testinput/insitu_ARGO_2021063006.json new file mode 100644 index 000000000..801f1f050 --- /dev/null +++ b/test/soca/testinput/insitu_ARGO_2021063006.json @@ -0,0 +1,12 @@ +{ + "data_format": "subpfl", + "subsets": "SUBPFL", + "source": "NCEP data tank", + "data_type": "argo", + "cycle_type": "gdas", + "cycle_datetime": "2021063006", + "dump_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", + "ioda_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", + "data_description": "6-hrly in situ ARGO profiles", + "data_provider": "U.S. NOAA" +} diff --git a/test/soca/testinput/insitu_BATHY_2021063006.json b/test/soca/testinput/insitu_BATHY_2021063006.json new file mode 100644 index 000000000..848fc08a2 --- /dev/null +++ b/test/soca/testinput/insitu_BATHY_2021063006.json @@ -0,0 +1,12 @@ +{ + "data_format": "bathy", + "subsets": "BATHY", + "source": "NCEP data tank", + "data_type": "bathy", + "cycle_type": "gdas", + "cycle_datetime": "2021063006", + "dump_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", + "ioda_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", + "data_description": "6-hrly in situ Bathythermal profiles", + "data_provider": "U.S. NOAA" +} \ No newline at end of file diff --git a/test/soca/testinput/insitu_GLIDER_2021063006.json b/test/soca/testinput/insitu_GLIDER_2021063006.json new file mode 100644 index 000000000..4b60800f8 --- /dev/null +++ b/test/soca/testinput/insitu_GLIDER_2021063006.json @@ -0,0 +1,12 @@ +{ + "data_format": "subpfl", + "subsets": "SUBPFL", + "source": "NCEP data tank", + "data_type": "glider", + "cycle_type": "gdas", + "cycle_datetime": "2021063006", + "dump_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", + "ioda_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", + "data_description": "6-hrly in situ GLIDER profiles", + "data_provider": "U.S. NOAA" +} \ No newline at end of file diff --git a/test/soca/testinput/insitu_TESAC_2021063006.json b/test/soca/testinput/insitu_TESAC_2021063006.json new file mode 100644 index 000000000..a4c966050 --- /dev/null +++ b/test/soca/testinput/insitu_TESAC_2021063006.json @@ -0,0 +1,12 @@ +{ + "data_format": "tesac", + "subsets": "TESAC", + "source": "NCEP data tank", + "data_type": "tesac", + "cycle_type": "gdas", + "cycle_datetime": "2021063006", + "dump_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", + "ioda_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", + "data_description": "6-hrly in situ TESAC profiles", + "data_provider": "U.S. NOAA" +} \ No newline at end of file diff --git a/test/soca/testinput/insitu_TRKOB_2021063006.json b/test/soca/testinput/insitu_TRKOB_2021063006.json new file mode 100644 index 000000000..312582489 --- /dev/null +++ b/test/soca/testinput/insitu_TRKOB_2021063006.json @@ -0,0 +1,12 @@ +{ + "data_format": "trkob", + "subsets": "TRACKOB", + "source": "NCEP data tank", + "data_type": "trackob", + "cycle_type": "gdas", + "cycle_datetime": "2021063006", + "dump_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", + "ioda_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", + "data_description": "6-hrly in situ TRACKOB surface", + "data_provider": "U.S. NOAA" +} \ No newline at end of file diff --git a/test/soca/testinput/insitu_XBTCTD_2021063006.json b/test/soca/testinput/insitu_XBTCTD_2021063006.json new file mode 100644 index 000000000..0e075df72 --- /dev/null +++ b/test/soca/testinput/insitu_XBTCTD_2021063006.json @@ -0,0 +1,12 @@ +{ + "data_format": "xbtctd", + "subsets": "XBTCTD", + "source": "NCEP data tank", + "data_type": "xbtctd", + "cycle_type": "gdas", + "cycle_datetime": "2021063006", + "dump_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", + "ioda_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", + "data_description": "6-hrly in situ XBT/XCTD profiles", + "data_provider": "U.S. NOAA" +} \ No newline at end of file diff --git a/test/soca/testref/insitu_ARGO_2021063006.ref b/test/soca/testref/insitu_ARGO_2021063006.ref new file mode 100644 index 000000000..bc91c7b5c --- /dev/null +++ b/test/soca/testref/insitu_ARGO_2021063006.ref @@ -0,0 +1,12 @@ + dateTime shape, dtype = (97150,), int64 + rcptdateTime shape, dytpe = (97150,), int64 + lon min, max, length, dtype = -174.8090057373047, 170.48915100097656, 97150, float32 + lat min, max, length, dtype = -59.77299880981445, 76.25086212158203, 97150, float32 + depth min, max, length, dtype = 0.0, 5700.7001953125, 97150, float32 + stationID shape, dtype = (97150,), = 68900) & (self.stationID <= 68999) | (self.stationID >= 1800000) & (self.stationID <= 1809999) | \ + (self.stationID >= 2800000) & (self.stationID <= 2809999) | (self.stationID >= 3800000) & (self.stationID <= 3809999) | \ + (self.stationID >= 4800000) & (self.stationID <= 4809999) | (self.stationID >= 5800000) & (self.stationID <= 5809999) | \ + (self.stationID >= 6800000) & (self.stationID <= 6809999) | (self.stationID >= 7800000) & (self.stationID <= 7809999) + + # Apply mask + self.stationID = self.stationID[mask_gldr] + self.lat = self.lat[mask_gldr] + self.lon = self.lon[mask_gldr] + self.depth = self.depth[mask_gldr] + self.temp = self.temp[mask_gldr] + self.saln = self.saln[mask_gldr] + self.seqNum = self.seqNum[mask_gldr] + self.dateTime = self.dateTime[mask_gldr] + self.rcptdateTime = self.rcptdateTime[mask_gldr] + + self.n_obs = len(mask_gldr) + + + def SetAdditionalData(self): + self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) + self.ObsError_temp = \ + np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorT))) + self.ObsError_saln = \ + np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) + + + + def createIODAVars(self, obsspace): + super().createIODAVars(obsspace) + + WriteStationID(obsspace, self.stationID) + WriteDepth(obsspace, self.depth) + WriteSequenceNumber(obsspace, self.seqNum, self.PreQC) + + self.WritePreQC(obsspace, "waterTemperature") + self.WritePreQC(obsspace, "salinity") + WriteObsError(obsspace, 'ObsError/waterTemperature', 'degC', self.ObsError_temp) + WriteObsError(obsspace, 'ObsError/salinity', 'psu', self.ObsError_saln) + self.WriteObsValueT(obsspace, 'waterTemperature') + self.WriteObsValueS(obsspace, 'salinity') + + diff --git a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py new file mode 100644 index 000000000..556417371 --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py @@ -0,0 +1,249 @@ +import numpy as np +from pyiodaconv import bufr +from util import Compute_sequenceNumber + + + +class IODAVariables: + def __init__(self): + self.n_obs = 0 + self.errorT = 0.0 + self.errorS = 0.0 + self.SetTemperatureRange(-10.0, 50.0) + self.SetSalinityRange(0.0, 45.0) + + + def SetTemperatureError(self, e): + self.errorT = e + + def SetSalinityError(self, e): + self.errorS = e + + def SetTemperatureRange(self, tmin, tmax): + self.Tmin = tmin + self.Tmax = tmax + + def SetSalinityRange(self, smin, smax): + self.Smin = smin + self.Smax = smax + + + def BuildQuery(self): + q = bufr.QuerySet() + + q.add('year', '*/YEAR') + q.add('month', '*/MNTH') + q.add('day', '*/DAYS') + q.add('hour', '*/HOUR') + q.add('minute', '*/MINU') + q.add('ryear', '*/RCYR') + q.add('rmonth', '*/RCMO') + q.add('rday', '*/RCDY') + q.add('rhour', '*/RCHR') + q.add('rminute', '*/RCMI') + + return q + + + def SetDatesFromQueryResult(self, r): + self.dateTime = r.get_datetime('year', 'month', 'day', 'hour', 'minute', group_by='depth') + self.dateTime = self.dateTime.astype(np.int64) + + self.rcptdateTime = r.get_datetime('ryear', 'rmonth', 'rday', 'rhour', 'rminute', group_by='depth') + self.rcptdateTime = self.rcptdateTime.astype(np.int64) + + def SetLonLatFromQueryResult(self, r): + self.lat = r.get('latitude', group_by='depth') + self.lon = r.get('longitude', group_by='depth') + + def SetObsFromQueryResult(self, r): + self.temp = r.get('temp', group_by='depth') + self.temp -= 273.15 + self.saln = r.get('saln', group_by='depth') + + + def SetFromQueryResult(self, r): + self.SetDatesFromQueryResult(r) + self.SetLonLatFromQueryResult(r) + self.stationID = r.get('stationID', group_by='depth') + self.depth = r.get('depth', group_by='depth') + self.SetObsFromQueryResult(r) + + + def TemperatureFilter(self): + return (self.temp > self.Tmin) & (self.temp <= self.Tmax) + def SalinityFilter(self): + return (self.saln >= self.Smin) & (self.saln <= self.Smax) + + def filter(self): + pass + + + def SetAdditionalData(self): + self.seqNum = Compute_sequenceNumber(self.lon) + self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) + self.ObsError_temp = \ + np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorT))) + self.ObsError_saln = \ + np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) + + + + + def createIODAVars(self, obsspace): + WriteDateTime(obsspace, self.dateTime) + WriteRcptDateTime(obsspace, self.rcptdateTime) + WriteLongitude(obsspace, self.lon) + WriteLatitude(obsspace, self.lat) + + + + def WritePreQC(self, obsspace, name): + obsspace.create_var("PreQC/" + name, dtype=self.PreQC.dtype, fillval=self.PreQC.fill_value) \ + .write_attr('long_name', 'PreQC') \ + .write_data(self.PreQC) + + def WriteObsValueT(self, obsspace, v_name): + obsspace.create_var('ObsValue/' + v_name, dtype=self.temp.dtype, fillval=self.temp.fill_value) \ + .write_attr('units', 'degC') \ + .write_attr('valid_range', \ + np.array([self.Tmin, self.Tmax], dtype=np.float32)) \ + .write_attr('long_name', v_name) \ + .write_data(self.temp) + + def WriteObsValueS(self, obsspace, v_name): + obsspace.create_var('ObsValue/' + v_name, dtype=self.saln.dtype, fillval=self.saln.fill_value) \ + .write_attr('units', 'psu') \ + .write_attr('valid_range', \ + np.array([self.Smin, self.Smax], dtype=np.float32)) \ + .write_attr('long_name', v_name) \ + .write_data(self.saln) + +############################################################################## + + def logTemperature(self, logger): + logger.debug(f" temp min, max, length, dtype = {self.temp.min()}, {self.temp.max()}, {len(self.temp)}, {self.temp.dtype}") + + def logSalinity(self, logger): + logger.debug(f" saln min, max, length, dtype = {self.saln.min()}, {self.saln.max()}, {len(self.saln)}, {self.saln.dtype}") + + + def logLonLat(self, logger): + logger.debug(f" lon min, max, length, dtype = {self.lon.min()}, {self.lon.max()}, {len(self.lon)}, {self.lon.dtype}") + logger.debug(f" lat min, max, length, dtype = {self.lat.min()}, {self.lat.max()}, {len(self.lat)}, {self.lat.dtype}") + + def logDates(self, logger): + logger.debug(f" dateTime shape, dtype = {self.dateTime.shape}, {self.dateTime.dtype}") + logger.debug(f" rcptdateTime shape, dytpe = {self.rcptdateTime.shape}, {self.rcptdateTime.dtype}") + + + def logStationID(self, logger): + logger.debug(f" stationID shape, dtype = {self.stationID.shape}, {self.stationID.astype(str).dtype}") + + def logDepth(self, logger): + logger.debug(f" depth min, max, length, dtype = {self.depth.min()}, {self.depth.max()}, {len(self.depth)}, {self.depth.dtype}") + + def LogSeqNum(self, logger): + logger.debug(f" sequence Num shape, dtype = {self.seqNum.shape}, {self.seqNum.dtype}") + + def LogPreQC(self, logger): + logger.debug(f" PreQC min, max, length, dtype = {self.PreQC.min()}, {self.PreQC.max()}, {len(self.PreQC)}, {self.PreQC.dtype}") + + def LogObsError_temp(self, logger): + logger.debug(f" ObsError_temp min, max, length, dtype = {self.ObsError_temp.min()}, {self.ObsError_temp.max()}, {len(self.ObsError_temp)}, {self.ObsError_temp.dtype}") + + def LogObsError_saln(self, logger): + logger.debug(f" ObsError_saln min, max, length, dtype = {self.ObsError_saln.min()}, {self.ObsError_saln.max()}, {len(self.ObsError_saln)}, {self.ObsError_saln.dtype}") + + + def logMetadata(self, logger): + self.logDates(logger) + self.logLonLat(logger) + self.logDepth(logger) + self.logStationID(logger) + + def logObs(self, logger): + self.logTemperature(logger) + self.logSalinity(logger) + + def logAdditionalData(self, logger): + self.LogSeqNum(logger) + self.LogPreQC(logger) + self.LogObsError_temp(logger) + self.LogObsError_saln(logger) + + def log(self, logger): + self.logMetadata(logger) + self.logObs(logger) + self.logAdditionalData(logger) + + + + +##################################################################### + + + +def WriteDateTime(obsspace, dateTime): + obsspace.create_var('MetaData/dateTime', \ + dtype=dateTime.dtype, fillval=dateTime.fill_value) \ + .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ + .write_attr('long_name', 'Datetime') \ + .write_data(dateTime) + +def WriteRcptDateTime(obsspace, rcptdateTime): + obsspace.create_var('MetaData/rcptdateTime', \ + dtype=rcptdateTime.dtype, fillval=rcptdateTime.fill_value) \ + .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ + .write_attr('long_name', 'receipt Datetime') \ + .write_data(rcptdateTime) + + +def WriteLongitude(obsspace, lon): + obsspace.create_var('MetaData/longitude', \ + dtype=lon.dtype, fillval=lon.fill_value) \ + .write_attr('units', 'degrees_east') \ + .write_attr('valid_range', np.array([-180, 180], dtype=np.float32)) \ + .write_attr('long_name', 'Longitude') \ + .write_data(lon) + +def WriteLatitude(obsspace, lat): + obsspace.create_var('MetaData/latitude', \ + dtype=lat.dtype, fillval=lat.fill_value) \ + .write_attr('units', 'degrees_north') \ + .write_attr('valid_range', np.array([-90, 90], dtype=np.float32)) \ + .write_attr('long_name', 'Latitude') \ + .write_data(lat) + + +def WriteStationID(obsspace, stationID): + obsspace.create_var('MetaData/stationID', \ + dtype=stationID.dtype, fillval=stationID.fill_value) \ + .write_attr('long_name', 'Station Identification') \ + .write_data(stationID) + +def WriteDepth(obsspace, depth): + obsspace.create_var('MetaData/depth', \ + dtype=depth.dtype, fillval=depth.fill_value) \ + .write_attr('units', 'm') \ + .write_attr('long_name', 'Water depth') \ + .write_data(depth) + + +def WriteSequenceNumber(obsspace, seqNum, PreQC): + obsspace.create_var('MetaData/sequenceNumber', \ + dtype=PreQC.dtype, fillval=PreQC.fill_value) \ + .write_attr('long_name', 'Sequence Number') \ + .write_data(seqNum) + + + +def WriteObsError(obsspace, v_name, units, v): + obsspace.create_var(v_name, \ + dtype=v.dtype, fillval=v.fill_value) \ + .write_attr('units', units) \ + .write_attr('long_name', 'ObsError') \ + .write_data(v) + + +################################################################## diff --git a/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py new file mode 100644 index 000000000..74bcc4fb5 --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py @@ -0,0 +1,89 @@ +import numpy as np +from pyiodaconv import bufr +from ioda_variables import * +from util import Compute_sequenceNumber + + +class MarinemammalIODAVariables(IODAVariables): + def __init__(self): + super().__init__() + + + def BuildQuery(self): + q = super().BuildQuery() + + q.add('stationID', '*/RPID') + q.add('latitude', '*/CLAT') + q.add('longitude', '*/CLON') + q.add('depth', '*/BTOCN/DBSS') + + # ObsValue + q.add('temp', '*/BTOCN/STMP') + q.add('saln', '*/BTOCN/SALN') + + return q + + + + def filter(self): + mask = self.TemperatureFilter() \ + & self.SalinityFilter() + + self.temp = self.temp[mask] + self.saln = self.saln[mask] + self.lat = self.lat[mask] + self.lon = self.lon[mask] + self.depth = self.depth[mask] + self.stationID = self.stationID[mask] + self.dateTime = self.dateTime[mask] + self.rcptdateTime = self.rcptdateTime[mask] + + # moved this ... + # self.seqNum = Compute_sequenceNumber(self.lon) + + # Separate marine mammals from TESAC tank + # Creating the mask for marine mammals from TESAC floats based on station ID + + alpha_mask = [item.isalpha() for item in self.stationID] + indices_true = [index for index, value in enumerate(alpha_mask) if value] + + self.n_obs = len(indices_true) + + # Apply index + self.stationID = self.stationID[indices_true] + self.lat = self.lat[indices_true] + self.lon = self.lon[indices_true] + self.depth = self.depth[indices_true] + self.temp = self.temp[indices_true] + self.saln = self.saln[indices_true] + self.seqNum = self.seqNum[indices_true] + self.dateTime = self.dateTime[indices_true] + self.rcptdateTime = self.rcptdateTime[indices_true] + + + # def SetAdditionalData(self): + # self.seqNum = Compute_sequenceNumber(self.lon) + # self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) + # self.ObsError_temp = \ + # np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorT))) + # self.ObsError_saln = \ + # np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) + + + + def createIODAVars(self, obsspace): + super().createIODAVars(obsspace) + + WriteStationID(obsspace, self.stationID) + WriteDepth(obsspace, self.depth) + WriteSequenceNumber(obsspace, self.seqNum, self.PreQC) + + self.WritePreQC(obsspace, "waterTemperature") + self.WritePreQC(obsspace, "salinity") + + WriteObsError(obsspace, "ObsError/waterTemperature", "degC", self.ObsError_temp) + WriteObsError(obsspace, "ObsError/salinity", "psu", self.ObsError_saln) + + self.WriteObsValueT(obsspace, 'waterTemperature') + self.WriteObsValueS(obsspace, 'salinity') + diff --git a/ush/ioda/bufr2ioda/marine/b2i/ocean.py b/ush/ioda/bufr2ioda/marine/b2i/ocean.py new file mode 100755 index 000000000..b981762c8 --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/ocean.py @@ -0,0 +1,380 @@ +#!/usr/bin/env python3 + +# import sys +import numpy as np +import numpy.ma as ma +# import os +# import argparse +import math +# import calendar +# import time +# import copy +# from datetime import datetime +# import json +# from pyiodaconv import bufr +# from collections import namedtuple +# from pyioda import ioda_obs_space as ioda_ospace +# from wxflow import Logger +# import warnings +# # suppress warnings +# warnings.filterwarnings('ignore') +# import subprocess +import matplotlib.pyplot as plt +import cartopy.crs as ccrs +import cartopy.feature as cfeature +import netCDF4 as nc +import xarray as xr + + + +ocean_basin_nc_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" + +ocean_basin_filename = "ocean_basin180x360" +n1 = 180 +n2 = 360 + +lat = [-89.5, -88.5, -87.5, -86.5, -85.5, -84.5, -83.5, -82.5, -81.5, -80.5, + -79.5, -78.5, -77.5, -76.5, -75.5, -74.5, -73.5, -72.5, -71.5, -70.5, + -69.5, -68.5, -67.5, -66.5, -65.5, -64.5, -63.5, -62.5, -61.5, -60.5, + -59.5, -58.5, -57.5, -56.5, -55.5, -54.5, -53.5, -52.5, -51.5, -50.5, + -49.5, -48.5, -47.5, -46.5, -45.5, -44.5, -43.5, -42.5, -41.5, -40.5, + -39.5, -38.5, -37.5, -36.5, -35.5, -34.5, -33.5, -32.5, -31.5, -30.5, + -29.5, -28.5, -27.5, -26.5, -25.5, -24.5, -23.5, -22.5, -21.5, -20.5, + -19.5, -18.5, -17.5, -16.5, -15.5, -14.5, -13.5, -12.5, -11.5, -10.5, + -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, + 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, + 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, + 27.5, 28.5, 29.5, 30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, 37.5, 38.5, + 39.5, 40.5, 41.5, 42.5, 43.5, 44.5, 45.5, 46.5, 47.5, 48.5, 49.5, 50.5, + 51.5, 52.5, 53.5, 54.5, 55.5, 56.5, 57.5, 58.5, 59.5, 60.5, 61.5, 62.5, + 63.5, 64.5, 65.5, 66.5, 67.5, 68.5, 69.5, 70.5, 71.5, 72.5, 73.5, 74.5, + 75.5, 76.5, 77.5, 78.5, 79.5, 80.5, 81.5, 82.5, 83.5, 84.5, 85.5, 86.5, + 87.5, 88.5, 89.5 ] + +lon = [ 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, + 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, 24.5, + 25.5, 26.5, 27.5, 28.5, 29.5, 30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, + 37.5, 38.5, 39.5, 40.5, 41.5, 42.5, 43.5, 44.5, 45.5, 46.5, 47.5, 48.5, + 49.5, 50.5, 51.5, 52.5, 53.5, 54.5, 55.5, 56.5, 57.5, 58.5, 59.5, 60.5, + 61.5, 62.5, 63.5, 64.5, 65.5, 66.5, 67.5, 68.5, 69.5, 70.5, 71.5, 72.5, + 73.5, 74.5, 75.5, 76.5, 77.5, 78.5, 79.5, 80.5, 81.5, 82.5, 83.5, 84.5, + 85.5, 86.5, 87.5, 88.5, 89.5, 90.5, 91.5, 92.5, 93.5, 94.5, 95.5, 96.5, + 97.5, 98.5, 99.5, 100.5, 101.5, 102.5, 103.5, 104.5, 105.5, 106.5, 107.5, + 108.5, 109.5, 110.5, 111.5, 112.5, 113.5, 114.5, 115.5, 116.5, 117.5, + 118.5, 119.5, 120.5, 121.5, 122.5, 123.5, 124.5, 125.5, 126.5, 127.5, + 128.5, 129.5, 130.5, 131.5, 132.5, 133.5, 134.5, 135.5, 136.5, 137.5, + 138.5, 139.5, 140.5, 141.5, 142.5, 143.5, 144.5, 145.5, 146.5, 147.5, + 148.5, 149.5, 150.5, 151.5, 152.5, 153.5, 154.5, 155.5, 156.5, 157.5, + 158.5, 159.5, 160.5, 161.5, 162.5, 163.5, 164.5, 165.5, 166.5, 167.5, + 168.5, 169.5, 170.5, 171.5, 172.5, 173.5, 174.5, 175.5, 176.5, 177.5, + 178.5, 179.5, 180.5, 181.5, 182.5, 183.5, 184.5, 185.5, 186.5, 187.5, + 188.5, 189.5, 190.5, 191.5, 192.5, 193.5, 194.5, 195.5, 196.5, 197.5, + 198.5, 199.5, 200.5, 201.5, 202.5, 203.5, 204.5, 205.5, 206.5, 207.5, + 208.5, 209.5, 210.5, 211.5, 212.5, 213.5, 214.5, 215.5, 216.5, 217.5, + 218.5, 219.5, 220.5, 221.5, 222.5, 223.5, 224.5, 225.5, 226.5, 227.5, + 228.5, 229.5, 230.5, 231.5, 232.5, 233.5, 234.5, 235.5, 236.5, 237.5, + 238.5, 239.5, 240.5, 241.5, 242.5, 243.5, 244.5, 245.5, 246.5, 247.5, + 248.5, 249.5, 250.5, 251.5, 252.5, 253.5, 254.5, 255.5, 256.5, 257.5, + 258.5, 259.5, 260.5, 261.5, 262.5, 263.5, 264.5, 265.5, 266.5, 267.5, + 268.5, 269.5, 270.5, 271.5, 272.5, 273.5, 274.5, 275.5, 276.5, 277.5, + 278.5, 279.5, 280.5, 281.5, 282.5, 283.5, 284.5, 285.5, 286.5, 287.5, + 288.5, 289.5, 290.5, 291.5, 292.5, 293.5, 294.5, 295.5, 296.5, 297.5, + 298.5, 299.5, 300.5, 301.5, 302.5, 303.5, 304.5, 305.5, 306.5, 307.5, + 308.5, 309.5, 310.5, 311.5, 312.5, 313.5, 314.5, 315.5, 316.5, 317.5, + 318.5, 319.5, 320.5, 321.5, 322.5, 323.5, 324.5, 325.5, 326.5, 327.5, + 328.5, 329.5, 330.5, 331.5, 332.5, 333.5, 334.5, 335.5, 336.5, 337.5, + 338.5, 339.5, 340.5, 341.5, 342.5, 343.5, 344.5, 345.5, 346.5, 347.5, + 348.5, 349.5, 350.5, 351.5, 352.5, 353.5, 354.5, 355.5, 356.5, 357.5, + 358.5, 359.5 ] + + +class OceanBasin: + # def __init__(self, filename): + def __init__(self): + self.__latitudes = lat + self.__longitudes = lon + self.__basin_array = None + # if filename: + # self.__basin_array = self.read_from_file(filename) + + + + def read_basin_from_file(self, filename): + integers_list = [] + with open(filename, 'r') as file: + for line in file: + # Convert each line to an integer and append to the list + integers_list.append(int(line.strip())) + + array_1d = np.array(integers_list) + try: + self.__basin_array = np.reshape(array_1d, (n1, n2)) + except ValueError: + print(f"Cannot reshape the array of size {len(integers_list)} into ({n1}, {n2})") + + + + def print_basin(self): + for i in range(n1): + for j in range(n2): + print(i, j, self.__basin_array[i][j]) + + + + def read_nc_file(self, filename): + print("reading the ocean basin data from ", filename) + variable_name = 'open_ocean' + + with nc.Dataset(filename, 'r') as nc_file: + if variable_name in nc_file.variables: + variable = nc_file.variables[variable_name] + + lon_dim = nc_file.dimensions['lon'].size + lat_dim = nc_file.dimensions['lat'].size + print("ocean basin dimensions ", lon_dim, lat_dim) + + # Read the variable data into a numpy array + variable_data = variable[:] + + # Convert to 2D numpy array (lon x lat) + self.__basin_array = np.reshape(variable_data, (lat_dim, lon_dim)) + + print(f'basin array array shape: {self.__basin_array.shape}') + # print(f'Variable "{self.__basin_array}" shape: {self.__basin_array.shape}') + # print(self.__basin_array) + + # print("DONE reading the ocean basin data from ", filename) + + + + + def plot_basin(self): + # Create a figure and axes with Cartopy projection + fig = plt.figure(figsize=(10, 6)) + ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) + + # Plot the ocean basins using a colormap with 6 colors + # cmap = plt.cm.get_cmap('rainbow', 6) # Choose a colormap with 6 colors + cmap = plt.get_cmap('viridis', 6) # Create a colormap with 6 discrete colors + im = ax.pcolormesh(self.__longitudes, self.__latitudes, self.__basin_array, cmap='viridis', shading='auto', transform=ccrs.PlateCarree()) + + # Add colorbar + cbar = fig.colorbar(im, ax=ax, orientation='vertical', pad=0.05, ticks=np.arange(0, 6)) + cbar.set_label('Ocean Basin', fontsize=12) + + # Add title and gridlines + ax.set_title('Ocean Basin Map', fontsize=16) + ax.coastlines() + ax.gridlines(draw_labels=True) + + # Show the plot + plt.show() + plt.savefig('ocean_basin.png', dpi=300) + + + + # input: 2 vectors of station coordinates + # output: a vector of station ocean basin values + def get_station_basin(self, lat, lon): + n = len(lon) + + lat0 = self.__latitudes[0] + dlat = self.__latitudes[1] - self.__latitudes[0] + lon0 = self.__longitudes[0] + dlon = self.__longitudes[1] - self.__longitudes[0] + # print("MMMMMMMMMMMMMuuuuuuuuuuuuuuuuuuuuuu") + # print("MMMMMMMMMMMMM", lon0, lat0) + # print("MMMMMMMMMMMMM", dlon, dlat) + # print("MMMMMMMMMMMMMuuuuuuuuuuuuuuuuuuuuuu") + + # the data may be a masked array + ocean_basin = [] + for i in range(n): + if not ma.is_masked(lat[i]): + i1 = round((lat[i] - lat0) / dlat) + i2 = round((lon[i] - lon0) / dlon) + ocean_basin.append(self.__basin_array[i1][i2]) + + # if (i == 0): + # print("MMMMMMMMMMMMM", lon[i], lat[i]) + # print("MMMMMMMMMMMMM", i1, i2) + # print("MMMMMMMMMMMMM", self.__basin_array[i1][i2]) + + return ocean_basin + + + + def print_station_basins(self, lon, lat): + ocean_basin = self.get_station_basin(lat, lon) + file_path = "/scratch1/NCEPDEV/da/Edward.Givelberg/workflow06112024/global-workflow/sorc/gdas.cd/ush/ioda/bufr2ioda/marine/argo.txt" + # print("print_station_basins to ===============>") + # print(file_path) + with open(file_path, 'w') as file: + # Iterate over lon, lat, and ocean_basin arrays simultaneously + for lat_val, lon_val, basin_val in zip(lat, lon, ocean_basin): + file.write(f"{lat_val} {lon_val} {basin_val}\n") + + + + + def plot_stations(self, lon, lat): + ocean_basin = self.get_station_basin(lon, lat) + + # Initialize the plot + plt.figure(figsize=(12, 8)) + + # Create a Cartopy map with PlateCarree projection (latitude/longitude) + ax = plt.axes(projection=ccrs.PlateCarree()) + + # Add coastlines and borders + ax.coastlines() + ax.add_feature(cartopy.feature.BORDERS, linestyle=':', linewidth=0.5) + + # Scatter plot with colored dots for each basin type + colors = ['blue', 'green', 'red', 'cyan', 'magenta', 'yellow'] + for basin_type in range(6): + indices = np.where(ocean_basin == basin_type)[0] + ax.scatter(lon[indices], lat[indices], color=colors[basin_type], label=f'Basin {basin_type}', alpha=0.7) + + # Add a legend + plt.legend(loc='lower left') + + # Add title and show plot + plt.title('Ocean Basins Plot using Cartopy') + plt.savefig('/scratch1/NCEPDEV/da/Edward.Givelberg/workflow06112024/global-workflow/sorc/gdas.cd/ush/ioda/bufr2ioda/marine/argo.png', dpi=300) + + + + def copy2_nc4_file(self, input_file, output_file): + + filename = "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/gdas.t06z.insitu_profile_argo.2021063006.nc4" + filename_w_ocean = filename + "_w_basin" + filename_w_ocean = "/scratch1/NCEPDEV/da/Edward.Givelberg/workflow06112024/global-workflow/sorc/gdas.cd/ush/ioda/bufr2ioda/marine/jocean.nc4" + print("add_basin_to_nc_file: .............") + print("FILE = ", filename) + input_file = filename + output_file = filename_w_ocean + + # open your dataset + ds = xr.open_dataset(filename) + + # change an existing variable + # ds.your_var += 20 + + # add a new variable + # ds['new_var'] = xr.DataArray([1, 2, 3, 4], dims=('new_dim', )) + + # write to a new file + ds.to_netcdf(filename_w_ocean) + + + + def copy_nc4_file(self, input_file, output_file): + + filename = "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/gdas.t06z.insitu_profile_argo.2021063006.nc4" + filename_w_ocean = filename + "_w_basin" + filename_w_ocean = "/scratch1/NCEPDEV/da/Edward.Givelberg/workflow06112024/global-workflow/sorc/gdas.cd/ush/ioda/bufr2ioda/marine/jocean.nc4" + print("add_basin_to_nc_file: .............") + print("FILE = ", filename) + input_file = filename + output_file = filename_w_ocean + + # Open the input NetCDF4 file for reading + with nc.Dataset(input_file, 'r') as ds: + # Create a new NetCDF4 file for writing + with nc.Dataset(output_file, 'w') as ds_out: + # Loop through and copy global attributes + for attr_name in ds.ncattrs(): + ds_out.setncattr(attr_name, ds.getncattr(attr_name)) + + # Loop through and copy dimensions + for dim_name, dim in ds.dimensions.items(): + ds_out.createDimension(dim_name, len(dim) if not dim.isunlimited() else None) + + # Loop through and copy groups recursively + def copy_group(src_group, dst_group): + for attr_name in src_group.ncattrs(): + dst_group.setncattr(attr_name, src_group.getncattr(attr_name)) + + for dim_name, dim in src_group.dimensions.items(): + dst_group.createDimension(dim_name, len(dim) if not dim.isunlimited() else None) + + for var_name, var in src_group.variables.items(): + new_var = dst_group.createVariable(var_name, var.dtype, var.dimensions) + + for attr_name in var.ncattrs(): + setattr(new_var, attr_name, getattr(var, attr_name)) + + new_var[:] = var[:] + + for subgrp_name, subgrp in src_group.groups.items(): + new_subgrp = dst_group.createGroup(subgrp_name) + copy_group(subgrp, new_subgrp) + + # Start copying from the root group + copy_group(ds, ds_out) + + + + + def add_basin_to_nc_file(self, filename): + + filename = "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/gdas.t06z.insitu_profile_argo.2021063006.nc4" + filename_w_ocean = filename + "_w_basin" + filename_w_ocean = "/scratch1/NCEPDEV/da/Edward.Givelberg/workflow06112024/global-workflow/sorc/gdas.cd/ush/ioda/bufr2ioda/marine/jocean.nc4" + print("add_basin_to_nc_file: .............") + print("FILE = ", filename) + + # Open the existing NetCDF file for reading + with nc.Dataset(filename, 'r') as ds: + # Open a new NetCDF file for writing + with nc.Dataset(filename_w_ocean, 'w') as ds_out: + # Iterate over dimensions and create them in the new file + for dimname, dim in ds.dimensions.items(): + ds_out.createDimension(dimname, len(dim) if not dim.isunlimited() else None) + + # Iterate over variables and copy them to the new file + for varname, var in ds.variables.items(): + # Create the variable in the new file + new_var = ds_out.createVariable(varname, var.dtype, var.dimensions) + + # Copy variable attributes + new_var.setncatts({k: var.getncattr(k) for k in var.ncattrs()}) + + # Copy variable data + new_var[:] = var[:] + + # Add your new variable (example: calculated based on an existing variable) + # temperature = ds.variables['temperature'][:] # Example existing variable + # new_variable = temperature * 2 # Example calculation + + # Create a new variable in the new file + # new_var_name = 'new_variable' + # new_var_units = 'units' # Example units + # new_var_long_name = 'Long name of new variable' # Example long_name + # new_var = ds_out.createVariable(new_var_name, temperature.dtype, temperature.dimensions) + + # Set variable attributes + # new_var.units = new_var_units + # new_var.long_name = new_var_long_name + + # Assign data to the new variable + # new_var[:] = new_variable + + # Copy global attributes + ds_out.setncatts({k: ds.getncattr(k) for k in ds.ncattrs()}) + + + + +if __name__ == '__main__': + + ocean_basin = OceanBasin() + + # ocean_basin.read_basin_from_file(ocean_basin_filename) + + ocean_basin.read_nc_file(ocean_basin_nc_path) + + # ocean_basin.print_basin() + ocean_basin.plot_basin() + diff --git a/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py new file mode 100644 index 000000000..ffe80c9df --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py @@ -0,0 +1,89 @@ +import numpy as np +from pyiodaconv import bufr +# from ioda_variables import IODAVariables +from ioda_variables import * +from util import Compute_sequenceNumber + + +class TesacIODAVariables(IODAVariables): + def __init__(self): + super().__init__() + + + def BuildQuery(self): + q = super().BuildQuery() + + q.add('stationID', '*/RPID') + q.add('latitude', '*/CLAT') + q.add('longitude', '*/CLON') + q.add('depth', '*/BTOCN/DBSS') + + # ObsValue + q.add('temp', '*/BTOCN/STMP') + q.add('saln', '*/BTOCN/SALN') + + + return q + + + def filter(self): + mask = self.TemperatureFilter() \ + & self.SalinityFilter() + + self.temp = self.temp[mask] + self.saln = self.saln[mask] + self.lat = self.lat[mask] + self.lon = self.lon[mask] + self.depth = self.depth[mask] + self.stationID = self.stationID[mask] + self.dateTime = self.dateTime[mask] + self.rcptdateTime = self.rcptdateTime[mask] + + self.seqNum = Compute_sequenceNumber(self.lon) + + + # Separate TESAC profiles tesac tank + # Creating the mask for TESAC floats based on station ID + + digit_mask = [item.isdigit() for item in self.stationID] + indices_true = [index for index, value in enumerate(digit_mask) if value] + + # Apply index + self.stationID = self.stationID[indices_true] + self.lat = self.lat[indices_true] + self.lon = self.lon[indices_true] + self.depth = self.depth[indices_true] + self.temp = self.temp[indices_true] + self.saln = self.saln[indices_true] + self.seqNum = self.seqNum[indices_true] + self.dateTime = self.dateTime[indices_true] + self.rcptdateTime = self.rcptdateTime[indices_true] + + self.n_obs = len(indices_true) + + + def SetAdditionalData(self): + self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) + self.ObsError_temp = \ + np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorT))) + self.ObsError_saln = \ + np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) + + + + def createIODAVars(self, obsspace): + super().createIODAVars(obsspace) + + WriteStationID(obsspace, self.stationID) + WriteDepth(obsspace, self.depth) + WriteSequenceNumber(obsspace, self.seqNum, self.PreQC) + + self.WritePreQC(obsspace, "waterTemperature") + self.WritePreQC(obsspace, "salinity") + + WriteObsError(obsspace, "ObsError/waterTemperature", "degC", self.ObsError_temp) + WriteObsError(obsspace, "ObsError/salinity", "psu", self.ObsError_saln) + + self.WriteObsValueT(obsspace, 'waterTemperature') + self.WriteObsValueS(obsspace, 'salinity') + diff --git a/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py new file mode 100644 index 000000000..54e6ac3ba --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py @@ -0,0 +1,74 @@ +import numpy as np +from pyiodaconv import bufr +# from ioda_variables import IODAVariables +from ioda_variables import * +from util import Compute_sequenceNumber + + +class TrkobIODAVariables(IODAVariables): + def __init__(self): + super().__init__() + + + def BuildQuery(self): + q = super().BuildQuery() + q.add('stationID', '*/RPID') + q.add('latitude', '*/CLAT') + q.add('longitude', '*/CLON') + q.add('depth', '*/BTOCN/DBSS') + + # ObsValue + q.add('temp', '*/BTOCN/STMP') + q.add('saln', '*/BTOCN/SALN') + + return q + + + def filter(self): + mask = self.TemperatureFilter() \ + & self.SalinityFilter() + self.n_obs = len(mask) + + self.temp = self.temp[mask] + self.saln = self.saln[mask] + self.lat = self.lat[mask] + self.lon = self.lon[mask] + self.stationID = self.stationID[mask] + self.dateTime = self.dateTime[mask] + self.rcptdateTime = self.rcptdateTime[mask] + + + def SetAdditionalData(self): + self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) + self.ObsError_temp = \ + np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorT))) + self.ObsError_saln = \ + np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) + + + + def createIODAVars(self, obsspace): + super().createIODAVars(obsspace) + + WriteStationID(obsspace, self.stationID) + + self.WritePreQC(obsspace, "seaSurfaceTemperature") + self.WritePreQC(obsspace, "seaSurfaceSalinity") + + WriteObsError(obsspace, "ObsError/seaSurfaceTemperature", "degC", self.ObsError_temp) + WriteObsError(obsspace, "ObsError/seaSurfaceSalinity", "psu", self.ObsError_saln) + + self.WriteObsValueT(obsspace, 'seaSurfaceTemperature') + self.WriteObsValueS(obsspace, 'seaSurfaceSalinity') + + + def logMetadata(self, logger): + self.logDates(logger) + self.logLonLat(logger) + self.logStationID(logger) + + def logAdditionalData(self, logger): + self.LogPreQC(logger) + self.LogObsError_temp(logger) + self.LogObsError_saln(logger) + diff --git a/ush/ioda/bufr2ioda/marine/b2i/util.py b/ush/ioda/bufr2ioda/marine/b2i/util.py new file mode 100644 index 000000000..12fc5e838 --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/util.py @@ -0,0 +1,207 @@ +import os +import sys +import argparse +import subprocess +import numpy as np +import tempfile +# import logging +# import colorlog + + +# def get_logger(name, level=logging.DEBUG): + # logger = logging.getLogger(name) + # logger.setLevel(level) +# + # handler = colorlog.StreamHandler() + # handler.setFormatter(colorlog.ColoredFormatter( + # '%(log_color)s%(asctime)s - %(levelname)s - %(message)s', + # log_colors={ + # 'DEBUG': 'cyan', + # 'INFO': 'green', + # 'WARNING': 'yellow', + # 'ERROR': 'red', + # 'CRITICAL': 'red,bg_white', + # }, + # reset=True, + # style='%' + # )) +# + # logger.addHandler(handler) + # return logger + + + +def ParseArguments(): + parser = argparse.ArgumentParser() + parser.add_argument('-c', '--config', \ + type=str, help='Input JSON or YAML configuration', required=True) + parser.add_argument('-l', '--log_file', \ + type=str, help='Output file for testing ioda variables') + parser.add_argument('-t', '--test', \ + type=str, help='Input test reference file') + # parser.add_argument('-v', '--verbose', \ + # help='Print debug logging information', + # action='store_true') + + args = parser.parse_args() + + # log_level = 'DEBUG' if args.verbose else 'INFO' + config_file = args.config + log_file = args.log_file + test_file = args.test + + script_name = sys.argv[0] + + return script_name, config_file, log_file, test_file + + + +def run_diff(file1, file2): + # log this.... + # print("running diff on: ") + # print("file 1 = ", file1) + # print("file 2 = ", file2) + + try: + # Run the diff command + result = subprocess.run(['diff', file1, file2], \ + capture_output=True, text=True, check=False) + + # Check if diff command succeeded (return code 0) + if result.returncode == 0: + print("Files are identical.") + elif result.returncode == 1: + # Print the difference if files are different + print("Files are different:") + print(result.stdout) + else: + print("Error occurred while running diff command.") + print(result.stderr) + + except subprocess.CalledProcessError as e: + print(f"Error occurred: {e}") + + return result.returncode + + + + +def run_diff_script_inline(file1, file2, script_content): + try: + # Create a temporary script file with the provided content + script_path = '/tmp/temp_script.sh' + with open(script_path, 'w') as f: + f.write(script_content) + + # Make the script executable + subprocess.run(['chmod', '+x', script_path], check=True) + + # Construct the command to run the temporary script + command = [script_path, file1, file2] + + # Run the script and capture the output + result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, text=True) + + # Return the output of the script (which is assumed to be the result of the diff) + return result.stdout + + except subprocess.CalledProcessError as e: + print(f"Error running script: {e}") + return None + except Exception as e: + print(f"Error: {e}") + return None + finally: + # Clean up: delete the temporary script file + try: + subprocess.run(['rm', '-f', script_path]) + except Exception as e: + print(f"Error cleaning up temp script: {e}") + + + +# to be deprecated..... +def WriteTestOutputFile(directory_path, file_name, text): + + # Check if the directory exists, create it if it doesn't + if not os.path.exists(directory_path): + os.makedirs(directory_path) + print(f"Directory '{directory_path}' created.") + + file_path = os.path.join(directory_path, file_name) + print(f"File '{file_path}' created.") + + with open(file_path, 'w') as file: + for s in text: + file.write(f"{s}\n") + + return + + + +def Compute_sequenceNumber(lon): + lon_u, seqNum = np.unique(lon, return_inverse=True) + seqNum = seqNum.astype(np.int32) + # logger.debug(f"Len of Sequence Number: {len(seqNum)}") + return seqNum + + + +def nc_diff(file1, file2): + try: + script_content = ''' +#!/bin/bash +diff <(ncdump "$1"| sed '1d') <(ncdump "$2"|sed '1d') +''' + + # Create a temporary script file with the provided content + with tempfile.NamedTemporaryFile(delete=False, mode='w') as temp_script: + temp_script.write(script_content.lstrip()) # Remove leading indentation + + # Make the script executable + os.chmod(temp_script.name, 0o755) # Make it executable for owner + + # Construct the command to run the temporary script + command = ['bash', temp_script.name, file1, file2] + + # result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, text=True) + result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + # Check the return code of the subprocess + # if result.returncode != 0: + # print(f"Script exited with non-zero status: {result.returncode}") + # return result.returncode + return result.returncode + # return result.stdout + + except subprocess.CalledProcessError as e: + print(f"Error running script: {e}") + # print(f"Script stderr: {e.stderr}") + return None + except Exception as e: + print(f"Error: {e}") + return None + finally: + # Clean up: delete the temporary script file + try: + os.remove(temp_script.name) + except Exception as e: + print(f"Error cleaning up temp script: {e}") + + + + +if __name__ == '__main__': + + + file1 = '/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/gdas.t06z.insitu_profile_argo.2021063006.nc4' + file2 = '/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/backup_gdas.t06z.insitu_profile_argo.2021063006.nc4' + # file2 = '/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/gdas.t06z.sst_viirs_npp_l3u.2021063006.nc4' + + + diff_result = nc_diff(file1, file2) + if diff_result == 0: + print("identitcal") + else: + print("different") + diff --git a/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py new file mode 100644 index 000000000..0e4f6a30f --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py @@ -0,0 +1,57 @@ +import numpy as np +from pyiodaconv import bufr +from ioda_variables import * +from util import Compute_sequenceNumber + + +class XbtctdIODAVariables(IODAVariables): + def __init__(self): + super().__init__() + + + def BuildQuery(self): + q = super().BuildQuery() + + q.add('stationID', '*/WMOP') + q.add('latitude', '*/CLATH') + q.add('longitude', '*/CLONH') + q.add('depth', '*/TMSLPFSQ/DBSS') + + # ObsValue + q.add('temp', '*/TMSLPFSQ/SST1') + q.add('saln', '*/TMSLPFSQ/SALNH') + + return q + + + def filter(self): + mask = self.TemperatureFilter() \ + & self.SalinityFilter() + self.n_obs = len(mask) + + self.temp = self.temp[mask] + self.saln = self.saln[mask] + self.lat = self.lat[mask] + self.lon = self.lon[mask] + self.depth = self.depth[mask] + self.stationID = self.stationID[mask] + self.dateTime = self.dateTime[mask] + self.rcptdateTime = self.rcptdateTime[mask] + + + def createIODAVars(self, obsspace): + super().createIODAVars(obsspace) + + WriteStationID(obsspace, self.stationID) + WriteDepth(obsspace, self.depth) + WriteSequenceNumber(obsspace, self.seqNum, self.PreQC) + + self.WritePreQC(obsspace, "waterTemperature") + self.WritePreQC(obsspace, "salinity") + + WriteObsError(obsspace, "ObsError/waterTemperature", "degC", self.ObsError_temp) + WriteObsError(obsspace, "ObsError/salinity", "psu", self.ObsError_saln) + + self.WriteObsValueT(obsspace, 'waterTemperature') + self.WriteObsValueS(obsspace, 'salinity') + From 56c0cef23270eb987729f817807c032afb605123 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 13:38:10 -0400 Subject: [PATCH 02/54] Update ARGO.py --- ush/ioda/bufr2ioda/marine/b2i/ARGO.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/ARGO.py b/ush/ioda/bufr2ioda/marine/b2i/ARGO.py index 48a5d9b54..397dd239f 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/ARGO.py +++ b/ush/ioda/bufr2ioda/marine/b2i/ARGO.py @@ -7,16 +7,14 @@ from bufr2ioda_converter import Bufr2ioda_Converter - - if __name__ == '__main__': script_name, config_file, log_file, test_file = ParseArguments() platform_description = 'ARGO profiles from subpfl: temperature and salinity' - bufr2ioda_config = Bufr2iodaConfig( \ - script_name, \ - config_file, \ + bufr2ioda_config = Bufr2iodaConfig( + script_name, + config_file, platform_description) ioda_vars = ArgoIODAVariables() @@ -29,4 +27,3 @@ if test_file: result = argo.test(test_file) sys.exit(result) - From e1b3d74a5ea4e16e3f769f88549687440fc22be5 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 13:39:22 -0400 Subject: [PATCH 03/54] Update ALTKOB.py --- ush/ioda/bufr2ioda/marine/b2i/ALTKOB.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/ALTKOB.py b/ush/ioda/bufr2ioda/marine/b2i/ALTKOB.py index a335da8da..21f44f731 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/ALTKOB.py +++ b/ush/ioda/bufr2ioda/marine/b2i/ALTKOB.py @@ -11,15 +11,14 @@ def IODAFilename(self): return f"{self.cycle_type}.t{self.hh}z.{self.data_type}_profiles.{self.data_format}.nc4" - if __name__ == '__main__': script_name, config_file, log_file, test_file = ParseArguments() platform_description = 'Surface obs from ALTKOB: temperature and salinity' - bufr2ioda_config = AltkobConfig( \ - script_name, \ - config_file, \ + bufr2ioda_config = AltkobConfig( + script_name, + config_file, platform_description) ioda_vars = AltkobIODAVariables() @@ -31,4 +30,3 @@ def IODAFilename(self): if test_file: result = altkob.test(test_file) sys.exit(result) - From a15bc5971eadf587b4eba9eb28081b6f765cefba Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 13:42:33 -0400 Subject: [PATCH 04/54] Update BATHY.py --- ush/ioda/bufr2ioda/marine/b2i/BATHY.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/BATHY.py b/ush/ioda/bufr2ioda/marine/b2i/BATHY.py index 04c884fd2..1cda4e4b0 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/BATHY.py +++ b/ush/ioda/bufr2ioda/marine/b2i/BATHY.py @@ -7,16 +7,14 @@ from bufr2ioda_converter import Bufr2ioda_Converter - - if __name__ == '__main__': script_name, config_file, log_file, test_file = ParseArguments() platform_description = 'Profiles from BATHYthermal: temperature' - bufr2ioda_config = Bufr2iodaConfig( \ - script_name, \ - config_file, \ + bufr2ioda_config = Bufr2iodaConfig( + script_name, + config_file, platform_description) ioda_vars = BathyIODAVariables() @@ -28,4 +26,3 @@ if test_file: result = bathy.test(test_file) sys.exit(result) - From 3f03aa944c33e27f6cc84e96528a17ff2357584f Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 13:43:47 -0400 Subject: [PATCH 05/54] Update GLIDER.py --- ush/ioda/bufr2ioda/marine/b2i/GLIDER.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/GLIDER.py b/ush/ioda/bufr2ioda/marine/b2i/GLIDER.py index fff453b2b..777bae57d 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/GLIDER.py +++ b/ush/ioda/bufr2ioda/marine/b2i/GLIDER.py @@ -12,15 +12,14 @@ def IODAFilename(self): return f"{self.cycle_type}.t{self.hh}z.{self.data_type}_profiles.{self.data_format}.nc4" - if __name__ == '__main__': script_name, config_file, log_file, test_file = ParseArguments() platform_description = 'GLIDER profiles from subpfl: temperature and salinity' - bufr2ioda_config = GliderConfig( \ - script_name, \ - config_file, \ + bufr2ioda_config = GliderConfig( + script_name, + config_file, platform_description) ioda_vars = GliderIODAVariables() @@ -33,4 +32,3 @@ def IODAFilename(self): if test_file: result = glider.test(test_file) sys.exit(result) - From 4d15eb9fb895bcbd5605230e77b7a60356d468bd Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 13:45:44 -0400 Subject: [PATCH 06/54] Update MARINEMAMMAL.py --- ush/ioda/bufr2ioda/marine/b2i/MARINEMAMMAL.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/MARINEMAMMAL.py b/ush/ioda/bufr2ioda/marine/b2i/MARINEMAMMAL.py index 834d4c33c..a2a66474c 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/MARINEMAMMAL.py +++ b/ush/ioda/bufr2ioda/marine/b2i/MARINEMAMMAL.py @@ -6,16 +6,14 @@ from bufr2ioda_converter import Bufr2ioda_Converter - - if __name__ == '__main__': script_name, config_file, log_file, test_file = ParseArguments() platform_description = 'Profiles from Marine Mammals: temperature and salinity' - bufr2ioda_config = Bufr2iodaConfig( \ - script_name, \ - config_file, \ + bufr2ioda_config = Bufr2iodaConfig( + script_name, + config_file, platform_description) ioda_vars = MarinemammalIODAVariables() @@ -28,4 +26,3 @@ if test_file: result = mammal.test(test_file) sys.exit(result) - From 4bc9a6bebba3b79e7f40890d1c30b10cc9b290c6 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 13:47:00 -0400 Subject: [PATCH 07/54] Update TESAC.py --- ush/ioda/bufr2ioda/marine/b2i/TESAC.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/TESAC.py b/ush/ioda/bufr2ioda/marine/b2i/TESAC.py index 55943b28d..8e55c352e 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/TESAC.py +++ b/ush/ioda/bufr2ioda/marine/b2i/TESAC.py @@ -7,15 +7,14 @@ from tesac_ioda_variables import TesacIODAVariables - if __name__ == '__main__': script_name, config_file, log_file, test_file = ParseArguments() platform_description = 'Profiles from TESAC: temperature and salinity' - bufr2ioda_config = Bufr2iodaConfig( \ - script_name, \ - config_file, \ + bufr2ioda_config = Bufr2iodaConfig( + script_name, + config_file, platform_description) ioda_vars = TesacIODAVariables() @@ -28,4 +27,3 @@ if test_file: result = tesac.test(test_file) sys.exit(result) - From a995f15775309826068bdd01307330a9f0c5b868 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 13:47:58 -0400 Subject: [PATCH 08/54] Update TRKOB.py --- ush/ioda/bufr2ioda/marine/b2i/TRKOB.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/TRKOB.py b/ush/ioda/bufr2ioda/marine/b2i/TRKOB.py index 45deec581..2f8820b64 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/TRKOB.py +++ b/ush/ioda/bufr2ioda/marine/b2i/TRKOB.py @@ -12,16 +12,14 @@ def IODAFilename(self): return f"{self.cycle_type}.t{self.hh}z.insitu_surface_{self.data_format}.{self.cycle_datetime}.nc4" - - if __name__ == '__main__': script_name, config_file, log_file, test_file = ParseArguments() platform_description = 'Surface obs from TRACKOB: temperature and salinity' - bufr2ioda_config = TrkobConfig( \ - script_name, \ - config_file, \ + bufr2ioda_config = TrkobConfig( + script_name, + config_file, platform_description) ioda_vars = TrkobIODAVariables() @@ -34,4 +32,3 @@ def IODAFilename(self): if test_file: result = trkob.test(test_file) sys.exit(result) - From 15c05ab5121e374603ef1b1f2311ea8f8adec39e Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 13:49:16 -0400 Subject: [PATCH 09/54] Update XBTCTD.py --- ush/ioda/bufr2ioda/marine/b2i/XBTCTD.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/XBTCTD.py b/ush/ioda/bufr2ioda/marine/b2i/XBTCTD.py index 746d58b3e..0c98a46e2 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/XBTCTD.py +++ b/ush/ioda/bufr2ioda/marine/b2i/XBTCTD.py @@ -12,16 +12,14 @@ def IODAFilename(self): return f"{self.cycle_type}.t{self.hh}z.{self.data_type}_profiles.{self.data_format}.nc4" - - if __name__ == '__main__': script_name, config_file, log_file, test_file = ParseArguments() platform_description = 'Profiles from XBT/CTD: temperature and salinity' - bufr2ioda_config = XbtctdConfig( \ - script_name, \ - config_file, \ + bufr2ioda_config = XbtctdConfig( + script_name, + config_file, platform_description) ioda_vars = XbtctdIODAVariables() @@ -34,4 +32,3 @@ def IODAFilename(self): if test_file: result = xbtctd.test(test_file) sys.exit(result) - From 72d787b0e14505bc40d93cb70696f61d6f54537a Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 14:17:32 -0400 Subject: [PATCH 10/54] Update altkob_ioda_variables.py --- .../bufr2ioda/marine/b2i/altkob_ioda_variables.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py index 386a6db2d..01ab610bb 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py @@ -8,26 +8,20 @@ class AltkobIODAVariables(IODAVariables): def __init__(self): super().__init__() - def BuildQuery(self): q = super().BuildQuery() - q.add('latitude', '*/CLATH') q.add('longitude', '*/CLONH') - # ObsValue q.add('temp', '*/SST0') q.add('saln', '*/SSS0') - return q - def SetFromQueryResult(self, r): self.SetDatesFromQueryResult(r) self.SetLonLatFromQueryResult(r) self.SetObsFromQueryResult(r) - def filter(self): mask = self.TemperatureFilter() \ & SalinityFilter() @@ -43,9 +37,9 @@ def filter(self): def SetAdditionalData(self): self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) - self.ObsError_temp = \ + self.ObsError_temp = \ np.float32(np.ma.masked_array(np.full((self.n_obs), self.ErrorT))) - self.ObsError_saln = \ + self.ObsError_saln = \ np.float32(np.ma.masked_array(np.full((self.n_obs), self.ErrorS))) @@ -63,4 +57,3 @@ def createIODAVars(self, obsspace): self.WriteObsValueT(obsspace,'waterTemperature') self.WriteObsValueS(obsspace, 'salinity') - From 54c11c97268e1dc75af5aedd1786cf472d56272d Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 14:20:00 -0400 Subject: [PATCH 11/54] Update argo_ioda_variables.py --- ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py index 627c57f4f..f3d871833 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py @@ -12,25 +12,20 @@ def __init__(self): def BuildQuery(self): q = super().BuildQuery() - q.add('stationID', '*/WMOP') q.add('latitude', '*/CLATH') q.add('longitude', '*/CLONH') q.add('depth', '*/GLPFDATA/WPRES') - # ObsValue q.add('temp', '*/GLPFDATA/SSTH') q.add('saln', '*/GLPFDATA/SALNH') - return q - def SetFromQueryResult(self, r): super().SetFromQueryResult(r) # convert depth in pressure units to meters (rho * g * h) self.depth = np.float32(self.depth.astype(float) * 0.0001) - def filter(self): mask = self.TemperatureFilter() \ & self.SalinityFilter() @@ -67,7 +62,6 @@ def filter(self): self.dateTime = self.dateTime[index_list] self.rcptdateTime = self.rcptdateTime[index_list] - def createIODAVars(self, obsspace): super().createIODAVars(obsspace) From 441419da2398f5f72854264a5e34f4daf7283df8 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 14:28:37 -0400 Subject: [PATCH 12/54] Update argo_ioda_variables.py --- ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py index f3d871833..00ce46ef0 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py @@ -9,7 +9,6 @@ class ArgoIODAVariables(IODAVariables): def __init__(self): super().__init__() - def BuildQuery(self): q = super().BuildQuery() q.add('stationID', '*/WMOP') @@ -77,4 +76,3 @@ def createIODAVars(self, obsspace): self.WriteObsValueT(obsspace, 'waterTemperature') self.WriteObsValueS(obsspace, 'salinity') - From 9ec439fe8eb722cdbc53176e2e7bb21b6c2379c7 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 14:30:47 -0400 Subject: [PATCH 13/54] Update bathy_ioda_variables.py --- ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py index 1091e3926..7c1d89c99 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py @@ -8,26 +8,20 @@ class BathyIODAVariables(IODAVariables): def __init__(self): super().__init__() - def BuildQuery(self): q = super().BuildQuery() - q.add('stationID', '*/RPID') q.add('latitude', '*/CLAT') q.add('longitude', '*/CLON') q.add('depth', '*/BTOCN/DBSS') - # ObsValue q.add('temp', '*/BTOCN/STMP') - return q - def SetObsFromQueryResult(self, r): self.temp = r.get('temp', group_by='depth') self.temp -= 273.15 - def filter(self): mask = self.TemperatureFilter() self.n_obs = len(mask) @@ -40,7 +34,6 @@ def filter(self): self.rcptdateTime = self.rcptdateTime[mask] self.temp = self.temp[mask] - def SetAdditionalData(self): self.seqNum = Compute_sequenceNumber(self.lon) self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) @@ -48,8 +41,6 @@ def SetAdditionalData(self): # ObsError -- UNUSED # ObsError_temp = np.float32(np.ma.masked_array(np.full((len(temp)), 0.24))) - - def createIODAVars(self, obsspace): super().createIODAVars(obsspace) @@ -60,11 +51,9 @@ def createIODAVars(self, obsspace): self.WritePreQC(obsspace, "waterTemperature") self.WriteObsValueT(obsspace, "waterTemperature") - def logObs(self, logger): self.logTemperature(logger) def logAdditionalData(self, logger): self.LogSeqNum(logger) self.LogPreQC(logger) - From 455e9a34929b180b7582ba40f6bd3caeb078f733 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 14:32:49 -0400 Subject: [PATCH 14/54] Update glider_ioda_variables.py --- .../bufr2ioda/marine/b2i/glider_ioda_variables.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py index 57fd06120..6912fc796 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py @@ -8,28 +8,22 @@ class GliderIODAVariables(IODAVariables): def __init__(self): super().__init__() - def BuildQuery(self): q = super().BuildQuery() - q.add('stationID', '*/WMOP') q.add('latitude', '*/CLATH') q.add('longitude', '*/CLONH') q.add('depth', '*/GLPFDATA/WPRES') - # ObsValue q.add('temp', '*/GLPFDATA/SSTH') q.add('saln', '*/GLPFDATA/SALNH') - return q - def SetFromQueryResult(self, r): super().SetFromQueryResult(r) # convert depth in pressure units to meters (rho * g * h) self.depth = np.float32(self.depth.astype(float) * 0.0001) - def filter(self): mask = self.TemperatureFilter() \ & self.SalinityFilter() @@ -66,7 +60,6 @@ def filter(self): self.n_obs = len(mask_gldr) - def SetAdditionalData(self): self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) self.ObsError_temp = \ @@ -74,8 +67,6 @@ def SetAdditionalData(self): self.ObsError_saln = \ np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) - - def createIODAVars(self, obsspace): super().createIODAVars(obsspace) @@ -89,5 +80,3 @@ def createIODAVars(self, obsspace): WriteObsError(obsspace, 'ObsError/salinity', 'psu', self.ObsError_saln) self.WriteObsValueT(obsspace, 'waterTemperature') self.WriteObsValueS(obsspace, 'salinity') - - From c8d6c5ef2b1704e5d5508718c290bf69e755f79f Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 14:36:10 -0400 Subject: [PATCH 15/54] Update marinemammal_ioda_variables.py --- .../marine/b2i/marinemammal_ioda_variables.py | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py index 74bcc4fb5..f9d9c94ca 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py @@ -8,23 +8,17 @@ class MarinemammalIODAVariables(IODAVariables): def __init__(self): super().__init__() - def BuildQuery(self): q = super().BuildQuery() - q.add('stationID', '*/RPID') q.add('latitude', '*/CLAT') q.add('longitude', '*/CLON') q.add('depth', '*/BTOCN/DBSS') - # ObsValue q.add('temp', '*/BTOCN/STMP') q.add('saln', '*/BTOCN/SALN') - return q - - def filter(self): mask = self.TemperatureFilter() \ & self.SalinityFilter() @@ -38,9 +32,6 @@ def filter(self): self.dateTime = self.dateTime[mask] self.rcptdateTime = self.rcptdateTime[mask] - # moved this ... - # self.seqNum = Compute_sequenceNumber(self.lon) - # Separate marine mammals from TESAC tank # Creating the mask for marine mammals from TESAC floats based on station ID @@ -60,17 +51,6 @@ def filter(self): self.dateTime = self.dateTime[indices_true] self.rcptdateTime = self.rcptdateTime[indices_true] - - # def SetAdditionalData(self): - # self.seqNum = Compute_sequenceNumber(self.lon) - # self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) - # self.ObsError_temp = \ - # np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorT))) - # self.ObsError_saln = \ - # np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) - - - def createIODAVars(self, obsspace): super().createIODAVars(obsspace) @@ -86,4 +66,3 @@ def createIODAVars(self, obsspace): self.WriteObsValueT(obsspace, 'waterTemperature') self.WriteObsValueS(obsspace, 'salinity') - From 68366f78074fb3d315274b9d62ba93fd47df0602 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 14:38:46 -0400 Subject: [PATCH 16/54] Update tesac_ioda_variables.py --- .../bufr2ioda/marine/b2i/tesac_ioda_variables.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py index ffe80c9df..6cef13a81 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py @@ -9,23 +9,17 @@ class TesacIODAVariables(IODAVariables): def __init__(self): super().__init__() - def BuildQuery(self): q = super().BuildQuery() - q.add('stationID', '*/RPID') q.add('latitude', '*/CLAT') q.add('longitude', '*/CLON') q.add('depth', '*/BTOCN/DBSS') - # ObsValue q.add('temp', '*/BTOCN/STMP') q.add('saln', '*/BTOCN/SALN') - - return q - def filter(self): mask = self.TemperatureFilter() \ & self.SalinityFilter() @@ -41,10 +35,8 @@ def filter(self): self.seqNum = Compute_sequenceNumber(self.lon) - # Separate TESAC profiles tesac tank # Creating the mask for TESAC floats based on station ID - digit_mask = [item.isdigit() for item in self.stationID] indices_true = [index for index, value in enumerate(digit_mask) if value] @@ -61,7 +53,6 @@ def filter(self): self.n_obs = len(indices_true) - def SetAdditionalData(self): self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) self.ObsError_temp = \ @@ -69,8 +60,6 @@ def SetAdditionalData(self): self.ObsError_saln = \ np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) - - def createIODAVars(self, obsspace): super().createIODAVars(obsspace) @@ -86,4 +75,3 @@ def createIODAVars(self, obsspace): self.WriteObsValueT(obsspace, 'waterTemperature') self.WriteObsValueS(obsspace, 'salinity') - From bbdae7cbbf3b87a78fd53f723aae79dcca4b8fd9 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 14:40:35 -0400 Subject: [PATCH 17/54] Update trkob_ioda_variables.py --- ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py index 54e6ac3ba..c9615906d 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py @@ -9,21 +9,17 @@ class TrkobIODAVariables(IODAVariables): def __init__(self): super().__init__() - def BuildQuery(self): q = super().BuildQuery() q.add('stationID', '*/RPID') q.add('latitude', '*/CLAT') q.add('longitude', '*/CLON') q.add('depth', '*/BTOCN/DBSS') - # ObsValue q.add('temp', '*/BTOCN/STMP') q.add('saln', '*/BTOCN/SALN') - return q - def filter(self): mask = self.TemperatureFilter() \ & self.SalinityFilter() @@ -37,7 +33,6 @@ def filter(self): self.dateTime = self.dateTime[mask] self.rcptdateTime = self.rcptdateTime[mask] - def SetAdditionalData(self): self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) self.ObsError_temp = \ @@ -45,8 +40,6 @@ def SetAdditionalData(self): self.ObsError_saln = \ np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) - - def createIODAVars(self, obsspace): super().createIODAVars(obsspace) @@ -61,7 +54,6 @@ def createIODAVars(self, obsspace): self.WriteObsValueT(obsspace, 'seaSurfaceTemperature') self.WriteObsValueS(obsspace, 'seaSurfaceSalinity') - def logMetadata(self, logger): self.logDates(logger) self.logLonLat(logger) @@ -71,4 +63,3 @@ def logAdditionalData(self, logger): self.LogPreQC(logger) self.LogObsError_temp(logger) self.LogObsError_saln(logger) - From 8487acceac3ca921b0ad16f2a1c9d49481c81a07 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 14:41:41 -0400 Subject: [PATCH 18/54] Update xbtctd_ioda_variables.py --- ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py index 0e4f6a30f..4c666d025 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py @@ -8,22 +8,17 @@ class XbtctdIODAVariables(IODAVariables): def __init__(self): super().__init__() - def BuildQuery(self): q = super().BuildQuery() - q.add('stationID', '*/WMOP') q.add('latitude', '*/CLATH') q.add('longitude', '*/CLONH') q.add('depth', '*/TMSLPFSQ/DBSS') - # ObsValue q.add('temp', '*/TMSLPFSQ/SST1') q.add('saln', '*/TMSLPFSQ/SALNH') - return q - def filter(self): mask = self.TemperatureFilter() \ & self.SalinityFilter() @@ -38,7 +33,6 @@ def filter(self): self.dateTime = self.dateTime[mask] self.rcptdateTime = self.rcptdateTime[mask] - def createIODAVars(self, obsspace): super().createIODAVars(obsspace) @@ -54,4 +48,3 @@ def createIODAVars(self, obsspace): self.WriteObsValueT(obsspace, 'waterTemperature') self.WriteObsValueS(obsspace, 'salinity') - From a37155c8263b4afccf2abc0ab94b31379daeabb3 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 14:59:50 -0400 Subject: [PATCH 19/54] Update bufr2ioda_config.py --- ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py index c6149bed8..4cac466a7 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py @@ -2,8 +2,6 @@ import yaml import os - - class Bufr2iodaConfig: def __init__(self, script_name, config_file, platform_description): self.script_name = script_name @@ -22,7 +20,6 @@ def __init__(self, script_name, config_file, platform_description): else: print("Unknown file extension = ", file_extension) - def ReadConfig(self, config): subsets = config["subsets"] @@ -43,24 +40,18 @@ def ReadConfig(self, config): # General Information self.converter = 'BUFR to IODA Converter' - - def BufrFilename(self): return f"{self.cycle_datetime}-{self.cycle_type}.t{self.hh}z.{self.data_format}.tm00.bufr_d" - def BufrFilepath(self): return os.path.join(self.dump_dir, self.BufrFilename()) - def IODAFilename(self): return f"{self.cycle_type}.t{self.hh}z.insitu_profile_{self.data_format}.{self.cycle_datetime}.nc4" - def IODAFilepath(self): return os.path.join(self.ioda_dir, self.IODAFilename()) - def CreateIODAAttributes(self, obsspace, date_range): obsspace.write_attr('Converter', self.converter) obsspace.write_attr('source', self.source) @@ -69,4 +60,3 @@ def CreateIODAAttributes(self, obsspace, date_range): obsspace.write_attr('description', self.data_description) obsspace.write_attr('datetimeRange', date_range) obsspace.write_attr('platformLongDescription', self.platform_description) - From e158b437d87ba077a4c652d4ced4e13e69cfd5f5 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 15:04:47 -0400 Subject: [PATCH 20/54] Update bufr2ioda_converter.py --- .../marine/b2i/bufr2ioda_converter.py | 29 ------------------- 1 file changed, 29 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_converter.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_converter.py index c07bac0b5..ec511073f 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_converter.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_converter.py @@ -8,7 +8,6 @@ import time import copy from datetime import datetime -# import json from pyiodaconv import bufr from collections import namedtuple from pyioda import ioda_obs_space as ioda_ospace @@ -16,30 +15,19 @@ import warnings # suppress warnings warnings.filterwarnings('ignore') - from util import ParseArguments, run_diff from bufr2ioda_config import Bufr2iodaConfig -# from ioda_variables import IODAVariables import logging import tempfile - - class Bufr2ioda_Converter: def __init__(self, bufr2ioda_config, ioda_vars, logfile): self.bufr2ioda_config = bufr2ioda_config self.ioda_vars = ioda_vars self.logfile = logfile - - # self.logger = Logger( \ - # bufr2ioda_config.script_name, - # level=logfile, \ - # colored_log=True) - self.SetupLogging(bufr2ioda_config.script_name, self.logfile) - def SetupLogging(self, script_name, logfile): self.logger = logging.getLogger(script_name) self.logger.setLevel(logging.DEBUG) @@ -59,14 +47,12 @@ def SetupLogging(self, script_name, logfile): file_formatter = logging.Formatter('%(message)s') self.file_handler.setFormatter(file_formatter) - def run(self): start_time = time.time() self.logger.debug(f"BuildQuery") q = self.ioda_vars.BuildQuery() - bufrfile_path = self.bufr2ioda_config.BufrFilepath() self.logger.debug(f"ExecuteQuery: BUFR file = {bufrfile_path}") with bufr.File(bufrfile_path) as f: @@ -77,7 +63,6 @@ def run(self): self.ioda_vars.filter() - # set seqNum, PreQC, ObsError self.ioda_vars.SetAdditionalData() @@ -96,20 +81,16 @@ def run(self): self.logger.debug(f"createIODAVars") self.ioda_vars.createIODAVars(obsspace) - if (self.logfile): self.logger.addHandler(self.file_handler) self.ioda_vars.log(self.logger) if (self.logfile): self.logger.removeHandler(self.file_handler) - end_time = time.time() running_time = end_time - start_time self.logger.debug(f"Total running time: {running_time} seconds") - - def test(self, test_file): with tempfile.NamedTemporaryFile(delete=False, suffix='.log') as temp_log_file: temp_log_file_name = temp_log_file.name @@ -129,13 +110,3 @@ def test(self, test_file): self.logger.error(f"TEST ERROR: files are different") else: self.logger.info(f"TEST passed: files are identical") - - - - # self.logger.debug(f"TEST: running diff on {self.logfile} and {test_file}") - # result = run_diff(self.logfile, test_file) - # if result: - # self.logger.error(f"TEST ERROR: files are different") - # else: - # self.logger.info(f"TEST passed: files are identical") - From f57bcee33f4432681d86beb9e73db8d0783ca632 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 15:12:08 -0400 Subject: [PATCH 21/54] Update util.py --- ush/ioda/bufr2ioda/marine/b2i/util.py | 63 --------------------------- 1 file changed, 63 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/util.py b/ush/ioda/bufr2ioda/marine/b2i/util.py index 12fc5e838..9731c05c5 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/util.py +++ b/ush/ioda/bufr2ioda/marine/b2i/util.py @@ -4,31 +4,6 @@ import subprocess import numpy as np import tempfile -# import logging -# import colorlog - - -# def get_logger(name, level=logging.DEBUG): - # logger = logging.getLogger(name) - # logger.setLevel(level) -# - # handler = colorlog.StreamHandler() - # handler.setFormatter(colorlog.ColoredFormatter( - # '%(log_color)s%(asctime)s - %(levelname)s - %(message)s', - # log_colors={ - # 'DEBUG': 'cyan', - # 'INFO': 'green', - # 'WARNING': 'yellow', - # 'ERROR': 'red', - # 'CRITICAL': 'red,bg_white', - # }, - # reset=True, - # style='%' - # )) -# - # logger.addHandler(handler) - # return logger - def ParseArguments(): @@ -39,17 +14,11 @@ def ParseArguments(): type=str, help='Output file for testing ioda variables') parser.add_argument('-t', '--test', \ type=str, help='Input test reference file') - # parser.add_argument('-v', '--verbose', \ - # help='Print debug logging information', - # action='store_true') args = parser.parse_args() - - # log_level = 'DEBUG' if args.verbose else 'INFO' config_file = args.config log_file = args.log_file test_file = args.test - script_name = sys.argv[0] return script_name, config_file, log_file, test_file @@ -83,9 +52,6 @@ def run_diff(file1, file2): return result.returncode - - - def run_diff_script_inline(file1, file2, script_content): try: # Create a temporary script file with the provided content @@ -118,35 +84,12 @@ def run_diff_script_inline(file1, file2, script_content): except Exception as e: print(f"Error cleaning up temp script: {e}") - - -# to be deprecated..... -def WriteTestOutputFile(directory_path, file_name, text): - - # Check if the directory exists, create it if it doesn't - if not os.path.exists(directory_path): - os.makedirs(directory_path) - print(f"Directory '{directory_path}' created.") - - file_path = os.path.join(directory_path, file_name) - print(f"File '{file_path}' created.") - - with open(file_path, 'w') as file: - for s in text: - file.write(f"{s}\n") - - return - - - def Compute_sequenceNumber(lon): lon_u, seqNum = np.unique(lon, return_inverse=True) seqNum = seqNum.astype(np.int32) # logger.debug(f"Len of Sequence Number: {len(seqNum)}") return seqNum - - def nc_diff(file1, file2): try: script_content = ''' @@ -189,19 +132,13 @@ def nc_diff(file1, file2): print(f"Error cleaning up temp script: {e}") - - if __name__ == '__main__': - - file1 = '/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/gdas.t06z.insitu_profile_argo.2021063006.nc4' file2 = '/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/backup_gdas.t06z.insitu_profile_argo.2021063006.nc4' # file2 = '/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/gdas.t06z.sst_viirs_npp_l3u.2021063006.nc4' - diff_result = nc_diff(file1, file2) if diff_result == 0: print("identitcal") else: print("different") - From a0f811019f5e42af4870c73f92ffb5b7cc3deb97 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 15:32:14 -0400 Subject: [PATCH 22/54] Update altkob_ioda_variables.py --- ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py index 01ab610bb..14c236ba2 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py @@ -34,7 +34,6 @@ def filter(self): self.temp = self.temp[mask] self.saln = self.saln[mask] - def SetAdditionalData(self): self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) self.ObsError_temp = \ @@ -42,7 +41,6 @@ def SetAdditionalData(self): self.ObsError_saln = \ np.float32(np.ma.masked_array(np.full((self.n_obs), self.ErrorS))) - def createIODAVars(self, obsspace): super().createIODAVars(obsspace) @@ -55,5 +53,5 @@ def createIODAVars(self, obsspace): WriteObsError(obsspace, "ObsError/seaSurfaceTemperature", "degC", self.ObsError_temp) WriteObsError(obsspace, "ObsError/seaSurfaceSalinity", "psu", self.ObsError_saln) - self.WriteObsValueT(obsspace,'waterTemperature') + self.WriteObsValueT(obsspace, 'waterTemperature') self.WriteObsValueS(obsspace, 'salinity') From f7ca21dd68aff998e0f27759cc192d089bd4722e Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 15:36:45 -0400 Subject: [PATCH 23/54] Update util.py --- ush/ioda/bufr2ioda/marine/b2i/util.py | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/util.py b/ush/ioda/bufr2ioda/marine/b2i/util.py index 9731c05c5..ec01cbaca 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/util.py +++ b/ush/ioda/bufr2ioda/marine/b2i/util.py @@ -8,11 +8,11 @@ def ParseArguments(): parser = argparse.ArgumentParser() - parser.add_argument('-c', '--config', \ + parser.add_argument('-c', '--config', type=str, help='Input JSON or YAML configuration', required=True) - parser.add_argument('-l', '--log_file', \ + parser.add_argument('-l', '--log_file', type=str, help='Output file for testing ioda variables') - parser.add_argument('-t', '--test', \ + parser.add_argument('-t', '--test', type=str, help='Input test reference file') args = parser.parse_args() @@ -24,7 +24,6 @@ def ParseArguments(): return script_name, config_file, log_file, test_file - def run_diff(file1, file2): # log this.... # print("running diff on: ") @@ -130,15 +129,3 @@ def nc_diff(file1, file2): os.remove(temp_script.name) except Exception as e: print(f"Error cleaning up temp script: {e}") - - -if __name__ == '__main__': - file1 = '/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/gdas.t06z.insitu_profile_argo.2021063006.nc4' - file2 = '/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/backup_gdas.t06z.insitu_profile_argo.2021063006.nc4' - # file2 = '/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/gdas.t06z.sst_viirs_npp_l3u.2021063006.nc4' - - diff_result = nc_diff(file1, file2) - if diff_result == 0: - print("identitcal") - else: - print("different") From 0ad2baa47af7ccf7ca2e920a64acb24140816cee Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 15:44:34 -0400 Subject: [PATCH 24/54] Update ioda_variables.py --- .../bufr2ioda/marine/b2i/ioda_variables.py | 94 +++++++------------ 1 file changed, 32 insertions(+), 62 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py index 556417371..36c109dec 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py @@ -3,7 +3,6 @@ from util import Compute_sequenceNumber - class IODAVariables: def __init__(self): self.n_obs = 0 @@ -12,7 +11,6 @@ def __init__(self): self.SetTemperatureRange(-10.0, 50.0) self.SetSalinityRange(0.0, 45.0) - def SetTemperatureError(self, e): self.errorT = e @@ -27,10 +25,8 @@ def SetSalinityRange(self, smin, smax): self.Smin = smin self.Smax = smax - def BuildQuery(self): q = bufr.QuerySet() - q.add('year', '*/YEAR') q.add('month', '*/MNTH') q.add('day', '*/DAYS') @@ -41,10 +37,8 @@ def BuildQuery(self): q.add('rday', '*/RCDY') q.add('rhour', '*/RCHR') q.add('rminute', '*/RCMI') - return q - def SetDatesFromQueryResult(self, r): self.dateTime = r.get_datetime('year', 'month', 'day', 'hour', 'minute', group_by='depth') self.dateTime = self.dateTime.astype(np.int64) @@ -61,7 +55,6 @@ def SetObsFromQueryResult(self, r): self.temp -= 273.15 self.saln = r.get('saln', group_by='depth') - def SetFromQueryResult(self, r): self.SetDatesFromQueryResult(r) self.SetLonLatFromQueryResult(r) @@ -69,7 +62,6 @@ def SetFromQueryResult(self, r): self.depth = r.get('depth', group_by='depth') self.SetObsFromQueryResult(r) - def TemperatureFilter(self): return (self.temp > self.Tmin) & (self.temp <= self.Tmax) def SalinityFilter(self): @@ -78,7 +70,6 @@ def SalinityFilter(self): def filter(self): pass - def SetAdditionalData(self): self.seqNum = Compute_sequenceNumber(self.lon) self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) @@ -87,17 +78,12 @@ def SetAdditionalData(self): self.ObsError_saln = \ np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) - - - def createIODAVars(self, obsspace): WriteDateTime(obsspace, self.dateTime) WriteRcptDateTime(obsspace, self.rcptdateTime) WriteLongitude(obsspace, self.lon) WriteLatitude(obsspace, self.lat) - - def WritePreQC(self, obsspace, name): obsspace.create_var("PreQC/" + name, dtype=self.PreQC.dtype, fillval=self.PreQC.fill_value) \ .write_attr('long_name', 'PreQC') \ @@ -127,7 +113,6 @@ def logTemperature(self, logger): def logSalinity(self, logger): logger.debug(f" saln min, max, length, dtype = {self.saln.min()}, {self.saln.max()}, {len(self.saln)}, {self.saln.dtype}") - def logLonLat(self, logger): logger.debug(f" lon min, max, length, dtype = {self.lon.min()}, {self.lon.max()}, {len(self.lon)}, {self.lon.dtype}") logger.debug(f" lat min, max, length, dtype = {self.lat.min()}, {self.lat.max()}, {len(self.lat)}, {self.lat.dtype}") @@ -136,7 +121,6 @@ def logDates(self, logger): logger.debug(f" dateTime shape, dtype = {self.dateTime.shape}, {self.dateTime.dtype}") logger.debug(f" rcptdateTime shape, dytpe = {self.rcptdateTime.shape}, {self.rcptdateTime.dtype}") - def logStationID(self, logger): logger.debug(f" stationID shape, dtype = {self.stationID.shape}, {self.stationID.astype(str).dtype}") @@ -155,7 +139,6 @@ def LogObsError_temp(self, logger): def LogObsError_saln(self, logger): logger.debug(f" ObsError_saln min, max, length, dtype = {self.ObsError_saln.min()}, {self.ObsError_saln.max()}, {len(self.ObsError_saln)}, {self.ObsError_saln.dtype}") - def logMetadata(self, logger): self.logDates(logger) self.logLonLat(logger) @@ -177,73 +160,60 @@ def log(self, logger): self.logObs(logger) self.logAdditionalData(logger) - - - ##################################################################### - - def WriteDateTime(obsspace, dateTime): - obsspace.create_var('MetaData/dateTime', \ - dtype=dateTime.dtype, fillval=dateTime.fill_value) \ - .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ - .write_attr('long_name', 'Datetime') \ + obsspace.create_var('MetaData/dateTime', + dtype=dateTime.dtype, fillval=dateTime.fill_value) + .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') + .write_attr('long_name', 'Datetime') .write_data(dateTime) def WriteRcptDateTime(obsspace, rcptdateTime): - obsspace.create_var('MetaData/rcptdateTime', \ - dtype=rcptdateTime.dtype, fillval=rcptdateTime.fill_value) \ - .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ - .write_attr('long_name', 'receipt Datetime') \ + obsspace.create_var('MetaData/rcptdateTime', + dtype=rcptdateTime.dtype, fillval=rcptdateTime.fill_value) + .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') + .write_attr('long_name', 'receipt Datetime') .write_data(rcptdateTime) - def WriteLongitude(obsspace, lon): - obsspace.create_var('MetaData/longitude', \ - dtype=lon.dtype, fillval=lon.fill_value) \ - .write_attr('units', 'degrees_east') \ - .write_attr('valid_range', np.array([-180, 180], dtype=np.float32)) \ - .write_attr('long_name', 'Longitude') \ + obsspace.create_var('MetaData/longitude', + dtype=lon.dtype, fillval=lon.fill_value) + .write_attr('units', 'degrees_east') + .write_attr('valid_range', np.array([-180, 180], dtype=np.float32)) + .write_attr('long_name', 'Longitude') .write_data(lon) def WriteLatitude(obsspace, lat): - obsspace.create_var('MetaData/latitude', \ - dtype=lat.dtype, fillval=lat.fill_value) \ - .write_attr('units', 'degrees_north') \ - .write_attr('valid_range', np.array([-90, 90], dtype=np.float32)) \ - .write_attr('long_name', 'Latitude') \ + obsspace.create_var('MetaData/latitude', + dtype=lat.dtype, fillval=lat.fill_value) + .write_attr('units', 'degrees_north') + .write_attr('valid_range', np.array([-90, 90], dtype=np.float32)) + .write_attr('long_name', 'Latitude') .write_data(lat) - def WriteStationID(obsspace, stationID): - obsspace.create_var('MetaData/stationID', \ - dtype=stationID.dtype, fillval=stationID.fill_value) \ - .write_attr('long_name', 'Station Identification') \ + obsspace.create_var('MetaData/stationID', + dtype=stationID.dtype, fillval=stationID.fill_value) + .write_attr('long_name', 'Station Identification') .write_data(stationID) def WriteDepth(obsspace, depth): - obsspace.create_var('MetaData/depth', \ - dtype=depth.dtype, fillval=depth.fill_value) \ - .write_attr('units', 'm') \ - .write_attr('long_name', 'Water depth') \ + obsspace.create_var('MetaData/depth', + dtype=depth.dtype, fillval=depth.fill_value) + .write_attr('units', 'm') + .write_attr('long_name', 'Water depth') .write_data(depth) - def WriteSequenceNumber(obsspace, seqNum, PreQC): - obsspace.create_var('MetaData/sequenceNumber', \ - dtype=PreQC.dtype, fillval=PreQC.fill_value) \ - .write_attr('long_name', 'Sequence Number') \ + obsspace.create_var('MetaData/sequenceNumber', + dtype=PreQC.dtype, fillval=PreQC.fill_value) + .write_attr('long_name', 'Sequence Number') .write_data(seqNum) - - def WriteObsError(obsspace, v_name, units, v): - obsspace.create_var(v_name, \ - dtype=v.dtype, fillval=v.fill_value) \ - .write_attr('units', units) \ - .write_attr('long_name', 'ObsError') \ + obsspace.create_var(v_name, + dtype=v.dtype, fillval=v.fill_value) + .write_attr('units', units) + .write_attr('long_name', 'ObsError') .write_data(v) - - -################################################################## From 927fd52d511e56f33f40d687c7072bfa269fd5ae Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 15:51:59 -0400 Subject: [PATCH 25/54] Update bufr2ioda_config.py --- ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py index 4cac466a7..272c5145a 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py @@ -2,6 +2,7 @@ import yaml import os + class Bufr2iodaConfig: def __init__(self, script_name, config_file, platform_description): self.script_name = script_name @@ -18,7 +19,7 @@ def __init__(self, script_name, config_file, platform_description): config = yaml.safe_load(file) self.ReadConfig(config) else: - print("Unknown file extension = ", file_extension) + print("Unknown file extension = ", file_extension) def ReadConfig(self, config): subsets = config["subsets"] From 7f13f693e4229e680838d55c2e869ed4500f5431 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 16:00:06 -0400 Subject: [PATCH 26/54] Update util.py --- ush/ioda/bufr2ioda/marine/b2i/util.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/util.py b/ush/ioda/bufr2ioda/marine/b2i/util.py index ec01cbaca..5f40c549f 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/util.py +++ b/ush/ioda/bufr2ioda/marine/b2i/util.py @@ -8,22 +8,29 @@ def ParseArguments(): parser = argparse.ArgumentParser() - parser.add_argument('-c', '--config', - type=str, help='Input JSON or YAML configuration', required=True) - parser.add_argument('-l', '--log_file', - type=str, help='Output file for testing ioda variables') - parser.add_argument('-t', '--test', - type=str, help='Input test reference file') + parser.add_argument( + '-c', '--config', + type=str, + help='Input JSON or YAML configuration', required=True + ) + parser.add_argument( + '-l', '--log_file', + type=str, + help='Output file for testing ioda variables' + ) + parser.add_argument( + '-t', '--test', + type=str, + help='Input test reference file' + ) args = parser.parse_args() config_file = args.config log_file = args.log_file test_file = args.test script_name = sys.argv[0] - return script_name, config_file, log_file, test_file - def run_diff(file1, file2): # log this.... # print("running diff on: ") From 24c029feebba217068735b3d1ec014abce9a9d7f Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 16:10:10 -0400 Subject: [PATCH 27/54] Update util.py --- ush/ioda/bufr2ioda/marine/b2i/util.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/util.py b/ush/ioda/bufr2ioda/marine/b2i/util.py index 5f40c549f..36273c0aa 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/util.py +++ b/ush/ioda/bufr2ioda/marine/b2i/util.py @@ -10,17 +10,17 @@ def ParseArguments(): parser = argparse.ArgumentParser() parser.add_argument( '-c', '--config', - type=str, + type=str, help='Input JSON or YAML configuration', required=True ) parser.add_argument( '-l', '--log_file', - type=str, + type=str, help='Output file for testing ioda variables' ) parser.add_argument( '-t', '--test', - type=str, + type=str, help='Input test reference file' ) @@ -31,6 +31,7 @@ def ParseArguments(): script_name = sys.argv[0] return script_name, config_file, log_file, test_file + def run_diff(file1, file2): # log this.... # print("running diff on: ") @@ -39,8 +40,10 @@ def run_diff(file1, file2): try: # Run the diff command - result = subprocess.run(['diff', file1, file2], \ - capture_output=True, text=True, check=False) + result = subprocess.run( + ['diff', file1, file2], + capture_output=True, text=True, check=False + ) # Check if diff command succeeded (return code 0) if result.returncode == 0: @@ -52,12 +55,13 @@ def run_diff(file1, file2): else: print("Error occurred while running diff command.") print(result.stderr) - + except subprocess.CalledProcessError as e: print(f"Error occurred: {e}") return result.returncode + def run_diff_script_inline(file1, file2, script_content): try: # Create a temporary script file with the provided content @@ -90,12 +94,14 @@ def run_diff_script_inline(file1, file2, script_content): except Exception as e: print(f"Error cleaning up temp script: {e}") + def Compute_sequenceNumber(lon): lon_u, seqNum = np.unique(lon, return_inverse=True) seqNum = seqNum.astype(np.int32) # logger.debug(f"Len of Sequence Number: {len(seqNum)}") return seqNum + def nc_diff(file1, file2): try: script_content = ''' @@ -116,10 +122,6 @@ def nc_diff(file1, file2): # result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, text=True) result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - # Check the return code of the subprocess - # if result.returncode != 0: - # print(f"Script exited with non-zero status: {result.returncode}") - # return result.returncode return result.returncode # return result.stdout From 62f714503f9c783e2111e8b5fbe8fe04d5676141 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 16:22:54 -0400 Subject: [PATCH 28/54] Update ioda_variables.py --- .../bufr2ioda/marine/b2i/ioda_variables.py | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py index 36c109dec..bc384be43 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py @@ -131,13 +131,25 @@ def LogSeqNum(self, logger): logger.debug(f" sequence Num shape, dtype = {self.seqNum.shape}, {self.seqNum.dtype}") def LogPreQC(self, logger): - logger.debug(f" PreQC min, max, length, dtype = {self.PreQC.min()}, {self.PreQC.max()}, {len(self.PreQC)}, {self.PreQC.dtype}") + logger.debug(f" PreQC min, max, length, dtype = \ + {self.PreQC.min()}, \ + {self.PreQC.max()}, \ + {len(self.PreQC)}, \ + {self.PreQC.dtype}") def LogObsError_temp(self, logger): - logger.debug(f" ObsError_temp min, max, length, dtype = {self.ObsError_temp.min()}, {self.ObsError_temp.max()}, {len(self.ObsError_temp)}, {self.ObsError_temp.dtype}") + logger.debug(f" ObsError_temp min, max, length, dtype = \ + {self.ObsError_temp.min()}, \ + {self.ObsError_temp.max()}, \ + {len(self.ObsError_temp)}, \ + {self.ObsError_temp.dtype}") def LogObsError_saln(self, logger): - logger.debug(f" ObsError_saln min, max, length, dtype = {self.ObsError_saln.min()}, {self.ObsError_saln.max()}, {len(self.ObsError_saln)}, {self.ObsError_saln.dtype}") + logger.debug(f" ObsError_saln min, max, length, dtype = \ + {self.ObsError_saln.min()}, \ + {self.ObsError_saln.max()}, \ + {len(self.ObsError_saln)}, \ + {self.ObsError_saln.dtype}") def logMetadata(self, logger): self.logDates(logger) @@ -212,8 +224,10 @@ def WriteSequenceNumber(obsspace, seqNum, PreQC): .write_data(seqNum) def WriteObsError(obsspace, v_name, units, v): - obsspace.create_var(v_name, - dtype=v.dtype, fillval=v.fill_value) - .write_attr('units', units) - .write_attr('long_name', 'ObsError') - .write_data(v) + obsspace.create_var( + v_name, + dtype=v.dtype, fillval=v.fill_value + ) \ + .write_attr('units', units) \ + .write_attr('long_name', 'ObsError') \ + .write_data(v) From 0ff9e9b7e4aeeb7c75386e35ab604a40383ad9dc Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 16:29:34 -0400 Subject: [PATCH 29/54] Update trkob_ioda_variables.py --- ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py index c9615906d..3573fc5e8 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py @@ -48,8 +48,8 @@ def createIODAVars(self, obsspace): self.WritePreQC(obsspace, "seaSurfaceTemperature") self.WritePreQC(obsspace, "seaSurfaceSalinity") - WriteObsError(obsspace, "ObsError/seaSurfaceTemperature", "degC", self.ObsError_temp) - WriteObsError(obsspace, "ObsError/seaSurfaceSalinity", "psu", self.ObsError_saln) + WriteObsError(obsspace, "ObsError/seaSurfaceTemperature", "degC", self.ObsError_temp) + WriteObsError(obsspace, "ObsError/seaSurfaceSalinity", "psu", self.ObsError_saln) self.WriteObsValueT(obsspace, 'seaSurfaceTemperature') self.WriteObsValueS(obsspace, 'seaSurfaceSalinity') From 8956f7aac8aaa8a2bbfd8c30c0610cf4a4d2c09b Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 16:35:36 -0400 Subject: [PATCH 30/54] Update ioda_variables.py --- ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py index bc384be43..006fc76a9 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py @@ -228,6 +228,6 @@ def WriteObsError(obsspace, v_name, units, v): v_name, dtype=v.dtype, fillval=v.fill_value ) \ - .write_attr('units', units) \ - .write_attr('long_name', 'ObsError') \ - .write_data(v) + .write_attr('units', units) \ + .write_attr('long_name', 'ObsError') \ + .write_data(v) From d8842197c89ebc481c9beeae5b37c1bf26c2b70f Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 16:48:35 -0400 Subject: [PATCH 31/54] Update ioda_variables.py --- .../bufr2ioda/marine/b2i/ioda_variables.py | 81 ++++++++++++------- 1 file changed, 52 insertions(+), 29 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py index 006fc76a9..c9c8e7f60 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py @@ -175,54 +175,77 @@ def log(self, logger): ##################################################################### def WriteDateTime(obsspace, dateTime): - obsspace.create_var('MetaData/dateTime', - dtype=dateTime.dtype, fillval=dateTime.fill_value) - .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') - .write_attr('long_name', 'Datetime') + obsspace.create_var( + 'MetaData/dateTime', + dtype=dateTime.dtype, fillval=dateTime.fill_value + ) \ + .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ + .write_attr('long_name', 'Datetime') \ .write_data(dateTime) + def WriteRcptDateTime(obsspace, rcptdateTime): - obsspace.create_var('MetaData/rcptdateTime', - dtype=rcptdateTime.dtype, fillval=rcptdateTime.fill_value) - .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') - .write_attr('long_name', 'receipt Datetime') + obsspace.create_var( + 'MetaData/rcptdateTime', + dtype=rcptdateTime.dtype, fillval=rcptdateTime.fill_value + ) \ + .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ + .write_attr('long_name', 'receipt Datetime') \ .write_data(rcptdateTime) + def WriteLongitude(obsspace, lon): - obsspace.create_var('MetaData/longitude', - dtype=lon.dtype, fillval=lon.fill_value) - .write_attr('units', 'degrees_east') - .write_attr('valid_range', np.array([-180, 180], dtype=np.float32)) - .write_attr('long_name', 'Longitude') + obsspace.create_var( + 'MetaData/longitude', + dtype=lon.dtype, fillval=lon.fill_value + ) \ + .write_attr('units', 'degrees_east') \ + .write_attr('valid_range', np.array([-180, 180], dtype=np.float32)) \ + .write_attr('long_name', 'Longitude') \ .write_data(lon) + def WriteLatitude(obsspace, lat): - obsspace.create_var('MetaData/latitude', - dtype=lat.dtype, fillval=lat.fill_value) - .write_attr('units', 'degrees_north') - .write_attr('valid_range', np.array([-90, 90], dtype=np.float32)) - .write_attr('long_name', 'Latitude') + obsspace.create_var( + 'MetaData/latitude', + dtype=lat.dtype, fillval=lat.fill_value + ) \ + .write_attr('units', 'degrees_north') \ + .write_attr('valid_range', np.array([-90, 90], dtype=np.float32)) \ + .write_attr('long_name', 'Latitude') \ .write_data(lat) + def WriteStationID(obsspace, stationID): - obsspace.create_var('MetaData/stationID', - dtype=stationID.dtype, fillval=stationID.fill_value) - .write_attr('long_name', 'Station Identification') + obsspace.create_var( + 'MetaData/stationID', + dtype=stationID.dtype, fillval=stationID.fill_value + ) \ + .write_attr('long_name', 'Station Identification') \ .write_data(stationID) + def WriteDepth(obsspace, depth): - obsspace.create_var('MetaData/depth', - dtype=depth.dtype, fillval=depth.fill_value) - .write_attr('units', 'm') - .write_attr('long_name', 'Water depth') - .write_data(depth) + obsspace.create_var( + 'MetaData/depth', + dtype=depth.dtype, + fillval=depth.fill_value + ) \ + .write_attr('units', 'm') \ + .write_attr('long_name', 'Water depth') \ + .write_data(depth) + def WriteSequenceNumber(obsspace, seqNum, PreQC): - obsspace.create_var('MetaData/sequenceNumber', - dtype=PreQC.dtype, fillval=PreQC.fill_value) - .write_attr('long_name', 'Sequence Number') + obsspace.create_var( + 'MetaData/sequenceNumber', + dtype=PreQC.dtype, + fillval=PreQC.fill_value + ) \ + .write_attr('long_name', 'Sequence Number') \ .write_data(seqNum) + def WriteObsError(obsspace, v_name, units, v): obsspace.create_var( v_name, From bcc068cca47bddd496de2e94c67c1427a2bfa8fa Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 16:56:12 -0400 Subject: [PATCH 32/54] Update ioda_variables.py --- ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py index c9c8e7f60..03dbf3647 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py @@ -100,7 +100,7 @@ def WriteObsValueT(self, obsspace, v_name): def WriteObsValueS(self, obsspace, v_name): obsspace.create_var('ObsValue/' + v_name, dtype=self.saln.dtype, fillval=self.saln.fill_value) \ .write_attr('units', 'psu') \ - .write_attr('valid_range', \ + .write_attr('valid_range', np.array([self.Smin, self.Smax], dtype=np.float32)) \ .write_attr('long_name', v_name) \ .write_data(self.saln) @@ -174,6 +174,7 @@ def log(self, logger): ##################################################################### + def WriteDateTime(obsspace, dateTime): obsspace.create_var( 'MetaData/dateTime', @@ -231,9 +232,9 @@ def WriteDepth(obsspace, depth): dtype=depth.dtype, fillval=depth.fill_value ) \ - .write_attr('units', 'm') \ - .write_attr('long_name', 'Water depth') \ - .write_data(depth) + .write_attr('units', 'm') \ + .write_attr('long_name', 'Water depth') \ + .write_data(depth) def WriteSequenceNumber(obsspace, seqNum, PreQC): From c5b625fe4c16a3f0ed25df1edfa8f214a236b4b3 Mon Sep 17 00:00:00 2001 From: Ed Givelberg Date: Tue, 6 Aug 2024 17:05:11 -0400 Subject: [PATCH 33/54] Update ioda_variables.py --- ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py index 03dbf3647..6cf4dd86c 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py @@ -64,6 +64,7 @@ def SetFromQueryResult(self, r): def TemperatureFilter(self): return (self.temp > self.Tmin) & (self.temp <= self.Tmax) + def SalinityFilter(self): return (self.saln >= self.Smin) & (self.saln <= self.Smax) @@ -92,18 +93,18 @@ def WritePreQC(self, obsspace, name): def WriteObsValueT(self, obsspace, v_name): obsspace.create_var('ObsValue/' + v_name, dtype=self.temp.dtype, fillval=self.temp.fill_value) \ .write_attr('units', 'degC') \ - .write_attr('valid_range', \ - np.array([self.Tmin, self.Tmax], dtype=np.float32)) \ + .write_attr('valid_range', np.array([self.Tmin, self.Tmax], dtype=np.float32)) \ .write_attr('long_name', v_name) \ .write_data(self.temp) def WriteObsValueS(self, obsspace, v_name): - obsspace.create_var('ObsValue/' + v_name, dtype=self.saln.dtype, fillval=self.saln.fill_value) \ - .write_attr('units', 'psu') \ - .write_attr('valid_range', - np.array([self.Smin, self.Smax], dtype=np.float32)) \ - .write_attr('long_name', v_name) \ - .write_data(self.saln) + obsspace.create_var('ObsValue/' + v_name, dtype=self.saln.dtype, + fillval=self.saln.fill_value + ) + .write_attr('units', 'psu') \ + .write_attr('valid_range', np.array([self.Smin, self.Smax], dtype=np.float32)) \ + .write_attr('long_name', v_name) \ + .write_data(self.saln) ############################################################################## From 3df30b599805535325d71112f5aa0131f277e6c2 Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Thu, 8 Aug 2024 14:27:06 +0000 Subject: [PATCH 34/54] fixed style issues, removed ocean.py --- .../marine/b2i/bufr2ioda_converter.py | 2 + .../bufr2ioda/marine/b2i/ioda_variables.py | 16 +- ush/ioda/bufr2ioda/marine/b2i/ocean.py | 380 ------------------ 3 files changed, 11 insertions(+), 387 deletions(-) delete mode 100755 ush/ioda/bufr2ioda/marine/b2i/ocean.py diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_converter.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_converter.py index ec511073f..5a455b4ab 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_converter.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_converter.py @@ -110,3 +110,5 @@ def test(self, test_file): self.logger.error(f"TEST ERROR: files are different") else: self.logger.info(f"TEST passed: files are identical") + + return result diff --git a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py index 6cf4dd86c..c11a77569 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py @@ -98,13 +98,15 @@ def WriteObsValueT(self, obsspace, v_name): .write_data(self.temp) def WriteObsValueS(self, obsspace, v_name): - obsspace.create_var('ObsValue/' + v_name, dtype=self.saln.dtype, - fillval=self.saln.fill_value - ) - .write_attr('units', 'psu') \ - .write_attr('valid_range', np.array([self.Smin, self.Smax], dtype=np.float32)) \ - .write_attr('long_name', v_name) \ - .write_data(self.saln) + obsspace.create_var( + 'ObsValue/' + v_name, + dtype=self.saln.dtype, + fillval=self.saln.fill_value + ) \ + .write_attr('units', 'psu') \ + .write_attr('valid_range', np.array([self.Smin, self.Smax], dtype=np.float32)) \ + .write_attr('long_name', v_name) \ + .write_data(self.saln) ############################################################################## diff --git a/ush/ioda/bufr2ioda/marine/b2i/ocean.py b/ush/ioda/bufr2ioda/marine/b2i/ocean.py deleted file mode 100755 index b981762c8..000000000 --- a/ush/ioda/bufr2ioda/marine/b2i/ocean.py +++ /dev/null @@ -1,380 +0,0 @@ -#!/usr/bin/env python3 - -# import sys -import numpy as np -import numpy.ma as ma -# import os -# import argparse -import math -# import calendar -# import time -# import copy -# from datetime import datetime -# import json -# from pyiodaconv import bufr -# from collections import namedtuple -# from pyioda import ioda_obs_space as ioda_ospace -# from wxflow import Logger -# import warnings -# # suppress warnings -# warnings.filterwarnings('ignore') -# import subprocess -import matplotlib.pyplot as plt -import cartopy.crs as ccrs -import cartopy.feature as cfeature -import netCDF4 as nc -import xarray as xr - - - -ocean_basin_nc_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" - -ocean_basin_filename = "ocean_basin180x360" -n1 = 180 -n2 = 360 - -lat = [-89.5, -88.5, -87.5, -86.5, -85.5, -84.5, -83.5, -82.5, -81.5, -80.5, - -79.5, -78.5, -77.5, -76.5, -75.5, -74.5, -73.5, -72.5, -71.5, -70.5, - -69.5, -68.5, -67.5, -66.5, -65.5, -64.5, -63.5, -62.5, -61.5, -60.5, - -59.5, -58.5, -57.5, -56.5, -55.5, -54.5, -53.5, -52.5, -51.5, -50.5, - -49.5, -48.5, -47.5, -46.5, -45.5, -44.5, -43.5, -42.5, -41.5, -40.5, - -39.5, -38.5, -37.5, -36.5, -35.5, -34.5, -33.5, -32.5, -31.5, -30.5, - -29.5, -28.5, -27.5, -26.5, -25.5, -24.5, -23.5, -22.5, -21.5, -20.5, - -19.5, -18.5, -17.5, -16.5, -15.5, -14.5, -13.5, -12.5, -11.5, -10.5, - -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, - 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, - 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, - 27.5, 28.5, 29.5, 30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, 37.5, 38.5, - 39.5, 40.5, 41.5, 42.5, 43.5, 44.5, 45.5, 46.5, 47.5, 48.5, 49.5, 50.5, - 51.5, 52.5, 53.5, 54.5, 55.5, 56.5, 57.5, 58.5, 59.5, 60.5, 61.5, 62.5, - 63.5, 64.5, 65.5, 66.5, 67.5, 68.5, 69.5, 70.5, 71.5, 72.5, 73.5, 74.5, - 75.5, 76.5, 77.5, 78.5, 79.5, 80.5, 81.5, 82.5, 83.5, 84.5, 85.5, 86.5, - 87.5, 88.5, 89.5 ] - -lon = [ 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, - 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, 24.5, - 25.5, 26.5, 27.5, 28.5, 29.5, 30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, - 37.5, 38.5, 39.5, 40.5, 41.5, 42.5, 43.5, 44.5, 45.5, 46.5, 47.5, 48.5, - 49.5, 50.5, 51.5, 52.5, 53.5, 54.5, 55.5, 56.5, 57.5, 58.5, 59.5, 60.5, - 61.5, 62.5, 63.5, 64.5, 65.5, 66.5, 67.5, 68.5, 69.5, 70.5, 71.5, 72.5, - 73.5, 74.5, 75.5, 76.5, 77.5, 78.5, 79.5, 80.5, 81.5, 82.5, 83.5, 84.5, - 85.5, 86.5, 87.5, 88.5, 89.5, 90.5, 91.5, 92.5, 93.5, 94.5, 95.5, 96.5, - 97.5, 98.5, 99.5, 100.5, 101.5, 102.5, 103.5, 104.5, 105.5, 106.5, 107.5, - 108.5, 109.5, 110.5, 111.5, 112.5, 113.5, 114.5, 115.5, 116.5, 117.5, - 118.5, 119.5, 120.5, 121.5, 122.5, 123.5, 124.5, 125.5, 126.5, 127.5, - 128.5, 129.5, 130.5, 131.5, 132.5, 133.5, 134.5, 135.5, 136.5, 137.5, - 138.5, 139.5, 140.5, 141.5, 142.5, 143.5, 144.5, 145.5, 146.5, 147.5, - 148.5, 149.5, 150.5, 151.5, 152.5, 153.5, 154.5, 155.5, 156.5, 157.5, - 158.5, 159.5, 160.5, 161.5, 162.5, 163.5, 164.5, 165.5, 166.5, 167.5, - 168.5, 169.5, 170.5, 171.5, 172.5, 173.5, 174.5, 175.5, 176.5, 177.5, - 178.5, 179.5, 180.5, 181.5, 182.5, 183.5, 184.5, 185.5, 186.5, 187.5, - 188.5, 189.5, 190.5, 191.5, 192.5, 193.5, 194.5, 195.5, 196.5, 197.5, - 198.5, 199.5, 200.5, 201.5, 202.5, 203.5, 204.5, 205.5, 206.5, 207.5, - 208.5, 209.5, 210.5, 211.5, 212.5, 213.5, 214.5, 215.5, 216.5, 217.5, - 218.5, 219.5, 220.5, 221.5, 222.5, 223.5, 224.5, 225.5, 226.5, 227.5, - 228.5, 229.5, 230.5, 231.5, 232.5, 233.5, 234.5, 235.5, 236.5, 237.5, - 238.5, 239.5, 240.5, 241.5, 242.5, 243.5, 244.5, 245.5, 246.5, 247.5, - 248.5, 249.5, 250.5, 251.5, 252.5, 253.5, 254.5, 255.5, 256.5, 257.5, - 258.5, 259.5, 260.5, 261.5, 262.5, 263.5, 264.5, 265.5, 266.5, 267.5, - 268.5, 269.5, 270.5, 271.5, 272.5, 273.5, 274.5, 275.5, 276.5, 277.5, - 278.5, 279.5, 280.5, 281.5, 282.5, 283.5, 284.5, 285.5, 286.5, 287.5, - 288.5, 289.5, 290.5, 291.5, 292.5, 293.5, 294.5, 295.5, 296.5, 297.5, - 298.5, 299.5, 300.5, 301.5, 302.5, 303.5, 304.5, 305.5, 306.5, 307.5, - 308.5, 309.5, 310.5, 311.5, 312.5, 313.5, 314.5, 315.5, 316.5, 317.5, - 318.5, 319.5, 320.5, 321.5, 322.5, 323.5, 324.5, 325.5, 326.5, 327.5, - 328.5, 329.5, 330.5, 331.5, 332.5, 333.5, 334.5, 335.5, 336.5, 337.5, - 338.5, 339.5, 340.5, 341.5, 342.5, 343.5, 344.5, 345.5, 346.5, 347.5, - 348.5, 349.5, 350.5, 351.5, 352.5, 353.5, 354.5, 355.5, 356.5, 357.5, - 358.5, 359.5 ] - - -class OceanBasin: - # def __init__(self, filename): - def __init__(self): - self.__latitudes = lat - self.__longitudes = lon - self.__basin_array = None - # if filename: - # self.__basin_array = self.read_from_file(filename) - - - - def read_basin_from_file(self, filename): - integers_list = [] - with open(filename, 'r') as file: - for line in file: - # Convert each line to an integer and append to the list - integers_list.append(int(line.strip())) - - array_1d = np.array(integers_list) - try: - self.__basin_array = np.reshape(array_1d, (n1, n2)) - except ValueError: - print(f"Cannot reshape the array of size {len(integers_list)} into ({n1}, {n2})") - - - - def print_basin(self): - for i in range(n1): - for j in range(n2): - print(i, j, self.__basin_array[i][j]) - - - - def read_nc_file(self, filename): - print("reading the ocean basin data from ", filename) - variable_name = 'open_ocean' - - with nc.Dataset(filename, 'r') as nc_file: - if variable_name in nc_file.variables: - variable = nc_file.variables[variable_name] - - lon_dim = nc_file.dimensions['lon'].size - lat_dim = nc_file.dimensions['lat'].size - print("ocean basin dimensions ", lon_dim, lat_dim) - - # Read the variable data into a numpy array - variable_data = variable[:] - - # Convert to 2D numpy array (lon x lat) - self.__basin_array = np.reshape(variable_data, (lat_dim, lon_dim)) - - print(f'basin array array shape: {self.__basin_array.shape}') - # print(f'Variable "{self.__basin_array}" shape: {self.__basin_array.shape}') - # print(self.__basin_array) - - # print("DONE reading the ocean basin data from ", filename) - - - - - def plot_basin(self): - # Create a figure and axes with Cartopy projection - fig = plt.figure(figsize=(10, 6)) - ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) - - # Plot the ocean basins using a colormap with 6 colors - # cmap = plt.cm.get_cmap('rainbow', 6) # Choose a colormap with 6 colors - cmap = plt.get_cmap('viridis', 6) # Create a colormap with 6 discrete colors - im = ax.pcolormesh(self.__longitudes, self.__latitudes, self.__basin_array, cmap='viridis', shading='auto', transform=ccrs.PlateCarree()) - - # Add colorbar - cbar = fig.colorbar(im, ax=ax, orientation='vertical', pad=0.05, ticks=np.arange(0, 6)) - cbar.set_label('Ocean Basin', fontsize=12) - - # Add title and gridlines - ax.set_title('Ocean Basin Map', fontsize=16) - ax.coastlines() - ax.gridlines(draw_labels=True) - - # Show the plot - plt.show() - plt.savefig('ocean_basin.png', dpi=300) - - - - # input: 2 vectors of station coordinates - # output: a vector of station ocean basin values - def get_station_basin(self, lat, lon): - n = len(lon) - - lat0 = self.__latitudes[0] - dlat = self.__latitudes[1] - self.__latitudes[0] - lon0 = self.__longitudes[0] - dlon = self.__longitudes[1] - self.__longitudes[0] - # print("MMMMMMMMMMMMMuuuuuuuuuuuuuuuuuuuuuu") - # print("MMMMMMMMMMMMM", lon0, lat0) - # print("MMMMMMMMMMMMM", dlon, dlat) - # print("MMMMMMMMMMMMMuuuuuuuuuuuuuuuuuuuuuu") - - # the data may be a masked array - ocean_basin = [] - for i in range(n): - if not ma.is_masked(lat[i]): - i1 = round((lat[i] - lat0) / dlat) - i2 = round((lon[i] - lon0) / dlon) - ocean_basin.append(self.__basin_array[i1][i2]) - - # if (i == 0): - # print("MMMMMMMMMMMMM", lon[i], lat[i]) - # print("MMMMMMMMMMMMM", i1, i2) - # print("MMMMMMMMMMMMM", self.__basin_array[i1][i2]) - - return ocean_basin - - - - def print_station_basins(self, lon, lat): - ocean_basin = self.get_station_basin(lat, lon) - file_path = "/scratch1/NCEPDEV/da/Edward.Givelberg/workflow06112024/global-workflow/sorc/gdas.cd/ush/ioda/bufr2ioda/marine/argo.txt" - # print("print_station_basins to ===============>") - # print(file_path) - with open(file_path, 'w') as file: - # Iterate over lon, lat, and ocean_basin arrays simultaneously - for lat_val, lon_val, basin_val in zip(lat, lon, ocean_basin): - file.write(f"{lat_val} {lon_val} {basin_val}\n") - - - - - def plot_stations(self, lon, lat): - ocean_basin = self.get_station_basin(lon, lat) - - # Initialize the plot - plt.figure(figsize=(12, 8)) - - # Create a Cartopy map with PlateCarree projection (latitude/longitude) - ax = plt.axes(projection=ccrs.PlateCarree()) - - # Add coastlines and borders - ax.coastlines() - ax.add_feature(cartopy.feature.BORDERS, linestyle=':', linewidth=0.5) - - # Scatter plot with colored dots for each basin type - colors = ['blue', 'green', 'red', 'cyan', 'magenta', 'yellow'] - for basin_type in range(6): - indices = np.where(ocean_basin == basin_type)[0] - ax.scatter(lon[indices], lat[indices], color=colors[basin_type], label=f'Basin {basin_type}', alpha=0.7) - - # Add a legend - plt.legend(loc='lower left') - - # Add title and show plot - plt.title('Ocean Basins Plot using Cartopy') - plt.savefig('/scratch1/NCEPDEV/da/Edward.Givelberg/workflow06112024/global-workflow/sorc/gdas.cd/ush/ioda/bufr2ioda/marine/argo.png', dpi=300) - - - - def copy2_nc4_file(self, input_file, output_file): - - filename = "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/gdas.t06z.insitu_profile_argo.2021063006.nc4" - filename_w_ocean = filename + "_w_basin" - filename_w_ocean = "/scratch1/NCEPDEV/da/Edward.Givelberg/workflow06112024/global-workflow/sorc/gdas.cd/ush/ioda/bufr2ioda/marine/jocean.nc4" - print("add_basin_to_nc_file: .............") - print("FILE = ", filename) - input_file = filename - output_file = filename_w_ocean - - # open your dataset - ds = xr.open_dataset(filename) - - # change an existing variable - # ds.your_var += 20 - - # add a new variable - # ds['new_var'] = xr.DataArray([1, 2, 3, 4], dims=('new_dim', )) - - # write to a new file - ds.to_netcdf(filename_w_ocean) - - - - def copy_nc4_file(self, input_file, output_file): - - filename = "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/gdas.t06z.insitu_profile_argo.2021063006.nc4" - filename_w_ocean = filename + "_w_basin" - filename_w_ocean = "/scratch1/NCEPDEV/da/Edward.Givelberg/workflow06112024/global-workflow/sorc/gdas.cd/ush/ioda/bufr2ioda/marine/jocean.nc4" - print("add_basin_to_nc_file: .............") - print("FILE = ", filename) - input_file = filename - output_file = filename_w_ocean - - # Open the input NetCDF4 file for reading - with nc.Dataset(input_file, 'r') as ds: - # Create a new NetCDF4 file for writing - with nc.Dataset(output_file, 'w') as ds_out: - # Loop through and copy global attributes - for attr_name in ds.ncattrs(): - ds_out.setncattr(attr_name, ds.getncattr(attr_name)) - - # Loop through and copy dimensions - for dim_name, dim in ds.dimensions.items(): - ds_out.createDimension(dim_name, len(dim) if not dim.isunlimited() else None) - - # Loop through and copy groups recursively - def copy_group(src_group, dst_group): - for attr_name in src_group.ncattrs(): - dst_group.setncattr(attr_name, src_group.getncattr(attr_name)) - - for dim_name, dim in src_group.dimensions.items(): - dst_group.createDimension(dim_name, len(dim) if not dim.isunlimited() else None) - - for var_name, var in src_group.variables.items(): - new_var = dst_group.createVariable(var_name, var.dtype, var.dimensions) - - for attr_name in var.ncattrs(): - setattr(new_var, attr_name, getattr(var, attr_name)) - - new_var[:] = var[:] - - for subgrp_name, subgrp in src_group.groups.items(): - new_subgrp = dst_group.createGroup(subgrp_name) - copy_group(subgrp, new_subgrp) - - # Start copying from the root group - copy_group(ds, ds_out) - - - - - def add_basin_to_nc_file(self, filename): - - filename = "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/gdas.t06z.insitu_profile_argo.2021063006.nc4" - filename_w_ocean = filename + "_w_basin" - filename_w_ocean = "/scratch1/NCEPDEV/da/Edward.Givelberg/workflow06112024/global-workflow/sorc/gdas.cd/ush/ioda/bufr2ioda/marine/jocean.nc4" - print("add_basin_to_nc_file: .............") - print("FILE = ", filename) - - # Open the existing NetCDF file for reading - with nc.Dataset(filename, 'r') as ds: - # Open a new NetCDF file for writing - with nc.Dataset(filename_w_ocean, 'w') as ds_out: - # Iterate over dimensions and create them in the new file - for dimname, dim in ds.dimensions.items(): - ds_out.createDimension(dimname, len(dim) if not dim.isunlimited() else None) - - # Iterate over variables and copy them to the new file - for varname, var in ds.variables.items(): - # Create the variable in the new file - new_var = ds_out.createVariable(varname, var.dtype, var.dimensions) - - # Copy variable attributes - new_var.setncatts({k: var.getncattr(k) for k in var.ncattrs()}) - - # Copy variable data - new_var[:] = var[:] - - # Add your new variable (example: calculated based on an existing variable) - # temperature = ds.variables['temperature'][:] # Example existing variable - # new_variable = temperature * 2 # Example calculation - - # Create a new variable in the new file - # new_var_name = 'new_variable' - # new_var_units = 'units' # Example units - # new_var_long_name = 'Long name of new variable' # Example long_name - # new_var = ds_out.createVariable(new_var_name, temperature.dtype, temperature.dimensions) - - # Set variable attributes - # new_var.units = new_var_units - # new_var.long_name = new_var_long_name - - # Assign data to the new variable - # new_var[:] = new_variable - - # Copy global attributes - ds_out.setncatts({k: ds.getncattr(k) for k in ds.ncattrs()}) - - - - -if __name__ == '__main__': - - ocean_basin = OceanBasin() - - # ocean_basin.read_basin_from_file(ocean_basin_filename) - - ocean_basin.read_nc_file(ocean_basin_nc_path) - - # ocean_basin.print_basin() - ocean_basin.plot_basin() - From 059635dc37a80664337652b0b4ff55e332b97f1a Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Thu, 8 Aug 2024 19:57:23 +0000 Subject: [PATCH 35/54] new directory structure --- ush/ioda/bufr2ioda/marine/b2i/ALTKOB.py | 8 +- ush/ioda/bufr2ioda/marine/b2i/ARGO.py | 6 +- ush/ioda/bufr2ioda/marine/b2i/BATHY.py | 6 +- ush/ioda/bufr2ioda/marine/b2i/GLIDER.py | 6 +- ush/ioda/bufr2ioda/marine/b2i/TESAC.py | 6 +- ush/ioda/bufr2ioda/marine/b2i/TRKOB.py | 6 +- ush/ioda/bufr2ioda/marine/b2i/XBTCTD.py | 6 +- .../marine/b2i/altkob_ioda_variables.py | 14 +- .../marine/b2i/argo_ioda_variables.py | 17 +- .../marine/b2i/b2iconverter/__init__.py | 0 .../b2i/b2iconverter/bufr2ioda_config.py | 63 ++++ .../b2i/b2iconverter/bufr2ioda_converter.py | 114 +++++++ .../marine/b2i/b2iconverter/ioda_variables.py | 278 ++++++++++++++++++ .../bufr2ioda/marine/b2i/b2iconverter/util.py | 140 +++++++++ .../marine/b2i/bathy_ioda_variables.py | 11 +- .../marine/b2i/glider_ioda_variables.py | 15 +- .../marine/b2i/marinemammal_ioda_variables.py | 17 +- .../marine/b2i/tesac_ioda_variables.py | 18 +- .../marine/b2i/trkob_ioda_variables.py | 13 +- .../marine/b2i/xbtctd_ioda_variables.py | 17 +- 20 files changed, 670 insertions(+), 91 deletions(-) create mode 100644 ush/ioda/bufr2ioda/marine/b2i/b2iconverter/__init__.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py create mode 100755 ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py diff --git a/ush/ioda/bufr2ioda/marine/b2i/ALTKOB.py b/ush/ioda/bufr2ioda/marine/b2i/ALTKOB.py index 21f44f731..422040fc0 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/ALTKOB.py +++ b/ush/ioda/bufr2ioda/marine/b2i/ALTKOB.py @@ -1,9 +1,11 @@ #!/usr/bin/env python3 -from util import ParseArguments -from bufr2ioda_config import Bufr2iodaConfig +import sys from altkob_ioda_variables import AltkobIODAVariables -from bufr2ioda_converter import Bufr2ioda_Converter +from b2iconverter.util import ParseArguments +from b2iconverter.bufr2ioda_config import Bufr2iodaConfig +from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter + class AltkobConfig(Bufr2iodaConfig): diff --git a/ush/ioda/bufr2ioda/marine/b2i/ARGO.py b/ush/ioda/bufr2ioda/marine/b2i/ARGO.py index 397dd239f..b0eb604af 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/ARGO.py +++ b/ush/ioda/bufr2ioda/marine/b2i/ARGO.py @@ -1,10 +1,10 @@ #!/usr/bin/env python3 import sys -from util import ParseArguments -from bufr2ioda_config import Bufr2iodaConfig +from b2iconverter.util import ParseArguments +from b2iconverter.bufr2ioda_config import Bufr2iodaConfig +from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter from argo_ioda_variables import ArgoIODAVariables -from bufr2ioda_converter import Bufr2ioda_Converter if __name__ == '__main__': diff --git a/ush/ioda/bufr2ioda/marine/b2i/BATHY.py b/ush/ioda/bufr2ioda/marine/b2i/BATHY.py index 1cda4e4b0..a7d2ac2a0 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/BATHY.py +++ b/ush/ioda/bufr2ioda/marine/b2i/BATHY.py @@ -1,10 +1,10 @@ #!/usr/bin/env python3 import sys -from util import ParseArguments -from bufr2ioda_config import Bufr2iodaConfig +from b2iconverter.util import ParseArguments +from b2iconverter.bufr2ioda_config import Bufr2iodaConfig +from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter from bathy_ioda_variables import BathyIODAVariables -from bufr2ioda_converter import Bufr2ioda_Converter if __name__ == '__main__': diff --git a/ush/ioda/bufr2ioda/marine/b2i/GLIDER.py b/ush/ioda/bufr2ioda/marine/b2i/GLIDER.py index 777bae57d..476d7a50b 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/GLIDER.py +++ b/ush/ioda/bufr2ioda/marine/b2i/GLIDER.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 import sys -from util import ParseArguments -from bufr2ioda_config import Bufr2iodaConfig -from bufr2ioda_converter import Bufr2ioda_Converter +from b2iconverter.util import ParseArguments +from b2iconverter.bufr2ioda_config import Bufr2iodaConfig +from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter from glider_ioda_variables import GliderIODAVariables diff --git a/ush/ioda/bufr2ioda/marine/b2i/TESAC.py b/ush/ioda/bufr2ioda/marine/b2i/TESAC.py index 8e55c352e..44a1033b3 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/TESAC.py +++ b/ush/ioda/bufr2ioda/marine/b2i/TESAC.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 import sys -from util import ParseArguments, run_diff -from bufr2ioda_config import Bufr2iodaConfig -from bufr2ioda_converter import Bufr2ioda_Converter +from b2iconverter.util import ParseArguments +from b2iconverter.bufr2ioda_config import Bufr2iodaConfig +from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter from tesac_ioda_variables import TesacIODAVariables diff --git a/ush/ioda/bufr2ioda/marine/b2i/TRKOB.py b/ush/ioda/bufr2ioda/marine/b2i/TRKOB.py index 2f8820b64..31e09ac69 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/TRKOB.py +++ b/ush/ioda/bufr2ioda/marine/b2i/TRKOB.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 import sys -from util import ParseArguments -from bufr2ioda_config import Bufr2iodaConfig -from bufr2ioda_converter import Bufr2ioda_Converter +from b2iconverter.util import ParseArguments +from b2iconverter.bufr2ioda_config import Bufr2iodaConfig +from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter from trkob_ioda_variables import TrkobIODAVariables diff --git a/ush/ioda/bufr2ioda/marine/b2i/XBTCTD.py b/ush/ioda/bufr2ioda/marine/b2i/XBTCTD.py index 0c98a46e2..b606823a2 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/XBTCTD.py +++ b/ush/ioda/bufr2ioda/marine/b2i/XBTCTD.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 import sys -from util import ParseArguments -from bufr2ioda_config import Bufr2iodaConfig -from bufr2ioda_converter import Bufr2ioda_Converter +from b2iconverter.util import ParseArguments +from b2iconverter.bufr2ioda_config import Bufr2iodaConfig +from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter from xbtctd_ioda_variables import XbtctdIODAVariables diff --git a/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py index 14c236ba2..127c650cb 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py @@ -1,7 +1,7 @@ import numpy as np from pyiodaconv import bufr -from ioda_variables import * -from util import Compute_sequenceNumber +from b2iconverter.ioda_variables import IODAVariables +from b2iconverter.util import Compute_sequenceNumber class AltkobIODAVariables(IODAVariables): @@ -45,13 +45,13 @@ def createIODAVars(self, obsspace): super().createIODAVars(obsspace) # BUG: StationID is undefined - WriteStationID(obsspace, self.stationID) + self.WriteStationID(obsspace) self.WritePreQC(obsspace, "seaSurfaceTemperature") self.WritePreQC(obsspace, "seaSurfaceSalinity") - WriteObsError(obsspace, "ObsError/seaSurfaceTemperature", "degC", self.ObsError_temp) - WriteObsError(obsspace, "ObsError/seaSurfaceSalinity", "psu", self.ObsError_saln) + self.WriteObsErrorT(obsspace, "seaSurfaceTemperature") + self.WriteObsErrorS(obsspace, "seaSurfaceSalinity") - self.WriteObsValueT(obsspace, 'waterTemperature') - self.WriteObsValueS(obsspace, 'salinity') + self.WriteObsValueT(obsspace, 'seaSurfaceTemperature') + self.WriteObsValueS(obsspace, 'seaSurfaceSalinity') diff --git a/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py index 00ce46ef0..0d028017e 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py @@ -1,8 +1,7 @@ import numpy as np from pyiodaconv import bufr -# from ioda_variables import IODAVariables -from ioda_variables import * -from util import Compute_sequenceNumber +from b2iconverter.ioda_variables import IODAVariables +from b2iconverter.util import Compute_sequenceNumber class ArgoIODAVariables(IODAVariables): @@ -64,15 +63,13 @@ def filter(self): def createIODAVars(self, obsspace): super().createIODAVars(obsspace) - WriteStationID(obsspace, self.stationID) - WriteDepth(obsspace, self.depth) - WriteSequenceNumber(obsspace, self.seqNum, self.PreQC) + self.WriteStationID(obsspace) + self.WriteDepth(obsspace) + self.WriteSequenceNumber(obsspace) self.WritePreQC(obsspace, "waterTemperature") self.WritePreQC(obsspace, "salinity") - - WriteObsError(obsspace, "ObsError/waterTemperature", "degC", self.ObsError_temp) - WriteObsError(obsspace, "ObsError/salinity", "psu", self.ObsError_saln) - + self.WriteObsErrorT(obsspace, "waterTemperature") + self.WriteObsErrorS(obsspace, "salinity") self.WriteObsValueT(obsspace, 'waterTemperature') self.WriteObsValueS(obsspace, 'salinity') diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/__init__.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py new file mode 100644 index 000000000..272c5145a --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py @@ -0,0 +1,63 @@ +import json +import yaml +import os + + +class Bufr2iodaConfig: + def __init__(self, script_name, config_file, platform_description): + self.script_name = script_name + self.platform_description = platform_description + + _, file_extension = os.path.splitext(config_file) + + if file_extension == ".json": + with open(config_file, "r") as file: + config = json.load(file) + self.ReadConfig(config) + elif file_extension == ".yaml": + with open(config_file, "r") as file: + config = yaml.safe_load(file) + self.ReadConfig(config) + else: + print("Unknown file extension = ", file_extension) + + def ReadConfig(self, config): + subsets = config["subsets"] + + # Get parameters from configuration + self.data_format = config["data_format"] + self.source = config["source"] + self.data_type = config["data_type"] + self.data_description = config["data_description"] + self.data_provider = config["data_provider"] + self.cycle_type = config["cycle_type"] + self.cycle_datetime = config["cycle_datetime"] + self.dump_dir = config["dump_directory"] + self.ioda_dir = config["ioda_directory"] + + self.yyyymmdd = self.cycle_datetime[0:8] + self.hh = self.cycle_datetime[8:10] + + # General Information + self.converter = 'BUFR to IODA Converter' + + def BufrFilename(self): + return f"{self.cycle_datetime}-{self.cycle_type}.t{self.hh}z.{self.data_format}.tm00.bufr_d" + + def BufrFilepath(self): + return os.path.join(self.dump_dir, self.BufrFilename()) + + def IODAFilename(self): + return f"{self.cycle_type}.t{self.hh}z.insitu_profile_{self.data_format}.{self.cycle_datetime}.nc4" + + def IODAFilepath(self): + return os.path.join(self.ioda_dir, self.IODAFilename()) + + def CreateIODAAttributes(self, obsspace, date_range): + obsspace.write_attr('Converter', self.converter) + obsspace.write_attr('source', self.source) + obsspace.write_attr('sourceFiles', self.BufrFilename()) + obsspace.write_attr('dataProviderOrigin', self.data_provider) + obsspace.write_attr('description', self.data_description) + obsspace.write_attr('datetimeRange', date_range) + obsspace.write_attr('platformLongDescription', self.platform_description) diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py new file mode 100755 index 000000000..1391af034 --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py @@ -0,0 +1,114 @@ +import sys +import numpy as np +import numpy.ma as ma +import os +# import argparse +import math +import calendar +import time +import copy +from datetime import datetime +from pyiodaconv import bufr +from collections import namedtuple +from pyioda import ioda_obs_space as ioda_ospace +from wxflow import Logger +import warnings +# suppress warnings +warnings.filterwarnings('ignore') +from .util import ParseArguments, run_diff +from .bufr2ioda_config import Bufr2iodaConfig +import logging +import tempfile + + +class Bufr2ioda_Converter: + def __init__(self, bufr2ioda_config, ioda_vars, logfile): + self.bufr2ioda_config = bufr2ioda_config + self.ioda_vars = ioda_vars + self.logfile = logfile + self.SetupLogging(bufr2ioda_config.script_name, self.logfile) + + def SetupLogging(self, script_name, logfile): + self.logger = logging.getLogger(script_name) + self.logger.setLevel(logging.DEBUG) + + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + + console_handler = logging.StreamHandler() + # console_handler.setLevel(logging.INFO) + console_handler.setLevel(logging.DEBUG) + console_handler.setFormatter(formatter) + + self.logger.addHandler(console_handler) + + if (logfile): + self.file_handler = logging.FileHandler(logfile) + self.file_handler.setLevel(logging.DEBUG) + file_formatter = logging.Formatter('%(message)s') + self.file_handler.setFormatter(file_formatter) + + def run(self): + start_time = time.time() + + self.logger.debug(f"BuildQuery") + q = self.ioda_vars.BuildQuery() + + bufrfile_path = self.bufr2ioda_config.BufrFilepath() + self.logger.debug(f"ExecuteQuery: BUFR file = {bufrfile_path}") + with bufr.File(bufrfile_path) as f: + r = f.execute(q) + + # process query results and set ioda variables + self.ioda_vars.SetFromQueryResult(r) + + self.ioda_vars.filter() + + # set seqNum, PreQC, ObsError + self.ioda_vars.SetAdditionalData() + + iodafile_path = self.bufr2ioda_config.IODAFilepath() + path, fname = os.path.split(iodafile_path) + os.makedirs(path, exist_ok=True) + + dims = {'Location': np.arange(0, self.ioda_vars.lat.shape[0])} + obsspace = ioda_ospace.ObsSpace(iodafile_path, mode='w', dim_dict=dims) + self.logger.debug(f"Created IODA file: {iodafile_path}") + + date_range = [str(self.ioda_vars.dateTime.min()), str(self.ioda_vars.dateTime.max())] + self.logger.debug(f"CreateGlobalAttributes") + self.bufr2ioda_config.CreateIODAAttributes(obsspace, date_range) + + self.logger.debug(f"createIODAVars") + self.ioda_vars.createIODAVars(obsspace) + + if (self.logfile): + self.logger.addHandler(self.file_handler) + self.ioda_vars.log(self.logger) + if (self.logfile): + self.logger.removeHandler(self.file_handler) + + end_time = time.time() + running_time = end_time - start_time + self.logger.debug(f"Total running time: {running_time} seconds") + + def test(self, test_file): + with tempfile.NamedTemporaryFile(delete=False, suffix='.log') as temp_log_file: + temp_log_file_name = temp_log_file.name + file_handler = logging.FileHandler(temp_log_file_name) + file_handler.setLevel(logging.DEBUG) + file_formatter = logging.Formatter('%(message)s') + file_handler.setFormatter(file_formatter) + + self.logger.debug(f"TEST: created a temporary log file {temp_log_file_name}") + self.logger.debug(f"TEST: running diff with reference file {test_file}") + self.logger.addHandler(file_handler) + + self.ioda_vars.log(self.logger) + + result = run_diff(temp_log_file_name, test_file) + if result: + self.logger.error(f"TEST ERROR: files are different") + else: + self.logger.info(f"TEST passed: files are identical") + + return result diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py new file mode 100644 index 000000000..a277beebe --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py @@ -0,0 +1,278 @@ +import numpy as np +from pyiodaconv import bufr +from .util import Compute_sequenceNumber + + +class IODAVariables: + def __init__(self): + self.n_obs = 0 + self.errorT = 0.0 + self.errorS = 0.0 + self.SetTemperatureRange(-10.0, 50.0) + self.SetSalinityRange(0.0, 45.0) + + def SetTemperatureError(self, e): + self.errorT = e + + def SetSalinityError(self, e): + self.errorS = e + + def SetTemperatureRange(self, tmin, tmax): + self.Tmin = tmin + self.Tmax = tmax + + def SetSalinityRange(self, smin, smax): + self.Smin = smin + self.Smax = smax + + def BuildQuery(self): + q = bufr.QuerySet() + q.add('year', '*/YEAR') + q.add('month', '*/MNTH') + q.add('day', '*/DAYS') + q.add('hour', '*/HOUR') + q.add('minute', '*/MINU') + q.add('ryear', '*/RCYR') + q.add('rmonth', '*/RCMO') + q.add('rday', '*/RCDY') + q.add('rhour', '*/RCHR') + q.add('rminute', '*/RCMI') + return q + + def SetDatesFromQueryResult(self, r): + self.dateTime = r.get_datetime('year', 'month', 'day', 'hour', 'minute', group_by='depth') + self.dateTime = self.dateTime.astype(np.int64) + + self.rcptdateTime = r.get_datetime('ryear', 'rmonth', 'rday', 'rhour', 'rminute', group_by='depth') + self.rcptdateTime = self.rcptdateTime.astype(np.int64) + + def SetLonLatFromQueryResult(self, r): + self.lat = r.get('latitude', group_by='depth') + self.lon = r.get('longitude', group_by='depth') + + def SetObsFromQueryResult(self, r): + self.temp = r.get('temp', group_by='depth') + self.temp -= 273.15 + self.saln = r.get('saln', group_by='depth') + + def SetFromQueryResult(self, r): + self.SetDatesFromQueryResult(r) + self.SetLonLatFromQueryResult(r) + self.stationID = r.get('stationID', group_by='depth') + self.depth = r.get('depth', group_by='depth') + self.SetObsFromQueryResult(r) + + def TemperatureFilter(self): + return (self.temp > self.Tmin) & (self.temp <= self.Tmax) + + def SalinityFilter(self): + return (self.saln >= self.Smin) & (self.saln <= self.Smax) + + def filter(self): + pass + + def SetAdditionalData(self): + self.seqNum = Compute_sequenceNumber(self.lon) + self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) + self.ObsError_temp = \ + np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorT))) + self.ObsError_saln = \ + np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) + + def WriteDateTime(self, obsspace): + WriteDateTime(obsspace, self.dateTime) + + def WriteStationID(self, obsspace): + WriteStationID(obsspace, self.stationID) + + def WriteDepth(self, obsspace): + WriteDepth(obsspace, self.depth) + + def WriteSequenceNumber(self, obsspace): + WriteSequenceNumber(obsspace, self.seqNum, self.PreQC) + + def createIODAVars(self, obsspace): + WriteDateTime(obsspace, self.dateTime) + WriteRcptDateTime(obsspace, self.rcptdateTime) + WriteLongitude(obsspace, self.lon) + WriteLatitude(obsspace, self.lat) + + def WritePreQC(self, obsspace, name): + obsspace.create_var("PreQC/" + name, dtype=self.PreQC.dtype, fillval=self.PreQC.fill_value) \ + .write_attr('long_name', 'PreQC') \ + .write_data(self.PreQC) + + def WriteObsValueT(self, obsspace, v_name): + obsspace.create_var('ObsValue/' + v_name, dtype=self.temp.dtype, fillval=self.temp.fill_value) \ + .write_attr('units', 'degC') \ + .write_attr('valid_range', np.array([self.Tmin, self.Tmax], dtype=np.float32)) \ + .write_attr('long_name', v_name) \ + .write_data(self.temp) + + def WriteObsValueS(self, obsspace, v_name): + obsspace.create_var( + 'ObsValue/' + v_name, + dtype=self.saln.dtype, + fillval=self.saln.fill_value + ) \ + .write_attr('units', 'psu') \ + .write_attr('valid_range', np.array([self.Smin, self.Smax], dtype=np.float32)) \ + .write_attr('long_name', v_name) \ + .write_data(self.saln) + + def WriteObsErrorT(self, obsspace, v_name): + WriteObsError(obsspace, "ObsError/" + v_name, "degC", self.ObsError_temp) + + def WriteObsErrorS(self, obsspace, v_name): + WriteObsError(obsspace, "ObsError/" + v_name, "psu", self.ObsError_saln) + +############################################################################## + + def logTemperature(self, logger): + logger.debug(f" temp min, max, length, dtype = {self.temp.min()}, {self.temp.max()}, {len(self.temp)}, {self.temp.dtype}") + + def logSalinity(self, logger): + logger.debug(f" saln min, max, length, dtype = {self.saln.min()}, {self.saln.max()}, {len(self.saln)}, {self.saln.dtype}") + + def logLonLat(self, logger): + logger.debug(f" lon min, max, length, dtype = {self.lon.min()}, {self.lon.max()}, {len(self.lon)}, {self.lon.dtype}") + logger.debug(f" lat min, max, length, dtype = {self.lat.min()}, {self.lat.max()}, {len(self.lat)}, {self.lat.dtype}") + + def logDates(self, logger): + logger.debug(f" dateTime shape, dtype = {self.dateTime.shape}, {self.dateTime.dtype}") + logger.debug(f" rcptdateTime shape, dytpe = {self.rcptdateTime.shape}, {self.rcptdateTime.dtype}") + + def logStationID(self, logger): + logger.debug(f" stationID shape, dtype = {self.stationID.shape}, {self.stationID.astype(str).dtype}") + + def logDepth(self, logger): + logger.debug(f" depth min, max, length, dtype = {self.depth.min()}, {self.depth.max()}, {len(self.depth)}, {self.depth.dtype}") + + def LogSeqNum(self, logger): + logger.debug(f" sequence Num shape, dtype = {self.seqNum.shape}, {self.seqNum.dtype}") + + def LogPreQC(self, logger): + logger.debug(f" PreQC min, max, length, dtype = \ + {self.PreQC.min()}, \ + {self.PreQC.max()}, \ + {len(self.PreQC)}, \ + {self.PreQC.dtype}") + + def LogObsError_temp(self, logger): + logger.debug(f" ObsError_temp min, max, length, dtype = \ + {self.ObsError_temp.min()}, \ + {self.ObsError_temp.max()}, \ + {len(self.ObsError_temp)}, \ + {self.ObsError_temp.dtype}") + + def LogObsError_saln(self, logger): + logger.debug(f" ObsError_saln min, max, length, dtype = \ + {self.ObsError_saln.min()}, \ + {self.ObsError_saln.max()}, \ + {len(self.ObsError_saln)}, \ + {self.ObsError_saln.dtype}") + + def logMetadata(self, logger): + self.logDates(logger) + self.logLonLat(logger) + self.logDepth(logger) + self.logStationID(logger) + + def logObs(self, logger): + self.logTemperature(logger) + self.logSalinity(logger) + + def logAdditionalData(self, logger): + self.LogSeqNum(logger) + self.LogPreQC(logger) + self.LogObsError_temp(logger) + self.LogObsError_saln(logger) + + def log(self, logger): + self.logMetadata(logger) + self.logObs(logger) + self.logAdditionalData(logger) + +##################################################################### + + +def WriteDateTime(obsspace, dateTime): + obsspace.create_var( + 'MetaData/dateTime', + dtype=dateTime.dtype, fillval=dateTime.fill_value + ) \ + .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ + .write_attr('long_name', 'Datetime') \ + .write_data(dateTime) + + +def WriteRcptDateTime(obsspace, rcptdateTime): + obsspace.create_var( + 'MetaData/rcptdateTime', + dtype=rcptdateTime.dtype, fillval=rcptdateTime.fill_value + ) \ + .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ + .write_attr('long_name', 'receipt Datetime') \ + .write_data(rcptdateTime) + + +def WriteLongitude(obsspace, lon): + obsspace.create_var( + 'MetaData/longitude', + dtype=lon.dtype, fillval=lon.fill_value + ) \ + .write_attr('units', 'degrees_east') \ + .write_attr('valid_range', np.array([-180, 180], dtype=np.float32)) \ + .write_attr('long_name', 'Longitude') \ + .write_data(lon) + + +def WriteLatitude(obsspace, lat): + obsspace.create_var( + 'MetaData/latitude', + dtype=lat.dtype, fillval=lat.fill_value + ) \ + .write_attr('units', 'degrees_north') \ + .write_attr('valid_range', np.array([-90, 90], dtype=np.float32)) \ + .write_attr('long_name', 'Latitude') \ + .write_data(lat) + + +def WriteStationID(obsspace, stationID): + obsspace.create_var( + 'MetaData/stationID', + dtype=stationID.dtype, fillval=stationID.fill_value + ) \ + .write_attr('long_name', 'Station Identification') \ + .write_data(stationID) + + +def WriteDepth(obsspace, depth): + obsspace.create_var( + 'MetaData/depth', + dtype=depth.dtype, + fillval=depth.fill_value + ) \ + .write_attr('units', 'm') \ + .write_attr('long_name', 'Water depth') \ + .write_data(depth) + + +def WriteSequenceNumber(obsspace, seqNum, PreQC): + obsspace.create_var( + 'MetaData/sequenceNumber', + dtype=PreQC.dtype, + fillval=PreQC.fill_value + ) \ + .write_attr('long_name', 'Sequence Number') \ + .write_data(seqNum) + + +def WriteObsError(obsspace, v_name, units, v): + obsspace.create_var( + v_name, + dtype=v.dtype, fillval=v.fill_value + ) \ + .write_attr('units', units) \ + .write_attr('long_name', 'ObsError') \ + .write_data(v) diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py new file mode 100644 index 000000000..36273c0aa --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py @@ -0,0 +1,140 @@ +import os +import sys +import argparse +import subprocess +import numpy as np +import tempfile + + +def ParseArguments(): + parser = argparse.ArgumentParser() + parser.add_argument( + '-c', '--config', + type=str, + help='Input JSON or YAML configuration', required=True + ) + parser.add_argument( + '-l', '--log_file', + type=str, + help='Output file for testing ioda variables' + ) + parser.add_argument( + '-t', '--test', + type=str, + help='Input test reference file' + ) + + args = parser.parse_args() + config_file = args.config + log_file = args.log_file + test_file = args.test + script_name = sys.argv[0] + return script_name, config_file, log_file, test_file + + +def run_diff(file1, file2): + # log this.... + # print("running diff on: ") + # print("file 1 = ", file1) + # print("file 2 = ", file2) + + try: + # Run the diff command + result = subprocess.run( + ['diff', file1, file2], + capture_output=True, text=True, check=False + ) + + # Check if diff command succeeded (return code 0) + if result.returncode == 0: + print("Files are identical.") + elif result.returncode == 1: + # Print the difference if files are different + print("Files are different:") + print(result.stdout) + else: + print("Error occurred while running diff command.") + print(result.stderr) + + except subprocess.CalledProcessError as e: + print(f"Error occurred: {e}") + + return result.returncode + + +def run_diff_script_inline(file1, file2, script_content): + try: + # Create a temporary script file with the provided content + script_path = '/tmp/temp_script.sh' + with open(script_path, 'w') as f: + f.write(script_content) + + # Make the script executable + subprocess.run(['chmod', '+x', script_path], check=True) + + # Construct the command to run the temporary script + command = [script_path, file1, file2] + + # Run the script and capture the output + result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, text=True) + + # Return the output of the script (which is assumed to be the result of the diff) + return result.stdout + + except subprocess.CalledProcessError as e: + print(f"Error running script: {e}") + return None + except Exception as e: + print(f"Error: {e}") + return None + finally: + # Clean up: delete the temporary script file + try: + subprocess.run(['rm', '-f', script_path]) + except Exception as e: + print(f"Error cleaning up temp script: {e}") + + +def Compute_sequenceNumber(lon): + lon_u, seqNum = np.unique(lon, return_inverse=True) + seqNum = seqNum.astype(np.int32) + # logger.debug(f"Len of Sequence Number: {len(seqNum)}") + return seqNum + + +def nc_diff(file1, file2): + try: + script_content = ''' +#!/bin/bash +diff <(ncdump "$1"| sed '1d') <(ncdump "$2"|sed '1d') +''' + + # Create a temporary script file with the provided content + with tempfile.NamedTemporaryFile(delete=False, mode='w') as temp_script: + temp_script.write(script_content.lstrip()) # Remove leading indentation + + # Make the script executable + os.chmod(temp_script.name, 0o755) # Make it executable for owner + + # Construct the command to run the temporary script + command = ['bash', temp_script.name, file1, file2] + + # result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, text=True) + result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + return result.returncode + # return result.stdout + + except subprocess.CalledProcessError as e: + print(f"Error running script: {e}") + # print(f"Script stderr: {e.stderr}") + return None + except Exception as e: + print(f"Error: {e}") + return None + finally: + # Clean up: delete the temporary script file + try: + os.remove(temp_script.name) + except Exception as e: + print(f"Error cleaning up temp script: {e}") diff --git a/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py index 7c1d89c99..171354383 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py @@ -1,7 +1,7 @@ import numpy as np from pyiodaconv import bufr -from ioda_variables import * -from util import Compute_sequenceNumber +from b2iconverter.ioda_variables import IODAVariables +from b2iconverter.util import Compute_sequenceNumber class BathyIODAVariables(IODAVariables): @@ -43,10 +43,9 @@ def SetAdditionalData(self): def createIODAVars(self, obsspace): super().createIODAVars(obsspace) - - WriteStationID(obsspace, self.stationID) - WriteDepth(obsspace, self.depth) - WriteSequenceNumber(obsspace, self.seqNum, self.PreQC) + self.WriteStationID(obsspace) + self.WriteDepth(obsspace) + self.WriteSequenceNumber(obsspace) self.WritePreQC(obsspace, "waterTemperature") self.WriteObsValueT(obsspace, "waterTemperature") diff --git a/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py index 6912fc796..276707086 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py @@ -1,7 +1,7 @@ import numpy as np from pyiodaconv import bufr -from ioda_variables import * -from util import Compute_sequenceNumber +from b2iconverter.ioda_variables import IODAVariables +from b2iconverter.util import Compute_sequenceNumber class GliderIODAVariables(IODAVariables): @@ -69,14 +69,13 @@ def SetAdditionalData(self): def createIODAVars(self, obsspace): super().createIODAVars(obsspace) - - WriteStationID(obsspace, self.stationID) - WriteDepth(obsspace, self.depth) - WriteSequenceNumber(obsspace, self.seqNum, self.PreQC) + self.WriteStationID(obsspace) + self.WriteDepth(obsspace) + self.WriteSequenceNumber(obsspace) self.WritePreQC(obsspace, "waterTemperature") self.WritePreQC(obsspace, "salinity") - WriteObsError(obsspace, 'ObsError/waterTemperature', 'degC', self.ObsError_temp) - WriteObsError(obsspace, 'ObsError/salinity', 'psu', self.ObsError_saln) + self.WriteObsErrorT(obsspace, "waterTemperature") + self.WriteObsErrorS(obsspace, "salinity") self.WriteObsValueT(obsspace, 'waterTemperature') self.WriteObsValueS(obsspace, 'salinity') diff --git a/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py index f9d9c94ca..757ebcce0 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py @@ -1,7 +1,7 @@ import numpy as np from pyiodaconv import bufr -from ioda_variables import * -from util import Compute_sequenceNumber +from b2iconverter.ioda_variables import IODAVariables +from b2iconverter.util import Compute_sequenceNumber class MarinemammalIODAVariables(IODAVariables): @@ -53,16 +53,13 @@ def filter(self): def createIODAVars(self, obsspace): super().createIODAVars(obsspace) - - WriteStationID(obsspace, self.stationID) - WriteDepth(obsspace, self.depth) - WriteSequenceNumber(obsspace, self.seqNum, self.PreQC) + self.WriteStationID(obsspace) + self.WriteDepth(obsspace) + self.WriteSequenceNumber(obsspace) self.WritePreQC(obsspace, "waterTemperature") self.WritePreQC(obsspace, "salinity") - - WriteObsError(obsspace, "ObsError/waterTemperature", "degC", self.ObsError_temp) - WriteObsError(obsspace, "ObsError/salinity", "psu", self.ObsError_saln) - + self.WriteObsErrorT(obsspace, "waterTemperature") + self.WriteObsErrorS(obsspace, "salinity") self.WriteObsValueT(obsspace, 'waterTemperature') self.WriteObsValueS(obsspace, 'salinity') diff --git a/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py index 6cef13a81..7684d9839 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py @@ -1,8 +1,7 @@ import numpy as np from pyiodaconv import bufr -# from ioda_variables import IODAVariables -from ioda_variables import * -from util import Compute_sequenceNumber +from b2iconverter.ioda_variables import IODAVariables +from b2iconverter.util import Compute_sequenceNumber class TesacIODAVariables(IODAVariables): @@ -62,16 +61,13 @@ def SetAdditionalData(self): def createIODAVars(self, obsspace): super().createIODAVars(obsspace) - - WriteStationID(obsspace, self.stationID) - WriteDepth(obsspace, self.depth) - WriteSequenceNumber(obsspace, self.seqNum, self.PreQC) + self.WriteStationID(obsspace) + self.WriteDepth(obsspace) + self.WriteSequenceNumber(obsspace) self.WritePreQC(obsspace, "waterTemperature") self.WritePreQC(obsspace, "salinity") - - WriteObsError(obsspace, "ObsError/waterTemperature", "degC", self.ObsError_temp) - WriteObsError(obsspace, "ObsError/salinity", "psu", self.ObsError_saln) - + self.WriteObsErrorT(obsspace, "waterTemperature") + self.WriteObsErrorS(obsspace, "salinity") self.WriteObsValueT(obsspace, 'waterTemperature') self.WriteObsValueS(obsspace, 'salinity') diff --git a/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py index 3573fc5e8..55176c896 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py @@ -1,8 +1,7 @@ import numpy as np from pyiodaconv import bufr -# from ioda_variables import IODAVariables -from ioda_variables import * -from util import Compute_sequenceNumber +from b2iconverter.ioda_variables import IODAVariables +from b2iconverter.util import Compute_sequenceNumber class TrkobIODAVariables(IODAVariables): @@ -43,14 +42,12 @@ def SetAdditionalData(self): def createIODAVars(self, obsspace): super().createIODAVars(obsspace) - WriteStationID(obsspace, self.stationID) + self.WriteStationID(obsspace) self.WritePreQC(obsspace, "seaSurfaceTemperature") self.WritePreQC(obsspace, "seaSurfaceSalinity") - - WriteObsError(obsspace, "ObsError/seaSurfaceTemperature", "degC", self.ObsError_temp) - WriteObsError(obsspace, "ObsError/seaSurfaceSalinity", "psu", self.ObsError_saln) - + self.WriteObsErrorT(obsspace, "waterTemperature") + self.WriteObsErrorS(obsspace, "salinity") self.WriteObsValueT(obsspace, 'seaSurfaceTemperature') self.WriteObsValueS(obsspace, 'seaSurfaceSalinity') diff --git a/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py index 4c666d025..135fb231f 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py @@ -1,7 +1,7 @@ import numpy as np from pyiodaconv import bufr -from ioda_variables import * -from util import Compute_sequenceNumber +from b2iconverter.ioda_variables import IODAVariables +from b2iconverter.util import Compute_sequenceNumber class XbtctdIODAVariables(IODAVariables): @@ -35,16 +35,13 @@ def filter(self): def createIODAVars(self, obsspace): super().createIODAVars(obsspace) - - WriteStationID(obsspace, self.stationID) - WriteDepth(obsspace, self.depth) - WriteSequenceNumber(obsspace, self.seqNum, self.PreQC) + self.WriteStationID(obsspace) + self.WriteDepth(obsspace) + self.WriteSequenceNumber(obsspace) self.WritePreQC(obsspace, "waterTemperature") self.WritePreQC(obsspace, "salinity") - - WriteObsError(obsspace, "ObsError/waterTemperature", "degC", self.ObsError_temp) - WriteObsError(obsspace, "ObsError/salinity", "psu", self.ObsError_saln) - + self.WriteObsErrorT(obsspace, "waterTemperature") + self.WriteObsErrorS(obsspace, "salinity") self.WriteObsValueT(obsspace, 'waterTemperature') self.WriteObsValueS(obsspace, 'salinity') From a9e3c9d622b8b40717f6780f8d504e16f25d9f1f Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Thu, 8 Aug 2024 20:01:39 +0000 Subject: [PATCH 36/54] new directory structure - removing redundant files --- .../bufr2ioda/marine/b2i/bufr2ioda_config.py | 63 ----- .../marine/b2i/bufr2ioda_converter.py | 114 -------- .../bufr2ioda/marine/b2i/ioda_variables.py | 260 ------------------ ush/ioda/bufr2ioda/marine/b2i/util.py | 140 ---------- 4 files changed, 577 deletions(-) delete mode 100644 ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py delete mode 100755 ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_converter.py delete mode 100644 ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py delete mode 100644 ush/ioda/bufr2ioda/marine/b2i/util.py diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py deleted file mode 100644 index 272c5145a..000000000 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_config.py +++ /dev/null @@ -1,63 +0,0 @@ -import json -import yaml -import os - - -class Bufr2iodaConfig: - def __init__(self, script_name, config_file, platform_description): - self.script_name = script_name - self.platform_description = platform_description - - _, file_extension = os.path.splitext(config_file) - - if file_extension == ".json": - with open(config_file, "r") as file: - config = json.load(file) - self.ReadConfig(config) - elif file_extension == ".yaml": - with open(config_file, "r") as file: - config = yaml.safe_load(file) - self.ReadConfig(config) - else: - print("Unknown file extension = ", file_extension) - - def ReadConfig(self, config): - subsets = config["subsets"] - - # Get parameters from configuration - self.data_format = config["data_format"] - self.source = config["source"] - self.data_type = config["data_type"] - self.data_description = config["data_description"] - self.data_provider = config["data_provider"] - self.cycle_type = config["cycle_type"] - self.cycle_datetime = config["cycle_datetime"] - self.dump_dir = config["dump_directory"] - self.ioda_dir = config["ioda_directory"] - - self.yyyymmdd = self.cycle_datetime[0:8] - self.hh = self.cycle_datetime[8:10] - - # General Information - self.converter = 'BUFR to IODA Converter' - - def BufrFilename(self): - return f"{self.cycle_datetime}-{self.cycle_type}.t{self.hh}z.{self.data_format}.tm00.bufr_d" - - def BufrFilepath(self): - return os.path.join(self.dump_dir, self.BufrFilename()) - - def IODAFilename(self): - return f"{self.cycle_type}.t{self.hh}z.insitu_profile_{self.data_format}.{self.cycle_datetime}.nc4" - - def IODAFilepath(self): - return os.path.join(self.ioda_dir, self.IODAFilename()) - - def CreateIODAAttributes(self, obsspace, date_range): - obsspace.write_attr('Converter', self.converter) - obsspace.write_attr('source', self.source) - obsspace.write_attr('sourceFiles', self.BufrFilename()) - obsspace.write_attr('dataProviderOrigin', self.data_provider) - obsspace.write_attr('description', self.data_description) - obsspace.write_attr('datetimeRange', date_range) - obsspace.write_attr('platformLongDescription', self.platform_description) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_converter.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_converter.py deleted file mode 100755 index 5a455b4ab..000000000 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_converter.py +++ /dev/null @@ -1,114 +0,0 @@ -import sys -import numpy as np -import numpy.ma as ma -import os -import argparse -import math -import calendar -import time -import copy -from datetime import datetime -from pyiodaconv import bufr -from collections import namedtuple -from pyioda import ioda_obs_space as ioda_ospace -from wxflow import Logger -import warnings -# suppress warnings -warnings.filterwarnings('ignore') -from util import ParseArguments, run_diff -from bufr2ioda_config import Bufr2iodaConfig -import logging -import tempfile - - -class Bufr2ioda_Converter: - def __init__(self, bufr2ioda_config, ioda_vars, logfile): - self.bufr2ioda_config = bufr2ioda_config - self.ioda_vars = ioda_vars - self.logfile = logfile - self.SetupLogging(bufr2ioda_config.script_name, self.logfile) - - def SetupLogging(self, script_name, logfile): - self.logger = logging.getLogger(script_name) - self.logger.setLevel(logging.DEBUG) - - formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - - console_handler = logging.StreamHandler() - # console_handler.setLevel(logging.INFO) - console_handler.setLevel(logging.DEBUG) - console_handler.setFormatter(formatter) - - self.logger.addHandler(console_handler) - - if (logfile): - self.file_handler = logging.FileHandler(logfile) - self.file_handler.setLevel(logging.DEBUG) - file_formatter = logging.Formatter('%(message)s') - self.file_handler.setFormatter(file_formatter) - - def run(self): - start_time = time.time() - - self.logger.debug(f"BuildQuery") - q = self.ioda_vars.BuildQuery() - - bufrfile_path = self.bufr2ioda_config.BufrFilepath() - self.logger.debug(f"ExecuteQuery: BUFR file = {bufrfile_path}") - with bufr.File(bufrfile_path) as f: - r = f.execute(q) - - # process query results and set ioda variables - self.ioda_vars.SetFromQueryResult(r) - - self.ioda_vars.filter() - - # set seqNum, PreQC, ObsError - self.ioda_vars.SetAdditionalData() - - iodafile_path = self.bufr2ioda_config.IODAFilepath() - path, fname = os.path.split(iodafile_path) - os.makedirs(path, exist_ok=True) - - dims = {'Location': np.arange(0, self.ioda_vars.lat.shape[0])} - obsspace = ioda_ospace.ObsSpace(iodafile_path, mode='w', dim_dict=dims) - self.logger.debug(f"Created IODA file: {iodafile_path}") - - date_range = [str(self.ioda_vars.dateTime.min()), str(self.ioda_vars.dateTime.max())] - self.logger.debug(f"CreateGlobalAttributes") - self.bufr2ioda_config.CreateIODAAttributes(obsspace, date_range) - - self.logger.debug(f"createIODAVars") - self.ioda_vars.createIODAVars(obsspace) - - if (self.logfile): - self.logger.addHandler(self.file_handler) - self.ioda_vars.log(self.logger) - if (self.logfile): - self.logger.removeHandler(self.file_handler) - - end_time = time.time() - running_time = end_time - start_time - self.logger.debug(f"Total running time: {running_time} seconds") - - def test(self, test_file): - with tempfile.NamedTemporaryFile(delete=False, suffix='.log') as temp_log_file: - temp_log_file_name = temp_log_file.name - file_handler = logging.FileHandler(temp_log_file_name) - file_handler.setLevel(logging.DEBUG) - file_formatter = logging.Formatter('%(message)s') - file_handler.setFormatter(file_formatter) - - self.logger.debug(f"TEST: created a temporary log file {temp_log_file_name}") - self.logger.debug(f"TEST: running diff with reference file {test_file}") - self.logger.addHandler(file_handler) - - self.ioda_vars.log(self.logger) - - result = run_diff(temp_log_file_name, test_file) - if result: - self.logger.error(f"TEST ERROR: files are different") - else: - self.logger.info(f"TEST passed: files are identical") - - return result diff --git a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py deleted file mode 100644 index c11a77569..000000000 --- a/ush/ioda/bufr2ioda/marine/b2i/ioda_variables.py +++ /dev/null @@ -1,260 +0,0 @@ -import numpy as np -from pyiodaconv import bufr -from util import Compute_sequenceNumber - - -class IODAVariables: - def __init__(self): - self.n_obs = 0 - self.errorT = 0.0 - self.errorS = 0.0 - self.SetTemperatureRange(-10.0, 50.0) - self.SetSalinityRange(0.0, 45.0) - - def SetTemperatureError(self, e): - self.errorT = e - - def SetSalinityError(self, e): - self.errorS = e - - def SetTemperatureRange(self, tmin, tmax): - self.Tmin = tmin - self.Tmax = tmax - - def SetSalinityRange(self, smin, smax): - self.Smin = smin - self.Smax = smax - - def BuildQuery(self): - q = bufr.QuerySet() - q.add('year', '*/YEAR') - q.add('month', '*/MNTH') - q.add('day', '*/DAYS') - q.add('hour', '*/HOUR') - q.add('minute', '*/MINU') - q.add('ryear', '*/RCYR') - q.add('rmonth', '*/RCMO') - q.add('rday', '*/RCDY') - q.add('rhour', '*/RCHR') - q.add('rminute', '*/RCMI') - return q - - def SetDatesFromQueryResult(self, r): - self.dateTime = r.get_datetime('year', 'month', 'day', 'hour', 'minute', group_by='depth') - self.dateTime = self.dateTime.astype(np.int64) - - self.rcptdateTime = r.get_datetime('ryear', 'rmonth', 'rday', 'rhour', 'rminute', group_by='depth') - self.rcptdateTime = self.rcptdateTime.astype(np.int64) - - def SetLonLatFromQueryResult(self, r): - self.lat = r.get('latitude', group_by='depth') - self.lon = r.get('longitude', group_by='depth') - - def SetObsFromQueryResult(self, r): - self.temp = r.get('temp', group_by='depth') - self.temp -= 273.15 - self.saln = r.get('saln', group_by='depth') - - def SetFromQueryResult(self, r): - self.SetDatesFromQueryResult(r) - self.SetLonLatFromQueryResult(r) - self.stationID = r.get('stationID', group_by='depth') - self.depth = r.get('depth', group_by='depth') - self.SetObsFromQueryResult(r) - - def TemperatureFilter(self): - return (self.temp > self.Tmin) & (self.temp <= self.Tmax) - - def SalinityFilter(self): - return (self.saln >= self.Smin) & (self.saln <= self.Smax) - - def filter(self): - pass - - def SetAdditionalData(self): - self.seqNum = Compute_sequenceNumber(self.lon) - self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) - self.ObsError_temp = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorT))) - self.ObsError_saln = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) - - def createIODAVars(self, obsspace): - WriteDateTime(obsspace, self.dateTime) - WriteRcptDateTime(obsspace, self.rcptdateTime) - WriteLongitude(obsspace, self.lon) - WriteLatitude(obsspace, self.lat) - - def WritePreQC(self, obsspace, name): - obsspace.create_var("PreQC/" + name, dtype=self.PreQC.dtype, fillval=self.PreQC.fill_value) \ - .write_attr('long_name', 'PreQC') \ - .write_data(self.PreQC) - - def WriteObsValueT(self, obsspace, v_name): - obsspace.create_var('ObsValue/' + v_name, dtype=self.temp.dtype, fillval=self.temp.fill_value) \ - .write_attr('units', 'degC') \ - .write_attr('valid_range', np.array([self.Tmin, self.Tmax], dtype=np.float32)) \ - .write_attr('long_name', v_name) \ - .write_data(self.temp) - - def WriteObsValueS(self, obsspace, v_name): - obsspace.create_var( - 'ObsValue/' + v_name, - dtype=self.saln.dtype, - fillval=self.saln.fill_value - ) \ - .write_attr('units', 'psu') \ - .write_attr('valid_range', np.array([self.Smin, self.Smax], dtype=np.float32)) \ - .write_attr('long_name', v_name) \ - .write_data(self.saln) - -############################################################################## - - def logTemperature(self, logger): - logger.debug(f" temp min, max, length, dtype = {self.temp.min()}, {self.temp.max()}, {len(self.temp)}, {self.temp.dtype}") - - def logSalinity(self, logger): - logger.debug(f" saln min, max, length, dtype = {self.saln.min()}, {self.saln.max()}, {len(self.saln)}, {self.saln.dtype}") - - def logLonLat(self, logger): - logger.debug(f" lon min, max, length, dtype = {self.lon.min()}, {self.lon.max()}, {len(self.lon)}, {self.lon.dtype}") - logger.debug(f" lat min, max, length, dtype = {self.lat.min()}, {self.lat.max()}, {len(self.lat)}, {self.lat.dtype}") - - def logDates(self, logger): - logger.debug(f" dateTime shape, dtype = {self.dateTime.shape}, {self.dateTime.dtype}") - logger.debug(f" rcptdateTime shape, dytpe = {self.rcptdateTime.shape}, {self.rcptdateTime.dtype}") - - def logStationID(self, logger): - logger.debug(f" stationID shape, dtype = {self.stationID.shape}, {self.stationID.astype(str).dtype}") - - def logDepth(self, logger): - logger.debug(f" depth min, max, length, dtype = {self.depth.min()}, {self.depth.max()}, {len(self.depth)}, {self.depth.dtype}") - - def LogSeqNum(self, logger): - logger.debug(f" sequence Num shape, dtype = {self.seqNum.shape}, {self.seqNum.dtype}") - - def LogPreQC(self, logger): - logger.debug(f" PreQC min, max, length, dtype = \ - {self.PreQC.min()}, \ - {self.PreQC.max()}, \ - {len(self.PreQC)}, \ - {self.PreQC.dtype}") - - def LogObsError_temp(self, logger): - logger.debug(f" ObsError_temp min, max, length, dtype = \ - {self.ObsError_temp.min()}, \ - {self.ObsError_temp.max()}, \ - {len(self.ObsError_temp)}, \ - {self.ObsError_temp.dtype}") - - def LogObsError_saln(self, logger): - logger.debug(f" ObsError_saln min, max, length, dtype = \ - {self.ObsError_saln.min()}, \ - {self.ObsError_saln.max()}, \ - {len(self.ObsError_saln)}, \ - {self.ObsError_saln.dtype}") - - def logMetadata(self, logger): - self.logDates(logger) - self.logLonLat(logger) - self.logDepth(logger) - self.logStationID(logger) - - def logObs(self, logger): - self.logTemperature(logger) - self.logSalinity(logger) - - def logAdditionalData(self, logger): - self.LogSeqNum(logger) - self.LogPreQC(logger) - self.LogObsError_temp(logger) - self.LogObsError_saln(logger) - - def log(self, logger): - self.logMetadata(logger) - self.logObs(logger) - self.logAdditionalData(logger) - -##################################################################### - - -def WriteDateTime(obsspace, dateTime): - obsspace.create_var( - 'MetaData/dateTime', - dtype=dateTime.dtype, fillval=dateTime.fill_value - ) \ - .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ - .write_attr('long_name', 'Datetime') \ - .write_data(dateTime) - - -def WriteRcptDateTime(obsspace, rcptdateTime): - obsspace.create_var( - 'MetaData/rcptdateTime', - dtype=rcptdateTime.dtype, fillval=rcptdateTime.fill_value - ) \ - .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ - .write_attr('long_name', 'receipt Datetime') \ - .write_data(rcptdateTime) - - -def WriteLongitude(obsspace, lon): - obsspace.create_var( - 'MetaData/longitude', - dtype=lon.dtype, fillval=lon.fill_value - ) \ - .write_attr('units', 'degrees_east') \ - .write_attr('valid_range', np.array([-180, 180], dtype=np.float32)) \ - .write_attr('long_name', 'Longitude') \ - .write_data(lon) - - -def WriteLatitude(obsspace, lat): - obsspace.create_var( - 'MetaData/latitude', - dtype=lat.dtype, fillval=lat.fill_value - ) \ - .write_attr('units', 'degrees_north') \ - .write_attr('valid_range', np.array([-90, 90], dtype=np.float32)) \ - .write_attr('long_name', 'Latitude') \ - .write_data(lat) - - -def WriteStationID(obsspace, stationID): - obsspace.create_var( - 'MetaData/stationID', - dtype=stationID.dtype, fillval=stationID.fill_value - ) \ - .write_attr('long_name', 'Station Identification') \ - .write_data(stationID) - - -def WriteDepth(obsspace, depth): - obsspace.create_var( - 'MetaData/depth', - dtype=depth.dtype, - fillval=depth.fill_value - ) \ - .write_attr('units', 'm') \ - .write_attr('long_name', 'Water depth') \ - .write_data(depth) - - -def WriteSequenceNumber(obsspace, seqNum, PreQC): - obsspace.create_var( - 'MetaData/sequenceNumber', - dtype=PreQC.dtype, - fillval=PreQC.fill_value - ) \ - .write_attr('long_name', 'Sequence Number') \ - .write_data(seqNum) - - -def WriteObsError(obsspace, v_name, units, v): - obsspace.create_var( - v_name, - dtype=v.dtype, fillval=v.fill_value - ) \ - .write_attr('units', units) \ - .write_attr('long_name', 'ObsError') \ - .write_data(v) diff --git a/ush/ioda/bufr2ioda/marine/b2i/util.py b/ush/ioda/bufr2ioda/marine/b2i/util.py deleted file mode 100644 index 36273c0aa..000000000 --- a/ush/ioda/bufr2ioda/marine/b2i/util.py +++ /dev/null @@ -1,140 +0,0 @@ -import os -import sys -import argparse -import subprocess -import numpy as np -import tempfile - - -def ParseArguments(): - parser = argparse.ArgumentParser() - parser.add_argument( - '-c', '--config', - type=str, - help='Input JSON or YAML configuration', required=True - ) - parser.add_argument( - '-l', '--log_file', - type=str, - help='Output file for testing ioda variables' - ) - parser.add_argument( - '-t', '--test', - type=str, - help='Input test reference file' - ) - - args = parser.parse_args() - config_file = args.config - log_file = args.log_file - test_file = args.test - script_name = sys.argv[0] - return script_name, config_file, log_file, test_file - - -def run_diff(file1, file2): - # log this.... - # print("running diff on: ") - # print("file 1 = ", file1) - # print("file 2 = ", file2) - - try: - # Run the diff command - result = subprocess.run( - ['diff', file1, file2], - capture_output=True, text=True, check=False - ) - - # Check if diff command succeeded (return code 0) - if result.returncode == 0: - print("Files are identical.") - elif result.returncode == 1: - # Print the difference if files are different - print("Files are different:") - print(result.stdout) - else: - print("Error occurred while running diff command.") - print(result.stderr) - - except subprocess.CalledProcessError as e: - print(f"Error occurred: {e}") - - return result.returncode - - -def run_diff_script_inline(file1, file2, script_content): - try: - # Create a temporary script file with the provided content - script_path = '/tmp/temp_script.sh' - with open(script_path, 'w') as f: - f.write(script_content) - - # Make the script executable - subprocess.run(['chmod', '+x', script_path], check=True) - - # Construct the command to run the temporary script - command = [script_path, file1, file2] - - # Run the script and capture the output - result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, text=True) - - # Return the output of the script (which is assumed to be the result of the diff) - return result.stdout - - except subprocess.CalledProcessError as e: - print(f"Error running script: {e}") - return None - except Exception as e: - print(f"Error: {e}") - return None - finally: - # Clean up: delete the temporary script file - try: - subprocess.run(['rm', '-f', script_path]) - except Exception as e: - print(f"Error cleaning up temp script: {e}") - - -def Compute_sequenceNumber(lon): - lon_u, seqNum = np.unique(lon, return_inverse=True) - seqNum = seqNum.astype(np.int32) - # logger.debug(f"Len of Sequence Number: {len(seqNum)}") - return seqNum - - -def nc_diff(file1, file2): - try: - script_content = ''' -#!/bin/bash -diff <(ncdump "$1"| sed '1d') <(ncdump "$2"|sed '1d') -''' - - # Create a temporary script file with the provided content - with tempfile.NamedTemporaryFile(delete=False, mode='w') as temp_script: - temp_script.write(script_content.lstrip()) # Remove leading indentation - - # Make the script executable - os.chmod(temp_script.name, 0o755) # Make it executable for owner - - # Construct the command to run the temporary script - command = ['bash', temp_script.name, file1, file2] - - # result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, text=True) - result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - return result.returncode - # return result.stdout - - except subprocess.CalledProcessError as e: - print(f"Error running script: {e}") - # print(f"Script stderr: {e.stderr}") - return None - except Exception as e: - print(f"Error: {e}") - return None - finally: - # Clean up: delete the temporary script file - try: - os.remove(temp_script.name) - except Exception as e: - print(f"Error cleaning up temp script: {e}") From c47ab214d38de5b291f756331572f86d7766220b Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Thu, 8 Aug 2024 21:38:41 +0000 Subject: [PATCH 37/54] fixed converter naming scheme --- test/soca/CMakeLists.txt | 28 ++++++++++--------- ...2ioda_insitu_profile_argo_2021063006.json} | 0 ...ioda_insitu_profile_bathy_2021063006.json} | 0 ...oda_insitu_profile_glider_2021063006.json} | 0 ...ioda_insitu_profile_tesac_2021063006.json} | 0 ...oda_insitu_profile_xbtctd_2021063006.json} | 0 ...ioda_insitu_surface_trkob_2021063006.json} | 0 ...r2ioda_insitu_profile_argo_2021063006.ref} | 0 ...2ioda_insitu_profile_bathy_2021063006.ref} | 0 ...ioda_insitu_profile_glider_2021063006.ref} | 0 ...2ioda_insitu_profile_tesac_2021063006.ref} | 0 ...ioda_insitu_profile_xbtctd_2021063006.ref} | 0 ...2ioda_insitu_surface_trkob_2021063006.ref} | 0 13 files changed, 15 insertions(+), 13 deletions(-) rename test/soca/testinput/{insitu_ARGO_2021063006.json => bufr2ioda_insitu_profile_argo_2021063006.json} (100%) rename test/soca/testinput/{insitu_BATHY_2021063006.json => bufr2ioda_insitu_profile_bathy_2021063006.json} (100%) rename test/soca/testinput/{insitu_GLIDER_2021063006.json => bufr2ioda_insitu_profile_glider_2021063006.json} (100%) rename test/soca/testinput/{insitu_TESAC_2021063006.json => bufr2ioda_insitu_profile_tesac_2021063006.json} (100%) rename test/soca/testinput/{insitu_XBTCTD_2021063006.json => bufr2ioda_insitu_profile_xbtctd_2021063006.json} (100%) rename test/soca/testinput/{insitu_TRKOB_2021063006.json => bufr2ioda_insitu_surface_trkob_2021063006.json} (100%) rename test/soca/testref/{insitu_ARGO_2021063006.ref => bufr2ioda_insitu_profile_argo_2021063006.ref} (100%) rename test/soca/testref/{insitu_BATHY_2021063006.ref => bufr2ioda_insitu_profile_bathy_2021063006.ref} (100%) rename test/soca/testref/{insitu_GLIDER_2021063006.ref => bufr2ioda_insitu_profile_glider_2021063006.ref} (100%) rename test/soca/testref/{insitu_TESAC_2021063006.ref => bufr2ioda_insitu_profile_tesac_2021063006.ref} (100%) rename test/soca/testref/{insitu_XBTCTD_2021063006.ref => bufr2ioda_insitu_profile_xbtctd_2021063006.ref} (100%) rename test/soca/testref/{insitu_TRKOB_2021063006.ref => bufr2ioda_insitu_surface_trkob_2021063006.ref} (100%) diff --git a/test/soca/CMakeLists.txt b/test/soca/CMakeLists.txt index d8cae9e12..2840bf310 100644 --- a/test/soca/CMakeLists.txt +++ b/test/soca/CMakeLists.txt @@ -9,7 +9,7 @@ set(TESTDATA ${PROJECT_BINARY_DIR}/test/testdata ) set (TESTINPUT_DIR ${PROJECT_BINARY_DIR}/test/soca/testinput) file(MAKE_DIRECTORY ${TESTINPUT_DIR}) -message(">>>>>>>>>>>>>>>>>>>>>>> created ${TESTINPUT_DIR}") +# message(">>>>>>>>>>>>>>>>>>>>>>> created ${TESTINPUT_DIR}") # symlink foreach(FILENAME ${test_input}) @@ -49,14 +49,14 @@ set(CONFIG_DIR ${PROJECT_SOURCE_DIR}/test/soca/testinput) set(TESTREF_DIR ${PROJECT_SOURCE_DIR}/test/soca/testref) function(ADD_INSITU_TEST testname) - # set(TEST insitu_${testname}) - set(TEST ${testname}) - message(".....................adding test ${TEST}") - set(CONFIG_FILE insitu_${TEST}_2021063006.json) - set(TESTREF_FILE insitu_${TEST}_2021063006.ref) + set(TEST bufr2ioda_insitu_${testname}) + # set(TEST ${testname}) + # message(".....................adding test ${TEST}") + set(CONFIG_FILE ${TEST}_2021063006.json) + set(TESTREF_FILE ${TEST}_2021063006.ref) add_test( - NAME test_insitu_bufr2ioda_${TEST} + NAME test_${TEST} COMMAND ${MARINE_BUFR2IODA_DIR}/${TEST}.py -c ${CONFIG_DIR}/${CONFIG_FILE} -t ${TESTREF_DIR}/${TESTREF_FILE} WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/test/soca ) @@ -64,10 +64,12 @@ endfunction() # ADD_INSITU_TEST(ALTKOB) -ADD_INSITU_TEST(ARGO) -ADD_INSITU_TEST(BATHY) -ADD_INSITU_TEST(GLIDER) -ADD_INSITU_TEST(TESAC) -ADD_INSITU_TEST(XBTCTD) -ADD_INSITU_TEST(TRKOB) +ADD_INSITU_TEST(profile_argo) +ADD_INSITU_TEST(profile_bathy) +ADD_INSITU_TEST(profile_glider) +# ADD_INSITU_TEST(profile_marinemammal) +ADD_INSITU_TEST(profile_tesac) +ADD_INSITU_TEST(profile_xbtctd) +# ADD_INSITU_TEST(surface_altkob) +ADD_INSITU_TEST(surface_trkob) diff --git a/test/soca/testinput/insitu_ARGO_2021063006.json b/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json similarity index 100% rename from test/soca/testinput/insitu_ARGO_2021063006.json rename to test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json diff --git a/test/soca/testinput/insitu_BATHY_2021063006.json b/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json similarity index 100% rename from test/soca/testinput/insitu_BATHY_2021063006.json rename to test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json diff --git a/test/soca/testinput/insitu_GLIDER_2021063006.json b/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json similarity index 100% rename from test/soca/testinput/insitu_GLIDER_2021063006.json rename to test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json diff --git a/test/soca/testinput/insitu_TESAC_2021063006.json b/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json similarity index 100% rename from test/soca/testinput/insitu_TESAC_2021063006.json rename to test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json diff --git a/test/soca/testinput/insitu_XBTCTD_2021063006.json b/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json similarity index 100% rename from test/soca/testinput/insitu_XBTCTD_2021063006.json rename to test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json diff --git a/test/soca/testinput/insitu_TRKOB_2021063006.json b/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json similarity index 100% rename from test/soca/testinput/insitu_TRKOB_2021063006.json rename to test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json diff --git a/test/soca/testref/insitu_ARGO_2021063006.ref b/test/soca/testref/bufr2ioda_insitu_profile_argo_2021063006.ref similarity index 100% rename from test/soca/testref/insitu_ARGO_2021063006.ref rename to test/soca/testref/bufr2ioda_insitu_profile_argo_2021063006.ref diff --git a/test/soca/testref/insitu_BATHY_2021063006.ref b/test/soca/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref similarity index 100% rename from test/soca/testref/insitu_BATHY_2021063006.ref rename to test/soca/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref diff --git a/test/soca/testref/insitu_GLIDER_2021063006.ref b/test/soca/testref/bufr2ioda_insitu_profile_glider_2021063006.ref similarity index 100% rename from test/soca/testref/insitu_GLIDER_2021063006.ref rename to test/soca/testref/bufr2ioda_insitu_profile_glider_2021063006.ref diff --git a/test/soca/testref/insitu_TESAC_2021063006.ref b/test/soca/testref/bufr2ioda_insitu_profile_tesac_2021063006.ref similarity index 100% rename from test/soca/testref/insitu_TESAC_2021063006.ref rename to test/soca/testref/bufr2ioda_insitu_profile_tesac_2021063006.ref diff --git a/test/soca/testref/insitu_XBTCTD_2021063006.ref b/test/soca/testref/bufr2ioda_insitu_profile_xbtctd_2021063006.ref similarity index 100% rename from test/soca/testref/insitu_XBTCTD_2021063006.ref rename to test/soca/testref/bufr2ioda_insitu_profile_xbtctd_2021063006.ref diff --git a/test/soca/testref/insitu_TRKOB_2021063006.ref b/test/soca/testref/bufr2ioda_insitu_surface_trkob_2021063006.ref similarity index 100% rename from test/soca/testref/insitu_TRKOB_2021063006.ref rename to test/soca/testref/bufr2ioda_insitu_surface_trkob_2021063006.ref From e94fd52856d2dad988a81d3fef6f5e6230319e31 Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Thu, 8 Aug 2024 21:44:24 +0000 Subject: [PATCH 38/54] fixed converter naming scheme --- .../testref/bufr2ioda_insitu_profile_argo_2021063006.ref | 6 +++--- .../testref/bufr2ioda_insitu_profile_bathy_2021063006.ref | 2 +- .../testref/bufr2ioda_insitu_profile_glider_2021063006.ref | 6 +++--- .../testref/bufr2ioda_insitu_profile_tesac_2021063006.ref | 6 +++--- .../testref/bufr2ioda_insitu_profile_xbtctd_2021063006.ref | 6 +++--- .../testref/bufr2ioda_insitu_surface_trkob_2021063006.ref | 6 +++--- ush/ioda/bufr2ioda/marine/b2i/TODO | 2 -- .../b2i/{ARGO.py => bufr2ioda_insitu_profile_argo.py} | 0 .../b2i/{BATHY.py => bufr2ioda_insitu_profile_bathy.py} | 0 .../b2i/{GLIDER.py => bufr2ioda_insitu_profile_glider.py} | 0 ...NEMAMMAL.py => bufr2ioda_insitu_profile_marinemammal.py} | 0 .../b2i/{TESAC.py => bufr2ioda_insitu_profile_tesac.py} | 0 .../b2i/{XBTCTD.py => bufr2ioda_insitu_profile_xbtctd.py} | 0 .../b2i/{ALTKOB.py => bufr2ioda_insitu_surface_altkob.py} | 0 .../b2i/{TRKOB.py => bufr2ioda_insitu_surface_trkob.py} | 0 15 files changed, 16 insertions(+), 18 deletions(-) delete mode 100644 ush/ioda/bufr2ioda/marine/b2i/TODO rename ush/ioda/bufr2ioda/marine/b2i/{ARGO.py => bufr2ioda_insitu_profile_argo.py} (100%) rename ush/ioda/bufr2ioda/marine/b2i/{BATHY.py => bufr2ioda_insitu_profile_bathy.py} (100%) rename ush/ioda/bufr2ioda/marine/b2i/{GLIDER.py => bufr2ioda_insitu_profile_glider.py} (100%) rename ush/ioda/bufr2ioda/marine/b2i/{MARINEMAMMAL.py => bufr2ioda_insitu_profile_marinemammal.py} (100%) rename ush/ioda/bufr2ioda/marine/b2i/{TESAC.py => bufr2ioda_insitu_profile_tesac.py} (100%) rename ush/ioda/bufr2ioda/marine/b2i/{XBTCTD.py => bufr2ioda_insitu_profile_xbtctd.py} (100%) rename ush/ioda/bufr2ioda/marine/b2i/{ALTKOB.py => bufr2ioda_insitu_surface_altkob.py} (100%) rename ush/ioda/bufr2ioda/marine/b2i/{TRKOB.py => bufr2ioda_insitu_surface_trkob.py} (100%) diff --git a/test/soca/testref/bufr2ioda_insitu_profile_argo_2021063006.ref b/test/soca/testref/bufr2ioda_insitu_profile_argo_2021063006.ref index bc91c7b5c..9d0e4e91f 100644 --- a/test/soca/testref/bufr2ioda_insitu_profile_argo_2021063006.ref +++ b/test/soca/testref/bufr2ioda_insitu_profile_argo_2021063006.ref @@ -7,6 +7,6 @@ temp min, max, length, dtype = -1.817999243736267, 31.73198890686035, 97150, float32 saln min, max, length, dtype = 0.0, 42.47999954223633, 97150, float32 sequence Num shape, dtype = (97150,), int32 - PreQC min, max, length, dtype = 0, 0, 97150, int32 - ObsError_temp min, max, length, dtype = 0.019999999552965164, 0.019999999552965164, 97150, float32 - ObsError_saln min, max, length, dtype = 0.009999999776482582, 0.009999999776482582, 97150, float32 + PreQC min, max, length, dtype = 0, 0, 97150, int32 + ObsError_temp min, max, length, dtype = 0.019999999552965164, 0.019999999552965164, 97150, float32 + ObsError_saln min, max, length, dtype = 0.009999999776482582, 0.009999999776482582, 97150, float32 diff --git a/test/soca/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref b/test/soca/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref index 12661465f..f2b704187 100644 --- a/test/soca/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref +++ b/test/soca/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref @@ -6,4 +6,4 @@ stationID shape, dtype = (1751,), Date: Fri, 9 Aug 2024 19:24:29 +0000 Subject: [PATCH 39/54] Passed all tests. --- test/soca/CMakeLists.txt | 6 - .../b2i/b2iconverter/bufr2ioda_converter.py | 2 +- .../bufr2ioda/marine/b2i/b2iconverter/util.py | 103 +++--------------- 3 files changed, 14 insertions(+), 97 deletions(-) diff --git a/test/soca/CMakeLists.txt b/test/soca/CMakeLists.txt index 2840bf310..f34a7dfb8 100644 --- a/test/soca/CMakeLists.txt +++ b/test/soca/CMakeLists.txt @@ -9,7 +9,6 @@ set(TESTDATA ${PROJECT_BINARY_DIR}/test/testdata ) set (TESTINPUT_DIR ${PROJECT_BINARY_DIR}/test/soca/testinput) file(MAKE_DIRECTORY ${TESTINPUT_DIR}) -# message(">>>>>>>>>>>>>>>>>>>>>>> created ${TESTINPUT_DIR}") # symlink foreach(FILENAME ${test_input}) @@ -45,13 +44,10 @@ ENVIRONMENT "data=${TESTDATA};PYTHONPATH=${PROJECT_BINARY_DIR}/ush:$ENV{PYTHONPA set(MARINE_BUFR2IODA_DIR ${PROJECT_SOURCE_DIR}/ush/ioda/bufr2ioda/marine) set(MARINE_BUFR2IODA_DIR ${MARINE_BUFR2IODA_DIR}/b2i) set(CONFIG_DIR ${PROJECT_SOURCE_DIR}/test/soca/testinput) -# set(TESTREF_DIR ${PROJECT_BINARY_DIR}/test/soca/testref) set(TESTREF_DIR ${PROJECT_SOURCE_DIR}/test/soca/testref) function(ADD_INSITU_TEST testname) set(TEST bufr2ioda_insitu_${testname}) - # set(TEST ${testname}) - # message(".....................adding test ${TEST}") set(CONFIG_FILE ${TEST}_2021063006.json) set(TESTREF_FILE ${TEST}_2021063006.ref) @@ -63,7 +59,6 @@ function(ADD_INSITU_TEST testname) endfunction() -# ADD_INSITU_TEST(ALTKOB) ADD_INSITU_TEST(profile_argo) ADD_INSITU_TEST(profile_bathy) ADD_INSITU_TEST(profile_glider) @@ -72,4 +67,3 @@ ADD_INSITU_TEST(profile_tesac) ADD_INSITU_TEST(profile_xbtctd) # ADD_INSITU_TEST(surface_altkob) ADD_INSITU_TEST(surface_trkob) - diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py index 1391af034..cbf02383b 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py @@ -105,7 +105,7 @@ def test(self, test_file): self.ioda_vars.log(self.logger) - result = run_diff(temp_log_file_name, test_file) + result = run_diff(temp_log_file_name, test_file, self.logger) if result: self.logger.error(f"TEST ERROR: files are different") else: diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py index 36273c0aa..9d990f76f 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py @@ -32,12 +32,14 @@ def ParseArguments(): return script_name, config_file, log_file, test_file -def run_diff(file1, file2): - # log this.... - # print("running diff on: ") - # print("file 1 = ", file1) - # print("file 2 = ", file2) +def Compute_sequenceNumber(lon): + lon_u, seqNum = np.unique(lon, return_inverse=True) + seqNum = seqNum.astype(np.int32) + # logger.debug(f"Len of Sequence Number: {len(seqNum)}") + return seqNum + +def run_diff(file1, file2, logger): try: # Run the diff command result = subprocess.run( @@ -47,94 +49,15 @@ def run_diff(file1, file2): # Check if diff command succeeded (return code 0) if result.returncode == 0: - print("Files are identical.") + pass elif result.returncode == 1: - # Print the difference if files are different - print("Files are different:") - print(result.stdout) + logger.error("Files are different:") + logger.error(f"{result.stdout}") else: - print("Error occurred while running diff command.") - print(result.stderr) + logger.error("Error occurred while running diff command.") + logger.error(f"{result.stdout}") except subprocess.CalledProcessError as e: - print(f"Error occurred: {e}") + logger.error(f"Error occurred: {e}") return result.returncode - - -def run_diff_script_inline(file1, file2, script_content): - try: - # Create a temporary script file with the provided content - script_path = '/tmp/temp_script.sh' - with open(script_path, 'w') as f: - f.write(script_content) - - # Make the script executable - subprocess.run(['chmod', '+x', script_path], check=True) - - # Construct the command to run the temporary script - command = [script_path, file1, file2] - - # Run the script and capture the output - result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, text=True) - - # Return the output of the script (which is assumed to be the result of the diff) - return result.stdout - - except subprocess.CalledProcessError as e: - print(f"Error running script: {e}") - return None - except Exception as e: - print(f"Error: {e}") - return None - finally: - # Clean up: delete the temporary script file - try: - subprocess.run(['rm', '-f', script_path]) - except Exception as e: - print(f"Error cleaning up temp script: {e}") - - -def Compute_sequenceNumber(lon): - lon_u, seqNum = np.unique(lon, return_inverse=True) - seqNum = seqNum.astype(np.int32) - # logger.debug(f"Len of Sequence Number: {len(seqNum)}") - return seqNum - - -def nc_diff(file1, file2): - try: - script_content = ''' -#!/bin/bash -diff <(ncdump "$1"| sed '1d') <(ncdump "$2"|sed '1d') -''' - - # Create a temporary script file with the provided content - with tempfile.NamedTemporaryFile(delete=False, mode='w') as temp_script: - temp_script.write(script_content.lstrip()) # Remove leading indentation - - # Make the script executable - os.chmod(temp_script.name, 0o755) # Make it executable for owner - - # Construct the command to run the temporary script - command = ['bash', temp_script.name, file1, file2] - - # result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, text=True) - result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - return result.returncode - # return result.stdout - - except subprocess.CalledProcessError as e: - print(f"Error running script: {e}") - # print(f"Script stderr: {e.stderr}") - return None - except Exception as e: - print(f"Error: {e}") - return None - finally: - # Clean up: delete the temporary script file - try: - os.remove(temp_script.name) - except Exception as e: - print(f"Error cleaning up temp script: {e}") From 15eb0692298ee8a81418d3bacc342477f8eb0416 Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Fri, 9 Aug 2024 19:29:11 +0000 Subject: [PATCH 40/54] updated bufr2ioda_insitu_surface_altkob.py --- .../bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_altkob.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_altkob.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_altkob.py index 422040fc0..39cebda0c 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_altkob.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_altkob.py @@ -1,13 +1,12 @@ #!/usr/bin/env python3 -import sys +import sys from altkob_ioda_variables import AltkobIODAVariables from b2iconverter.util import ParseArguments from b2iconverter.bufr2ioda_config import Bufr2iodaConfig from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter - class AltkobConfig(Bufr2iodaConfig): def IODAFilename(self): return f"{self.cycle_type}.t{self.hh}z.{self.data_type}_profiles.{self.data_format}.nc4" From 39df6d3df02f215bfd9fbba403b751793f00e45d Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Mon, 12 Aug 2024 21:16:32 +0000 Subject: [PATCH 41/54] updated obs var names --- .../marine/b2i/altkob_ioda_variables.py | 16 ++-- .../marine/b2i/argo_ioda_variables.py | 14 ---- .../marine/b2i/b2iconverter/ioda_variables.py | 74 ++++++++++++------- .../marine/b2i/bathy_ioda_variables.py | 7 +- .../b2i/bufr2ioda_insitu_profile_argo.py | 2 + .../b2i/bufr2ioda_insitu_profile_bathy.py | 1 + .../b2i/bufr2ioda_insitu_profile_glider.py | 2 + .../bufr2ioda_insitu_profile_marinemammal.py | 2 + .../b2i/bufr2ioda_insitu_profile_tesac.py | 2 + .../b2i/bufr2ioda_insitu_profile_xbtctd.py | 2 + .../b2i/bufr2ioda_insitu_surface_altkob.py | 2 + .../b2i/bufr2ioda_insitu_surface_trkob.py | 2 + .../marine/b2i/glider_ioda_variables.py | 17 +---- .../marine/b2i/marinemammal_ioda_variables.py | 13 ---- .../marine/b2i/tesac_ioda_variables.py | 17 +---- .../marine/b2i/trkob_ioda_variables.py | 18 ++--- .../marine/b2i/xbtctd_ioda_variables.py | 13 ---- 17 files changed, 85 insertions(+), 119 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py index 127c650cb..69afc30a9 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py @@ -42,16 +42,14 @@ def SetAdditionalData(self): np.float32(np.ma.masked_array(np.full((self.n_obs), self.ErrorS))) def createIODAVars(self, obsspace): - super().createIODAVars(obsspace) + self.WriteBasicMetadata(obsspace) # BUG: StationID is undefined self.WriteStationID(obsspace) - self.WritePreQC(obsspace, "seaSurfaceTemperature") - self.WritePreQC(obsspace, "seaSurfaceSalinity") - - self.WriteObsErrorT(obsspace, "seaSurfaceTemperature") - self.WriteObsErrorS(obsspace, "seaSurfaceSalinity") - - self.WriteObsValueT(obsspace, 'seaSurfaceTemperature') - self.WriteObsValueS(obsspace, 'seaSurfaceSalinity') + self.WritePreQC(obsspace, self.T_name) + self.WritePreQC(obsspace, self.S_name) + self.WriteObsErrorT(obsspace) + self.WriteObsErrorS(obsspace) + self.WriteObsValueT(obsspace) + self.WriteObsValueS(obsspace) diff --git a/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py index 0d028017e..bd1571d4d 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py @@ -59,17 +59,3 @@ def filter(self): self.seqNum = self.seqNum[index_list] self.dateTime = self.dateTime[index_list] self.rcptdateTime = self.rcptdateTime[index_list] - - def createIODAVars(self, obsspace): - super().createIODAVars(obsspace) - - self.WriteStationID(obsspace) - self.WriteDepth(obsspace) - self.WriteSequenceNumber(obsspace) - - self.WritePreQC(obsspace, "waterTemperature") - self.WritePreQC(obsspace, "salinity") - self.WriteObsErrorT(obsspace, "waterTemperature") - self.WriteObsErrorS(obsspace, "salinity") - self.WriteObsValueT(obsspace, 'waterTemperature') - self.WriteObsValueS(obsspace, 'salinity') diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py index a277beebe..d4f512963 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py @@ -6,24 +6,30 @@ class IODAVariables: def __init__(self): self.n_obs = 0 - self.errorT = 0.0 - self.errorS = 0.0 + self.T_error = 0.0 + self.S_error = 0.0 self.SetTemperatureRange(-10.0, 50.0) self.SetSalinityRange(0.0, 45.0) - def SetTemperatureError(self, e): - self.errorT = e + def SetTemperatureVarName(self, name): + self.T_name = name - def SetSalinityError(self, e): - self.errorS = e + def SetTemperatureError(self, e): + self.T_error = e def SetTemperatureRange(self, tmin, tmax): - self.Tmin = tmin - self.Tmax = tmax + self.T_min = tmin + self.T_max = tmax + + def SetSalinityVarName(self, name): + self.S_name = name + + def SetSalinityError(self, e): + self.S_error = e def SetSalinityRange(self, smin, smax): - self.Smin = smin - self.Smax = smax + self.S_min = smin + self.S_max = smax def BuildQuery(self): q = bufr.QuerySet() @@ -63,10 +69,10 @@ def SetFromQueryResult(self, r): self.SetObsFromQueryResult(r) def TemperatureFilter(self): - return (self.temp > self.Tmin) & (self.temp <= self.Tmax) + return (self.temp > self.T_min) & (self.temp <= self.T_max) def SalinityFilter(self): - return (self.saln >= self.Smin) & (self.saln <= self.Smax) + return (self.saln >= self.S_min) & (self.saln <= self.S_max) def filter(self): pass @@ -75,9 +81,9 @@ def SetAdditionalData(self): self.seqNum = Compute_sequenceNumber(self.lon) self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) self.ObsError_temp = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorT))) + np.float32(np.ma.masked_array(np.full((self.n_obs), self.T_error))) self.ObsError_saln = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) + np.float32(np.ma.masked_array(np.full((self.n_obs), self.S_error))) def WriteDateTime(self, obsspace): WriteDateTime(obsspace, self.dateTime) @@ -91,40 +97,54 @@ def WriteDepth(self, obsspace): def WriteSequenceNumber(self, obsspace): WriteSequenceNumber(obsspace, self.seqNum, self.PreQC) - def createIODAVars(self, obsspace): + def WriteBasicMetadata(self, obsspace): WriteDateTime(obsspace, self.dateTime) WriteRcptDateTime(obsspace, self.rcptdateTime) WriteLongitude(obsspace, self.lon) WriteLatitude(obsspace, self.lat) + def createIODAVars(self, obsspace): + self.WriteBasicMetadata(obsspace) + self.WriteStationID(obsspace) + self.WriteDepth(obsspace) + self.WriteSequenceNumber(obsspace) + + self.WritePreQC(obsspace, self.T_name) + self.WritePreQC(obsspace, self.S_name) + self.WriteObsErrorT(obsspace) + self.WriteObsErrorS(obsspace) + self.WriteObsValueT(obsspace) + self.WriteObsValueS(obsspace) + + def WritePreQC(self, obsspace, name): obsspace.create_var("PreQC/" + name, dtype=self.PreQC.dtype, fillval=self.PreQC.fill_value) \ .write_attr('long_name', 'PreQC') \ .write_data(self.PreQC) - def WriteObsValueT(self, obsspace, v_name): - obsspace.create_var('ObsValue/' + v_name, dtype=self.temp.dtype, fillval=self.temp.fill_value) \ + def WriteObsValueT(self, obsspace): + obsspace.create_var('ObsValue/' + self.T_name, dtype=self.temp.dtype, fillval=self.temp.fill_value) \ .write_attr('units', 'degC') \ - .write_attr('valid_range', np.array([self.Tmin, self.Tmax], dtype=np.float32)) \ - .write_attr('long_name', v_name) \ + .write_attr('valid_range', np.array([self.T_min, self.T_max], dtype=np.float32)) \ + .write_attr('long_name', self.T_name) \ .write_data(self.temp) - def WriteObsValueS(self, obsspace, v_name): + def WriteObsValueS(self, obsspace): obsspace.create_var( - 'ObsValue/' + v_name, + 'ObsValue/' + self.S_name, dtype=self.saln.dtype, fillval=self.saln.fill_value ) \ .write_attr('units', 'psu') \ - .write_attr('valid_range', np.array([self.Smin, self.Smax], dtype=np.float32)) \ - .write_attr('long_name', v_name) \ + .write_attr('valid_range', np.array([self.S_min, self.S_max], dtype=np.float32)) \ + .write_attr('long_name', self.S_name) \ .write_data(self.saln) - def WriteObsErrorT(self, obsspace, v_name): - WriteObsError(obsspace, "ObsError/" + v_name, "degC", self.ObsError_temp) + def WriteObsErrorT(self, obsspace): + WriteObsError(obsspace, "ObsError/" + self.T_name, "degC", self.ObsError_temp) - def WriteObsErrorS(self, obsspace, v_name): - WriteObsError(obsspace, "ObsError/" + v_name, "psu", self.ObsError_saln) + def WriteObsErrorS(self, obsspace): + WriteObsError(obsspace, "ObsError/" + self.S_name, "psu", self.ObsError_saln) ############################################################################## diff --git a/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py index 171354383..ad3f16d43 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py @@ -42,13 +42,12 @@ def SetAdditionalData(self): # ObsError_temp = np.float32(np.ma.masked_array(np.full((len(temp)), 0.24))) def createIODAVars(self, obsspace): - super().createIODAVars(obsspace) + self.WriteBasicMetadata(obsspace) self.WriteStationID(obsspace) self.WriteDepth(obsspace) self.WriteSequenceNumber(obsspace) - - self.WritePreQC(obsspace, "waterTemperature") - self.WriteObsValueT(obsspace, "waterTemperature") + self.WritePreQC(obsspace, self.T_name) + self.WriteObsValueT(obsspace) def logObs(self, logger): self.logTemperature(logger) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py index b0eb604af..b4baa5a4d 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py @@ -18,7 +18,9 @@ platform_description) ioda_vars = ArgoIODAVariables() + ioda_vars.SetTemperatureVarName("waterTemperature") ioda_vars.SetTemperatureError(0.02) + ioda_vars.SetSalinityVarName("salinity") ioda_vars.SetSalinityError(0.01) argo = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py index a7d2ac2a0..59c60d490 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py @@ -20,6 +20,7 @@ ioda_vars = BathyIODAVariables() # ??? ioda_vars.SetTemperatureError(0.3) # ??? ioda_vars.SetSalinityError(1.0) + ioda_vars.SetTemperatureVarName("waterTemperature") bathy = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) bathy.run() diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py index 476d7a50b..26feaf0a5 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py @@ -23,7 +23,9 @@ def IODAFilename(self): platform_description) ioda_vars = GliderIODAVariables() + ioda_vars.SetTemperatureVarName("waterTemperature") ioda_vars.SetTemperatureError(0.02) + ioda_vars.SetSalinityVarName("salinity") ioda_vars.SetSalinityError(0.01) glider = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_marinemammal.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_marinemammal.py index a2a66474c..01c0bec61 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_marinemammal.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_marinemammal.py @@ -17,7 +17,9 @@ platform_description) ioda_vars = MarinemammalIODAVariables() + ioda_vars.SetTemperatureVarName("waterTemperature") ioda_vars.SetTemperatureError(0.02) + ioda_vars.SetSalinityVarName("salinity") ioda_vars.SetSalinityError(0.01) mammal = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py index 44a1033b3..8b7222456 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py @@ -19,7 +19,9 @@ ioda_vars = TesacIODAVariables() ioda_vars.SetTemperatureError(0.02) + ioda_vars.SetTemperatureVarName("waterTemperature") ioda_vars.SetSalinityError(0.01) + ioda_vars.SetSalinityVarName("salinity") tesac = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) tesac.run() diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py index b606823a2..81dc90c77 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py @@ -23,7 +23,9 @@ def IODAFilename(self): platform_description) ioda_vars = XbtctdIODAVariables() + ioda_vars.SetTemperatureVarName("waterTemperature") ioda_vars.SetTemperatureError(0.12) + ioda_vars.SetSalinityVarName("salinity") ioda_vars.SetSalinityError(1.0) xbtctd = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_altkob.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_altkob.py index 39cebda0c..d2eab0d92 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_altkob.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_altkob.py @@ -23,7 +23,9 @@ def IODAFilename(self): platform_description) ioda_vars = AltkobIODAVariables() + ioda_vars.SetTemperatureVarName("seaSurfaceTemperature") ioda_vars.SetTemperatureError(0.3) + ioda_vars.SetSalinityVarName("seaSurfaceSalinity") ioda_vars.SetSalinityError(1.0) altkob = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) altkob.run() diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py index 31e09ac69..251ec4260 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py @@ -23,7 +23,9 @@ def IODAFilename(self): platform_description) ioda_vars = TrkobIODAVariables() + ioda_vars.SetTemperatureVarName("seaSurfaceTemperature") ioda_vars.SetTemperatureError(0.3) + ioda_vars.SetSalinityVarName("seaSurfaceSalinity") ioda_vars.SetSalinityError(1.0) trkob = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) diff --git a/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py index 276707086..e59666d30 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py @@ -63,19 +63,6 @@ def filter(self): def SetAdditionalData(self): self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) self.ObsError_temp = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorT))) + np.float32(np.ma.masked_array(np.full((self.n_obs), self.T_error))) self.ObsError_saln = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) - - def createIODAVars(self, obsspace): - super().createIODAVars(obsspace) - self.WriteStationID(obsspace) - self.WriteDepth(obsspace) - self.WriteSequenceNumber(obsspace) - - self.WritePreQC(obsspace, "waterTemperature") - self.WritePreQC(obsspace, "salinity") - self.WriteObsErrorT(obsspace, "waterTemperature") - self.WriteObsErrorS(obsspace, "salinity") - self.WriteObsValueT(obsspace, 'waterTemperature') - self.WriteObsValueS(obsspace, 'salinity') + np.float32(np.ma.masked_array(np.full((self.n_obs), self.S_error))) diff --git a/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py index 757ebcce0..ee581b648 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py @@ -50,16 +50,3 @@ def filter(self): self.seqNum = self.seqNum[indices_true] self.dateTime = self.dateTime[indices_true] self.rcptdateTime = self.rcptdateTime[indices_true] - - def createIODAVars(self, obsspace): - super().createIODAVars(obsspace) - self.WriteStationID(obsspace) - self.WriteDepth(obsspace) - self.WriteSequenceNumber(obsspace) - - self.WritePreQC(obsspace, "waterTemperature") - self.WritePreQC(obsspace, "salinity") - self.WriteObsErrorT(obsspace, "waterTemperature") - self.WriteObsErrorS(obsspace, "salinity") - self.WriteObsValueT(obsspace, 'waterTemperature') - self.WriteObsValueS(obsspace, 'salinity') diff --git a/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py index 7684d9839..6196b601e 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py @@ -55,19 +55,6 @@ def filter(self): def SetAdditionalData(self): self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) self.ObsError_temp = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorT))) + np.float32(np.ma.masked_array(np.full((self.n_obs), self.T_error))) self.ObsError_saln = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) - - def createIODAVars(self, obsspace): - super().createIODAVars(obsspace) - self.WriteStationID(obsspace) - self.WriteDepth(obsspace) - self.WriteSequenceNumber(obsspace) - - self.WritePreQC(obsspace, "waterTemperature") - self.WritePreQC(obsspace, "salinity") - self.WriteObsErrorT(obsspace, "waterTemperature") - self.WriteObsErrorS(obsspace, "salinity") - self.WriteObsValueT(obsspace, 'waterTemperature') - self.WriteObsValueS(obsspace, 'salinity') + np.float32(np.ma.masked_array(np.full((self.n_obs), self.S_error))) diff --git a/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py index 55176c896..5fae69699 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py @@ -35,21 +35,21 @@ def filter(self): def SetAdditionalData(self): self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) self.ObsError_temp = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorT))) + np.float32(np.ma.masked_array(np.full((self.n_obs), self.T_error))) self.ObsError_saln = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.errorS))) + np.float32(np.ma.masked_array(np.full((self.n_obs), self.S_error))) def createIODAVars(self, obsspace): - super().createIODAVars(obsspace) + self.WriteBasicMetadata(obsspace) self.WriteStationID(obsspace) - self.WritePreQC(obsspace, "seaSurfaceTemperature") - self.WritePreQC(obsspace, "seaSurfaceSalinity") - self.WriteObsErrorT(obsspace, "waterTemperature") - self.WriteObsErrorS(obsspace, "salinity") - self.WriteObsValueT(obsspace, 'seaSurfaceTemperature') - self.WriteObsValueS(obsspace, 'seaSurfaceSalinity') + self.WritePreQC(obsspace, self.T_name) + self.WritePreQC(obsspace, self.S_name) + self.WriteObsErrorT(obsspace) + self.WriteObsErrorS(obsspace) + self.WriteObsValueT(obsspace) + self.WriteObsValueS(obsspace) def logMetadata(self, logger): self.logDates(logger) diff --git a/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py index 135fb231f..68b20d23e 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py @@ -32,16 +32,3 @@ def filter(self): self.stationID = self.stationID[mask] self.dateTime = self.dateTime[mask] self.rcptdateTime = self.rcptdateTime[mask] - - def createIODAVars(self, obsspace): - super().createIODAVars(obsspace) - self.WriteStationID(obsspace) - self.WriteDepth(obsspace) - self.WriteSequenceNumber(obsspace) - - self.WritePreQC(obsspace, "waterTemperature") - self.WritePreQC(obsspace, "salinity") - self.WriteObsErrorT(obsspace, "waterTemperature") - self.WriteObsErrorS(obsspace, "salinity") - self.WriteObsValueT(obsspace, 'waterTemperature') - self.WriteObsValueS(obsspace, 'salinity') From 1c2b3b36673ccd1461aab09bd6c3528a8808d239 Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Wed, 14 Aug 2024 19:32:14 +0000 Subject: [PATCH 42/54] added staging of files --- test/soca/CMakeLists.txt | 82 ++++++++++++++++--- ...oda_insitu_profile_argo_2021063006.json.in | 12 +++ ...da_insitu_profile_bathy_2021063006.json.in | 12 +++ ...a_insitu_profile_glider_2021063006.json.in | 12 +++ ...da_insitu_profile_tesac_2021063006.json.in | 12 +++ ...a_insitu_profile_xbtctd_2021063006.json.in | 12 +++ ...da_insitu_surface_trkob_2021063006.json.in | 12 +++ 7 files changed, 142 insertions(+), 12 deletions(-) create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json.in create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json.in create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json.in create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json.in create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json.in create mode 100644 test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json.in diff --git a/test/soca/CMakeLists.txt b/test/soca/CMakeLists.txt index f34a7dfb8..46d604322 100644 --- a/test/soca/CMakeLists.txt +++ b/test/soca/CMakeLists.txt @@ -38,32 +38,90 @@ PROPERTIES ENVIRONMENT "data=${TESTDATA};PYTHONPATH=${PROJECT_BINARY_DIR}/ush:$ENV{PYTHONPATH}") +########################################################################### +# bufr to ioda tests: +########################################################################### + +# prepare a test.yaml file from test.yaml.in by replacing +# placeholder patterns __BUFRINPUTDIR__ and __IODAOUTPUTDIR__ +# with actual directory paths +function(CREATE_CONFIG_FILE test_config_in test_config_out bufr_input_dir ioda_output_dir) + file(READ "${test_config_in}" file_content) + string(REPLACE "__BUFRINPUTDIR__" "\"${bufr_input_dir}\"" temp_content "${file_content}") + string(REPLACE "__IODAOUTPUTDIR__" "\"${ioda_output_dir}\"" temp_content2 "${temp_content}") + file(WRITE "${test_config_out}" "${temp_content2}") +endfunction() +# set(TEST_WORKING_DIR ${PROJECT_BINARY_DIR}/test/soca) +set(TEST_WORKING_DIR "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138") set(MARINE_BUFR2IODA_DIR ${PROJECT_SOURCE_DIR}/ush/ioda/bufr2ioda/marine) set(MARINE_BUFR2IODA_DIR ${MARINE_BUFR2IODA_DIR}/b2i) set(CONFIG_DIR ${PROJECT_SOURCE_DIR}/test/soca/testinput) set(TESTREF_DIR ${PROJECT_SOURCE_DIR}/test/soca/testref) -function(ADD_INSITU_TEST testname) - set(TEST bufr2ioda_insitu_${testname}) - set(CONFIG_FILE ${TEST}_2021063006.json) - set(TESTREF_FILE ${TEST}_2021063006.ref) +# find the staging directory for bufr test input files ${BUFR_TEST_DIR} +# bufr input files on orion: +set(BUFR_TEST_DIR + # "/work/noaa/da/marineda/gfs-marine/data/obs/ci/obs" + ${TEST_WORKING_DIR} # temporary fix +) +if (NOT EXISTS ${BUFR_TEST_DIR}) + # bufr input files on hera: + set(BUFR_TEST_DIR + # "/scratch1/NCEPDEV/da/common/ci/obs" + ${TEST_WORKING_DIR} # temporary fix + ) +endif() +if (NOT EXISTS ${BUFR_TEST_DIR}) + message(FATAL_ERROR "staging directory for BUFR test files ${BUFR_TEST_DIR} not found") +endif() + + + +function(ADD_INSITU_TEST testname testbufr) + set(CONFIG_TYPE "json") + # set(CONFIG_TYPE "yaml") + set(DATE "2021063006") + set(TEST "bufr2ioda_insitu_${testname}") + + set(TESTREF_FILE "${TEST}_${DATE}.ref") + + # stage the input file to directory ${BUFR_INPUT_DIR} + set(BUFR_INPUT_DIR ${TEST_WORKING_DIR}) + set(BUFR_TEST_FILE "${DATE}-gdas.t06z.${testbufr}.tm00.bufr_d") + set(BUFR_FILE "${BUFR_TEST_DIR}/${BUFR_TEST_FILE}") + if (NOT EXISTS ${BUFR_FILE}) + message(FATAL_ERROR "BUFR file ${BUFR_FILE} not found") + endif() + file(COPY ${BUFR_FILE} DESTINATION ${BUFR_INPUT_DIR}) + + # stage the config file + set(CONFIG_FILE_NAME ${TEST}_${DATE}.${CONFIG_TYPE}) + set(CONFIG_FILE_IN "${CONFIG_DIR}/${CONFIG_FILE_NAME}.in") + set(CONFIG_FILE "${TEST_WORKING_DIR}/${CONFIG_FILE_NAME}") + set(IODA_OUTPUT_DIR ${TEST_WORKING_DIR}) + CREATE_CONFIG_FILE( + ${CONFIG_FILE_IN} + ${CONFIG_FILE} + ${BUFR_INPUT_DIR} + ${IODA_OUTPUT_DIR} + ) add_test( NAME test_${TEST} - COMMAND ${MARINE_BUFR2IODA_DIR}/${TEST}.py -c ${CONFIG_DIR}/${CONFIG_FILE} -t ${TESTREF_DIR}/${TESTREF_FILE} - WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/test/soca + COMMAND ${MARINE_BUFR2IODA_DIR}/${TEST}.py -c ${CONFIG_FILE} -t ${TESTREF_DIR}/${TESTREF_FILE} + WORKING_DIRECTORY ${TEST_WORKING_DIR} ) endfunction() -ADD_INSITU_TEST(profile_argo) -ADD_INSITU_TEST(profile_bathy) -ADD_INSITU_TEST(profile_glider) +ADD_INSITU_TEST("profile_argo" "subpfl") +ADD_INSITU_TEST("profile_bathy" "bathy") +ADD_INSITU_TEST("profile_glider" "subpfl") # ADD_INSITU_TEST(profile_marinemammal) -ADD_INSITU_TEST(profile_tesac) -ADD_INSITU_TEST(profile_xbtctd) +ADD_INSITU_TEST("profile_tesac" "tesac") +ADD_INSITU_TEST("profile_xbtctd" "xbtctd") # ADD_INSITU_TEST(surface_altkob) -ADD_INSITU_TEST(surface_trkob) +ADD_INSITU_TEST("surface_trkob" "trkob") diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json.in b/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json.in new file mode 100644 index 000000000..b2acb33eb --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json.in @@ -0,0 +1,12 @@ +{ + "data_format": "subpfl", + "subsets": "SUBPFL", + "source": "NCEP data tank", + "data_type": "argo", + "cycle_type": "gdas", + "cycle_datetime": "2021063006", + "dump_directory": __BUFRINPUTDIR__, + "ioda_directory": __IODAOUTPUTDIR__, + "data_description": "6-hrly in situ ARGO profiles", + "data_provider": "U.S. NOAA" +} diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json.in b/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json.in new file mode 100644 index 000000000..f41a08ab8 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json.in @@ -0,0 +1,12 @@ +{ + "data_format": "bathy", + "subsets": "BATHY", + "source": "NCEP data tank", + "data_type": "bathy", + "cycle_type": "gdas", + "cycle_datetime": "2021063006", + "dump_directory": __BUFRINPUTDIR__, + "ioda_directory": __IODAOUTPUTDIR__, + "data_description": "6-hrly in situ Bathythermal profiles", + "data_provider": "U.S. NOAA" +} diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json.in b/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json.in new file mode 100644 index 000000000..dbd689a29 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json.in @@ -0,0 +1,12 @@ +{ + "data_format": "subpfl", + "subsets": "SUBPFL", + "source": "NCEP data tank", + "data_type": "glider", + "cycle_type": "gdas", + "cycle_datetime": "2021063006", + "dump_directory": __BUFRINPUTDIR__, + "ioda_directory": __IODAOUTPUTDIR__, + "data_description": "6-hrly in situ GLIDER profiles", + "data_provider": "U.S. NOAA" +} diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json.in b/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json.in new file mode 100644 index 000000000..c83fc65c5 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json.in @@ -0,0 +1,12 @@ +{ + "data_format": "tesac", + "subsets": "TESAC", + "source": "NCEP data tank", + "data_type": "tesac", + "cycle_type": "gdas", + "cycle_datetime": "2021063006", + "dump_directory": __BUFRINPUTDIR__, + "ioda_directory": __IODAOUTPUTDIR__, + "data_description": "6-hrly in situ TESAC profiles", + "data_provider": "U.S. NOAA" +} diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json.in b/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json.in new file mode 100644 index 000000000..00bd9d797 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json.in @@ -0,0 +1,12 @@ +{ + "data_format": "xbtctd", + "subsets": "XBTCTD", + "source": "NCEP data tank", + "data_type": "xbtctd", + "cycle_type": "gdas", + "cycle_datetime": "2021063006", + "dump_directory": __BUFRINPUTDIR__, + "ioda_directory": __IODAOUTPUTDIR__, + "data_description": "6-hrly in situ XBT/XCTD profiles", + "data_provider": "U.S. NOAA" +} diff --git a/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json.in b/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json.in new file mode 100644 index 000000000..3ed1bc2b3 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json.in @@ -0,0 +1,12 @@ +{ + "data_format": "trkob", + "subsets": "TRACKOB", + "source": "NCEP data tank", + "data_type": "trackob", + "cycle_type": "gdas", + "cycle_datetime": "2021063006", + "dump_directory": __BUFRINPUTDIR__, + "ioda_directory": __IODAOUTPUTDIR__, + "data_description": "6-hrly in situ TRACKOB surface", + "data_provider": "U.S. NOAA" +} From 51b915643b7f7471a2eeafa8807dd9e75d531502 Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Thu, 15 Aug 2024 15:32:20 +0000 Subject: [PATCH 43/54] added yaml, removed hard links --- test/soca/CMakeLists.txt | 4 ++-- .../bufr2ioda_insitu_profile_argo_2021063006.yaml | 12 ++++++++++++ .../bufr2ioda_insitu_profile_argo_2021063006.yaml.in | 12 ++++++++++++ .../bufr2ioda_insitu_profile_bathy_2021063006.yaml | 12 ++++++++++++ ...bufr2ioda_insitu_profile_bathy_2021063006.yaml.in | 12 ++++++++++++ .../bufr2ioda_insitu_profile_glider_2021063006.yaml | 12 ++++++++++++ ...ufr2ioda_insitu_profile_glider_2021063006.yaml.in | 12 ++++++++++++ .../bufr2ioda_insitu_profile_tesac_2021063006.yaml | 12 ++++++++++++ ...bufr2ioda_insitu_profile_tesac_2021063006.yaml.in | 12 ++++++++++++ .../bufr2ioda_insitu_profile_xbtctd_2021063006.yaml | 12 ++++++++++++ ...ufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in | 12 ++++++++++++ .../bufr2ioda_insitu_surface_trkob_2021063006.yaml | 12 ++++++++++++ ...bufr2ioda_insitu_surface_trkob_2021063006.yaml.in | 12 ++++++++++++ .../marine/b2i/b2iconverter/ioda_variables.py | 2 -- 14 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml.in create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml.in create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml.in create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml.in create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml create mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in create mode 100644 test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml create mode 100644 test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml.in diff --git a/test/soca/CMakeLists.txt b/test/soca/CMakeLists.txt index 46d604322..59fb6a4b6 100644 --- a/test/soca/CMakeLists.txt +++ b/test/soca/CMakeLists.txt @@ -81,8 +81,8 @@ endif() function(ADD_INSITU_TEST testname testbufr) - set(CONFIG_TYPE "json") - # set(CONFIG_TYPE "yaml") + # set(CONFIG_TYPE "json") + set(CONFIG_TYPE "yaml") set(DATE "2021063006") set(TEST "bufr2ioda_insitu_${testname}") diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml b/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml new file mode 100644 index 000000000..8ea072156 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml @@ -0,0 +1,12 @@ +--- +data_format: subpfl +subsets: SUBPFL +source: NCEP data tank +data_type: argo +cycle_type: gdas +cycle_datetime: '2021063006' +dump_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" +ioda_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" +data_description: 6-hrly in situ ARGO profiles +data_provider: U.S. NOAA + diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml.in b/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml.in new file mode 100644 index 000000000..9389692e1 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml.in @@ -0,0 +1,12 @@ +--- +data_format: subpfl +subsets: SUBPFL +source: NCEP data tank +data_type: argo +cycle_type: gdas +cycle_datetime: '2021063006' +dump_directory: __BUFRINPUTDIR__ +ioda_directory: __IODAOUTPUTDIR__ +data_description: 6-hrly in situ ARGO profiles +data_provider: U.S. NOAA + diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml b/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml new file mode 100644 index 000000000..811570b3a --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml @@ -0,0 +1,12 @@ +--- +data_format: bathy +subsets: BATHY +source: NCEP data tank +data_type: bathy +cycle_type: gdas +cycle_datetime: '2021063006' +dump_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" +ioda_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" +data_description: 6-hrly in situ Bathythermal profiles +data_provider: U.S. NOAA + diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml.in b/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml.in new file mode 100644 index 000000000..ee4102602 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml.in @@ -0,0 +1,12 @@ +--- +data_format: bathy +subsets: BATHY +source: NCEP data tank +data_type: bathy +cycle_type: gdas +cycle_datetime: '2021063006' +dump_directory: __BUFRINPUTDIR__ +ioda_directory: __IODAOUTPUTDIR__ +data_description: 6-hrly in situ Bathythermal profiles +data_provider: U.S. NOAA + diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml b/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml new file mode 100644 index 000000000..0028ba733 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml @@ -0,0 +1,12 @@ +--- +data_format: subpfl +subsets: SUBPFL +source: NCEP data tank +data_type: glider +cycle_type: gdas +cycle_datetime: '2021063006' +dump_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" +ioda_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" +data_description: 6-hrly in situ GLIDER profiles +data_provider: U.S. NOAA + diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml.in b/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml.in new file mode 100644 index 000000000..87d98e2d2 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml.in @@ -0,0 +1,12 @@ +--- +data_format: subpfl +subsets: SUBPFL +source: NCEP data tank +data_type: glider +cycle_type: gdas +cycle_datetime: '2021063006' +dump_directory: __BUFRINPUTDIR__ +ioda_directory: __IODAOUTPUTDIR__ +data_description: 6-hrly in situ GLIDER profiles +data_provider: U.S. NOAA + diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml b/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml new file mode 100644 index 000000000..ec017a315 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml @@ -0,0 +1,12 @@ +--- +data_format: tesac +subsets: TESAC +source: NCEP data tank +data_type: tesac +cycle_type: gdas +cycle_datetime: '2021063006' +dump_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" +ioda_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" +data_description: 6-hrly in situ TESAC profiles +data_provider: U.S. NOAA + diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml.in b/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml.in new file mode 100644 index 000000000..980879422 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml.in @@ -0,0 +1,12 @@ +--- +data_format: tesac +subsets: TESAC +source: NCEP data tank +data_type: tesac +cycle_type: gdas +cycle_datetime: '2021063006' +dump_directory: __BUFRINPUTDIR__ +ioda_directory: __IODAOUTPUTDIR__ +data_description: 6-hrly in situ TESAC profiles +data_provider: U.S. NOAA + diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml b/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml new file mode 100644 index 000000000..b4453ada0 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml @@ -0,0 +1,12 @@ +--- +data_format: xbtctd +subsets: XBTCTD +source: NCEP data tank +data_type: xbtctd +cycle_type: gdas +cycle_datetime: '2021063006' +dump_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" +ioda_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" +data_description: 6-hrly in situ XBT/XCTD profiles +data_provider: U.S. NOAA + diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in b/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in new file mode 100644 index 000000000..75ced072e --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in @@ -0,0 +1,12 @@ +--- +data_format: xbtctd +subsets: XBTCTD +source: NCEP data tank +data_type: xbtctd +cycle_type: gdas +cycle_datetime: '2021063006' +dump_directory: __BUFRINPUTDIR__ +ioda_directory: __IODAOUTPUTDIR__ +data_description: 6-hrly in situ XBT/XCTD profiles +data_provider: U.S. NOAA + diff --git a/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml b/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml new file mode 100644 index 000000000..73c5c85a4 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml @@ -0,0 +1,12 @@ +--- +data_format: trkob +subsets: TRACKOB +source: NCEP data tank +data_type: trackob +cycle_type: gdas +cycle_datetime: '2021063006' +dump_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" +ioda_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" +data_description: 6-hrly in situ TRACKOB surface +data_provider: U.S. NOAA + diff --git a/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml.in b/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml.in new file mode 100644 index 000000000..5d8161e79 --- /dev/null +++ b/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml.in @@ -0,0 +1,12 @@ +--- +data_format: trkob +subsets: TRACKOB +source: NCEP data tank +data_type: trackob +cycle_type: gdas +cycle_datetime: '2021063006' +dump_directory: __BUFRINPUTDIR__ +ioda_directory: __IODAOUTPUTDIR__ +data_description: 6-hrly in situ TRACKOB surface +data_provider: U.S. NOAA + diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py index d4f512963..99aa07736 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py @@ -108,7 +108,6 @@ def createIODAVars(self, obsspace): self.WriteStationID(obsspace) self.WriteDepth(obsspace) self.WriteSequenceNumber(obsspace) - self.WritePreQC(obsspace, self.T_name) self.WritePreQC(obsspace, self.S_name) self.WriteObsErrorT(obsspace) @@ -116,7 +115,6 @@ def createIODAVars(self, obsspace): self.WriteObsValueT(obsspace) self.WriteObsValueS(obsspace) - def WritePreQC(self, obsspace, name): obsspace.create_var("PreQC/" + name, dtype=self.PreQC.dtype, fillval=self.PreQC.fill_value) \ .write_attr('long_name', 'PreQC') \ From d61d697c9f4eb321caeea6ce6c257fecc25864cf Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Mon, 19 Aug 2024 18:01:57 +0000 Subject: [PATCH 44/54] linked to staged bufr on hera, orion --- test/soca/CMakeLists.txt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/test/soca/CMakeLists.txt b/test/soca/CMakeLists.txt index 59fb6a4b6..1b13cb277 100644 --- a/test/soca/CMakeLists.txt +++ b/test/soca/CMakeLists.txt @@ -53,8 +53,9 @@ function(CREATE_CONFIG_FILE test_config_in test_config_out bufr_input_dir ioda_o endfunction() -# set(TEST_WORKING_DIR ${PROJECT_BINARY_DIR}/test/soca) -set(TEST_WORKING_DIR "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138") +# set(TEST_WORKING_DIR "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138") +set(TEST_WORKING_DIR ${PROJECT_BINARY_DIR}/test/soca) +message("TEST_WORKING_DIR = ${TEST_WORKING_DIR|") set(MARINE_BUFR2IODA_DIR ${PROJECT_SOURCE_DIR}/ush/ioda/bufr2ioda/marine) set(MARINE_BUFR2IODA_DIR ${MARINE_BUFR2IODA_DIR}/b2i) @@ -64,14 +65,16 @@ set(TESTREF_DIR ${PROJECT_SOURCE_DIR}/test/soca/testref) # find the staging directory for bufr test input files ${BUFR_TEST_DIR} # bufr input files on orion: set(BUFR_TEST_DIR + "/work/noaa/da/marineda/gfs-marine/data/obs/ci/bufr" # "/work/noaa/da/marineda/gfs-marine/data/obs/ci/obs" - ${TEST_WORKING_DIR} # temporary fix + # ${TEST_WORKING_DIR} # temporary fix ) if (NOT EXISTS ${BUFR_TEST_DIR}) # bufr input files on hera: set(BUFR_TEST_DIR + "/scratch1/NCEPDEV/da/common/ci/bufr" # "/scratch1/NCEPDEV/da/common/ci/obs" - ${TEST_WORKING_DIR} # temporary fix + # ${TEST_WORKING_DIR} # temporary fix ) endif() if (NOT EXISTS ${BUFR_TEST_DIR}) From b07aa1388b09d9186454bc25e7f51a0b264b80f0 Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Tue, 3 Sep 2024 01:27:54 +0000 Subject: [PATCH 45/54] 2nd refactoring of 6 b2i converters --- test/soca/CMakeLists.txt | 2 +- ...r2ioda_insitu_profile_argo_2021063006.json | 12 - ...oda_insitu_profile_argo_2021063006.json.in | 12 - ...r2ioda_insitu_profile_argo_2021063006.yaml | 12 - ...2ioda_insitu_profile_bathy_2021063006.json | 12 - ...da_insitu_profile_bathy_2021063006.json.in | 12 - ...2ioda_insitu_profile_bathy_2021063006.yaml | 12 - ...ioda_insitu_profile_glider_2021063006.json | 12 - ...a_insitu_profile_glider_2021063006.json.in | 12 - ...ioda_insitu_profile_glider_2021063006.yaml | 12 - ...2ioda_insitu_profile_tesac_2021063006.json | 12 - ...da_insitu_profile_tesac_2021063006.json.in | 12 - ...2ioda_insitu_profile_tesac_2021063006.yaml | 12 - ...ioda_insitu_profile_xbtctd_2021063006.json | 12 - ...a_insitu_profile_xbtctd_2021063006.json.in | 12 - ...ioda_insitu_profile_xbtctd_2021063006.yaml | 12 - ...2ioda_insitu_surface_trkob_2021063006.json | 12 - ...da_insitu_surface_trkob_2021063006.json.in | 12 - ...2ioda_insitu_surface_trkob_2021063006.yaml | 12 - .../marine/b2i/altkob_ioda_variables.py | 55 ---- .../marine/b2i/argo_ioda_variables.py | 44 +-- .../b2i/b2iconverter/bufr2ioda_config.py | 14 +- .../b2i/b2iconverter/bufr2ioda_converter.py | 32 ++- .../marine/b2i/b2iconverter/ioda_addl_vars.py | 106 ++++++++ .../marine/b2i/b2iconverter/ioda_metadata.py | 96 +++++++ .../marine/b2i/b2iconverter/ioda_variables.py | 250 +++--------------- .../marine/b2i/b2iconverter/ocean.py | 116 ++++++++ .../bufr2ioda/marine/b2i/b2iconverter/util.py | 125 ++++++++- .../marine/b2i/bathy_ioda_variables.py | 56 ++-- .../b2i/bufr2ioda_insitu_profile_argo.py | 14 +- .../b2i/bufr2ioda_insitu_profile_bathy.py | 9 +- .../b2i/bufr2ioda_insitu_profile_glider.py | 10 +- .../bufr2ioda_insitu_profile_marinemammal.py | 30 --- .../b2i/bufr2ioda_insitu_profile_tesac.py | 8 +- .../b2i/bufr2ioda_insitu_profile_xbtctd.py | 10 +- .../b2i/bufr2ioda_insitu_surface_altkob.py | 35 --- .../b2i/bufr2ioda_insitu_surface_trkob.py | 7 +- .../marine/b2i/glider_ioda_variables.py | 55 +--- .../marine/b2i/marinemammal_ioda_variables.py | 52 ---- .../marine/b2i/tesac_ioda_variables.py | 43 +-- .../marine/b2i/trkob_ioda_variables.py | 83 ++++-- .../marine/b2i/xbtctd_ioda_variables.py | 11 +- 42 files changed, 661 insertions(+), 818 deletions(-) delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json.in delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json.in delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json.in delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json.in delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json.in delete mode 100644 test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml delete mode 100644 test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json delete mode 100644 test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json.in delete mode 100644 test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml delete mode 100644 ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_metadata.py create mode 100755 ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py delete mode 100755 ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_marinemammal.py delete mode 100755 ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_altkob.py delete mode 100644 ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py diff --git a/test/soca/CMakeLists.txt b/test/soca/CMakeLists.txt index 1b13cb277..601dbcf43 100644 --- a/test/soca/CMakeLists.txt +++ b/test/soca/CMakeLists.txt @@ -55,7 +55,7 @@ endfunction() # set(TEST_WORKING_DIR "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138") set(TEST_WORKING_DIR ${PROJECT_BINARY_DIR}/test/soca) -message("TEST_WORKING_DIR = ${TEST_WORKING_DIR|") +message("bufr to ioda: TEST_WORKING_DIR = ${TEST_WORKING_DIR}") set(MARINE_BUFR2IODA_DIR ${PROJECT_SOURCE_DIR}/ush/ioda/bufr2ioda/marine) set(MARINE_BUFR2IODA_DIR ${MARINE_BUFR2IODA_DIR}/b2i) diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json b/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json deleted file mode 100644 index 801f1f050..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "data_format": "subpfl", - "subsets": "SUBPFL", - "source": "NCEP data tank", - "data_type": "argo", - "cycle_type": "gdas", - "cycle_datetime": "2021063006", - "dump_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", - "ioda_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", - "data_description": "6-hrly in situ ARGO profiles", - "data_provider": "U.S. NOAA" -} diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json.in b/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json.in deleted file mode 100644 index b2acb33eb..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.json.in +++ /dev/null @@ -1,12 +0,0 @@ -{ - "data_format": "subpfl", - "subsets": "SUBPFL", - "source": "NCEP data tank", - "data_type": "argo", - "cycle_type": "gdas", - "cycle_datetime": "2021063006", - "dump_directory": __BUFRINPUTDIR__, - "ioda_directory": __IODAOUTPUTDIR__, - "data_description": "6-hrly in situ ARGO profiles", - "data_provider": "U.S. NOAA" -} diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml b/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml deleted file mode 100644 index 8ea072156..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -data_format: subpfl -subsets: SUBPFL -source: NCEP data tank -data_type: argo -cycle_type: gdas -cycle_datetime: '2021063006' -dump_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" -ioda_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" -data_description: 6-hrly in situ ARGO profiles -data_provider: U.S. NOAA - diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json b/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json deleted file mode 100644 index 848fc08a2..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "data_format": "bathy", - "subsets": "BATHY", - "source": "NCEP data tank", - "data_type": "bathy", - "cycle_type": "gdas", - "cycle_datetime": "2021063006", - "dump_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", - "ioda_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", - "data_description": "6-hrly in situ Bathythermal profiles", - "data_provider": "U.S. NOAA" -} \ No newline at end of file diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json.in b/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json.in deleted file mode 100644 index f41a08ab8..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.json.in +++ /dev/null @@ -1,12 +0,0 @@ -{ - "data_format": "bathy", - "subsets": "BATHY", - "source": "NCEP data tank", - "data_type": "bathy", - "cycle_type": "gdas", - "cycle_datetime": "2021063006", - "dump_directory": __BUFRINPUTDIR__, - "ioda_directory": __IODAOUTPUTDIR__, - "data_description": "6-hrly in situ Bathythermal profiles", - "data_provider": "U.S. NOAA" -} diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml b/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml deleted file mode 100644 index 811570b3a..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -data_format: bathy -subsets: BATHY -source: NCEP data tank -data_type: bathy -cycle_type: gdas -cycle_datetime: '2021063006' -dump_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" -ioda_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" -data_description: 6-hrly in situ Bathythermal profiles -data_provider: U.S. NOAA - diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json b/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json deleted file mode 100644 index 4b60800f8..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "data_format": "subpfl", - "subsets": "SUBPFL", - "source": "NCEP data tank", - "data_type": "glider", - "cycle_type": "gdas", - "cycle_datetime": "2021063006", - "dump_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", - "ioda_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", - "data_description": "6-hrly in situ GLIDER profiles", - "data_provider": "U.S. NOAA" -} \ No newline at end of file diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json.in b/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json.in deleted file mode 100644 index dbd689a29..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.json.in +++ /dev/null @@ -1,12 +0,0 @@ -{ - "data_format": "subpfl", - "subsets": "SUBPFL", - "source": "NCEP data tank", - "data_type": "glider", - "cycle_type": "gdas", - "cycle_datetime": "2021063006", - "dump_directory": __BUFRINPUTDIR__, - "ioda_directory": __IODAOUTPUTDIR__, - "data_description": "6-hrly in situ GLIDER profiles", - "data_provider": "U.S. NOAA" -} diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml b/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml deleted file mode 100644 index 0028ba733..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -data_format: subpfl -subsets: SUBPFL -source: NCEP data tank -data_type: glider -cycle_type: gdas -cycle_datetime: '2021063006' -dump_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" -ioda_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" -data_description: 6-hrly in situ GLIDER profiles -data_provider: U.S. NOAA - diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json b/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json deleted file mode 100644 index a4c966050..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "data_format": "tesac", - "subsets": "TESAC", - "source": "NCEP data tank", - "data_type": "tesac", - "cycle_type": "gdas", - "cycle_datetime": "2021063006", - "dump_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", - "ioda_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", - "data_description": "6-hrly in situ TESAC profiles", - "data_provider": "U.S. NOAA" -} \ No newline at end of file diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json.in b/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json.in deleted file mode 100644 index c83fc65c5..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.json.in +++ /dev/null @@ -1,12 +0,0 @@ -{ - "data_format": "tesac", - "subsets": "TESAC", - "source": "NCEP data tank", - "data_type": "tesac", - "cycle_type": "gdas", - "cycle_datetime": "2021063006", - "dump_directory": __BUFRINPUTDIR__, - "ioda_directory": __IODAOUTPUTDIR__, - "data_description": "6-hrly in situ TESAC profiles", - "data_provider": "U.S. NOAA" -} diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml b/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml deleted file mode 100644 index ec017a315..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -data_format: tesac -subsets: TESAC -source: NCEP data tank -data_type: tesac -cycle_type: gdas -cycle_datetime: '2021063006' -dump_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" -ioda_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" -data_description: 6-hrly in situ TESAC profiles -data_provider: U.S. NOAA - diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json b/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json deleted file mode 100644 index 0e075df72..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "data_format": "xbtctd", - "subsets": "XBTCTD", - "source": "NCEP data tank", - "data_type": "xbtctd", - "cycle_type": "gdas", - "cycle_datetime": "2021063006", - "dump_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", - "ioda_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", - "data_description": "6-hrly in situ XBT/XCTD profiles", - "data_provider": "U.S. NOAA" -} \ No newline at end of file diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json.in b/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json.in deleted file mode 100644 index 00bd9d797..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.json.in +++ /dev/null @@ -1,12 +0,0 @@ -{ - "data_format": "xbtctd", - "subsets": "XBTCTD", - "source": "NCEP data tank", - "data_type": "xbtctd", - "cycle_type": "gdas", - "cycle_datetime": "2021063006", - "dump_directory": __BUFRINPUTDIR__, - "ioda_directory": __IODAOUTPUTDIR__, - "data_description": "6-hrly in situ XBT/XCTD profiles", - "data_provider": "U.S. NOAA" -} diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml b/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml deleted file mode 100644 index b4453ada0..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -data_format: xbtctd -subsets: XBTCTD -source: NCEP data tank -data_type: xbtctd -cycle_type: gdas -cycle_datetime: '2021063006' -dump_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" -ioda_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" -data_description: 6-hrly in situ XBT/XCTD profiles -data_provider: U.S. NOAA - diff --git a/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json b/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json deleted file mode 100644 index 312582489..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "data_format": "trkob", - "subsets": "TRACKOB", - "source": "NCEP data tank", - "data_type": "trackob", - "cycle_type": "gdas", - "cycle_datetime": "2021063006", - "dump_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", - "ioda_directory": "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138", - "data_description": "6-hrly in situ TRACKOB surface", - "data_provider": "U.S. NOAA" -} \ No newline at end of file diff --git a/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json.in b/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json.in deleted file mode 100644 index 3ed1bc2b3..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.json.in +++ /dev/null @@ -1,12 +0,0 @@ -{ - "data_format": "trkob", - "subsets": "TRACKOB", - "source": "NCEP data tank", - "data_type": "trackob", - "cycle_type": "gdas", - "cycle_datetime": "2021063006", - "dump_directory": __BUFRINPUTDIR__, - "ioda_directory": __IODAOUTPUTDIR__, - "data_description": "6-hrly in situ TRACKOB surface", - "data_provider": "U.S. NOAA" -} diff --git a/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml b/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml deleted file mode 100644 index 73c5c85a4..000000000 --- a/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -data_format: trkob -subsets: TRACKOB -source: NCEP data tank -data_type: trackob -cycle_type: gdas -cycle_datetime: '2021063006' -dump_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" -ioda_directory: "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138" -data_description: 6-hrly in situ TRACKOB surface -data_provider: U.S. NOAA - diff --git a/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py deleted file mode 100644 index 69afc30a9..000000000 --- a/ush/ioda/bufr2ioda/marine/b2i/altkob_ioda_variables.py +++ /dev/null @@ -1,55 +0,0 @@ -import numpy as np -from pyiodaconv import bufr -from b2iconverter.ioda_variables import IODAVariables -from b2iconverter.util import Compute_sequenceNumber - - -class AltkobIODAVariables(IODAVariables): - def __init__(self): - super().__init__() - - def BuildQuery(self): - q = super().BuildQuery() - q.add('latitude', '*/CLATH') - q.add('longitude', '*/CLONH') - # ObsValue - q.add('temp', '*/SST0') - q.add('saln', '*/SSS0') - return q - - def SetFromQueryResult(self, r): - self.SetDatesFromQueryResult(r) - self.SetLonLatFromQueryResult(r) - self.SetObsFromQueryResult(r) - - def filter(self): - mask = self.TemperatureFilter() \ - & SalinityFilter() - n_obs = len(mask) - - self.lat = self.lat[mask] - self.lon = self.lon[mask] - self.dateTime = self.dateTime[mask] - self.rcptdateTime = self.rcptdateTime[mask] - self.temp = self.temp[mask] - self.saln = self.saln[mask] - - def SetAdditionalData(self): - self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) - self.ObsError_temp = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.ErrorT))) - self.ObsError_saln = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.ErrorS))) - - def createIODAVars(self, obsspace): - self.WriteBasicMetadata(obsspace) - - # BUG: StationID is undefined - self.WriteStationID(obsspace) - - self.WritePreQC(obsspace, self.T_name) - self.WritePreQC(obsspace, self.S_name) - self.WriteObsErrorT(obsspace) - self.WriteObsErrorS(obsspace) - self.WriteObsValueT(obsspace) - self.WriteObsValueS(obsspace) diff --git a/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py index bd1571d4d..9ba7bf543 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py @@ -1,7 +1,6 @@ import numpy as np from pyiodaconv import bufr from b2iconverter.ioda_variables import IODAVariables -from b2iconverter.util import Compute_sequenceNumber class ArgoIODAVariables(IODAVariables): @@ -14,7 +13,6 @@ def BuildQuery(self): q.add('latitude', '*/CLATH') q.add('longitude', '*/CLONH') q.add('depth', '*/GLPFDATA/WPRES') - # ObsValue q.add('temp', '*/GLPFDATA/SSTH') q.add('saln', '*/GLPFDATA/SALNH') return q @@ -22,40 +20,14 @@ def BuildQuery(self): def SetFromQueryResult(self, r): super().SetFromQueryResult(r) # convert depth in pressure units to meters (rho * g * h) - self.depth = np.float32(self.depth.astype(float) * 0.0001) + self.metadata.depth = np.float32(self.metadata.depth.astype(float) * 0.0001) def filter(self): - mask = self.TemperatureFilter() \ - & self.SalinityFilter() - - self.temp = self.temp[mask] - self.lat = self.lat[mask] - self.lon = self.lon[mask] - self.depth = self.depth[mask] - self.stationID = self.stationID[mask] - - self.seqNum = Compute_sequenceNumber(self.lon) - + TS_mask = self.TemperatureFilter() & self.SalinityFilter() # Separate ARGO profiles from subpfl tank - # Finding index for ARGO floats where the second number of the stationID=9 - index_list = [] - for index, number in enumerate(self.stationID): - # Convert the number to a string - number_str = str(number) - - # Check if the second character is equal to '9' - if number_str[1] == '9': - index_list.append(index) - - self.n_obs = len(index_list) - - # Apply index - self.stationID = self.stationID[index_list] - self.lat = self.lat[index_list] - self.lon = self.lon[index_list] - self.depth = self.depth[index_list] - self.temp = self.temp[index_list] - self.saln = self.saln[index_list] - self.seqNum = self.seqNum[index_list] - self.dateTime = self.dateTime[index_list] - self.rcptdateTime = self.rcptdateTime[index_list] + # the index for ARGO floats where the second number of the stationID=9 + id_mask = [True if str(x)[1] == '9' else False for x in self.metadata.stationID] + mask = TS_mask & id_mask + self.metadata.filter(mask) + self.temp = self.temp[mask] + self.saln = self.saln[mask] diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py index 272c5145a..6508a5a45 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py @@ -1,15 +1,20 @@ import json import yaml import os +import sys +# configuration file can be either json or yaml +# this config class provides the functions that determine +# the names and the paths of the bufr input and the ioda output files +# these functions can be overridden in the converter + class Bufr2iodaConfig: def __init__(self, script_name, config_file, platform_description): self.script_name = script_name self.platform_description = platform_description _, file_extension = os.path.splitext(config_file) - if file_extension == ".json": with open(config_file, "r") as file: config = json.load(file) @@ -19,11 +24,12 @@ def __init__(self, script_name, config_file, platform_description): config = yaml.safe_load(file) self.ReadConfig(config) else: - print("Unknown file extension = ", file_extension) + print("Fatal error: Unknown file extension = ", file_extension) + sys.exit(1) def ReadConfig(self, config): - subsets = config["subsets"] - + # subsets was unused in the config file ??? + # subsets = config["subsets"] # Get parameters from configuration self.data_format = config["data_format"] self.source = config["source"] diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py index cbf02383b..eece4cfcc 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py @@ -2,25 +2,27 @@ import numpy as np import numpy.ma as ma import os -# import argparse -import math -import calendar import time -import copy from datetime import datetime from pyiodaconv import bufr from collections import namedtuple from pyioda import ioda_obs_space as ioda_ospace -from wxflow import Logger -import warnings -# suppress warnings -warnings.filterwarnings('ignore') from .util import ParseArguments, run_diff from .bufr2ioda_config import Bufr2iodaConfig import logging import tempfile +# the converter takes a configuration class as input, +# creates the logger and provides a method to run the converter +# and to test the result +# for testing purposes a temporary file is written by the logger +# and it is compared to a reference file +# the logger provides simple human readable numbers, +# as well as cryptographic hashes generated from input +# the hashes are deterministic, yet they are supposedly capable +# of detecting an error with high probability + class Bufr2ioda_Converter: def __init__(self, bufr2ioda_config, ioda_vars, logfile): self.bufr2ioda_config = bufr2ioda_config @@ -63,23 +65,25 @@ def run(self): self.ioda_vars.filter() - # set seqNum, PreQC, ObsError - self.ioda_vars.SetAdditionalData() + # set seqNum, PreQC, ObsError, OceanBasin + self.ioda_vars.additional_vars.construct() iodafile_path = self.bufr2ioda_config.IODAFilepath() path, fname = os.path.split(iodafile_path) os.makedirs(path, exist_ok=True) - dims = {'Location': np.arange(0, self.ioda_vars.lat.shape[0])} + metadata = self.ioda_vars.metadata + + dims = {'Location': np.arange(0, metadata.lat.shape[0])} obsspace = ioda_ospace.ObsSpace(iodafile_path, mode='w', dim_dict=dims) self.logger.debug(f"Created IODA file: {iodafile_path}") - date_range = [str(self.ioda_vars.dateTime.min()), str(self.ioda_vars.dateTime.max())] + date_range = [str(metadata.dateTime.min()), str(metadata.dateTime.max())] self.logger.debug(f"CreateGlobalAttributes") self.bufr2ioda_config.CreateIODAAttributes(obsspace, date_range) - self.logger.debug(f"createIODAVars") - self.ioda_vars.createIODAVars(obsspace) + self.logger.debug(f"ioda_vars.WriteToIodaFile") + self.ioda_vars.WriteToIodaFile(obsspace) if (self.logfile): self.logger.addHandler(self.file_handler) diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py new file mode 100644 index 000000000..4ebaea321 --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py @@ -0,0 +1,106 @@ +import numpy as np +import sys +from .ocean import OceanBasin +from .util import * + + +class IODAAdditionalVariables: + def __init__(self, ioda_vars): + self.ioda_vars = ioda_vars + + def construct(self): + self.seqNum = ComputeSeqNum(self.ioda_vars.metadata.lon, + self.ioda_vars.metadata.lat) + n = len(self.seqNum) + self.PreQC = (np.ma.masked_array(np.full(n, 0))).astype(np.int32) + self.ObsError_temp = \ + np.float32(np.ma.masked_array(np.full(n, self.ioda_vars.T_error))) + self.ObsError_saln = \ + np.float32(np.ma.masked_array(np.full(n, self.ioda_vars.S_error))) + self.ComputeOceanBasin() + + def SetOceanBasinNCFilePath(self, nc_file_path): + self.ocean_basin_nc_file_path = nc_file_path + + def ComputeOceanBasin(self): + try: + ocean = OceanBasin() + ocean.read_nc_file(self.ocean_basin_nc_file_path) + except Exception as e: + print(f"Fatal error: unable to read ocean basin file {self.ocean_basin_nc_file_path}") + sys.exit(1) + lat = self.ioda_vars.metadata.lat + lon = self.ioda_vars.metadata.lon + # self.OceanBasin = ocean.get_station_basin(lat, lon) + ob = ocean.get_station_basin(lat, lon) + self.OceanBasin = np.array(ob, dtype=np.int32) + + def SetTemperatureError(self, e): + self.T_error = e + + def SetSalinityError(self, e): + self.S_error = e + + def WriteToIodaFile(self, obsspace): + self.WriteSeqNum(obsspace) + self.WritePreQC(obsspace, self.ioda_vars.T_name) + self.WritePreQC(obsspace, self.ioda_vars.S_name) + self.WriteObsErrorT(obsspace) + self.WriteObsErrorS(obsspace) + self.WriteOceanBasin(obsspace) + + def log(self, logger): + self.logSeqNum(logger) + self.logPreQC(logger) + self.logObsError_temp(logger) + self.logObsError_saln(logger) + self.logOceanBasin(logger) + +######################################################################### + + def WriteSeqNum(self, obsspace): + WriteSeqNum(obsspace, self.seqNum, self.PreQC.dtype, self.PreQC.fill_value) + + # should the long name be "PreQC" + name? + def WritePreQC(self, obsspace, name): + obsspace.create_var("PreQC/" + name, dtype=self.PreQC.dtype, fillval=self.PreQC.fill_value) \ + .write_attr('long_name', 'PreQC') \ + .write_data(self.PreQC) + + def WriteObsErrorT(self, obsspace): + WriteObsError(obsspace, "ObsError/" + self.ioda_vars.T_name, "degC", self.ObsError_temp) + + def WriteObsErrorS(self, obsspace): + WriteObsError(obsspace, "ObsError/" + self.ioda_vars.S_name, "psu", self.ObsError_saln) + + def WriteOceanBasin(self, obsspace): + WriteOceanBasin(obsspace, self.OceanBasin, self.PreQC.dtype, self.PreQC.fill_value) + +######################################################################### + + def logSeqNum(self, logger): + LogVariable(logger, "seqNum", self.seqNum) + logger.debug(f"seqNum hash = {compute_hash(self.seqNum)}") + + def logPreQC(self, logger): + LogVariable(logger, "PreQC", self.PreQC) + + def logObsError_temp(self, logger): + LogVariable(logger, "ObsError_temp", self.ObsError_temp) + + def logObsError_saln(self, logger): + LogVariable(logger, "ObsError_saln", self.ObsError_saln) + + def logOceanBasin(self, logger): + LogVariable(logger, "OceanBasin", self.OceanBasin) + logger.debug(f"OceanBasin hash = {compute_hash(self.OceanBasin)}") + +######################################################################### + + +# seqNum depends both on lat and lon +def ComputeSeqNum(lon, lat): + combined = np.stack((lon, lat), axis=-1) + unique_combined, seqNum = np.unique(combined, axis=0, return_inverse=True) + seqNum = seqNum.astype(np.int32) + return seqNum diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_metadata.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_metadata.py new file mode 100644 index 000000000..6e0a66cf3 --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_metadata.py @@ -0,0 +1,96 @@ +import numpy as np +from .util import * +import hashlib + + +class IODAMetadata: + def __init__(self): + pass + + def SetFromQueryResult(self, r): + self.SetDateTimeFromQueryResult(r) + self.SetRcptDateTimeFromQueryResult(r) + self.SetLonFromQueryResult(r) + self.SetLatFromQueryResult(r) + self.SetStationIDFromQueryResult(r) + self.SetDepthFromQueryResult(r) + + def filter(self, mask): + self.dateTime = self.dateTime[mask] + self.rcptdateTime = self.rcptdateTime[mask] + self.lat = self.lat[mask] + self.lon = self.lon[mask] + self.stationID = self.stationID[mask] + self.depth = self.depth[mask] + + def WriteToIodaFile(self, obsspace): + WriteDateTime(obsspace, self.dateTime) + WriteRcptDateTime(obsspace, self.rcptdateTime) + WriteLongitude(obsspace, self.lon) + WriteLatitude(obsspace, self.lat) + WriteStationID(obsspace, self.stationID) + WriteDepth(obsspace, self.depth) + + def log(self, logger): + self.logDateTime(logger) + self.logRcptDateTime(logger) + self.logLongitude(logger) + self.logLatitude(logger) + self.logDepth(logger) + self.logStationID(logger) + +########################################################################## + + def SetDateTimeFromQueryResult(self, r): + self.dateTime = r.get_datetime('year', 'month', 'day', 'hour', 'minute', group_by='depth') + self.dateTime = self.dateTime.astype(np.int64) + + def SetRcptDateTimeFromQueryResult(self, r): + self.rcptdateTime = r.get_datetime('ryear', 'rmonth', 'rday', 'rhour', 'rminute', group_by='depth') + self.rcptdateTime = self.rcptdateTime.astype(np.int64) + + def SetLonFromQueryResult(self, r): + self.lon = r.get('longitude', group_by='depth') + + def SetLatFromQueryResult(self, r): + self.lat = r.get('latitude', group_by='depth') + + def SetStationIDFromQueryResult(self, r): + self.stationID = r.get('stationID', group_by='depth') + + def SetDepthFromQueryResult(self, r): + self.depth = r.get('depth', group_by='depth') + +########################################################################## + + def logLongitude(self, logger): + LogVariable(logger, "lon", self.lon) + logger.debug(f"lon hash = {compute_hash(self.lon)}") + + def logLatitude(self, logger): + LogVariable(logger, "lat", self.lat) + logger.debug(f"lat hash = {compute_hash(self.lat)}") + + def logDateTime(self, logger): + LogVariable(logger, "dateTime", self.dateTime) + logger.debug(f"dateTime hash = {compute_hash(self.dateTime)}") + + def logRcptDateTime(self, logger): + LogVariable(logger, "rcptdateTime", self.rcptdateTime) + logger.debug(f"rcptdateTime hash = {compute_hash(self.rcptdateTime)}") + + def logStationID(self, logger): + logger.debug(f"stationID: {len(self.stationID)}, {self.stationID.astype(str).dtype}") + if isinstance(self.stationID[0], str): + concatenated_string = ''.join(self.stationID) + # Compute the hash using SHA-256 + hash_object = hashlib.sha256(concatenated_string.encode()) + hash_hex = hash_object.hexdigest() + logger.debug(f"stationID hash = {hash_hex}") + # # elif isinstance(self.stationID[0], int32): + else: + logger.debug(f"stationID hash = {compute_hash(self.stationID)}") + + def logDepth(self, logger): + LogVariable(logger, "depth", self.depth) + logger.debug(f"depth hash = {compute_hash(self.depth)}") diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py index 99aa07736..cda241b50 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py @@ -1,15 +1,28 @@ import numpy as np from pyiodaconv import bufr -from .util import Compute_sequenceNumber +from .ocean import OceanBasin +from .util import * +from .ioda_metadata import IODAMetadata +from .ioda_addl_vars import IODAAdditionalVariables class IODAVariables: def __init__(self): + self.construct() + # derived classes add their own additional_vars: + self.additional_vars = IODAAdditionalVariables(self) + + def construct(self): self.n_obs = 0 - self.T_error = 0.0 - self.S_error = 0.0 + # default values can be oerridden using methods of this class: self.SetTemperatureRange(-10.0, 50.0) + self.T_error = 0.0 self.SetSalinityRange(0.0, 45.0) + self.S_error = 0.0 + self.metadata = IODAMetadata() + + def SetOceanBasinNCFilePath(self, nc_file_path): + self.additional_vars.SetOceanBasinNCFilePath(nc_file_path) def SetTemperatureVarName(self, name): self.T_name = name @@ -45,29 +58,12 @@ def BuildQuery(self): q.add('rminute', '*/RCMI') return q - def SetDatesFromQueryResult(self, r): - self.dateTime = r.get_datetime('year', 'month', 'day', 'hour', 'minute', group_by='depth') - self.dateTime = self.dateTime.astype(np.int64) - - self.rcptdateTime = r.get_datetime('ryear', 'rmonth', 'rday', 'rhour', 'rminute', group_by='depth') - self.rcptdateTime = self.rcptdateTime.astype(np.int64) - - def SetLonLatFromQueryResult(self, r): - self.lat = r.get('latitude', group_by='depth') - self.lon = r.get('longitude', group_by='depth') - - def SetObsFromQueryResult(self, r): - self.temp = r.get('temp', group_by='depth') - self.temp -= 273.15 - self.saln = r.get('saln', group_by='depth') - def SetFromQueryResult(self, r): - self.SetDatesFromQueryResult(r) - self.SetLonLatFromQueryResult(r) - self.stationID = r.get('stationID', group_by='depth') - self.depth = r.get('depth', group_by='depth') + self.metadata.SetFromQueryResult(r) self.SetObsFromQueryResult(r) +########################################################################### + def TemperatureFilter(self): return (self.temp > self.T_min) & (self.temp <= self.T_max) @@ -77,48 +73,22 @@ def SalinityFilter(self): def filter(self): pass - def SetAdditionalData(self): - self.seqNum = Compute_sequenceNumber(self.lon) - self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) - self.ObsError_temp = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.T_error))) - self.ObsError_saln = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.S_error))) - - def WriteDateTime(self, obsspace): - WriteDateTime(obsspace, self.dateTime) +########################################################################### - def WriteStationID(self, obsspace): - WriteStationID(obsspace, self.stationID) - - def WriteDepth(self, obsspace): - WriteDepth(obsspace, self.depth) - - def WriteSequenceNumber(self, obsspace): - WriteSequenceNumber(obsspace, self.seqNum, self.PreQC) - - def WriteBasicMetadata(self, obsspace): - WriteDateTime(obsspace, self.dateTime) - WriteRcptDateTime(obsspace, self.rcptdateTime) - WriteLongitude(obsspace, self.lon) - WriteLatitude(obsspace, self.lat) - - def createIODAVars(self, obsspace): - self.WriteBasicMetadata(obsspace) - self.WriteStationID(obsspace) - self.WriteDepth(obsspace) - self.WriteSequenceNumber(obsspace) - self.WritePreQC(obsspace, self.T_name) - self.WritePreQC(obsspace, self.S_name) - self.WriteObsErrorT(obsspace) - self.WriteObsErrorS(obsspace) + def WriteToIodaFile(self, obsspace): + self.metadata.WriteToIodaFile(obsspace) + self.additional_vars.WriteToIodaFile(obsspace) self.WriteObsValueT(obsspace) self.WriteObsValueS(obsspace) - def WritePreQC(self, obsspace, name): - obsspace.create_var("PreQC/" + name, dtype=self.PreQC.dtype, fillval=self.PreQC.fill_value) \ - .write_attr('long_name', 'PreQC') \ - .write_data(self.PreQC) +########################################################################## + + def SetObsFromQueryResult(self, r): + self.temp = r.get('temp', group_by='depth') + self.temp -= 273.15 + self.saln = r.get('saln', group_by='depth') + +########################################################################### def WriteObsValueT(self, obsspace): obsspace.create_var('ObsValue/' + self.T_name, dtype=self.temp.dtype, fillval=self.temp.fill_value) \ @@ -138,159 +108,21 @@ def WriteObsValueS(self, obsspace): .write_attr('long_name', self.S_name) \ .write_data(self.saln) - def WriteObsErrorT(self, obsspace): - WriteObsError(obsspace, "ObsError/" + self.T_name, "degC", self.ObsError_temp) - - def WriteObsErrorS(self, obsspace): - WriteObsError(obsspace, "ObsError/" + self.S_name, "psu", self.ObsError_saln) - ############################################################################## - def logTemperature(self, logger): - logger.debug(f" temp min, max, length, dtype = {self.temp.min()}, {self.temp.max()}, {len(self.temp)}, {self.temp.dtype}") - - def logSalinity(self, logger): - logger.debug(f" saln min, max, length, dtype = {self.saln.min()}, {self.saln.max()}, {len(self.saln)}, {self.saln.dtype}") - - def logLonLat(self, logger): - logger.debug(f" lon min, max, length, dtype = {self.lon.min()}, {self.lon.max()}, {len(self.lon)}, {self.lon.dtype}") - logger.debug(f" lat min, max, length, dtype = {self.lat.min()}, {self.lat.max()}, {len(self.lat)}, {self.lat.dtype}") - - def logDates(self, logger): - logger.debug(f" dateTime shape, dtype = {self.dateTime.shape}, {self.dateTime.dtype}") - logger.debug(f" rcptdateTime shape, dytpe = {self.rcptdateTime.shape}, {self.rcptdateTime.dtype}") - - def logStationID(self, logger): - logger.debug(f" stationID shape, dtype = {self.stationID.shape}, {self.stationID.astype(str).dtype}") - - def logDepth(self, logger): - logger.debug(f" depth min, max, length, dtype = {self.depth.min()}, {self.depth.max()}, {len(self.depth)}, {self.depth.dtype}") - - def LogSeqNum(self, logger): - logger.debug(f" sequence Num shape, dtype = {self.seqNum.shape}, {self.seqNum.dtype}") - - def LogPreQC(self, logger): - logger.debug(f" PreQC min, max, length, dtype = \ - {self.PreQC.min()}, \ - {self.PreQC.max()}, \ - {len(self.PreQC)}, \ - {self.PreQC.dtype}") - - def LogObsError_temp(self, logger): - logger.debug(f" ObsError_temp min, max, length, dtype = \ - {self.ObsError_temp.min()}, \ - {self.ObsError_temp.max()}, \ - {len(self.ObsError_temp)}, \ - {self.ObsError_temp.dtype}") - - def LogObsError_saln(self, logger): - logger.debug(f" ObsError_saln min, max, length, dtype = \ - {self.ObsError_saln.min()}, \ - {self.ObsError_saln.max()}, \ - {len(self.ObsError_saln)}, \ - {self.ObsError_saln.dtype}") - - def logMetadata(self, logger): - self.logDates(logger) - self.logLonLat(logger) - self.logDepth(logger) - self.logStationID(logger) + def log(self, logger): + self.metadata.log(logger) + self.logObs(logger) + self.additional_vars.log(logger) def logObs(self, logger): self.logTemperature(logger) self.logSalinity(logger) - def logAdditionalData(self, logger): - self.LogSeqNum(logger) - self.LogPreQC(logger) - self.LogObsError_temp(logger) - self.LogObsError_saln(logger) - - def log(self, logger): - self.logMetadata(logger) - self.logObs(logger) - self.logAdditionalData(logger) - -##################################################################### - - -def WriteDateTime(obsspace, dateTime): - obsspace.create_var( - 'MetaData/dateTime', - dtype=dateTime.dtype, fillval=dateTime.fill_value - ) \ - .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ - .write_attr('long_name', 'Datetime') \ - .write_data(dateTime) - - -def WriteRcptDateTime(obsspace, rcptdateTime): - obsspace.create_var( - 'MetaData/rcptdateTime', - dtype=rcptdateTime.dtype, fillval=rcptdateTime.fill_value - ) \ - .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ - .write_attr('long_name', 'receipt Datetime') \ - .write_data(rcptdateTime) - - -def WriteLongitude(obsspace, lon): - obsspace.create_var( - 'MetaData/longitude', - dtype=lon.dtype, fillval=lon.fill_value - ) \ - .write_attr('units', 'degrees_east') \ - .write_attr('valid_range', np.array([-180, 180], dtype=np.float32)) \ - .write_attr('long_name', 'Longitude') \ - .write_data(lon) - - -def WriteLatitude(obsspace, lat): - obsspace.create_var( - 'MetaData/latitude', - dtype=lat.dtype, fillval=lat.fill_value - ) \ - .write_attr('units', 'degrees_north') \ - .write_attr('valid_range', np.array([-90, 90], dtype=np.float32)) \ - .write_attr('long_name', 'Latitude') \ - .write_data(lat) - - -def WriteStationID(obsspace, stationID): - obsspace.create_var( - 'MetaData/stationID', - dtype=stationID.dtype, fillval=stationID.fill_value - ) \ - .write_attr('long_name', 'Station Identification') \ - .write_data(stationID) - - -def WriteDepth(obsspace, depth): - obsspace.create_var( - 'MetaData/depth', - dtype=depth.dtype, - fillval=depth.fill_value - ) \ - .write_attr('units', 'm') \ - .write_attr('long_name', 'Water depth') \ - .write_data(depth) - - -def WriteSequenceNumber(obsspace, seqNum, PreQC): - obsspace.create_var( - 'MetaData/sequenceNumber', - dtype=PreQC.dtype, - fillval=PreQC.fill_value - ) \ - .write_attr('long_name', 'Sequence Number') \ - .write_data(seqNum) - + def logTemperature(self, logger): + LogVariable(logger, "temp", self.temp) + logger.debug(f"temp hash = {compute_hash(self.temp)}") -def WriteObsError(obsspace, v_name, units, v): - obsspace.create_var( - v_name, - dtype=v.dtype, fillval=v.fill_value - ) \ - .write_attr('units', units) \ - .write_attr('long_name', 'ObsError') \ - .write_data(v) + def logSalinity(self, logger): + LogVariable(logger, "saln", self.saln) + logger.debug(f"saln hash = {compute_hash(self.saln)}") diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py new file mode 100755 index 000000000..9bbd77f16 --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 + +import numpy as np +import numpy.ma as ma +import math +import matplotlib.pyplot as plt +import cartopy.crs as ccrs +import cartopy.feature as cfeature +import netCDF4 as nc +import xarray as xr + +# OceanBasin class provides a facility to add an OceanBasin +# metadata variable using lon and lat +# basic definition of ocean basins is read from an nc file, +# like the following one +# ocean_basin_nc_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" +# the actual path to the ocean basin nc file is supplied +# in the implementation of the converter + +# the main method is get_station_basin which returns the ocean basin +# for a list of station coordinates +# there are methods for plotting and printing the ocean basin data +# as well as printing and plotting station basin data + +class OceanBasin: + def print_basin(self): + for i in range(n1): + for j in range(n2): + print(i, j, self.__basin_array[i][j]) + + def read_nc_file(self, filename): + variable_name = 'open_ocean' + with nc.Dataset(filename, 'r') as nc_file: + if variable_name in nc_file.variables: + variable = nc_file.variables[variable_name] + + lat_dim = nc_file.dimensions['lat'].size + lon_dim = nc_file.dimensions['lon'].size + self.__latitudes = nc_file.variables['lat'][:] + self.__longitudes = nc_file.variables['lon'][:] + + # Read the variable data into a numpy array + variable_data = variable[:] + # Convert to 2D numpy array + self.__basin_array = np.reshape(variable_data, (lat_dim, lon_dim)) + + def plot_basin(self): + # Create a figure and axes with Cartopy projection + fig = plt.figure(figsize=(10, 6)) + ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) + + # Plot the ocean basins using a colormap with 6 colors + # cmap = plt.cm.get_cmap('rainbow', 6) # Choose a colormap with 6 colors + cmap = plt.get_cmap('viridis', 6) # Create a colormap with 6 discrete colors + im = ax.pcolormesh(self.__longitudes, self.__latitudes, self.__basin_array, cmap='viridis', shading='auto', transform=ccrs.PlateCarree()) + + # Add colorbar + cbar = fig.colorbar(im, ax=ax, orientation='vertical', pad=0.05, ticks=np.arange(0, 6)) + cbar.set_label('Ocean Basin', fontsize=12) + # Add title and gridlines + ax.set_title('Ocean Basin Map', fontsize=16) + ax.coastlines() + ax.gridlines(draw_labels=True) + # Show the plot + plt.show() + plt.savefig('ocean_basin.png', dpi=300) + + # input: 2 vectors of station coordinates + # output: a vector of station ocean basin values + def get_station_basin(self, lat, lon): + n = len(lon) + # print("number of stations = ", n) + + lat0 = self.__latitudes[0] + dlat = self.__latitudes[1] - self.__latitudes[0] + lon0 = self.__longitudes[0] + dlon = self.__longitudes[1] - self.__longitudes[0] + + # the data may be a masked array + ocean_basin = [] + for i in range(n): + if not ma.is_masked(lat[i]): + i1 = round((lat[i] - lat0) / dlat) + i2 = round((lon[i] - lon0) / dlon) + ocean_basin.append(self.__basin_array[i1][i2]) + return ocean_basin + + def print_station_basins(self, lon, lat, file_path): + ocean_basin = self.get_station_basin(lat, lon) + with open(file_path, 'w') as file: + # Iterate over lon, lat, and ocean_basin arrays simultaneously + for lat_val, lon_val, basin_val in zip(lat, lon, ocean_basin): + file.write(f"{lat_val} {lon_val} {basin_val}\n") + + def plot_stations(self, lon, lat, png_file): + ocean_basin = self.get_station_basin(lon, lat) + + # Initialize the plot + plt.figure(figsize=(12, 8)) + # Create a Cartopy map with PlateCarree projection (latitude/longitude) + ax = plt.axes(projection=ccrs.PlateCarree()) + # Add coastlines and borders + ax.coastlines() + ax.add_feature(cartopy.feature.BORDERS, linestyle=':', linewidth=0.5) + + # Scatter plot with colored dots for each basin type + colors = ['blue', 'green', 'red', 'cyan', 'magenta', 'yellow'] + for basin_type in range(6): + indices = np.where(ocean_basin == basin_type)[0] + ax.scatter(lon[indices], lat[indices], color=colors[basin_type], label=f'Basin {basin_type}', alpha=0.7) + + # Add a legend + plt.legend(loc='lower left') + # Add title and show plot + plt.title('Ocean Basins Plot using Cartopy') + plt.savefig(png_file, dpi=300) diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py index 9d990f76f..1df1bde8d 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py @@ -4,6 +4,7 @@ import subprocess import numpy as np import tempfile +import hashlib def ParseArguments(): @@ -23,7 +24,6 @@ def ParseArguments(): type=str, help='Input test reference file' ) - args = parser.parse_args() config_file = args.config log_file = args.log_file @@ -32,11 +32,8 @@ def ParseArguments(): return script_name, config_file, log_file, test_file -def Compute_sequenceNumber(lon): - lon_u, seqNum = np.unique(lon, return_inverse=True) - seqNum = seqNum.astype(np.int32) - # logger.debug(f"Len of Sequence Number: {len(seqNum)}") - return seqNum +def LogVariable(logger, v_name, v): + logger.debug(f"{v_name}: {len(v)}, {v.dtype} min, max = {v.min()}, {v.max()}") def run_diff(file1, file2, logger): @@ -51,6 +48,9 @@ def run_diff(file1, file2, logger): if result.returncode == 0: pass elif result.returncode == 1: + logger.error("diff on files:") + logger.error(f"{file1}") + logger.error(f"{file2}") logger.error("Files are different:") logger.error(f"{result.stdout}") else: @@ -61,3 +61,116 @@ def run_diff(file1, file2, logger): logger.error(f"Error occurred: {e}") return result.returncode + + +# use hash for testing; +def compute_hash(sequence, algorithm='sha256'): + """ + Compute a hash of the given sequence using the specified algorithm. + + :param sequence: A sequence of numbers (e.g., list of integers). + :param algorithm: The hash algorithm to use (e.g., 'sha256'). + :return: The hexadecimal digest of the hash. + """ + # Convert the sequence to a byte string + sequence_bytes = bytes(sequence) + # Create a hash object + hash_obj = hashlib.new(algorithm) + # Update the hash object with the byte string + hash_obj.update(sequence_bytes) + # Return the hexadecimal digest of the hash + return hash_obj.hexdigest() + + +##################################################################### + +def WriteDateTime(obsspace, dateTime): + obsspace.create_var( + 'MetaData/dateTime', + dtype=dateTime.dtype, fillval=dateTime.fill_value + ) \ + .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ + .write_attr('long_name', 'Datetime') \ + .write_data(dateTime) + + +def WriteRcptDateTime(obsspace, rcptdateTime): + obsspace.create_var( + 'MetaData/rcptdateTime', + dtype=rcptdateTime.dtype, fillval=rcptdateTime.fill_value + ) \ + .write_attr('units', 'seconds since 1970-01-01T00:00:00Z') \ + .write_attr('long_name', 'receipt Datetime') \ + .write_data(rcptdateTime) + + +def WriteLongitude(obsspace, lon): + obsspace.create_var( + 'MetaData/longitude', + dtype=lon.dtype, fillval=lon.fill_value + ) \ + .write_attr('units', 'degrees_east') \ + .write_attr('valid_range', np.array([-180, 180], dtype=np.float32)) \ + .write_attr('long_name', 'Longitude') \ + .write_data(lon) + + +def WriteLatitude(obsspace, lat): + obsspace.create_var( + 'MetaData/latitude', + dtype=lat.dtype, fillval=lat.fill_value + ) \ + .write_attr('units', 'degrees_north') \ + .write_attr('valid_range', np.array([-90, 90], dtype=np.float32)) \ + .write_attr('long_name', 'Latitude') \ + .write_data(lat) + + +def WriteStationID(obsspace, stationID): + obsspace.create_var( + 'MetaData/stationID', + dtype=stationID.dtype, fillval=stationID.fill_value + ) \ + .write_attr('long_name', 'Station Identification') \ + .write_data(stationID) + + +def WriteDepth(obsspace, depth): + obsspace.create_var( + 'MetaData/depth', + dtype=depth.dtype, + fillval=depth.fill_value + ) \ + .write_attr('units', 'm') \ + .write_attr('long_name', 'Water depth') \ + .write_data(depth) + + +def WriteSeqNum(obsspace, seqNum, datatype, fillvalue): + obsspace.create_var( + 'MetaData/sequenceNumber', + dtype=datatype, + fillval=fillvalue + ) \ + .write_attr('long_name', 'Sequence Number') \ + .write_data(seqNum) + + +def WriteObsError(obsspace, v_name, units, v): + obsspace.create_var( + v_name, + dtype=v.dtype, fillval=v.fill_value + ) \ + .write_attr('units', units) \ + .write_attr('long_name', 'ObsError') \ + .write_data(v) + + +def WriteOceanBasin(obsspace, ocean_basin, datatype, fillvalue): + obsspace.create_var( + 'MetaData/oceanBasin', + dtype=datatype, + fillval=fillvalue + ) \ + .write_attr('long_name', 'Ocean basin') \ + .write_data(ocean_basin) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py index ad3f16d43..848480bf7 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py @@ -1,12 +1,13 @@ import numpy as np from pyiodaconv import bufr from b2iconverter.ioda_variables import IODAVariables -from b2iconverter.util import Compute_sequenceNumber +from b2iconverter.ioda_addl_vars import IODAAdditionalVariables, ComputeSeqNum class BathyIODAVariables(IODAVariables): def __init__(self): - super().__init__() + self.construct() + self.additional_vars = BathyAdditionalVariables(self) def BuildQuery(self): q = super().BuildQuery() @@ -14,7 +15,6 @@ def BuildQuery(self): q.add('latitude', '*/CLAT') q.add('longitude', '*/CLON') q.add('depth', '*/BTOCN/DBSS') - # ObsValue q.add('temp', '*/BTOCN/STMP') return q @@ -24,34 +24,36 @@ def SetObsFromQueryResult(self, r): def filter(self): mask = self.TemperatureFilter() - self.n_obs = len(mask) - - self.lat = self.lat[mask] - self.lon = self.lon[mask] - self.depth = self.depth[mask] - self.stationID = self.stationID[mask] - self.dateTime = self.dateTime[mask] - self.rcptdateTime = self.rcptdateTime[mask] + self.metadata.filter(mask) self.temp = self.temp[mask] - def SetAdditionalData(self): - self.seqNum = Compute_sequenceNumber(self.lon) - self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) - - # ObsError -- UNUSED - # ObsError_temp = np.float32(np.ma.masked_array(np.full((len(temp)), 0.24))) - - def createIODAVars(self, obsspace): - self.WriteBasicMetadata(obsspace) - self.WriteStationID(obsspace) - self.WriteDepth(obsspace) - self.WriteSequenceNumber(obsspace) - self.WritePreQC(obsspace, self.T_name) + def WriteToIodaFile(self, obsspace): + self.metadata.WriteToIodaFile(obsspace) + self.additional_vars.WriteToIodaFile(obsspace) self.WriteObsValueT(obsspace) def logObs(self, logger): self.logTemperature(logger) - def logAdditionalData(self, logger): - self.LogSeqNum(logger) - self.LogPreQC(logger) + +class BathyAdditionalVariables(IODAAdditionalVariables): + + def construct(self): + self.seqNum = ComputeSeqNum(self.ioda_vars.metadata.lon, self.ioda_vars.metadata.lat) + n = len(self.seqNum) + self.PreQC = (np.ma.masked_array(np.full(n, 0))).astype(np.int32) + self.ObsError_temp = \ + np.float32(np.ma.masked_array(np.full(n, self.ioda_vars.T_error))) + self.ComputeOceanBasin() + + def WriteToIodaFile(self, obsspace): + self.WriteSeqNum(obsspace) + self.WritePreQC(obsspace, self.ioda_vars.T_name) + self.WriteObsErrorT(obsspace) + self.WriteOceanBasin(obsspace) + + def log(self, logger): + self.logSeqNum(logger) + self.logPreQC(logger) + self.logObsError_temp(logger) + self.logOceanBasin(logger) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py index b4baa5a4d..bf08a7e5e 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py @@ -7,12 +7,20 @@ from argo_ioda_variables import ArgoIODAVariables +platform_description = 'ARGO profiles from subpfl: temperature and salinity' +ocean_basin_nc_file_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" + + +class ArgoConfig(Bufr2iodaConfig): + def IODAFilename(self): + return f"{self.cycle_type}.t{self.hh}z.insitu_profile_argo.{self.cycle_datetime}.nc4" + + if __name__ == '__main__': script_name, config_file, log_file, test_file = ParseArguments() - platform_description = 'ARGO profiles from subpfl: temperature and salinity' - bufr2ioda_config = Bufr2iodaConfig( + bufr2ioda_config = ArgoConfig( script_name, config_file, platform_description) @@ -22,6 +30,8 @@ ioda_vars.SetTemperatureError(0.02) ioda_vars.SetSalinityVarName("salinity") ioda_vars.SetSalinityError(0.01) + ioda_vars.SetOceanBasinNCFilePath(ocean_basin_nc_file_path) + argo = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) argo.run() diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py index 59c60d490..332fc187d 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py @@ -7,11 +7,15 @@ from bathy_ioda_variables import BathyIODAVariables +platform_description = 'Profiles from BATHYthermal: temperature' + +ocean_basin_nc_file_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" + + if __name__ == '__main__': script_name, config_file, log_file, test_file = ParseArguments() - platform_description = 'Profiles from BATHYthermal: temperature' bufr2ioda_config = Bufr2iodaConfig( script_name, config_file, @@ -21,7 +25,10 @@ # ??? ioda_vars.SetTemperatureError(0.3) # ??? ioda_vars.SetSalinityError(1.0) ioda_vars.SetTemperatureVarName("waterTemperature") + ioda_vars.SetOceanBasinNCFilePath(ocean_basin_nc_file_path) + bathy = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) + bathy.run() if test_file: diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py index 26feaf0a5..24dc96ee1 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py @@ -7,17 +7,16 @@ from glider_ioda_variables import GliderIODAVariables -class GliderConfig(Bufr2iodaConfig): - def IODAFilename(self): - return f"{self.cycle_type}.t{self.hh}z.{self.data_type}_profiles.{self.data_format}.nc4" +platform_description = 'GLIDER profiles from subpfl: temperature and salinity' + +ocean_basin_nc_file_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" if __name__ == '__main__': script_name, config_file, log_file, test_file = ParseArguments() - platform_description = 'GLIDER profiles from subpfl: temperature and salinity' - bufr2ioda_config = GliderConfig( + bufr2ioda_config = Bufr2iodaConfig( script_name, config_file, platform_description) @@ -27,6 +26,7 @@ def IODAFilename(self): ioda_vars.SetTemperatureError(0.02) ioda_vars.SetSalinityVarName("salinity") ioda_vars.SetSalinityError(0.01) + ioda_vars.SetOceanBasinNCFilePath(ocean_basin_nc_file_path) glider = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) glider.run() diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_marinemammal.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_marinemammal.py deleted file mode 100755 index 01c0bec61..000000000 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_marinemammal.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python3 - -from util import ParseArguments -from bufr2ioda_config import Bufr2iodaConfig -from marinemammal_ioda_variables import MarinemammalIODAVariables -from bufr2ioda_converter import Bufr2ioda_Converter - - -if __name__ == '__main__': - - script_name, config_file, log_file, test_file = ParseArguments() - - platform_description = 'Profiles from Marine Mammals: temperature and salinity' - bufr2ioda_config = Bufr2iodaConfig( - script_name, - config_file, - platform_description) - - ioda_vars = MarinemammalIODAVariables() - ioda_vars.SetTemperatureVarName("waterTemperature") - ioda_vars.SetTemperatureError(0.02) - ioda_vars.SetSalinityVarName("salinity") - ioda_vars.SetSalinityError(0.01) - - mammal = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) - mammal.run() - - if test_file: - result = mammal.test(test_file) - sys.exit(result) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py index 8b7222456..6d23c7cb8 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py @@ -7,11 +7,15 @@ from tesac_ioda_variables import TesacIODAVariables +platform_description = 'Profiles from TESAC: temperature and salinity' + +ocean_basin_nc_file_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" + + if __name__ == '__main__': script_name, config_file, log_file, test_file = ParseArguments() - platform_description = 'Profiles from TESAC: temperature and salinity' bufr2ioda_config = Bufr2iodaConfig( script_name, config_file, @@ -22,8 +26,10 @@ ioda_vars.SetTemperatureVarName("waterTemperature") ioda_vars.SetSalinityError(0.01) ioda_vars.SetSalinityVarName("salinity") + ioda_vars.SetOceanBasinNCFilePath(ocean_basin_nc_file_path) tesac = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) + tesac.run() if test_file: diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py index 81dc90c77..dd1de932c 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py @@ -7,17 +7,16 @@ from xbtctd_ioda_variables import XbtctdIODAVariables -class XbtctdConfig(Bufr2iodaConfig): - def IODAFilename(self): - return f"{self.cycle_type}.t{self.hh}z.{self.data_type}_profiles.{self.data_format}.nc4" +platform_description = 'Profiles from XBT/CTD: temperature and salinity' + +ocean_basin_nc_file_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" if __name__ == '__main__': script_name, config_file, log_file, test_file = ParseArguments() - platform_description = 'Profiles from XBT/CTD: temperature and salinity' - bufr2ioda_config = XbtctdConfig( + bufr2ioda_config = Bufr2iodaConfig( script_name, config_file, platform_description) @@ -27,6 +26,7 @@ def IODAFilename(self): ioda_vars.SetTemperatureError(0.12) ioda_vars.SetSalinityVarName("salinity") ioda_vars.SetSalinityError(1.0) + ioda_vars.SetOceanBasinNCFilePath(ocean_basin_nc_file_path) xbtctd = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) xbtctd.run() diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_altkob.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_altkob.py deleted file mode 100755 index d2eab0d92..000000000 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_altkob.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python3 - -import sys -from altkob_ioda_variables import AltkobIODAVariables -from b2iconverter.util import ParseArguments -from b2iconverter.bufr2ioda_config import Bufr2iodaConfig -from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter - - -class AltkobConfig(Bufr2iodaConfig): - def IODAFilename(self): - return f"{self.cycle_type}.t{self.hh}z.{self.data_type}_profiles.{self.data_format}.nc4" - - -if __name__ == '__main__': - - script_name, config_file, log_file, test_file = ParseArguments() - - platform_description = 'Surface obs from ALTKOB: temperature and salinity' - bufr2ioda_config = AltkobConfig( - script_name, - config_file, - platform_description) - - ioda_vars = AltkobIODAVariables() - ioda_vars.SetTemperatureVarName("seaSurfaceTemperature") - ioda_vars.SetTemperatureError(0.3) - ioda_vars.SetSalinityVarName("seaSurfaceSalinity") - ioda_vars.SetSalinityError(1.0) - altkob = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) - altkob.run() - - if test_file: - result = altkob.test(test_file) - sys.exit(result) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py index 251ec4260..63188f39f 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py @@ -7,6 +7,11 @@ from trkob_ioda_variables import TrkobIODAVariables +platform_description = 'Surface obs from TRACKOB: temperature and salinity' + +ocean_basin_nc_file_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" + + class TrkobConfig(Bufr2iodaConfig): def IODAFilename(self): return f"{self.cycle_type}.t{self.hh}z.insitu_surface_{self.data_format}.{self.cycle_datetime}.nc4" @@ -16,7 +21,6 @@ def IODAFilename(self): script_name, config_file, log_file, test_file = ParseArguments() - platform_description = 'Surface obs from TRACKOB: temperature and salinity' bufr2ioda_config = TrkobConfig( script_name, config_file, @@ -27,6 +31,7 @@ def IODAFilename(self): ioda_vars.SetTemperatureError(0.3) ioda_vars.SetSalinityVarName("seaSurfaceSalinity") ioda_vars.SetSalinityError(1.0) + ioda_vars.SetOceanBasinNCFilePath(ocean_basin_nc_file_path) trkob = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) trkob.run() diff --git a/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py index e59666d30..a51ba6b83 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py @@ -1,7 +1,6 @@ import numpy as np from pyiodaconv import bufr from b2iconverter.ioda_variables import IODAVariables -from b2iconverter.util import Compute_sequenceNumber class GliderIODAVariables(IODAVariables): @@ -14,7 +13,6 @@ def BuildQuery(self): q.add('latitude', '*/CLATH') q.add('longitude', '*/CLONH') q.add('depth', '*/GLPFDATA/WPRES') - # ObsValue q.add('temp', '*/GLPFDATA/SSTH') q.add('saln', '*/GLPFDATA/SALNH') return q @@ -22,47 +20,22 @@ def BuildQuery(self): def SetFromQueryResult(self, r): super().SetFromQueryResult(r) # convert depth in pressure units to meters (rho * g * h) - self.depth = np.float32(self.depth.astype(float) * 0.0001) + self.metadata.depth = np.float32(self.metadata.depth.astype(float) * 0.0001) def filter(self): + # Separate GLIDER profiles from subpfl tank + id = self.metadata.stationID + id_mask = (id >= 68900) & (id <= 68999) | \ + (id >= 1800000) & (id <= 1809999) | \ + (id >= 2800000) & (id <= 2809999) | \ + (id >= 3800000) & (id <= 3809999) | \ + (id >= 4800000) & (id <= 4809999) | \ + (id >= 5800000) & (id <= 5809999) | \ + (id >= 6800000) & (id <= 6809999) | \ + (id >= 7800000) & (id <= 7809999) mask = self.TemperatureFilter() \ - & self.SalinityFilter() - + & self.SalinityFilter() \ + & id_mask + self.metadata.filter(mask) self.temp = self.temp[mask] self.saln = self.saln[mask] - self.lat = self.lat[mask] - self.lon = self.lon[mask] - self.depth = self.depth[mask] - self.stationID = self.stationID[mask] - self.dateTime = self.dateTime[mask] - self.rcptdateTime = self.rcptdateTime[mask] - - self.seqNum = Compute_sequenceNumber(self.lon) - - # Separate GLIDER profiles from subpfl tank - # Creating the mask for GLIDER floats based on station ID numbers - - mask_gldr = (self.stationID >= 68900) & (self.stationID <= 68999) | (self.stationID >= 1800000) & (self.stationID <= 1809999) | \ - (self.stationID >= 2800000) & (self.stationID <= 2809999) | (self.stationID >= 3800000) & (self.stationID <= 3809999) | \ - (self.stationID >= 4800000) & (self.stationID <= 4809999) | (self.stationID >= 5800000) & (self.stationID <= 5809999) | \ - (self.stationID >= 6800000) & (self.stationID <= 6809999) | (self.stationID >= 7800000) & (self.stationID <= 7809999) - - # Apply mask - self.stationID = self.stationID[mask_gldr] - self.lat = self.lat[mask_gldr] - self.lon = self.lon[mask_gldr] - self.depth = self.depth[mask_gldr] - self.temp = self.temp[mask_gldr] - self.saln = self.saln[mask_gldr] - self.seqNum = self.seqNum[mask_gldr] - self.dateTime = self.dateTime[mask_gldr] - self.rcptdateTime = self.rcptdateTime[mask_gldr] - - self.n_obs = len(mask_gldr) - - def SetAdditionalData(self): - self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) - self.ObsError_temp = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.T_error))) - self.ObsError_saln = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.S_error))) diff --git a/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py deleted file mode 100644 index ee581b648..000000000 --- a/ush/ioda/bufr2ioda/marine/b2i/marinemammal_ioda_variables.py +++ /dev/null @@ -1,52 +0,0 @@ -import numpy as np -from pyiodaconv import bufr -from b2iconverter.ioda_variables import IODAVariables -from b2iconverter.util import Compute_sequenceNumber - - -class MarinemammalIODAVariables(IODAVariables): - def __init__(self): - super().__init__() - - def BuildQuery(self): - q = super().BuildQuery() - q.add('stationID', '*/RPID') - q.add('latitude', '*/CLAT') - q.add('longitude', '*/CLON') - q.add('depth', '*/BTOCN/DBSS') - # ObsValue - q.add('temp', '*/BTOCN/STMP') - q.add('saln', '*/BTOCN/SALN') - return q - - def filter(self): - mask = self.TemperatureFilter() \ - & self.SalinityFilter() - - self.temp = self.temp[mask] - self.saln = self.saln[mask] - self.lat = self.lat[mask] - self.lon = self.lon[mask] - self.depth = self.depth[mask] - self.stationID = self.stationID[mask] - self.dateTime = self.dateTime[mask] - self.rcptdateTime = self.rcptdateTime[mask] - - # Separate marine mammals from TESAC tank - # Creating the mask for marine mammals from TESAC floats based on station ID - - alpha_mask = [item.isalpha() for item in self.stationID] - indices_true = [index for index, value in enumerate(alpha_mask) if value] - - self.n_obs = len(indices_true) - - # Apply index - self.stationID = self.stationID[indices_true] - self.lat = self.lat[indices_true] - self.lon = self.lon[indices_true] - self.depth = self.depth[indices_true] - self.temp = self.temp[indices_true] - self.saln = self.saln[indices_true] - self.seqNum = self.seqNum[indices_true] - self.dateTime = self.dateTime[indices_true] - self.rcptdateTime = self.rcptdateTime[indices_true] diff --git a/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py index 6196b601e..177a058b4 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py @@ -1,7 +1,5 @@ -import numpy as np from pyiodaconv import bufr from b2iconverter.ioda_variables import IODAVariables -from b2iconverter.util import Compute_sequenceNumber class TesacIODAVariables(IODAVariables): @@ -14,47 +12,16 @@ def BuildQuery(self): q.add('latitude', '*/CLAT') q.add('longitude', '*/CLON') q.add('depth', '*/BTOCN/DBSS') - # ObsValue q.add('temp', '*/BTOCN/STMP') q.add('saln', '*/BTOCN/SALN') return q def filter(self): - mask = self.TemperatureFilter() \ + # Separate TESAC profiles tesac tank + id_mask = [True if id.isdigit() and id != 0 else False for id in self.metadata.stationID] + mask = id_mask \ + & self.TemperatureFilter() \ & self.SalinityFilter() - + self.metadata.filter(mask) self.temp = self.temp[mask] self.saln = self.saln[mask] - self.lat = self.lat[mask] - self.lon = self.lon[mask] - self.depth = self.depth[mask] - self.stationID = self.stationID[mask] - self.dateTime = self.dateTime[mask] - self.rcptdateTime = self.rcptdateTime[mask] - - self.seqNum = Compute_sequenceNumber(self.lon) - - # Separate TESAC profiles tesac tank - # Creating the mask for TESAC floats based on station ID - digit_mask = [item.isdigit() for item in self.stationID] - indices_true = [index for index, value in enumerate(digit_mask) if value] - - # Apply index - self.stationID = self.stationID[indices_true] - self.lat = self.lat[indices_true] - self.lon = self.lon[indices_true] - self.depth = self.depth[indices_true] - self.temp = self.temp[indices_true] - self.saln = self.saln[indices_true] - self.seqNum = self.seqNum[indices_true] - self.dateTime = self.dateTime[indices_true] - self.rcptdateTime = self.rcptdateTime[indices_true] - - self.n_obs = len(indices_true) - - def SetAdditionalData(self): - self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) - self.ObsError_temp = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.T_error))) - self.ObsError_saln = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.S_error))) diff --git a/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py index 5fae69699..73a12c058 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py @@ -1,12 +1,16 @@ import numpy as np from pyiodaconv import bufr from b2iconverter.ioda_variables import IODAVariables -from b2iconverter.util import Compute_sequenceNumber +from b2iconverter.ioda_addl_vars import IODAAdditionalVariables +from b2iconverter.ioda_metadata import IODAMetadata +from b2iconverter.util import WriteDateTime, WriteRcptDateTime, WriteLongitude, WriteLatitude, WriteStationID class TrkobIODAVariables(IODAVariables): def __init__(self): - super().__init__() + self.construct() + self.metadata = TrkobMetadata() + self.additional_vars = TrkobAdditionalVariables(self) def BuildQuery(self): q = super().BuildQuery() @@ -14,7 +18,6 @@ def BuildQuery(self): q.add('latitude', '*/CLAT') q.add('longitude', '*/CLON') q.add('depth', '*/BTOCN/DBSS') - # ObsValue q.add('temp', '*/BTOCN/STMP') q.add('saln', '*/BTOCN/SALN') return q @@ -22,41 +25,63 @@ def BuildQuery(self): def filter(self): mask = self.TemperatureFilter() \ & self.SalinityFilter() - self.n_obs = len(mask) - self.temp = self.temp[mask] self.saln = self.saln[mask] + self.metadata.filter(mask) + + +class TrkobMetadata(IODAMetadata): + + def SetFromQueryResult(self, r): + self.SetDateTimeFromQueryResult(r) + self.SetRcptDateTimeFromQueryResult(r) + self.SetLonFromQueryResult(r) + self.SetLatFromQueryResult(r) + self.SetStationIDFromQueryResult(r) + + def filter(self, mask): + self.dateTime = self.dateTime[mask] + self.rcptdateTime = self.rcptdateTime[mask] self.lat = self.lat[mask] self.lon = self.lon[mask] self.stationID = self.stationID[mask] - self.dateTime = self.dateTime[mask] - self.rcptdateTime = self.rcptdateTime[mask] - def SetAdditionalData(self): - self.PreQC = (np.ma.masked_array(np.full((self.n_obs), 0))).astype(np.int32) - self.ObsError_temp = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.T_error))) - self.ObsError_saln = \ - np.float32(np.ma.masked_array(np.full((self.n_obs), self.S_error))) + def WriteToIodaFile(self, obsspace): + WriteDateTime(obsspace, self.dateTime) + WriteRcptDateTime(obsspace, self.rcptdateTime) + WriteLongitude(obsspace, self.lon) + WriteLatitude(obsspace, self.lat) + WriteStationID(obsspace, self.stationID) - def createIODAVars(self, obsspace): - self.WriteBasicMetadata(obsspace) + def log(self, logger): + self.logDateTime(logger) + self.logRcptDateTime(logger) + # self.logLonLat(logger) + self.logLongitude(logger) + self.logLatitude(logger) + self.logStationID(logger) - self.WriteStationID(obsspace) - self.WritePreQC(obsspace, self.T_name) - self.WritePreQC(obsspace, self.S_name) +class TrkobAdditionalVariables(IODAAdditionalVariables): + + def construct(self): + n = len(self.ioda_vars.temp) + self.PreQC = (np.ma.masked_array(np.full(n, 0))).astype(np.int32) + self.ObsError_temp = \ + np.float32(np.ma.masked_array(np.full(n, self.ioda_vars.T_error))) + self.ObsError_saln = \ + np.float32(np.ma.masked_array(np.full(n, self.ioda_vars.S_error))) + self.ComputeOceanBasin() + + def WriteToIodaFile(self, obsspace): + self.WritePreQC(obsspace, self.ioda_vars.T_name) + self.WritePreQC(obsspace, self.ioda_vars.S_name) self.WriteObsErrorT(obsspace) self.WriteObsErrorS(obsspace) - self.WriteObsValueT(obsspace) - self.WriteObsValueS(obsspace) - - def logMetadata(self, logger): - self.logDates(logger) - self.logLonLat(logger) - self.logStationID(logger) + self.WriteOceanBasin(obsspace) - def logAdditionalData(self, logger): - self.LogPreQC(logger) - self.LogObsError_temp(logger) - self.LogObsError_saln(logger) + def log(self, logger): + self.logPreQC(logger) + self.logObsError_temp(logger) + self.logObsError_saln(logger) + self.logOceanBasin(logger) diff --git a/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py index 68b20d23e..7dfa295f9 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py @@ -1,7 +1,6 @@ import numpy as np from pyiodaconv import bufr from b2iconverter.ioda_variables import IODAVariables -from b2iconverter.util import Compute_sequenceNumber class XbtctdIODAVariables(IODAVariables): @@ -14,7 +13,6 @@ def BuildQuery(self): q.add('latitude', '*/CLATH') q.add('longitude', '*/CLONH') q.add('depth', '*/TMSLPFSQ/DBSS') - # ObsValue q.add('temp', '*/TMSLPFSQ/SST1') q.add('saln', '*/TMSLPFSQ/SALNH') return q @@ -22,13 +20,6 @@ def BuildQuery(self): def filter(self): mask = self.TemperatureFilter() \ & self.SalinityFilter() - self.n_obs = len(mask) - self.temp = self.temp[mask] self.saln = self.saln[mask] - self.lat = self.lat[mask] - self.lon = self.lon[mask] - self.depth = self.depth[mask] - self.stationID = self.stationID[mask] - self.dateTime = self.dateTime[mask] - self.rcptdateTime = self.rcptdateTime[mask] + self.metadata.filter(mask) From 344a4d011ae8707a228bcfe15a1f20d95998efb3 Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Mon, 9 Sep 2024 00:42:06 +0000 Subject: [PATCH 46/54] all tests passed --- .../marine/b2i/b2iconverter/ioda_addl_vars.py | 13 +-- .../marine/b2i/b2iconverter/ocean.py | 83 ++++++++++++------ .../b2i/bufr2ioda_insitu_profile_argo.py | 2 - .../b2i/bufr2ioda_insitu_profile_bathy.py | 3 - .../b2i/bufr2ioda_insitu_profile_glider.py | 3 - .../b2i/bufr2ioda_insitu_profile_tesac.py | 3 - .../b2i/bufr2ioda_insitu_profile_xbtctd.py | 3 - .../b2i/bufr2ioda_insitu_surface_trkob.py | 3 - .../marine/b2i/bufr_plot_stations.py | 73 +++++++++++++++ ush/ioda/bufr2ioda/marine/b2i/stations.png | Bin 0 -> 394326 bytes 10 files changed, 133 insertions(+), 53 deletions(-) create mode 100644 ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py create mode 100644 ush/ioda/bufr2ioda/marine/b2i/stations.png diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py index 4ebaea321..fa6069c84 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py @@ -7,6 +7,7 @@ class IODAAdditionalVariables: def __init__(self, ioda_vars): self.ioda_vars = ioda_vars + self.ocean = OceanBasin() def construct(self): self.seqNum = ComputeSeqNum(self.ioda_vars.metadata.lon, @@ -20,19 +21,13 @@ def construct(self): self.ComputeOceanBasin() def SetOceanBasinNCFilePath(self, nc_file_path): - self.ocean_basin_nc_file_path = nc_file_path + self.ocean.SetOceanBasinNCFilePath(nc_file_path) def ComputeOceanBasin(self): - try: - ocean = OceanBasin() - ocean.read_nc_file(self.ocean_basin_nc_file_path) - except Exception as e: - print(f"Fatal error: unable to read ocean basin file {self.ocean_basin_nc_file_path}") - sys.exit(1) lat = self.ioda_vars.metadata.lat lon = self.ioda_vars.metadata.lon - # self.OceanBasin = ocean.get_station_basin(lat, lon) - ob = ocean.get_station_basin(lat, lon) + self.ocean.ReadNCFile() + ob = self.ocean.GetStationBasin(lat, lon) self.OceanBasin = np.array(ob, dtype=np.int32) def SetTemperatureError(self, e): diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py index 9bbd77f16..eff60e604 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py @@ -1,5 +1,7 @@ #!/usr/bin/env python3 +import os +import sys import numpy as np import numpy.ma as ma import math @@ -12,39 +14,66 @@ # OceanBasin class provides a facility to add an OceanBasin # metadata variable using lon and lat # basic definition of ocean basins is read from an nc file, -# like the following one -# ocean_basin_nc_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" -# the actual path to the ocean basin nc file is supplied +# We search for the filename, depending on the system +# The path to the ocean basin nc file can be supplied # in the implementation of the converter -# the main method is get_station_basin which returns the ocean basin +# the main method is GetStationBasin which returns the ocean basin # for a list of station coordinates # there are methods for plotting and printing the ocean basin data # as well as printing and plotting station basin data + class OceanBasin: - def print_basin(self): + def __init__(self): + self.FindOceanBasinNCFile() + + def SetOceanBasinNCFilePath(self, filename): + self.ocean_basin_nc_file_path = filename + + def FindOceanBasinNCFile(self): + # try on hera: + trypath = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" + if os.path.exists(trypath): + self.ocean_basin_nc_file_path = trypath + else: + # try on orion + trypath = "/work/noaa/global/glopara/fix/gdas/soca/20240802/common/RECCAP2_region_masks_all_v20221025.nc" + if os.path.exists(trypath): + self.ocean_basin_nc_file_path = trypath + else: + # file not found + self.ocean_basin_nc_file_path = "" + + def ReadNCFile(self): + try: + with nc.Dataset(self.ocean_basin_nc_file_path, 'r') as nc_file: + variable_name = 'open_ocean' + if variable_name in nc_file.variables: + lat_dim = nc_file.dimensions['lat'].size + lon_dim = nc_file.dimensions['lon'].size + self.__latitudes = nc_file.variables['lat'][:] + self.__longitudes = nc_file.variables['lon'][:] + + variable = nc_file.variables[variable_name] + # Read the variable data into a numpy array + variable_data = variable[:] + # Convert to 2D numpy array + self.__basin_array = np.reshape(variable_data, (lat_dim, lon_dim)) + except FileNotFoundError: + print(f"The file {file_path} does not exist.") + sys.exit(1) + except IOError as e: + # Handle other I/O errors, such as permission errors + print(f"An IOError occurred: {e}") + sys.exit(1) + + def PrintBasin(self): for i in range(n1): for j in range(n2): print(i, j, self.__basin_array[i][j]) - def read_nc_file(self, filename): - variable_name = 'open_ocean' - with nc.Dataset(filename, 'r') as nc_file: - if variable_name in nc_file.variables: - variable = nc_file.variables[variable_name] - - lat_dim = nc_file.dimensions['lat'].size - lon_dim = nc_file.dimensions['lon'].size - self.__latitudes = nc_file.variables['lat'][:] - self.__longitudes = nc_file.variables['lon'][:] - - # Read the variable data into a numpy array - variable_data = variable[:] - # Convert to 2D numpy array - self.__basin_array = np.reshape(variable_data, (lat_dim, lon_dim)) - - def plot_basin(self): + def PlotBasin(self): # Create a figure and axes with Cartopy projection fig = plt.figure(figsize=(10, 6)) ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) @@ -67,7 +96,7 @@ def plot_basin(self): # input: 2 vectors of station coordinates # output: a vector of station ocean basin values - def get_station_basin(self, lat, lon): + def GetStationBasin(self, lat, lon): n = len(lon) # print("number of stations = ", n) @@ -85,15 +114,15 @@ def get_station_basin(self, lat, lon): ocean_basin.append(self.__basin_array[i1][i2]) return ocean_basin - def print_station_basins(self, lon, lat, file_path): - ocean_basin = self.get_station_basin(lat, lon) + def PrintStationBasin(self, lon, lat, file_path): + ocean_basin = self.GetStationBasin(lat, lon) with open(file_path, 'w') as file: # Iterate over lon, lat, and ocean_basin arrays simultaneously for lat_val, lon_val, basin_val in zip(lat, lon, ocean_basin): file.write(f"{lat_val} {lon_val} {basin_val}\n") - def plot_stations(self, lon, lat, png_file): - ocean_basin = self.get_station_basin(lon, lat) + def PlotStations(self, lon, lat, png_file): + ocean_basin = self.GetStationBasin(lon, lat) # Initialize the plot plt.figure(figsize=(12, 8)) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py index bf08a7e5e..af9f34b69 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py @@ -8,7 +8,6 @@ platform_description = 'ARGO profiles from subpfl: temperature and salinity' -ocean_basin_nc_file_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" class ArgoConfig(Bufr2iodaConfig): @@ -30,7 +29,6 @@ def IODAFilename(self): ioda_vars.SetTemperatureError(0.02) ioda_vars.SetSalinityVarName("salinity") ioda_vars.SetSalinityError(0.01) - ioda_vars.SetOceanBasinNCFilePath(ocean_basin_nc_file_path) argo = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py index 332fc187d..191fa1792 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py @@ -9,8 +9,6 @@ platform_description = 'Profiles from BATHYthermal: temperature' -ocean_basin_nc_file_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" - if __name__ == '__main__': @@ -25,7 +23,6 @@ # ??? ioda_vars.SetTemperatureError(0.3) # ??? ioda_vars.SetSalinityError(1.0) ioda_vars.SetTemperatureVarName("waterTemperature") - ioda_vars.SetOceanBasinNCFilePath(ocean_basin_nc_file_path) bathy = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py index 24dc96ee1..45f11329e 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py @@ -9,8 +9,6 @@ platform_description = 'GLIDER profiles from subpfl: temperature and salinity' -ocean_basin_nc_file_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" - if __name__ == '__main__': @@ -26,7 +24,6 @@ ioda_vars.SetTemperatureError(0.02) ioda_vars.SetSalinityVarName("salinity") ioda_vars.SetSalinityError(0.01) - ioda_vars.SetOceanBasinNCFilePath(ocean_basin_nc_file_path) glider = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) glider.run() diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py index 6d23c7cb8..28dc87397 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py @@ -9,8 +9,6 @@ platform_description = 'Profiles from TESAC: temperature and salinity' -ocean_basin_nc_file_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" - if __name__ == '__main__': @@ -26,7 +24,6 @@ ioda_vars.SetTemperatureVarName("waterTemperature") ioda_vars.SetSalinityError(0.01) ioda_vars.SetSalinityVarName("salinity") - ioda_vars.SetOceanBasinNCFilePath(ocean_basin_nc_file_path) tesac = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py index dd1de932c..0c69f8caa 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py @@ -9,8 +9,6 @@ platform_description = 'Profiles from XBT/CTD: temperature and salinity' -ocean_basin_nc_file_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" - if __name__ == '__main__': @@ -26,7 +24,6 @@ ioda_vars.SetTemperatureError(0.12) ioda_vars.SetSalinityVarName("salinity") ioda_vars.SetSalinityError(1.0) - ioda_vars.SetOceanBasinNCFilePath(ocean_basin_nc_file_path) xbtctd = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) xbtctd.run() diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py index 63188f39f..7d3898dae 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py @@ -9,8 +9,6 @@ platform_description = 'Surface obs from TRACKOB: temperature and salinity' -ocean_basin_nc_file_path = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" - class TrkobConfig(Bufr2iodaConfig): def IODAFilename(self): @@ -31,7 +29,6 @@ def IODAFilename(self): ioda_vars.SetTemperatureError(0.3) ioda_vars.SetSalinityVarName("seaSurfaceSalinity") ioda_vars.SetSalinityError(1.0) - ioda_vars.SetOceanBasinNCFilePath(ocean_basin_nc_file_path) trkob = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) trkob.run() diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py b/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py new file mode 100644 index 000000000..acc8db288 --- /dev/null +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py @@ -0,0 +1,73 @@ +import argparse + +from pyiodaconv import bufr + +import matplotlib.pyplot as plt +import cartopy.crs as ccrs +import cartopy.feature as cfeature +# from .ocean import OceanBasin + + +def plot_points_on_map(latitudes, longitudes, title='Map with Points', marker_color='red', marker_size=50): + """ + Plots points on a map given lists of latitudes and longitudes. + + Parameters: + latitudes (list of float): List of latitude values for the points. + longitudes (list of float): List of longitude values for the points. + title (str): Title of the map (default is 'Map with Points'). + marker_color (str): Color of the markers (default is 'red'). + marker_size (int): Size of the markers (default is 50). + """ + # Create a new figure + fig, ax = plt.subplots(figsize=(10, 7), subplot_kw={'projection': ccrs.PlateCarree()}) + + # Add features to the map + ax.add_feature(cfeature.LAND, edgecolor='black') + ax.add_feature(cfeature.OCEAN) + ax.add_feature(cfeature.COASTLINE) + ax.add_feature(cfeature.BORDERS, linestyle=':') + ax.add_feature(cfeature.LAKES, edgecolor='black') + + # Add gridlines + ax.gridlines(draw_labels=True) + + # Plot each point + ax.scatter(longitudes, latitudes, color=marker_color, s=marker_size, edgecolor='black', transform=ccrs.PlateCarree()) + + # Set title + plt.title(title) + + # Show the map + # plt.show() + png_file = "stations.png" + plt.savefig(png_file, dpi=300) + + +# bufrfile_path = "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/xx003" + + +parser = argparse.ArgumentParser() +parser.add_argument( + '-i', '--input', + type=str, + help='Input BUFR filename', required=True +) +args = parser.parse_args() +bufrfile_path = args.input + +q = bufr.QuerySet() +q.add('longitude', '*/CLON') +q.add('latitude', '*/CLAT') + +with bufr.File(bufrfile_path) as f: + r = f.execute(q) + +print("Executed query") + +lon = r.get('longitude') +lat = r.get('latitude') + +print(f"read lat, lon -- {len(lon)} points") + +plot_points_on_map(lat, lon, title='stations', marker_color='blue', marker_size=10) diff --git a/ush/ioda/bufr2ioda/marine/b2i/stations.png b/ush/ioda/bufr2ioda/marine/b2i/stations.png new file mode 100644 index 0000000000000000000000000000000000000000..5fbd83b83b9ece2bce1f8da1b19e2cadd4e738eb GIT binary patch literal 394326 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 Z~eLbP?ahxymV+G10U1wEs3O;#6SVyF#r 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%0AP>CwmDF)%F!+yU=`NhldP|-B02gR0va!Rw`t=)2 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∋z2$2l`Q%wNx+)?ooUSw~Eqc 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

|mQV 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

|mQV z2JrVt!?f_ZhtIKN$I$jv3n~cin@Zr1tV4%+BMcGk;2JED96H$F7FD0AP?E%ijl1Xs zn^cWtJoWH__(e!zm7}qR^uAn^$?*p-+$c`r!SQQ`fo%BFJ1t*0>u=Wz4;?LCDrwAt zMp3E8oV}^57F2srxdI8L2ikE6C)CMWHTLiTvW@&Z@6Xq@=5BE7^(avv&p-y4Ocn*+ zyuX8#o5yb*jBr$-Ljkj+uwsVQlhq3eMR}d_@UzvqRcB;GjF0YiU6lruBCXHF0p*Dm zrYXj0ginNSQIe^*!hlw__g&fS5{Rd+z*Z()RnY4O_E`=W!N~**Om#P^Va9|hMcx*u z=D(HOU%Kl@N0Lkl5DLw=f5!7>;{=6sx1e} zlvSa=nAyHCJ=&!XFdS*ItB-taaNd0cKK03$naqZn(*F4n2Me{XA;*XZcc9y8K-19p zY2&XiS9#nwutc_}8w$gD{i1W4Rj(yfhRT%Hi~TD0t}BcWEiEp9OEBL=h4>#^PesP7 z*miXbPo2v6QH|7fiW^juqzAi0q|<-Bm4#GL4*C=;3G4qb}Mf#jBo@tl*xUTWLA$O@~fYDloUL&}O2bU5ODtH@0$&-qD^jM(uF3RG$ z)&u7Tj+U^c2$*yzC6P;VRiq&2%f8C|gJu2eD5>glUrJU`MBc7{yZ(TV-70E;gID#Q ziXD}Zd$jT+R-NntD-R)g%#1L>{4P@%;oKA2kqN}Zvb@>d3w*h+*D2H2NEhk3T+77T zWVL(L*_y0g*%E6j6XT6B=k@GW4fX&Q#^F4T8Wu)prRr8$$v zr$$rLr+g*`xTT9H4EBOuw3iU-1I+(hBOlk!4cTYj-oQ1>|Hvt_i|h*gux+w(LceY3 zAJ_KV@|C_bo7m|2>dzn1Zd+1AVb}mj7cw_F^lgLy6T$!=O6Xzb&z**C#sULLM6cU7 zaNnIV|B1^#5N?M$zA2*%F5!V2mA#yVTMW(XmGXi4(ZOgAG%Y@P9?W}t!e{Z(GRc!K zcH+_;Q>G$CUTgEX>_fyC3*v?r^s*`^A_NiYYjf8*=Sc(kky-(9H7e!Q!sBz(e3YGs zlYUG3!9fP#+93z?A}Y96fy!)G{Cw?THy%*R<1X146=NS4BiY~Ij{s#wxKGQHlAjOJ z(`b`DYpRSbp#vO>p4D3t%jHsq!#tBi%@O3Yg5?rFiH+|(tK#>o`@`Udc=I<4MInb) z;~z7UjPh@>pdw6U#@=)nvpd-_g}RXUW&kOA8Vz;B&=t@eY0G|y509nqLwC;Y*x*_+ zYX|*2C$i0-rL>50C6P4(9LTfnZ9)or!vYO8==$3;mBY#2zcuv#q<5n1pg1AkB1fX= zu4sx3Aa2MK+yj@KY2NwMV9I;{g(M=-yxY3ZYj`8Sm9Lxi<+6sK6Ck$mqGD zx*Y1Sy+`mA$=L(2k(&d2vrsGO_CP_FGT{A?-Rc*fTM zGEYEQA8>FW(K<-yfIH>j76CXvY$8OG*m8%EMkqCrO zRAB_hTU0-N5VwsiXTt8?fB_u>=@z=Hnk+ z*3lMTyXq@|oOt7@xN|4e0-rLif~#?NnMrOXIzIrxQJX(n+I(q9bOSdb)n5Q&tfYtB z)9&%}MiFn}Qs;vSsj~C&?%lgXL2Ytg)dgZk6z2vW_6$6XNN-rwmW9I}nw!}3UR=Ab z2_C5JY&LO3OS6AWu2;^(-&S2n*w^jH$G_mU4jv{uMN z&)lyg@^Rg@6fnW-9o4*@+BWkKizrA(cOrqot}5+=jRpYzrOxf($QatVk|+k z=1u87q_G!1H*K5UoqoWq&;jp@77}G2Ww$!Y!^5LzFeL*3wtL*ksDGp(r?tgn`p$<- z&8bBM5o2fSngnPUB5fOr-^pMc=#Hp{V~QhSYk7BB z2(Kr4Yol2lkz^z>Q9UnLa)n|o%9miiNfHdw@+DG?-@=fU*ou#uX+!OCSmcm5j)Z#J z)Qu#rY9}y(X9Q(C>o%~3bzwsA_npuK7iNG)6M#BI=3oj3HAy7X{}3&bUKbPJxU|6{0sRFJDs&g#0~1F@Z<^Ln!_a9J5gfJfjqK|7v`w3k`0mHl zG*lcBQnQlv(;gv%+ifQ4~sr&(%{N76OIV zu8Ksf6U5JieHe5DL=$0UCIk)8; zjmd*#>q<4xwAPF)H{I)PY8+3QKMOYD z_L75>j;#OO6G}ud$V8OlU(!0Pi#bony)^dqF}t^oH@y0yc`ytzMwq;F+pV*P6W_Ct z@B|E#jvg*j1ADuz>f@DTj+E1a)zfsTeSeKX)4VsjIvQv$Rd&cj3UWbddsDN(;;Fi| z%TRl*lj}MUADpTi^zN9ZhtG*^@xdiU$LC!KLXPa$$yD;S{MQ=6L~DuOd@@$2qtJ0Y zt>^oe+wCShzd+3}OR0;1hHgBR$I&E)xJW`=JhsCF1szN=5RoqSznA0qj*)YRnN{Q{x=)7*xRbgr1+fG6t=NNHs(VR8*ooLNd-D6^LQtZO3gZ8reV>Hq7a}FV+Z64TfB*hg zpyQj88Rq#igy%ZtryBVoV-wKU>dv}b`j2Zb3wDlp=c6ovaYSfO>-%=@np1jKUQj!N z77`zSki?~ZTJ`RzNLa$TjeexPw?K5=Jzm2tP8U%`Sdi_b3atWaj9B>#$P#bTYmH8v zQ{<<#Y*7O6J9r*c_W7Ij9C9&)$KFwNvnE`}%msoi(NrVba?pEqdn*#XV~~kr1Z@bs zC1?zCyoCC@K$5x>+TkM*cjnULO~vO3SDPE4w_5`F6OCqKw5wE`#uslNQujLYdQ^U4 z(bmu4UA+7%l_z@@gn#i9g3K91i^|ar2woq*o!WBx>YJLhdE1)_{K4CagW2qp+S5x% z7tt}PK-c+sFSJ)U=rtqfOoebw8#nsvl~JWARP;e>&Hm3o2XccTZVu{XL87%2S|IL2xAmuLt1biCQvrS z;=HX@&`@YCC@Ly~m5S2_ifW3xKS7;fZ?;v$1b`fwq)mHd%ajs4DZS~`?l~XC&kA{J2&wq$Q|lS$_pB58_s&R3o3YC5@a?1(G9E6sI3`TtZIboz9{%I>9>={ zT5MVs3}~q5vM_Z8W)G5vNlup^`x}`;Ba`&!csxJIQTe$vT1#*LlQxcpX|!EfQLBCK8frbtQPX7uC*LNZ0lPjuc?629TF zgd!fZP`D;b0`G!7pnwm zPMc7J0K?~6JZYT2z|nYyAOQH}ErJRNIv}_u!?1KnhKloB)L2ScAB@e67!N<5%ykjK zBUeV5q?&TO7O@TyJcOBgKFN1^>rmqp-eRBW+9)fCEP+4&{#{c98sVaqR{jf~kvZ|o zRF?#tr83Ur?1gcov)Dk1mFAL(do}y30|!+_rPZ3F;nNa^P+~0&ItG*}0?Qw6e&PJgdU5wg|Zf+uxcb3h$s_^f_)WHI)3C8r2~X!c@mEaTD_+i)(W2D z)tfgzg;xUA6VD!5TIgC5se~XC44Rgno5|65p;mxmYC=Zo7lOLQKCaUXLs5&~8G)^0 z4GI$5jWcfKL27ZzN8TV9;8t4>06WRMP8R{Ju@fM|*g?I_gbRC9UW=<93aDv?F3_Ae z_%wyblL+#E{lS?Ly@>AVOS%F}D}2j|Zr1%oxUJlPEJO#N`Y@&Z4872>YW?81U6_{%hVEmWb406yc%M^!+;Tkyr=1O8paD2Hri0Z1ei?)QEJ-MF*z< zAu*NcB?q~)Y(}0F0h^`RfPmHnY{19AqSxkY=IfF%@OF#i`lT_0dbMv1CWZh

nZH zAle%stfe;Qr1wyqOv%{rld(DRpRt)j+d$(Y<|0yUfAtxeJuo3?bRaSlFg&&{}ZU%=ThAQ11zaal(8KYX~1U1qktY!qqq0jbJ+A%5Jd^k?e+Z z^f6^Pi8*Ep*=|xkJzHNTRuP+=;W#vT-isO}VyrH4gym&o z;c3+Uk6M7DC{z87_r;H?FHC66X812S25ALE^%2-YWMeb@svBYDi8+w_ZLl@u`_?fq zheCgAjK9!uxYva`_$0ZUI5H&t$KHw&QXh5EV*;ZQ!mF#Y$2isWdYUo} z7Nob*%S5YY8jQI7g#Eq9$I57U^q{g^jY@PWH=&_ro@3r>c{ZJ>N2|twfel8_={-rhO1-z-g(NQ#>W$HT-b=b|tN6|J zm_Dr=gX{9KY<1?-n(S6h6SW08ohj3g;t&iq?pJ7MwXphB7UaNY0yf>eZBKHpY7I)hxiVPCENDuOZM%xW_LOMGFGHgNh z$~?3KB_S`~QrwD@C;fa+a#B7HXS})IWeQOTpCKlZV{DzIH*jqKi0z<$)(i` z_{@_y8nGSneVEdjfK9LS56(7)I)|Y?sRJ!#8`D6Iyl|Rj^5mY~0W$d+*TSKtjBfwd zfQ4$4Ze)dq@P=a)dBwk5%FqoS?f%Sg5(J!*+; zu7JT8+xnT<7g9uj7}wlHR4tNQpLKAl&;Ja@YflPU5b@t>0a-mn0^I{jMb~Kv3g2*>(5FqN)35Q=J)EB+6n@V3~&=E#Qcu9Usb^r01eC0khS5yz8 zdSbg$R|O_M$~1DvH+^A`H9e579d7%JoWpUF0U=4?nzr|6!J~JZ=lzQI9v?hSLCsvC z&fds7NB-1&T7@@{G2P}KMjn6!4k!zeCRk@8J-W}vp`gzr3Q6fM`TVC3Q9Xs)&g9N$} zx*NnR7M1ry2dqHYQfgwz>k<(tW1@4OCci?SF02d?k&ZIiT5@D=5CNHDx%C>PPi~2$&r>7+8nCnxx}r`5Q{u^ zBW$yzO@46yLktNooH#64ME^q#vq+>-p7}Y$#q!NlMwC79Fo8;EDiCA^aEacR&54_j z5T=bzv!uQ{WJ2-D_uymn?O&U6gaXE5X;ZC4K3D9!ZKM6CQ82Nh%rA`kN02ezrx4kn ztiEs#a?>tS3k{@?W)M_G6xVK|Llf)kIibxbPjE~;t$k~IFZwov!&se#VkQ`jK~o{! zPrE`SbUIm;H$`=Vi%~WnhH>3b^7u9)>o6jwI$&))f`Nh_YmW_Bu8>6_26Rfd4xx)d+Au+|WZ&{x$rEtLo)Aj}S$V9I2a$hCLY#pj&a=RtjzG`I zc={{FVK1=$qZqK%yYSE4Px^V;p#QHu1^@Ls3jXW1KrBD--=X(^ZEMT&ye`k{fBW{V zdQ-gd8sci_5WiV%$L*Ja#~wXYs+bEIj#L21N;B`&Inmf z;s0AHeBOVgEt9M&q#NF^%+pocjI$0agzSZU6uP From 6156302fe68090f1fa9730a87853e5752e9728a9 Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Thu, 12 Sep 2024 20:01:45 +0000 Subject: [PATCH 49/54] ocean basin is a config parameter --- test/soca/CMakeLists.txt | 79 +++++++++++++++---- ...oda_insitu_profile_argo_2021063006.yaml.in | 1 + ...da_insitu_profile_bathy_2021063006.yaml.in | 1 + ...a_insitu_profile_glider_2021063006.yaml.in | 1 + ...da_insitu_profile_tesac_2021063006.yaml.in | 1 + ...a_insitu_profile_xbtctd_2021063006.yaml.in | 1 + ...da_insitu_surface_trkob_2021063006.yaml.in | 1 + .../b2i/b2iconverter/bufr2ioda_config.py | 6 +- .../b2i/b2iconverter/bufr2ioda_converter.py | 1 + .../marine/b2i/b2iconverter/ioda_addl_vars.py | 1 - .../marine/b2i/b2iconverter/ocean.py | 3 +- .../marine/b2i/bufr_plot_stations.py | 13 ++- 12 files changed, 85 insertions(+), 24 deletions(-) diff --git a/test/soca/CMakeLists.txt b/test/soca/CMakeLists.txt index 312ee8ade..9a0fc623d 100644 --- a/test/soca/CMakeLists.txt +++ b/test/soca/CMakeLists.txt @@ -45,43 +45,89 @@ ENVIRONMENT "data=${TESTDATA};PYTHONPATH=${PROJECT_BINARY_DIR}/ush:$ENV{PYTHONPA # prepare a test.yaml file from test.yaml.in by replacing # placeholder patterns __BUFRINPUTDIR__ and __IODAOUTPUTDIR__ # with actual directory paths -function(CREATE_CONFIG_FILE test_config_in test_config_out bufr_input_dir ioda_output_dir) +function(CREATE_CONFIG_FILE + test_config_in + test_config_out + bufr_input_dir + ioda_output_dir + ocean_basin_file +) file(READ "${test_config_in}" file_content) string(REPLACE "__BUFRINPUTDIR__" "\"${bufr_input_dir}\"" temp_content "${file_content}") string(REPLACE "__IODAOUTPUTDIR__" "\"${ioda_output_dir}\"" temp_content2 "${temp_content}") - file(WRITE "${test_config_out}" "${temp_content2}") + string(REPLACE "__OCEANBASIN__" "\"${ocean_basin_file}\"" temp_content3 "${temp_content2}") + file(WRITE "${test_config_out}" "${temp_content3}") endfunction() set(TEST_WORKING_DIR ${PROJECT_BINARY_DIR}/test/soca) -message("bufr to ioda: TEST_WORKING_DIR = ${TEST_WORKING_DIR}") +# message("bufr to ioda: TEST_WORKING_DIR = ${TEST_WORKING_DIR}") set(MARINE_BUFR2IODA_DIR ${PROJECT_SOURCE_DIR}/ush/ioda/bufr2ioda/marine) set(MARINE_BUFR2IODA_DIR ${MARINE_BUFR2IODA_DIR}/b2i) set(CONFIG_DIR ${PROJECT_SOURCE_DIR}/test/soca/testinput) set(TESTREF_DIR ${PROJECT_SOURCE_DIR}/test/soca/testref) -# find the staging directory for bufr test input files ${BUFR_TEST_DIR} -# checking on orion and hera -# bufr input files on orion: -set(BUFR_TEST_DIR + +function(CHECK_AND_SET_PATH PATH1 PATH2 RESULT_VAR) + # Check if PATH1 exists + if(EXISTS ${PATH1}) + set(${RESULT_VAR} ${PATH1} PARENT_SCOPE) + set(${RESULT_VAR}_EXISTS TRUE PARENT_SCOPE) + return() + endif() + + # Check if PATH2 exists + if(EXISTS ${PATH2}) + set(${RESULT_VAR} ${PATH2} PARENT_SCOPE) + set(${RESULT_VAR}_EXISTS TRUE PARENT_SCOPE) + return() + endif() + + # If neither path exists + set(${RESULT_VAR} "" PARENT_SCOPE) + set(${RESULT_VAR}_EXISTS FALSE PARENT_SCOPE) +endfunction() + + +# find the input files +set(BUFR_TEST_DIR_ORION "/work/noaa/da/marineda/gfs-marine/data/obs/ci/bufr" ) -if (NOT EXISTS ${BUFR_TEST_DIR}) - # bufr input files on hera: - set(BUFR_TEST_DIR - "/scratch1/NCEPDEV/da/common/ci/bufr" - ) -endif() -if (NOT EXISTS ${BUFR_TEST_DIR}) - message("staging directory for BUFR test files ${BUFR_TEST_DIR} not found") +set(BUFR_TEST_DIR_HERA + "/scratch1/NCEPDEV/da/common/ci/bufr" +) +CHECK_AND_SET_PATH( + ${BUFR_TEST_DIR_ORION} + ${BUFR_TEST_DIR_HERA} + BUFR_TEST_DIR +) +if (NOT BUFR_TEST_DIR_EXISTS) + message(STATUS "BUFR test file directory not found -- bufr to ioda tests not generted.") set(GENERATE_BUFR2IODA_TESTS FALSE) else() + # message(STATUS "Found bufr test directory: ${BUFR_TEST_DIR}") + + set(OCEAN_BASIN_FILE_HERA + "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" + ) + set(OCEAN_BASIN_FILE_ORION + "/work/noaa/global/glopara/fix/gdas/soca/20240802/common/RECCAP2_region_masks_all_v20221025.nc" + ) + CHECK_AND_SET_PATH( + ${OCEAN_BASIN_FILE_ORION} + ${OCEAN_BASIN_FILE_HERA} + OCEAN_BASIN_FILE + ) + if (NOT OCEAN_BASIN_FILE_EXISTS) + message("Ocean basin data file not found -- bufr to ioda tests not generated.") + set(GENERATE_BUFR2IODA_TESTS FALSE) + endif() + # message(STATUS "Found ocean basin data in ${OCEAN_BASIN_FILE}") set(GENERATE_BUFR2IODA_TESTS TRUE) endif() - function(ADD_INSITU_TEST testname testbufr) # set(CONFIG_TYPE "json") set(CONFIG_TYPE "yaml") @@ -109,6 +155,7 @@ function(ADD_INSITU_TEST testname testbufr) ${CONFIG_FILE} ${BUFR_INPUT_DIR} ${IODA_OUTPUT_DIR} + ${OCEAN_BASIN_FILE} ) add_test( diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml.in b/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml.in index 9389692e1..54ef72855 100644 --- a/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml.in +++ b/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml.in @@ -7,6 +7,7 @@ cycle_type: gdas cycle_datetime: '2021063006' dump_directory: __BUFRINPUTDIR__ ioda_directory: __IODAOUTPUTDIR__ +ocean_basin: __OCEANBASIN__ data_description: 6-hrly in situ ARGO profiles data_provider: U.S. NOAA diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml.in b/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml.in index ee4102602..442d0a05a 100644 --- a/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml.in +++ b/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml.in @@ -7,6 +7,7 @@ cycle_type: gdas cycle_datetime: '2021063006' dump_directory: __BUFRINPUTDIR__ ioda_directory: __IODAOUTPUTDIR__ +ocean_basin: __OCEANBASIN__ data_description: 6-hrly in situ Bathythermal profiles data_provider: U.S. NOAA diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml.in b/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml.in index 87d98e2d2..8deeff58d 100644 --- a/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml.in +++ b/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml.in @@ -7,6 +7,7 @@ cycle_type: gdas cycle_datetime: '2021063006' dump_directory: __BUFRINPUTDIR__ ioda_directory: __IODAOUTPUTDIR__ +ocean_basin: __OCEANBASIN__ data_description: 6-hrly in situ GLIDER profiles data_provider: U.S. NOAA diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml.in b/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml.in index 980879422..36e5e5ab1 100644 --- a/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml.in +++ b/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml.in @@ -7,6 +7,7 @@ cycle_type: gdas cycle_datetime: '2021063006' dump_directory: __BUFRINPUTDIR__ ioda_directory: __IODAOUTPUTDIR__ +ocean_basin: __OCEANBASIN__ data_description: 6-hrly in situ TESAC profiles data_provider: U.S. NOAA diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in b/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in index 75ced072e..3d0df09e2 100644 --- a/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in +++ b/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in @@ -7,6 +7,7 @@ cycle_type: gdas cycle_datetime: '2021063006' dump_directory: __BUFRINPUTDIR__ ioda_directory: __IODAOUTPUTDIR__ +ocean_basin: __OCEANBASIN__ data_description: 6-hrly in situ XBT/XCTD profiles data_provider: U.S. NOAA diff --git a/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml.in b/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml.in index 5d8161e79..977f2bcc0 100644 --- a/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml.in +++ b/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml.in @@ -7,6 +7,7 @@ cycle_type: gdas cycle_datetime: '2021063006' dump_directory: __BUFRINPUTDIR__ ioda_directory: __IODAOUTPUTDIR__ +ocean_basin: __OCEANBASIN__ data_description: 6-hrly in situ TRACKOB surface data_provider: U.S. NOAA diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py index 6508a5a45..c4b3cae3e 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py @@ -28,8 +28,6 @@ def __init__(self, script_name, config_file, platform_description): sys.exit(1) def ReadConfig(self, config): - # subsets was unused in the config file ??? - # subsets = config["subsets"] # Get parameters from configuration self.data_format = config["data_format"] self.source = config["source"] @@ -40,6 +38,7 @@ def ReadConfig(self, config): self.cycle_datetime = config["cycle_datetime"] self.dump_dir = config["dump_directory"] self.ioda_dir = config["ioda_directory"] + self.ocean_basin = config["ocean_basin"] self.yyyymmdd = self.cycle_datetime[0:8] self.hh = self.cycle_datetime[8:10] @@ -47,6 +46,9 @@ def ReadConfig(self, config): # General Information self.converter = 'BUFR to IODA Converter' + def OceanBasinNCFilePath(self): + return self.ocean_basin + def BufrFilename(self): return f"{self.cycle_datetime}-{self.cycle_type}.t{self.hh}z.{self.data_format}.tm00.bufr_d" diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py index eece4cfcc..02fde1434 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py @@ -25,6 +25,7 @@ class Bufr2ioda_Converter: def __init__(self, bufr2ioda_config, ioda_vars, logfile): + ioda_vars.SetOceanBasinNCFilePath(bufr2ioda_config.OceanBasinNCFilePath()) self.bufr2ioda_config = bufr2ioda_config self.ioda_vars = ioda_vars self.logfile = logfile diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py index fa6069c84..cda9093e8 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py @@ -93,7 +93,6 @@ def logOceanBasin(self, logger): ######################################################################### -# seqNum depends both on lat and lon def ComputeSeqNum(lon, lat): combined = np.stack((lon, lat), axis=-1) unique_combined, seqNum = np.unique(combined, axis=0, return_inverse=True) diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py index eff60e604..2064d41ba 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py @@ -26,7 +26,8 @@ class OceanBasin: def __init__(self): - self.FindOceanBasinNCFile() + # self.FindOceanBasinNCFile() + pass def SetOceanBasinNCFilePath(self, filename): self.ocean_basin_nc_file_path = filename diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py b/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py index c4e365849..22878fc0e 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py @@ -15,7 +15,7 @@ # from .ocean import OceanBasin -def plot_points_on_map(latitudes, longitudes, title='Map with Points', marker_color='red', marker_size=50): +def plot_points_on_map(latitudes, longitudes, output_file_name, title='Map with Points', marker_color='red', marker_size=50): """ Plots points on a map given lists of latitudes and longitudes. @@ -47,8 +47,7 @@ def plot_points_on_map(latitudes, longitudes, title='Map with Points', marker_co # Show the map # plt.show() - png_file = "stations.png" - plt.savefig(png_file, dpi=300) + plt.savefig(output_file_name, dpi=300) parser = argparse.ArgumentParser() @@ -57,8 +56,14 @@ def plot_points_on_map(latitudes, longitudes, title='Map with Points', marker_co type=str, help='Input BUFR filename', required=True ) +parser.add_argument( + '-o', '--output', + type=str, + help='Output png filename', required=True +) args = parser.parse_args() bufrfile_path = args.input +output_file_name = args.output q = bufr.QuerySet() q.add('longitude', '*/CLON') @@ -74,4 +79,4 @@ def plot_points_on_map(latitudes, longitudes, title='Map with Points', marker_co print(f"read lat, lon -- {len(lon)} points") -plot_points_on_map(lat, lon, title='stations', marker_color='blue', marker_size=10) +plot_points_on_map(lat, lon, output_file_name, title='stations', marker_color='blue', marker_size=10) From 26cedf3f08a637cdd86112ac3f55d60f8b75897a Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Thu, 12 Sep 2024 21:18:58 +0000 Subject: [PATCH 50/54] changed camel --- .../marine/b2i/argo_ioda_variables.py | 8 +- .../b2i/b2iconverter/bufr2ioda_config.py | 24 +++--- .../b2i/b2iconverter/bufr2ioda_converter.py | 24 +++--- .../marine/b2i/b2iconverter/ioda_addl_vars.py | 82 +++++++++---------- .../marine/b2i/b2iconverter/ioda_metadata.py | 74 ++++++++--------- .../marine/b2i/b2iconverter/ioda_variables.py | 60 +++++++------- .../marine/b2i/b2iconverter/ocean.py | 35 +++----- .../bufr2ioda/marine/b2i/b2iconverter/util.py | 22 ++--- .../marine/b2i/bathy_ioda_variables.py | 42 +++++----- .../b2i/bufr2ioda_insitu_profile_argo.py | 14 ++-- .../b2i/bufr2ioda_insitu_profile_bathy.py | 8 +- .../b2i/bufr2ioda_insitu_profile_glider.py | 12 +-- .../b2i/bufr2ioda_insitu_profile_tesac.py | 12 +-- .../b2i/bufr2ioda_insitu_profile_xbtctd.py | 12 +-- .../b2i/bufr2ioda_insitu_surface_trkob.py | 14 ++-- .../marine/b2i/glider_ioda_variables.py | 8 +- .../marine/b2i/tesac_ioda_variables.py | 4 +- .../marine/b2i/trkob_ioda_variables.py | 62 +++++++------- .../marine/b2i/xbtctd_ioda_variables.py | 4 +- 19 files changed, 253 insertions(+), 268 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py index 9ba7bf543..eb8ead4af 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/argo_ioda_variables.py @@ -7,8 +7,8 @@ class ArgoIODAVariables(IODAVariables): def __init__(self): super().__init__() - def BuildQuery(self): - q = super().BuildQuery() + def build_query(self): + q = super().build_query() q.add('stationID', '*/WMOP') q.add('latitude', '*/CLATH') q.add('longitude', '*/CLONH') @@ -17,8 +17,8 @@ def BuildQuery(self): q.add('saln', '*/GLPFDATA/SALNH') return q - def SetFromQueryResult(self, r): - super().SetFromQueryResult(r) + def set_from_query_result(self, r): + super().set_from_query_result(r) # convert depth in pressure units to meters (rho * g * h) self.metadata.depth = np.float32(self.metadata.depth.astype(float) * 0.0001) diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py index c4b3cae3e..5cd5e9c7d 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_config.py @@ -18,16 +18,16 @@ def __init__(self, script_name, config_file, platform_description): if file_extension == ".json": with open(config_file, "r") as file: config = json.load(file) - self.ReadConfig(config) + self.read_config(config) elif file_extension == ".yaml": with open(config_file, "r") as file: config = yaml.safe_load(file) - self.ReadConfig(config) + self.read_config(config) else: print("Fatal error: Unknown file extension = ", file_extension) sys.exit(1) - def ReadConfig(self, config): + def read_config(self, config): # Get parameters from configuration self.data_format = config["data_format"] self.source = config["source"] @@ -46,25 +46,25 @@ def ReadConfig(self, config): # General Information self.converter = 'BUFR to IODA Converter' - def OceanBasinNCFilePath(self): + def ocean_basin_nc_file_path(self): return self.ocean_basin - def BufrFilename(self): + def bufr_filename(self): return f"{self.cycle_datetime}-{self.cycle_type}.t{self.hh}z.{self.data_format}.tm00.bufr_d" - def BufrFilepath(self): - return os.path.join(self.dump_dir, self.BufrFilename()) + def bufr_filepath(self): + return os.path.join(self.dump_dir, self.bufr_filename()) - def IODAFilename(self): + def ioda_filename(self): return f"{self.cycle_type}.t{self.hh}z.insitu_profile_{self.data_format}.{self.cycle_datetime}.nc4" - def IODAFilepath(self): - return os.path.join(self.ioda_dir, self.IODAFilename()) + def ioda_filepath(self): + return os.path.join(self.ioda_dir, self.ioda_filename()) - def CreateIODAAttributes(self, obsspace, date_range): + def create_ioda_attributes(self, obsspace, date_range): obsspace.write_attr('Converter', self.converter) obsspace.write_attr('source', self.source) - obsspace.write_attr('sourceFiles', self.BufrFilename()) + obsspace.write_attr('sourceFiles', self.bufr_filename()) obsspace.write_attr('dataProviderOrigin', self.data_provider) obsspace.write_attr('description', self.data_description) obsspace.write_attr('datetimeRange', date_range) diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py index 02fde1434..f65d58523 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/bufr2ioda_converter.py @@ -7,7 +7,7 @@ from pyiodaconv import bufr from collections import namedtuple from pyioda import ioda_obs_space as ioda_ospace -from .util import ParseArguments, run_diff +from .util import parse_arguments, run_diff from .bufr2ioda_config import Bufr2iodaConfig import logging import tempfile @@ -25,13 +25,13 @@ class Bufr2ioda_Converter: def __init__(self, bufr2ioda_config, ioda_vars, logfile): - ioda_vars.SetOceanBasinNCFilePath(bufr2ioda_config.OceanBasinNCFilePath()) + ioda_vars.set_ocean_basin_nc_file(bufr2ioda_config.ocean_basin_nc_file_path()) self.bufr2ioda_config = bufr2ioda_config self.ioda_vars = ioda_vars self.logfile = logfile - self.SetupLogging(bufr2ioda_config.script_name, self.logfile) + self.setup_logging(bufr2ioda_config.script_name, self.logfile) - def SetupLogging(self, script_name, logfile): + def setup_logging(self, script_name, logfile): self.logger = logging.getLogger(script_name) self.logger.setLevel(logging.DEBUG) @@ -53,23 +53,23 @@ def SetupLogging(self, script_name, logfile): def run(self): start_time = time.time() - self.logger.debug(f"BuildQuery") - q = self.ioda_vars.BuildQuery() + self.logger.debug(f"build_query") + q = self.ioda_vars.build_query() - bufrfile_path = self.bufr2ioda_config.BufrFilepath() + bufrfile_path = self.bufr2ioda_config.bufr_filepath() self.logger.debug(f"ExecuteQuery: BUFR file = {bufrfile_path}") with bufr.File(bufrfile_path) as f: r = f.execute(q) # process query results and set ioda variables - self.ioda_vars.SetFromQueryResult(r) + self.ioda_vars.set_from_query_result(r) self.ioda_vars.filter() # set seqNum, PreQC, ObsError, OceanBasin self.ioda_vars.additional_vars.construct() - iodafile_path = self.bufr2ioda_config.IODAFilepath() + iodafile_path = self.bufr2ioda_config.ioda_filepath() path, fname = os.path.split(iodafile_path) os.makedirs(path, exist_ok=True) @@ -81,10 +81,10 @@ def run(self): date_range = [str(metadata.dateTime.min()), str(metadata.dateTime.max())] self.logger.debug(f"CreateGlobalAttributes") - self.bufr2ioda_config.CreateIODAAttributes(obsspace, date_range) + self.bufr2ioda_config.create_ioda_attributes(obsspace, date_range) - self.logger.debug(f"ioda_vars.WriteToIodaFile") - self.ioda_vars.WriteToIodaFile(obsspace) + self.logger.debug(f"ioda_vars.write_to_ioda_file") + self.ioda_vars.write_to_ioda_file(obsspace) if (self.logfile): self.logger.addHandler(self.file_handler) diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py index cda9093e8..14dab59d2 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py @@ -10,7 +10,7 @@ def __init__(self, ioda_vars): self.ocean = OceanBasin() def construct(self): - self.seqNum = ComputeSeqNum(self.ioda_vars.metadata.lon, + self.seqNum = compute_seq_num(self.ioda_vars.metadata.lon, self.ioda_vars.metadata.lat) n = len(self.seqNum) self.PreQC = (np.ma.masked_array(np.full(n, 0))).astype(np.int32) @@ -18,82 +18,82 @@ def construct(self): np.float32(np.ma.masked_array(np.full(n, self.ioda_vars.T_error))) self.ObsError_saln = \ np.float32(np.ma.masked_array(np.full(n, self.ioda_vars.S_error))) - self.ComputeOceanBasin() + self.compute_ocean_basin() - def SetOceanBasinNCFilePath(self, nc_file_path): - self.ocean.SetOceanBasinNCFilePath(nc_file_path) + def set_ocean_basin_nc_file(self, nc_file_path): + self.ocean.set_ocean_basin_nc_file(nc_file_path) - def ComputeOceanBasin(self): + def compute_ocean_basin(self): lat = self.ioda_vars.metadata.lat lon = self.ioda_vars.metadata.lon - self.ocean.ReadNCFile() - ob = self.ocean.GetStationBasin(lat, lon) + self.ocean.read_nc_file() + ob = self.ocean.get_station_basin(lat, lon) self.OceanBasin = np.array(ob, dtype=np.int32) - def SetTemperatureError(self, e): + def set_temperature_error(self, e): self.T_error = e - def SetSalinityError(self, e): + def set_salinity_error(self, e): self.S_error = e - def WriteToIodaFile(self, obsspace): - self.WriteSeqNum(obsspace) - self.WritePreQC(obsspace, self.ioda_vars.T_name) - self.WritePreQC(obsspace, self.ioda_vars.S_name) - self.WriteObsErrorT(obsspace) - self.WriteObsErrorS(obsspace) - self.WriteOceanBasin(obsspace) + def write_to_ioda_file(self, obsspace): + self.write_seq_num(obsspace) + self.write_preqc(obsspace, self.ioda_vars.T_name) + self.write_preqc(obsspace, self.ioda_vars.S_name) + self.write_obs_errorT(obsspace) + self.write_obs_errorS(obsspace) + self.write_ocean_basin(obsspace) def log(self, logger): - self.logSeqNum(logger) - self.logPreQC(logger) - self.logObsError_temp(logger) - self.logObsError_saln(logger) - self.logOceanBasin(logger) + self.log_seq_num(logger) + self.log_preqc(logger) + self.log_obs_error_temp(logger) + self.log_obs_error_saln(logger) + self.log_ocean_basin(logger) ######################################################################### - def WriteSeqNum(self, obsspace): - WriteSeqNum(obsspace, self.seqNum, self.PreQC.dtype, self.PreQC.fill_value) + def write_seq_num(self, obsspace): + write_seq_num(obsspace, self.seqNum, self.PreQC.dtype, self.PreQC.fill_value) # should the long name be "PreQC" + name? - def WritePreQC(self, obsspace, name): + def write_preqc(self, obsspace, name): obsspace.create_var("PreQC/" + name, dtype=self.PreQC.dtype, fillval=self.PreQC.fill_value) \ .write_attr('long_name', 'PreQC') \ .write_data(self.PreQC) - def WriteObsErrorT(self, obsspace): - WriteObsError(obsspace, "ObsError/" + self.ioda_vars.T_name, "degC", self.ObsError_temp) + def write_obs_errorT(self, obsspace): + write_obs_error(obsspace, "ObsError/" + self.ioda_vars.T_name, "degC", self.ObsError_temp) - def WriteObsErrorS(self, obsspace): - WriteObsError(obsspace, "ObsError/" + self.ioda_vars.S_name, "psu", self.ObsError_saln) + def write_obs_errorS(self, obsspace): + write_obs_error(obsspace, "ObsError/" + self.ioda_vars.S_name, "psu", self.ObsError_saln) - def WriteOceanBasin(self, obsspace): - WriteOceanBasin(obsspace, self.OceanBasin, self.PreQC.dtype, self.PreQC.fill_value) + def write_ocean_basin(self, obsspace): + write_ocean_basin(obsspace, self.OceanBasin, self.PreQC.dtype, self.PreQC.fill_value) ######################################################################### - def logSeqNum(self, logger): - LogVariable(logger, "seqNum", self.seqNum) + def log_seq_num(self, logger): + log_variable(logger, "seqNum", self.seqNum) logger.debug(f"seqNum hash = {compute_hash(self.seqNum)}") - def logPreQC(self, logger): - LogVariable(logger, "PreQC", self.PreQC) + def log_preqc(self, logger): + log_variable(logger, "PreQC", self.PreQC) - def logObsError_temp(self, logger): - LogVariable(logger, "ObsError_temp", self.ObsError_temp) + def log_obs_error_temp(self, logger): + log_variable(logger, "ObsError_temp", self.ObsError_temp) - def logObsError_saln(self, logger): - LogVariable(logger, "ObsError_saln", self.ObsError_saln) + def log_obs_error_saln(self, logger): + log_variable(logger, "ObsError_saln", self.ObsError_saln) - def logOceanBasin(self, logger): - LogVariable(logger, "OceanBasin", self.OceanBasin) + def log_ocean_basin(self, logger): + log_variable(logger, "OceanBasin", self.OceanBasin) logger.debug(f"OceanBasin hash = {compute_hash(self.OceanBasin)}") ######################################################################### -def ComputeSeqNum(lon, lat): +def compute_seq_num(lon, lat): combined = np.stack((lon, lat), axis=-1) unique_combined, seqNum = np.unique(combined, axis=0, return_inverse=True) seqNum = seqNum.astype(np.int32) diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_metadata.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_metadata.py index 6e0a66cf3..0bcac7ff9 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_metadata.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_metadata.py @@ -7,13 +7,13 @@ class IODAMetadata: def __init__(self): pass - def SetFromQueryResult(self, r): - self.SetDateTimeFromQueryResult(r) - self.SetRcptDateTimeFromQueryResult(r) - self.SetLonFromQueryResult(r) - self.SetLatFromQueryResult(r) - self.SetStationIDFromQueryResult(r) - self.SetDepthFromQueryResult(r) + def set_from_query_result(self, r): + self.set_date_time_from_query_result(r) + self.set_rcpt_date_time_from_query_result(r) + self.set_lon_from_query_result(r) + self.set_lat_from_query_result(r) + self.set_station_id_from_query_result(r) + self.set_depth_from_query_result(r) def filter(self, mask): self.dateTime = self.dateTime[mask] @@ -23,63 +23,63 @@ def filter(self, mask): self.stationID = self.stationID[mask] self.depth = self.depth[mask] - def WriteToIodaFile(self, obsspace): - WriteDateTime(obsspace, self.dateTime) - WriteRcptDateTime(obsspace, self.rcptdateTime) - WriteLongitude(obsspace, self.lon) - WriteLatitude(obsspace, self.lat) - WriteStationID(obsspace, self.stationID) - WriteDepth(obsspace, self.depth) + def write_to_ioda_file(self, obsspace): + write_date_time(obsspace, self.dateTime) + write_rcpt_date_time(obsspace, self.rcptdateTime) + write_longitude(obsspace, self.lon) + write_latitude(obsspace, self.lat) + write_station_id(obsspace, self.stationID) + write_depth(obsspace, self.depth) def log(self, logger): - self.logDateTime(logger) - self.logRcptDateTime(logger) - self.logLongitude(logger) - self.logLatitude(logger) - self.logDepth(logger) - self.logStationID(logger) + self.log_date_time(logger) + self.log_rcpt_date_time(logger) + self.log_longitude(logger) + self.log_latitude(logger) + self.log_depth(logger) + self.log_station_id(logger) ########################################################################## - def SetDateTimeFromQueryResult(self, r): + def set_date_time_from_query_result(self, r): self.dateTime = r.get_datetime('year', 'month', 'day', 'hour', 'minute', group_by='depth') self.dateTime = self.dateTime.astype(np.int64) - def SetRcptDateTimeFromQueryResult(self, r): + def set_rcpt_date_time_from_query_result(self, r): self.rcptdateTime = r.get_datetime('ryear', 'rmonth', 'rday', 'rhour', 'rminute', group_by='depth') self.rcptdateTime = self.rcptdateTime.astype(np.int64) - def SetLonFromQueryResult(self, r): + def set_lon_from_query_result(self, r): self.lon = r.get('longitude', group_by='depth') - def SetLatFromQueryResult(self, r): + def set_lat_from_query_result(self, r): self.lat = r.get('latitude', group_by='depth') - def SetStationIDFromQueryResult(self, r): + def set_station_id_from_query_result(self, r): self.stationID = r.get('stationID', group_by='depth') - def SetDepthFromQueryResult(self, r): + def set_depth_from_query_result(self, r): self.depth = r.get('depth', group_by='depth') ########################################################################## - def logLongitude(self, logger): - LogVariable(logger, "lon", self.lon) + def log_longitude(self, logger): + log_variable(logger, "lon", self.lon) logger.debug(f"lon hash = {compute_hash(self.lon)}") - def logLatitude(self, logger): - LogVariable(logger, "lat", self.lat) + def log_latitude(self, logger): + log_variable(logger, "lat", self.lat) logger.debug(f"lat hash = {compute_hash(self.lat)}") - def logDateTime(self, logger): - LogVariable(logger, "dateTime", self.dateTime) + def log_date_time(self, logger): + log_variable(logger, "dateTime", self.dateTime) logger.debug(f"dateTime hash = {compute_hash(self.dateTime)}") - def logRcptDateTime(self, logger): - LogVariable(logger, "rcptdateTime", self.rcptdateTime) + def log_rcpt_date_time(self, logger): + log_variable(logger, "rcptdateTime", self.rcptdateTime) logger.debug(f"rcptdateTime hash = {compute_hash(self.rcptdateTime)}") - def logStationID(self, logger): + def log_station_id(self, logger): logger.debug(f"stationID: {len(self.stationID)}, {self.stationID.astype(str).dtype}") if isinstance(self.stationID[0], str): concatenated_string = ''.join(self.stationID) @@ -91,6 +91,6 @@ def logStationID(self, logger): else: logger.debug(f"stationID hash = {compute_hash(self.stationID)}") - def logDepth(self, logger): - LogVariable(logger, "depth", self.depth) + def log_depth(self, logger): + log_variable(logger, "depth", self.depth) logger.debug(f"depth hash = {compute_hash(self.depth)}") diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py index cda241b50..789fe060a 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_variables.py @@ -15,36 +15,36 @@ def __init__(self): def construct(self): self.n_obs = 0 # default values can be oerridden using methods of this class: - self.SetTemperatureRange(-10.0, 50.0) + self.set_temperature_range(-10.0, 50.0) self.T_error = 0.0 - self.SetSalinityRange(0.0, 45.0) + self.set_salinity_range(0.0, 45.0) self.S_error = 0.0 self.metadata = IODAMetadata() - def SetOceanBasinNCFilePath(self, nc_file_path): - self.additional_vars.SetOceanBasinNCFilePath(nc_file_path) + def set_ocean_basin_nc_file(self, nc_file_path): + self.additional_vars.set_ocean_basin_nc_file(nc_file_path) - def SetTemperatureVarName(self, name): + def set_temperature_var_name(self, name): self.T_name = name - def SetTemperatureError(self, e): + def set_temperature_error(self, e): self.T_error = e - def SetTemperatureRange(self, tmin, tmax): + def set_temperature_range(self, tmin, tmax): self.T_min = tmin self.T_max = tmax - def SetSalinityVarName(self, name): + def set_salinity_var_name(self, name): self.S_name = name - def SetSalinityError(self, e): + def set_salinity_error(self, e): self.S_error = e - def SetSalinityRange(self, smin, smax): + def set_salinity_range(self, smin, smax): self.S_min = smin self.S_max = smax - def BuildQuery(self): + def build_query(self): q = bufr.QuerySet() q.add('year', '*/YEAR') q.add('month', '*/MNTH') @@ -58,9 +58,9 @@ def BuildQuery(self): q.add('rminute', '*/RCMI') return q - def SetFromQueryResult(self, r): - self.metadata.SetFromQueryResult(r) - self.SetObsFromQueryResult(r) + def set_from_query_result(self, r): + self.metadata.set_from_query_result(r) + self.set_obs_from_query_result(r) ########################################################################### @@ -75,29 +75,29 @@ def filter(self): ########################################################################### - def WriteToIodaFile(self, obsspace): - self.metadata.WriteToIodaFile(obsspace) - self.additional_vars.WriteToIodaFile(obsspace) - self.WriteObsValueT(obsspace) - self.WriteObsValueS(obsspace) + def write_to_ioda_file(self, obsspace): + self.metadata.write_to_ioda_file(obsspace) + self.additional_vars.write_to_ioda_file(obsspace) + self.write_obs_value_t(obsspace) + self.write_obs_value_s(obsspace) ########################################################################## - def SetObsFromQueryResult(self, r): + def set_obs_from_query_result(self, r): self.temp = r.get('temp', group_by='depth') self.temp -= 273.15 self.saln = r.get('saln', group_by='depth') ########################################################################### - def WriteObsValueT(self, obsspace): + def write_obs_value_t(self, obsspace): obsspace.create_var('ObsValue/' + self.T_name, dtype=self.temp.dtype, fillval=self.temp.fill_value) \ .write_attr('units', 'degC') \ .write_attr('valid_range', np.array([self.T_min, self.T_max], dtype=np.float32)) \ .write_attr('long_name', self.T_name) \ .write_data(self.temp) - def WriteObsValueS(self, obsspace): + def write_obs_value_s(self, obsspace): obsspace.create_var( 'ObsValue/' + self.S_name, dtype=self.saln.dtype, @@ -112,17 +112,17 @@ def WriteObsValueS(self, obsspace): def log(self, logger): self.metadata.log(logger) - self.logObs(logger) + self.log_obs(logger) self.additional_vars.log(logger) - def logObs(self, logger): - self.logTemperature(logger) - self.logSalinity(logger) + def log_obs(self, logger): + self.log_temperature(logger) + self.log_salinity(logger) - def logTemperature(self, logger): - LogVariable(logger, "temp", self.temp) + def log_temperature(self, logger): + log_variable(logger, "temp", self.temp) logger.debug(f"temp hash = {compute_hash(self.temp)}") - def logSalinity(self, logger): - LogVariable(logger, "saln", self.saln) + def log_salinity(self, logger): + log_variable(logger, "saln", self.saln) logger.debug(f"saln hash = {compute_hash(self.saln)}") diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py index 2064d41ba..9e848c5f5 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ocean.py @@ -18,7 +18,7 @@ # The path to the ocean basin nc file can be supplied # in the implementation of the converter -# the main method is GetStationBasin which returns the ocean basin +# the main method is get_station_basin which returns the ocean basin # for a list of station coordinates # there are methods for plotting and printing the ocean basin data # as well as printing and plotting station basin data @@ -26,27 +26,12 @@ class OceanBasin: def __init__(self): - # self.FindOceanBasinNCFile() pass - def SetOceanBasinNCFilePath(self, filename): + def set_ocean_basin_nc_file(self, filename): self.ocean_basin_nc_file_path = filename - def FindOceanBasinNCFile(self): - # try on hera: - trypath = "/scratch2/NCEPDEV/ocean/Guillaume.Vernieres/data/static/common/RECCAP2_region_masks_all_v20221025.nc" - if os.path.exists(trypath): - self.ocean_basin_nc_file_path = trypath - else: - # try on orion - trypath = "/work/noaa/global/glopara/fix/gdas/soca/20240802/common/RECCAP2_region_masks_all_v20221025.nc" - if os.path.exists(trypath): - self.ocean_basin_nc_file_path = trypath - else: - # file not found - self.ocean_basin_nc_file_path = "" - - def ReadNCFile(self): + def read_nc_file(self): try: with nc.Dataset(self.ocean_basin_nc_file_path, 'r') as nc_file: variable_name = 'open_ocean' @@ -69,12 +54,12 @@ def ReadNCFile(self): print(f"An IOError occurred: {e}") sys.exit(1) - def PrintBasin(self): + def print_basin(self): for i in range(n1): for j in range(n2): print(i, j, self.__basin_array[i][j]) - def PlotBasin(self): + def plot_basin(self): # Create a figure and axes with Cartopy projection fig = plt.figure(figsize=(10, 6)) ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) @@ -97,7 +82,7 @@ def PlotBasin(self): # input: 2 vectors of station coordinates # output: a vector of station ocean basin values - def GetStationBasin(self, lat, lon): + def get_station_basin(self, lat, lon): n = len(lon) # print("number of stations = ", n) @@ -115,15 +100,15 @@ def GetStationBasin(self, lat, lon): ocean_basin.append(self.__basin_array[i1][i2]) return ocean_basin - def PrintStationBasin(self, lon, lat, file_path): - ocean_basin = self.GetStationBasin(lat, lon) + def print_station_basin(self, lon, lat, file_path): + ocean_basin = self.get_station_basin(lat, lon) with open(file_path, 'w') as file: # Iterate over lon, lat, and ocean_basin arrays simultaneously for lat_val, lon_val, basin_val in zip(lat, lon, ocean_basin): file.write(f"{lat_val} {lon_val} {basin_val}\n") - def PlotStations(self, lon, lat, png_file): - ocean_basin = self.GetStationBasin(lon, lat) + def plot_stations(self, lon, lat, png_file): + ocean_basin = self.get_station_basin(lon, lat) # Initialize the plot plt.figure(figsize=(12, 8)) diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py index 1df1bde8d..5d3e039b3 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/util.py @@ -7,7 +7,7 @@ import hashlib -def ParseArguments(): +def parse_arguments(): parser = argparse.ArgumentParser() parser.add_argument( '-c', '--config', @@ -32,7 +32,7 @@ def ParseArguments(): return script_name, config_file, log_file, test_file -def LogVariable(logger, v_name, v): +def log_variable(logger, v_name, v): logger.debug(f"{v_name}: {len(v)}, {v.dtype} min, max = {v.min()}, {v.max()}") @@ -84,7 +84,7 @@ def compute_hash(sequence, algorithm='sha256'): ##################################################################### -def WriteDateTime(obsspace, dateTime): +def write_date_time(obsspace, dateTime): obsspace.create_var( 'MetaData/dateTime', dtype=dateTime.dtype, fillval=dateTime.fill_value @@ -94,7 +94,7 @@ def WriteDateTime(obsspace, dateTime): .write_data(dateTime) -def WriteRcptDateTime(obsspace, rcptdateTime): +def write_rcpt_date_time(obsspace, rcptdateTime): obsspace.create_var( 'MetaData/rcptdateTime', dtype=rcptdateTime.dtype, fillval=rcptdateTime.fill_value @@ -104,7 +104,7 @@ def WriteRcptDateTime(obsspace, rcptdateTime): .write_data(rcptdateTime) -def WriteLongitude(obsspace, lon): +def write_longitude(obsspace, lon): obsspace.create_var( 'MetaData/longitude', dtype=lon.dtype, fillval=lon.fill_value @@ -115,7 +115,7 @@ def WriteLongitude(obsspace, lon): .write_data(lon) -def WriteLatitude(obsspace, lat): +def write_latitude(obsspace, lat): obsspace.create_var( 'MetaData/latitude', dtype=lat.dtype, fillval=lat.fill_value @@ -126,7 +126,7 @@ def WriteLatitude(obsspace, lat): .write_data(lat) -def WriteStationID(obsspace, stationID): +def write_station_id(obsspace, stationID): obsspace.create_var( 'MetaData/stationID', dtype=stationID.dtype, fillval=stationID.fill_value @@ -135,7 +135,7 @@ def WriteStationID(obsspace, stationID): .write_data(stationID) -def WriteDepth(obsspace, depth): +def write_depth(obsspace, depth): obsspace.create_var( 'MetaData/depth', dtype=depth.dtype, @@ -146,7 +146,7 @@ def WriteDepth(obsspace, depth): .write_data(depth) -def WriteSeqNum(obsspace, seqNum, datatype, fillvalue): +def write_seq_num(obsspace, seqNum, datatype, fillvalue): obsspace.create_var( 'MetaData/sequenceNumber', dtype=datatype, @@ -156,7 +156,7 @@ def WriteSeqNum(obsspace, seqNum, datatype, fillvalue): .write_data(seqNum) -def WriteObsError(obsspace, v_name, units, v): +def write_obs_error(obsspace, v_name, units, v): obsspace.create_var( v_name, dtype=v.dtype, fillval=v.fill_value @@ -166,7 +166,7 @@ def WriteObsError(obsspace, v_name, units, v): .write_data(v) -def WriteOceanBasin(obsspace, ocean_basin, datatype, fillvalue): +def write_ocean_basin(obsspace, ocean_basin, datatype, fillvalue): obsspace.create_var( 'MetaData/oceanBasin', dtype=datatype, diff --git a/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py index 848480bf7..ec49e39c0 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bathy_ioda_variables.py @@ -1,7 +1,7 @@ import numpy as np from pyiodaconv import bufr from b2iconverter.ioda_variables import IODAVariables -from b2iconverter.ioda_addl_vars import IODAAdditionalVariables, ComputeSeqNum +from b2iconverter.ioda_addl_vars import IODAAdditionalVariables, compute_seq_num class BathyIODAVariables(IODAVariables): @@ -9,8 +9,8 @@ def __init__(self): self.construct() self.additional_vars = BathyAdditionalVariables(self) - def BuildQuery(self): - q = super().BuildQuery() + def build_query(self): + q = super().build_query() q.add('stationID', '*/RPID') q.add('latitude', '*/CLAT') q.add('longitude', '*/CLON') @@ -18,7 +18,7 @@ def BuildQuery(self): q.add('temp', '*/BTOCN/STMP') return q - def SetObsFromQueryResult(self, r): + def set_obs_from_query_result(self, r): self.temp = r.get('temp', group_by='depth') self.temp -= 273.15 @@ -27,33 +27,33 @@ def filter(self): self.metadata.filter(mask) self.temp = self.temp[mask] - def WriteToIodaFile(self, obsspace): - self.metadata.WriteToIodaFile(obsspace) - self.additional_vars.WriteToIodaFile(obsspace) - self.WriteObsValueT(obsspace) + def write_to_ioda_file(self, obsspace): + self.metadata.write_to_ioda_file(obsspace) + self.additional_vars.write_to_ioda_file(obsspace) + self.write_obs_value_t(obsspace) - def logObs(self, logger): - self.logTemperature(logger) + def log_obs(self, logger): + self.log_temperature(logger) class BathyAdditionalVariables(IODAAdditionalVariables): def construct(self): - self.seqNum = ComputeSeqNum(self.ioda_vars.metadata.lon, self.ioda_vars.metadata.lat) + self.seqNum = compute_seq_num(self.ioda_vars.metadata.lon, self.ioda_vars.metadata.lat) n = len(self.seqNum) self.PreQC = (np.ma.masked_array(np.full(n, 0))).astype(np.int32) self.ObsError_temp = \ np.float32(np.ma.masked_array(np.full(n, self.ioda_vars.T_error))) - self.ComputeOceanBasin() + self.compute_ocean_basin() - def WriteToIodaFile(self, obsspace): - self.WriteSeqNum(obsspace) - self.WritePreQC(obsspace, self.ioda_vars.T_name) - self.WriteObsErrorT(obsspace) - self.WriteOceanBasin(obsspace) + def write_to_ioda_file(self, obsspace): + self.write_seq_num(obsspace) + self.write_preqc(obsspace, self.ioda_vars.T_name) + self.write_obs_errorT(obsspace) + self.write_ocean_basin(obsspace) def log(self, logger): - self.logSeqNum(logger) - self.logPreQC(logger) - self.logObsError_temp(logger) - self.logOceanBasin(logger) + self.log_seq_num(logger) + self.log_preqc(logger) + self.log_obs_error_temp(logger) + self.log_ocean_basin(logger) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py index af9f34b69..bed8b6692 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_argo.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import sys -from b2iconverter.util import ParseArguments +from b2iconverter.util import parse_arguments from b2iconverter.bufr2ioda_config import Bufr2iodaConfig from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter from argo_ioda_variables import ArgoIODAVariables @@ -11,13 +11,13 @@ class ArgoConfig(Bufr2iodaConfig): - def IODAFilename(self): + def ioda_filename(self): return f"{self.cycle_type}.t{self.hh}z.insitu_profile_argo.{self.cycle_datetime}.nc4" if __name__ == '__main__': - script_name, config_file, log_file, test_file = ParseArguments() + script_name, config_file, log_file, test_file = parse_arguments() bufr2ioda_config = ArgoConfig( script_name, @@ -25,10 +25,10 @@ def IODAFilename(self): platform_description) ioda_vars = ArgoIODAVariables() - ioda_vars.SetTemperatureVarName("waterTemperature") - ioda_vars.SetTemperatureError(0.02) - ioda_vars.SetSalinityVarName("salinity") - ioda_vars.SetSalinityError(0.01) + ioda_vars.set_temperature_var_name("waterTemperature") + ioda_vars.set_temperature_error(0.02) + ioda_vars.set_salinity_var_name("salinity") + ioda_vars.set_salinity_error(0.01) argo = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py index 4386eee40..a492337a4 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import sys -from b2iconverter.util import ParseArguments +from b2iconverter.util import parse_arguments from b2iconverter.bufr2ioda_config import Bufr2iodaConfig from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter from bathy_ioda_variables import BathyIODAVariables @@ -12,7 +12,7 @@ if __name__ == '__main__': - script_name, config_file, log_file, test_file = ParseArguments() + script_name, config_file, log_file, test_file = parse_arguments() bufr2ioda_config = Bufr2iodaConfig( script_name, @@ -20,8 +20,8 @@ platform_description) ioda_vars = BathyIODAVariables() - ioda_vars.SetTemperatureError(0.24) - ioda_vars.SetTemperatureVarName("waterTemperature") + ioda_vars.set_temperature_error(0.24) + ioda_vars.set_temperature_var_name("waterTemperature") bathy = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py index 45f11329e..627bf0292 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_glider.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import sys -from b2iconverter.util import ParseArguments +from b2iconverter.util import parse_arguments from b2iconverter.bufr2ioda_config import Bufr2iodaConfig from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter from glider_ioda_variables import GliderIODAVariables @@ -12,7 +12,7 @@ if __name__ == '__main__': - script_name, config_file, log_file, test_file = ParseArguments() + script_name, config_file, log_file, test_file = parse_arguments() bufr2ioda_config = Bufr2iodaConfig( script_name, @@ -20,10 +20,10 @@ platform_description) ioda_vars = GliderIODAVariables() - ioda_vars.SetTemperatureVarName("waterTemperature") - ioda_vars.SetTemperatureError(0.02) - ioda_vars.SetSalinityVarName("salinity") - ioda_vars.SetSalinityError(0.01) + ioda_vars.set_temperature_var_name("waterTemperature") + ioda_vars.set_temperature_error(0.02) + ioda_vars.set_salinity_var_name("salinity") + ioda_vars.set_salinity_error(0.01) glider = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) glider.run() diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py index 28dc87397..b1d1d93e6 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_tesac.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import sys -from b2iconverter.util import ParseArguments +from b2iconverter.util import parse_arguments from b2iconverter.bufr2ioda_config import Bufr2iodaConfig from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter from tesac_ioda_variables import TesacIODAVariables @@ -12,7 +12,7 @@ if __name__ == '__main__': - script_name, config_file, log_file, test_file = ParseArguments() + script_name, config_file, log_file, test_file = parse_arguments() bufr2ioda_config = Bufr2iodaConfig( script_name, @@ -20,10 +20,10 @@ platform_description) ioda_vars = TesacIODAVariables() - ioda_vars.SetTemperatureError(0.02) - ioda_vars.SetTemperatureVarName("waterTemperature") - ioda_vars.SetSalinityError(0.01) - ioda_vars.SetSalinityVarName("salinity") + ioda_vars.set_temperature_error(0.02) + ioda_vars.set_temperature_var_name("waterTemperature") + ioda_vars.set_salinity_error(0.01) + ioda_vars.set_salinity_var_name("salinity") tesac = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py index 0c69f8caa..20fbead4e 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_xbtctd.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import sys -from b2iconverter.util import ParseArguments +from b2iconverter.util import parse_arguments from b2iconverter.bufr2ioda_config import Bufr2iodaConfig from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter from xbtctd_ioda_variables import XbtctdIODAVariables @@ -12,7 +12,7 @@ if __name__ == '__main__': - script_name, config_file, log_file, test_file = ParseArguments() + script_name, config_file, log_file, test_file = parse_arguments() bufr2ioda_config = Bufr2iodaConfig( script_name, @@ -20,10 +20,10 @@ platform_description) ioda_vars = XbtctdIODAVariables() - ioda_vars.SetTemperatureVarName("waterTemperature") - ioda_vars.SetTemperatureError(0.12) - ioda_vars.SetSalinityVarName("salinity") - ioda_vars.SetSalinityError(1.0) + ioda_vars.set_temperature_var_name("waterTemperature") + ioda_vars.set_temperature_error(0.12) + ioda_vars.set_salinity_var_name("salinity") + ioda_vars.set_salinity_error(1.0) xbtctd = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) xbtctd.run() diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py index 7d3898dae..122c5cebe 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_surface_trkob.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import sys -from b2iconverter.util import ParseArguments +from b2iconverter.util import parse_arguments from b2iconverter.bufr2ioda_config import Bufr2iodaConfig from b2iconverter.bufr2ioda_converter import Bufr2ioda_Converter from trkob_ioda_variables import TrkobIODAVariables @@ -11,13 +11,13 @@ class TrkobConfig(Bufr2iodaConfig): - def IODAFilename(self): + def ioda_filename(self): return f"{self.cycle_type}.t{self.hh}z.insitu_surface_{self.data_format}.{self.cycle_datetime}.nc4" if __name__ == '__main__': - script_name, config_file, log_file, test_file = ParseArguments() + script_name, config_file, log_file, test_file = parse_arguments() bufr2ioda_config = TrkobConfig( script_name, @@ -25,10 +25,10 @@ def IODAFilename(self): platform_description) ioda_vars = TrkobIODAVariables() - ioda_vars.SetTemperatureVarName("seaSurfaceTemperature") - ioda_vars.SetTemperatureError(0.3) - ioda_vars.SetSalinityVarName("seaSurfaceSalinity") - ioda_vars.SetSalinityError(1.0) + ioda_vars.set_temperature_var_name("seaSurfaceTemperature") + ioda_vars.set_temperature_error(0.3) + ioda_vars.set_salinity_var_name("seaSurfaceSalinity") + ioda_vars.set_salinity_error(1.0) trkob = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) trkob.run() diff --git a/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py index a51ba6b83..19f24ddc8 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/glider_ioda_variables.py @@ -7,8 +7,8 @@ class GliderIODAVariables(IODAVariables): def __init__(self): super().__init__() - def BuildQuery(self): - q = super().BuildQuery() + def build_query(self): + q = super().build_query() q.add('stationID', '*/WMOP') q.add('latitude', '*/CLATH') q.add('longitude', '*/CLONH') @@ -17,8 +17,8 @@ def BuildQuery(self): q.add('saln', '*/GLPFDATA/SALNH') return q - def SetFromQueryResult(self, r): - super().SetFromQueryResult(r) + def set_from_query_result(self, r): + super().set_from_query_result(r) # convert depth in pressure units to meters (rho * g * h) self.metadata.depth = np.float32(self.metadata.depth.astype(float) * 0.0001) diff --git a/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py index 177a058b4..c950b0c10 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/tesac_ioda_variables.py @@ -6,8 +6,8 @@ class TesacIODAVariables(IODAVariables): def __init__(self): super().__init__() - def BuildQuery(self): - q = super().BuildQuery() + def build_query(self): + q = super().build_query() q.add('stationID', '*/RPID') q.add('latitude', '*/CLAT') q.add('longitude', '*/CLON') diff --git a/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py index 73a12c058..7eeb3047c 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/trkob_ioda_variables.py @@ -3,7 +3,7 @@ from b2iconverter.ioda_variables import IODAVariables from b2iconverter.ioda_addl_vars import IODAAdditionalVariables from b2iconverter.ioda_metadata import IODAMetadata -from b2iconverter.util import WriteDateTime, WriteRcptDateTime, WriteLongitude, WriteLatitude, WriteStationID +from b2iconverter.util import write_date_time, write_rcpt_date_time, write_longitude, write_latitude, write_station_id class TrkobIODAVariables(IODAVariables): @@ -12,8 +12,8 @@ def __init__(self): self.metadata = TrkobMetadata() self.additional_vars = TrkobAdditionalVariables(self) - def BuildQuery(self): - q = super().BuildQuery() + def build_query(self): + q = super().build_query() q.add('stationID', '*/RPID') q.add('latitude', '*/CLAT') q.add('longitude', '*/CLON') @@ -32,12 +32,12 @@ def filter(self): class TrkobMetadata(IODAMetadata): - def SetFromQueryResult(self, r): - self.SetDateTimeFromQueryResult(r) - self.SetRcptDateTimeFromQueryResult(r) - self.SetLonFromQueryResult(r) - self.SetLatFromQueryResult(r) - self.SetStationIDFromQueryResult(r) + def set_from_query_result(self, r): + self.set_date_time_from_query_result(r) + self.set_rcpt_date_time_from_query_result(r) + self.set_lon_from_query_result(r) + self.set_lat_from_query_result(r) + self.set_station_id_from_query_result(r) def filter(self, mask): self.dateTime = self.dateTime[mask] @@ -46,20 +46,20 @@ def filter(self, mask): self.lon = self.lon[mask] self.stationID = self.stationID[mask] - def WriteToIodaFile(self, obsspace): - WriteDateTime(obsspace, self.dateTime) - WriteRcptDateTime(obsspace, self.rcptdateTime) - WriteLongitude(obsspace, self.lon) - WriteLatitude(obsspace, self.lat) - WriteStationID(obsspace, self.stationID) + def write_to_ioda_file(self, obsspace): + write_date_time(obsspace, self.dateTime) + write_rcpt_date_time(obsspace, self.rcptdateTime) + write_longitude(obsspace, self.lon) + write_latitude(obsspace, self.lat) + write_station_id(obsspace, self.stationID) def log(self, logger): - self.logDateTime(logger) - self.logRcptDateTime(logger) + self.log_date_time(logger) + self.log_rcpt_date_time(logger) # self.logLonLat(logger) - self.logLongitude(logger) - self.logLatitude(logger) - self.logStationID(logger) + self.log_longitude(logger) + self.log_latitude(logger) + self.log_station_id(logger) class TrkobAdditionalVariables(IODAAdditionalVariables): @@ -71,17 +71,17 @@ def construct(self): np.float32(np.ma.masked_array(np.full(n, self.ioda_vars.T_error))) self.ObsError_saln = \ np.float32(np.ma.masked_array(np.full(n, self.ioda_vars.S_error))) - self.ComputeOceanBasin() + self.compute_ocean_basin() - def WriteToIodaFile(self, obsspace): - self.WritePreQC(obsspace, self.ioda_vars.T_name) - self.WritePreQC(obsspace, self.ioda_vars.S_name) - self.WriteObsErrorT(obsspace) - self.WriteObsErrorS(obsspace) - self.WriteOceanBasin(obsspace) + def write_to_ioda_file(self, obsspace): + self.write_preqc(obsspace, self.ioda_vars.T_name) + self.write_preqc(obsspace, self.ioda_vars.S_name) + self.write_obs_errorT(obsspace) + self.write_obs_errorS(obsspace) + self.write_ocean_basin(obsspace) def log(self, logger): - self.logPreQC(logger) - self.logObsError_temp(logger) - self.logObsError_saln(logger) - self.logOceanBasin(logger) + self.log_preqc(logger) + self.log_obs_error_temp(logger) + self.log_obs_error_saln(logger) + self.log_ocean_basin(logger) diff --git a/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py b/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py index 7dfa295f9..fc85ace38 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py +++ b/ush/ioda/bufr2ioda/marine/b2i/xbtctd_ioda_variables.py @@ -7,8 +7,8 @@ class XbtctdIODAVariables(IODAVariables): def __init__(self): super().__init__() - def BuildQuery(self): - q = super().BuildQuery() + def build_query(self): + q = super().build_query() q.add('stationID', '*/WMOP') q.add('latitude', '*/CLATH') q.add('longitude', '*/CLONH') From 8cc08d9ccd3191eea0fffff51208505a24688154 Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Wed, 18 Sep 2024 18:20:21 +0000 Subject: [PATCH 51/54] removed plot; fixed style --- .../marine/b2i/bufr_plot_stations.py | 82 ------------------- 1 file changed, 82 deletions(-) delete mode 100755 ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py b/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py deleted file mode 100755 index 22878fc0e..000000000 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py +++ /dev/null @@ -1,82 +0,0 @@ -# a simple script to plot stations -# Usage: python3 bufr_plot_stations.py -i BUFR_FILE_NAME -# output is produced in the file "stations.png" - -# the bufr query strings will not always work; -# in some cases they need to be changed to CLONH, CLATH - -import argparse - -from pyiodaconv import bufr - -import matplotlib.pyplot as plt -import cartopy.crs as ccrs -import cartopy.feature as cfeature -# from .ocean import OceanBasin - - -def plot_points_on_map(latitudes, longitudes, output_file_name, title='Map with Points', marker_color='red', marker_size=50): - """ - Plots points on a map given lists of latitudes and longitudes. - - Parameters: - latitudes (list of float): List of latitude values for the points. - longitudes (list of float): List of longitude values for the points. - title (str): Title of the map (default is 'Map with Points'). - marker_color (str): Color of the markers (default is 'red'). - marker_size (int): Size of the markers (default is 50). - """ - # Create a new figure - fig, ax = plt.subplots(figsize=(10, 7), subplot_kw={'projection': ccrs.PlateCarree()}) - - # Add features to the map - ax.add_feature(cfeature.LAND, edgecolor='black') - ax.add_feature(cfeature.OCEAN) - ax.add_feature(cfeature.COASTLINE) - ax.add_feature(cfeature.BORDERS, linestyle=':') - ax.add_feature(cfeature.LAKES, edgecolor='black') - - # Add gridlines - ax.gridlines(draw_labels=True) - - # Plot each point - ax.scatter(longitudes, latitudes, color=marker_color, s=marker_size, edgecolor='black', transform=ccrs.PlateCarree()) - - # Set title - plt.title(title) - - # Show the map - # plt.show() - plt.savefig(output_file_name, dpi=300) - - -parser = argparse.ArgumentParser() -parser.add_argument( - '-i', '--input', - type=str, - help='Input BUFR filename', required=True -) -parser.add_argument( - '-o', '--output', - type=str, - help='Output png filename', required=True -) -args = parser.parse_args() -bufrfile_path = args.input -output_file_name = args.output - -q = bufr.QuerySet() -q.add('longitude', '*/CLON') -q.add('latitude', '*/CLAT') - -with bufr.File(bufrfile_path) as f: - r = f.execute(q) - -print("Executed query") - -lon = r.get('longitude') -lat = r.get('latitude') - -print(f"read lat, lon -- {len(lon)} points") - -plot_points_on_map(lat, lon, output_file_name, title='stations', marker_color='blue', marker_size=10) From 87bbf60cda9208a870186749347857a3959557b1 Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Wed, 18 Sep 2024 18:21:55 +0000 Subject: [PATCH 52/54] removed plot; fixed style --- ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py index 14dab59d2..b05ed31c2 100644 --- a/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py +++ b/ush/ioda/bufr2ioda/marine/b2i/b2iconverter/ioda_addl_vars.py @@ -10,8 +10,7 @@ def __init__(self, ioda_vars): self.ocean = OceanBasin() def construct(self): - self.seqNum = compute_seq_num(self.ioda_vars.metadata.lon, - self.ioda_vars.metadata.lat) + self.seqNum = compute_seq_num(self.ioda_vars.metadata.lon, self.ioda_vars.metadata.lat) n = len(self.seqNum) self.PreQC = (np.ma.masked_array(np.full(n, 0))).astype(np.int32) self.ObsError_temp = \ From 1c256c564304ee2b2d7b2dd1de2aff80408db5aa Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Thu, 19 Sep 2024 00:37:15 +0000 Subject: [PATCH 53/54] removed lines in cmake --- test/soca/CMakeLists.txt | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/test/soca/CMakeLists.txt b/test/soca/CMakeLists.txt index 9a0fc623d..afc21721d 100644 --- a/test/soca/CMakeLists.txt +++ b/test/soca/CMakeLists.txt @@ -23,27 +23,13 @@ endforeach(FILENAME) install(FILES ${test_input} DESTINATION "test/testinput/") -# Test exgdas scripts from the global-worflow -if (WORKFLOW_TESTS) - add_subdirectory(gw) -endif() - -# test for ush/socaincr2mom6.py -add_test(NAME test_gdasapp_soca_nsst_increment_to_mom6 - COMMAND ${PROJECT_SOURCE_DIR}/test/soca/socaincr2mom6.sh ${PROJECT_SOURCE_DIR} - WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/test/soca) -set_tests_properties( - test_gdasapp_soca_nsst_increment_to_mom6 -PROPERTIES -ENVIRONMENT "data=${TESTDATA};PYTHONPATH=${PROJECT_BINARY_DIR}/ush:$ENV{PYTHONPATH}") - ########################################################################### # bufr to ioda tests: ########################################################################### # prepare a test.yaml file from test.yaml.in by replacing -# placeholder patterns __BUFRINPUTDIR__ and __IODAOUTPUTDIR__ +# placeholder patterns __BUFRINPUTDIR__ and __IODAOUTPUTDIR__ and __OCEANBASIN__ # with actual directory paths function(CREATE_CONFIG_FILE test_config_in @@ -61,7 +47,6 @@ endfunction() set(TEST_WORKING_DIR ${PROJECT_BINARY_DIR}/test/soca) -# message("bufr to ioda: TEST_WORKING_DIR = ${TEST_WORKING_DIR}") set(MARINE_BUFR2IODA_DIR ${PROJECT_SOURCE_DIR}/ush/ioda/bufr2ioda/marine) set(MARINE_BUFR2IODA_DIR ${MARINE_BUFR2IODA_DIR}/b2i) From 9efeaa4dce92d6d33fa2acf591d96a6865d723f4 Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Thu, 19 Sep 2024 18:19:41 +0000 Subject: [PATCH 54/54] renamed soca to marine; adjusted links --- test/CMakeLists.txt | 2 ++ test/{soca => marine}/CMakeLists.txt | 8 ++++---- .../bufr2ioda_insitu_profile_argo_2021063006.yaml.in | 0 .../bufr2ioda_insitu_profile_bathy_2021063006.yaml.in | 0 .../bufr2ioda_insitu_profile_glider_2021063006.yaml.in | 0 .../bufr2ioda_insitu_profile_tesac_2021063006.yaml.in | 0 .../bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in | 0 .../bufr2ioda_insitu_surface_trkob_2021063006.yaml.in | 0 .../testref/bufr2ioda_insitu_profile_argo_2021063006.ref | 0 .../testref/bufr2ioda_insitu_profile_bathy_2021063006.ref | 0 .../bufr2ioda_insitu_profile_glider_2021063006.ref | 0 .../testref/bufr2ioda_insitu_profile_tesac_2021063006.ref | 0 .../bufr2ioda_insitu_profile_xbtctd_2021063006.ref | 0 .../testref/bufr2ioda_insitu_surface_trkob_2021063006.ref | 0 14 files changed, 6 insertions(+), 4 deletions(-) rename test/{soca => marine}/CMakeLists.txt (95%) rename test/{soca => marine}/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml.in (100%) rename test/{soca => marine}/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml.in (100%) rename test/{soca => marine}/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml.in (100%) rename test/{soca => marine}/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml.in (100%) rename test/{soca => marine}/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in (100%) rename test/{soca => marine}/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml.in (100%) rename test/{soca => marine}/testref/bufr2ioda_insitu_profile_argo_2021063006.ref (100%) rename test/{soca => marine}/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref (100%) rename test/{soca => marine}/testref/bufr2ioda_insitu_profile_glider_2021063006.ref (100%) rename test/{soca => marine}/testref/bufr2ioda_insitu_profile_tesac_2021063006.ref (100%) rename test/{soca => marine}/testref/bufr2ioda_insitu_profile_xbtctd_2021063006.ref (100%) rename test/{soca => marine}/testref/bufr2ioda_insitu_surface_trkob_2021063006.ref (100%) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 6f1b59c18..cae0d55ec 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -146,3 +146,5 @@ add_subdirectory(atm) # gdas aerosol tests add_subdirectory(aero) + +add_subdirectory(marine) diff --git a/test/soca/CMakeLists.txt b/test/marine/CMakeLists.txt similarity index 95% rename from test/soca/CMakeLists.txt rename to test/marine/CMakeLists.txt index afc21721d..4dda602ca 100644 --- a/test/soca/CMakeLists.txt +++ b/test/marine/CMakeLists.txt @@ -6,7 +6,7 @@ set(TESTDATA ${PROJECT_BINARY_DIR}/test/testdata ) # Symlink test input yaml files # ----------------------------- # create testinput dir -set (TESTINPUT_DIR ${PROJECT_BINARY_DIR}/test/soca/testinput) +set (TESTINPUT_DIR ${PROJECT_BINARY_DIR}/test/marine/testinput) file(MAKE_DIRECTORY ${TESTINPUT_DIR}) @@ -46,12 +46,12 @@ function(CREATE_CONFIG_FILE endfunction() -set(TEST_WORKING_DIR ${PROJECT_BINARY_DIR}/test/soca) +set(TEST_WORKING_DIR ${PROJECT_BINARY_DIR}/test/marine) set(MARINE_BUFR2IODA_DIR ${PROJECT_SOURCE_DIR}/ush/ioda/bufr2ioda/marine) set(MARINE_BUFR2IODA_DIR ${MARINE_BUFR2IODA_DIR}/b2i) -set(CONFIG_DIR ${PROJECT_SOURCE_DIR}/test/soca/testinput) -set(TESTREF_DIR ${PROJECT_SOURCE_DIR}/test/soca/testref) +set(CONFIG_DIR ${PROJECT_SOURCE_DIR}/test/marine/testinput) +set(TESTREF_DIR ${PROJECT_SOURCE_DIR}/test/marine/testref) function(CHECK_AND_SET_PATH PATH1 PATH2 RESULT_VAR) diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml.in b/test/marine/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml.in similarity index 100% rename from test/soca/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml.in rename to test/marine/testinput/bufr2ioda_insitu_profile_argo_2021063006.yaml.in diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml.in b/test/marine/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml.in similarity index 100% rename from test/soca/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml.in rename to test/marine/testinput/bufr2ioda_insitu_profile_bathy_2021063006.yaml.in diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml.in b/test/marine/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml.in similarity index 100% rename from test/soca/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml.in rename to test/marine/testinput/bufr2ioda_insitu_profile_glider_2021063006.yaml.in diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml.in b/test/marine/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml.in similarity index 100% rename from test/soca/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml.in rename to test/marine/testinput/bufr2ioda_insitu_profile_tesac_2021063006.yaml.in diff --git a/test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in b/test/marine/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in similarity index 100% rename from test/soca/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in rename to test/marine/testinput/bufr2ioda_insitu_profile_xbtctd_2021063006.yaml.in diff --git a/test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml.in b/test/marine/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml.in similarity index 100% rename from test/soca/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml.in rename to test/marine/testinput/bufr2ioda_insitu_surface_trkob_2021063006.yaml.in diff --git a/test/soca/testref/bufr2ioda_insitu_profile_argo_2021063006.ref b/test/marine/testref/bufr2ioda_insitu_profile_argo_2021063006.ref similarity index 100% rename from test/soca/testref/bufr2ioda_insitu_profile_argo_2021063006.ref rename to test/marine/testref/bufr2ioda_insitu_profile_argo_2021063006.ref diff --git a/test/soca/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref b/test/marine/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref similarity index 100% rename from test/soca/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref rename to test/marine/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref diff --git a/test/soca/testref/bufr2ioda_insitu_profile_glider_2021063006.ref b/test/marine/testref/bufr2ioda_insitu_profile_glider_2021063006.ref similarity index 100% rename from test/soca/testref/bufr2ioda_insitu_profile_glider_2021063006.ref rename to test/marine/testref/bufr2ioda_insitu_profile_glider_2021063006.ref diff --git a/test/soca/testref/bufr2ioda_insitu_profile_tesac_2021063006.ref b/test/marine/testref/bufr2ioda_insitu_profile_tesac_2021063006.ref similarity index 100% rename from test/soca/testref/bufr2ioda_insitu_profile_tesac_2021063006.ref rename to test/marine/testref/bufr2ioda_insitu_profile_tesac_2021063006.ref diff --git a/test/soca/testref/bufr2ioda_insitu_profile_xbtctd_2021063006.ref b/test/marine/testref/bufr2ioda_insitu_profile_xbtctd_2021063006.ref similarity index 100% rename from test/soca/testref/bufr2ioda_insitu_profile_xbtctd_2021063006.ref rename to test/marine/testref/bufr2ioda_insitu_profile_xbtctd_2021063006.ref diff --git a/test/soca/testref/bufr2ioda_insitu_surface_trkob_2021063006.ref b/test/marine/testref/bufr2ioda_insitu_surface_trkob_2021063006.ref similarity index 100% rename from test/soca/testref/bufr2ioda_insitu_surface_trkob_2021063006.ref rename to test/marine/testref/bufr2ioda_insitu_surface_trkob_2021063006.ref

nZH zAle%stfe;Qr1wyqOv%{rld(DRpRt)j+d$(Y<|0yUfAtxeJuo3?bRaSlFg&&{}ZU%=ThAQ11zaal(8KYX~1U1qktY!qqq0jbJ+A%5Jd^k?e+Z z^f6^Pi8*Ep*=|xkJzHNTRuP+=;W#vT-isO}VyrH4gym&o z;c3+Uk6M7DC{z87_r;H?FHC66X812S25ALE^%2-YWMeb@svBYDi8+w_ZLl@u`_?fq zheCgAjK9!uxYva`_$0ZUI5H&t$KHw&QXh5EV*;ZQ!mF#Y$2isWdYUo} z7Nob*%S5YY8jQI7g#Eq9$I57U^q{g^jY@PWH=&_ro@3r>c{ZJ>N2|twfel8_={-rhO1-z-g(NQ#>W$HT-b=b|tN6|J zm_Dr=gX{9KY<1?-n(S6h6SW08ohj3g;t&iq?pJ7MwXphB7UaNY0yf>eZBKHpY7I)hxiVPCENDuOZM%xW_LOMGFGHgNh z$~?3KB_S`~QrwD@C;fa+a#B7HXS})IWeQOTpCKlZV{DzIH*jqKi0z<$)(i` z_{@_y8nGSneVEdjfK9LS56(7)I)|Y?sRJ!#8`D6Iyl|Rj^5mY~0W$d+*TSKtjBfwd zfQ4$4Ze)dq@P=a)dBwk5%FqoS?f%Sg5(J!*+; zu7JT8+xnT<7g9uj7}wlHR4tNQpLKAl&;Ja@YflPU5b@t>0a-mn0^I{jMb~Kv3g2*>(5FqN)35Q=J)EB+6n@V3~&=E#Qcu9Usb^r01eC0khS5yz8 zdSbg$R|O_M$~1DvH+^A`H9e579d7%JoWpUF0U=4?nzr|6!J~JZ=lzQI9v?hSLCsvC z&fds7NB-1&T7@@{G2P}KMjn6!4k!zeCRk@8J-W}vp`gzr3Q6fM`TVC3Q9Xs)&g9N$} zx*NnR7M1ry2dqHYQfgwz>k<(tW1@4OCci?SF02d?k&ZIiT5@D=5CNHDx%C>PPi~2$&r>7+8nCnxx}r`5Q{u^ zBW$yzO@46yLktNooH#64ME^q#vq+>-p7}Y$#q!NlMwC79Fo8;EDiCA^aEacR&54_j z5T=bzv!uQ{WJ2-D_uymn?O&U6gaXE5X;ZC4K3D9!ZKM6CQ82Nh%rA`kN02ezrx4kn ztiEs#a?>tS3k{@?W)M_G6xVK|Llf)kIibxbPjE~;t$k~IFZwov!&se#VkQ`jK~o{! zPrE`SbUIm;H$`=Vi%~WnhH>3b^7u9)>o6jwI$&))f`Nh_YmW_Bu8>6_26Rfd4xx)d+Au+|WZ&{x$rEtLo)Aj}S$V9I2a$hCLY#pj&a=RtjzG`I zc={{FVK1=$qZqK%yYSE4Px^V;p#QHu1^@Ls3jXW1KrBD--=X(^ZEMT&ye`k{fBW{V zdQ-gd8sci_5WiV%$L*Ja#~wXYs+bEIj#L21N;B`&Inmf z;s0AHeBOVgEt9M&q#NF^%+pocjI$0agzSZU6uP literal 0 HcmV?d00001 From 48f9c5494c1bb4cebc2f6267717140777422eb30 Mon Sep 17 00:00:00 2001 From: Edward Givelberg Date: Mon, 9 Sep 2024 01:15:37 +0000 Subject: [PATCH 47/54] ref files --- ...fr2ioda_insitu_profile_argo_2021063006.ref | 35 ++++++++++++------- ...r2ioda_insitu_profile_bathy_2021063006.ref | 29 ++++++++++----- ...2ioda_insitu_profile_glider_2021063006.ref | 35 ++++++++++++------- ...r2ioda_insitu_profile_tesac_2021063006.ref | 35 ++++++++++++------- ...2ioda_insitu_profile_xbtctd_2021063006.ref | 35 ++++++++++++------- ...r2ioda_insitu_surface_trkob_2021063006.ref | 29 +++++++++------ 6 files changed, 131 insertions(+), 67 deletions(-) diff --git a/test/soca/testref/bufr2ioda_insitu_profile_argo_2021063006.ref b/test/soca/testref/bufr2ioda_insitu_profile_argo_2021063006.ref index 9d0e4e91f..aeaa3a049 100644 --- a/test/soca/testref/bufr2ioda_insitu_profile_argo_2021063006.ref +++ b/test/soca/testref/bufr2ioda_insitu_profile_argo_2021063006.ref @@ -1,12 +1,23 @@ - dateTime shape, dtype = (97150,), int64 - rcptdateTime shape, dytpe = (97150,), int64 - lon min, max, length, dtype = -174.8090057373047, 170.48915100097656, 97150, float32 - lat min, max, length, dtype = -59.77299880981445, 76.25086212158203, 97150, float32 - depth min, max, length, dtype = 0.0, 5700.7001953125, 97150, float32 - stationID shape, dtype = (97150,), Date: Tue, 10 Sep 2024 17:04:03 +0000 Subject: [PATCH 48/54] review corrections --- test/soca/CMakeLists.txt | 27 +++++++++--------- ...r2ioda_insitu_profile_bathy_2021063006.ref | 2 +- .../b2i/bufr2ioda_insitu_profile_bathy.py | 3 +- .../marine/b2i/bufr_plot_stations.py | 10 +++++-- ush/ioda/bufr2ioda/marine/b2i/stations.png | Bin 394326 -> 0 bytes 5 files changed, 22 insertions(+), 20 deletions(-) mode change 100644 => 100755 ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py delete mode 100644 ush/ioda/bufr2ioda/marine/b2i/stations.png diff --git a/test/soca/CMakeLists.txt b/test/soca/CMakeLists.txt index 601dbcf43..312ee8ade 100644 --- a/test/soca/CMakeLists.txt +++ b/test/soca/CMakeLists.txt @@ -53,7 +53,6 @@ function(CREATE_CONFIG_FILE test_config_in test_config_out bufr_input_dir ioda_o endfunction() -# set(TEST_WORKING_DIR "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138") set(TEST_WORKING_DIR ${PROJECT_BINARY_DIR}/test/soca) message("bufr to ioda: TEST_WORKING_DIR = ${TEST_WORKING_DIR}") @@ -63,22 +62,22 @@ set(CONFIG_DIR ${PROJECT_SOURCE_DIR}/test/soca/testinput) set(TESTREF_DIR ${PROJECT_SOURCE_DIR}/test/soca/testref) # find the staging directory for bufr test input files ${BUFR_TEST_DIR} +# checking on orion and hera # bufr input files on orion: set(BUFR_TEST_DIR "/work/noaa/da/marineda/gfs-marine/data/obs/ci/bufr" - # "/work/noaa/da/marineda/gfs-marine/data/obs/ci/obs" - # ${TEST_WORKING_DIR} # temporary fix ) if (NOT EXISTS ${BUFR_TEST_DIR}) # bufr input files on hera: set(BUFR_TEST_DIR "/scratch1/NCEPDEV/da/common/ci/bufr" - # "/scratch1/NCEPDEV/da/common/ci/obs" - # ${TEST_WORKING_DIR} # temporary fix ) endif() if (NOT EXISTS ${BUFR_TEST_DIR}) - message(FATAL_ERROR "staging directory for BUFR test files ${BUFR_TEST_DIR} not found") + message("staging directory for BUFR test files ${BUFR_TEST_DIR} not found") + set(GENERATE_BUFR2IODA_TESTS FALSE) +else() + set(GENERATE_BUFR2IODA_TESTS TRUE) endif() @@ -120,11 +119,11 @@ function(ADD_INSITU_TEST testname testbufr) endfunction() -ADD_INSITU_TEST("profile_argo" "subpfl") -ADD_INSITU_TEST("profile_bathy" "bathy") -ADD_INSITU_TEST("profile_glider" "subpfl") -# ADD_INSITU_TEST(profile_marinemammal) -ADD_INSITU_TEST("profile_tesac" "tesac") -ADD_INSITU_TEST("profile_xbtctd" "xbtctd") -# ADD_INSITU_TEST(surface_altkob) -ADD_INSITU_TEST("surface_trkob" "trkob") +if (GENERATE_BUFR2IODA_TESTS) + ADD_INSITU_TEST("profile_argo" "subpfl") + ADD_INSITU_TEST("profile_bathy" "bathy") + ADD_INSITU_TEST("profile_glider" "subpfl") + ADD_INSITU_TEST("profile_tesac" "tesac") + ADD_INSITU_TEST("profile_xbtctd" "xbtctd") + ADD_INSITU_TEST("surface_trkob" "trkob") +endif() diff --git a/test/soca/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref b/test/soca/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref index 28d2ff8f7..4a0835775 100644 --- a/test/soca/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref +++ b/test/soca/testref/bufr2ioda_insitu_profile_bathy_2021063006.ref @@ -15,6 +15,6 @@ temp hash = c00bbe5d969f8de8232ae22cd0948621e6b3e326e4931cdcfa2f7dd4d2509879 seqNum: 1751, int32 min, max = 0, 2 seqNum hash = 7429963169776e1dc0d26732c5053c7e81131cc66654c23aa6393258e9b5b9ae PreQC: 1751, int32 min, max = 0, 0 -ObsError_temp: 1751, float32 min, max = 0.0, 0.0 +ObsError_temp: 1751, float32 min, max = 0.23999999463558197, 0.23999999463558197 OceanBasin: 1751, int32 min, max = 1, 1 OceanBasin hash = 7de61dfe030e0fabc021c5e1c509cbd2f01afba06ac93959f94c5726d513937f diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py index 191fa1792..4386eee40 100755 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr2ioda_insitu_profile_bathy.py @@ -20,8 +20,7 @@ platform_description) ioda_vars = BathyIODAVariables() - # ??? ioda_vars.SetTemperatureError(0.3) - # ??? ioda_vars.SetSalinityError(1.0) + ioda_vars.SetTemperatureError(0.24) ioda_vars.SetTemperatureVarName("waterTemperature") bathy = Bufr2ioda_Converter(bufr2ioda_config, ioda_vars, log_file) diff --git a/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py b/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py old mode 100644 new mode 100755 index acc8db288..c4e365849 --- a/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py +++ b/ush/ioda/bufr2ioda/marine/b2i/bufr_plot_stations.py @@ -1,3 +1,10 @@ +# a simple script to plot stations +# Usage: python3 bufr_plot_stations.py -i BUFR_FILE_NAME +# output is produced in the file "stations.png" + +# the bufr query strings will not always work; +# in some cases they need to be changed to CLONH, CLATH + import argparse from pyiodaconv import bufr @@ -44,9 +51,6 @@ def plot_points_on_map(latitudes, longitudes, title='Map with Points', marker_co plt.savefig(png_file, dpi=300) -# bufrfile_path = "/scratch1/NCEPDEV/stmp2/Edward.Givelberg/RUNDIRS/GFSv17-3DVAR-C384mx025/prepoceanobs.114138/xx003" - - parser = argparse.ArgumentParser() parser.add_argument( '-i', '--input', diff --git a/ush/ioda/bufr2ioda/marine/b2i/stations.png b/ush/ioda/bufr2ioda/marine/b2i/stations.png deleted file mode 100644 index 5fbd83b83b9ece2bce1f8da1b19e2cadd4e738eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 394326 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 Z~eLbP?ahxymV+G10U1wEs3O;#6SVyF#r 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%0AP>CwmDF)%F!+yU=`NhldP|-B02gR0va!Rw`t=)2 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∋z2$2l`Q%wNx+)?ooUSw~Eqc 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