Skip to content

Commit 1b6fae8

Browse files
authored
Merge pull request #34 from SWOT-Confluence/add-sword-version-debug-h2ivdi
Add sword version debug h2ivdi
2 parents e62db40 + da61828 commit 1b6fae8

14 files changed

Lines changed: 1413 additions & 55 deletions

Singularity.def

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
Bootstrap: docker
2+
From: ghcr.io/swot-confluence/output:latest
3+
4+
%files
5+
metadata /app/metadata/
6+
output /app/output/
7+
run_output.py /app/run_output.py
8+
9+
%post
10+
# Fix nested output directory - copy contents up one level
11+
if [ -d /app/output/output ]; then
12+
cp -rf /app/output/output/* /app/output/
13+
rm -rf /app/output/output
14+
fi
15+
16+
%runscript
17+
exec /app/env/bin/python3 /app/run_output.py "$@"

output/.ipynb_checkpoints/Append-checkpoint.py

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,6 @@ class Append:
6363
list of AbstractModule objects to execute result storage ops for
6464
MODULES_LIST: list
6565
list of string module names to create objects for
66-
PRIORS_SUFFIX: str
67-
string suffix for priors file name
68-
RESULTS_SUFFIX: str
69-
string suffix for output file name
7066
sos_nrids: nd.array
7167
array of SOS reach identifiers on the node-level
7268
sos_nids: nd.array
@@ -99,20 +95,22 @@ class Append:
9995
"""
10096

10197

102-
PRIORS_SUFFIX = "sword_v16_SOS_priors"
103-
RESULTS_SUFFIX = "sword_v16_SOS_results"
104-
# PRIORS_SUFFIX = "sword_v11_SOS_priors"
105-
# RESULTS_SUFFIX = "sword_v11_SOS_results"
10698
VERS_LENGTH = 4
10799
INT_FILL_VALUE = -999
108100

109101
def __init__(self, cont_json, index, input_dir, output_dir, modules, logger,
110-
metadata_json):
102+
metadata_json, sword_version="17"):
111103
"""
112104
TODO: Remove "temp" from output_dir (self.sos_new)
113105
114106
Parameters
115107
----------
108+
sword_version: str
109+
string arg input of SWORD version that built priors
110+
priors_suffix: str
111+
string suffix for priors file name
112+
results_suffix: str
113+
string suffix for output file name
116114
cont_json: Path
117115
path to continent JSON file
118116
index: int
@@ -125,12 +123,18 @@ def __init__(self, cont_json, index, input_dir, output_dir, modules, logger,
125123
list of module results to append to the SoS
126124
logger: Logger
127125
logger to use for logging state
126+
sword_version: str, optional
127+
SWORD version number (default: "16")
128128
"""
129129

130+
self.sword_version = sword_version
131+
self.priors_suffix = f"sword_v{sword_version}_SOS_priors"
132+
self.results_suffix = f"sword_v{sword_version}_SOS_results"
133+
130134
self.cont = get_cont_data(cont_json, index)
131135
self.sos_cur = input_dir / "sos"
132-
self.sos_file = output_dir / "sos" / f"{list(self.cont.keys())[0]}_{self.RESULTS_SUFFIX}.nc"
133-
sos_data = get_continent_sos_data(self.sos_cur, list(self.cont.keys())[0], self.PRIORS_SUFFIX)
136+
self.sos_file = output_dir / "sos" / f"{list(self.cont.keys())[0]}_{self.results_suffix}.nc"
137+
sos_data = get_continent_sos_data(self.sos_cur, list(self.cont.keys())[0], self.priors_suffix)
134138
self.sos_rids = sos_data["reaches"]
135139
self.sos_nrids = sos_data["node_reaches"]
136140
self.sos_nids = sos_data["nodes"]
@@ -153,7 +157,7 @@ def create_new_version(self):
153157
# Create directory and file
154158
self.sos_file.parent.mkdir(parents=True, exist_ok=True)
155159
continent = self.sos_file.name.split('_')[0]
156-
prior_sos = Dataset(self.sos_cur / f"{continent}_{self.PRIORS_SUFFIX}.nc")
160+
prior_sos = Dataset(self.sos_cur / f"{continent}_{self.priors_suffix}.nc")
157161
result_sos = Dataset(self.sos_file, 'w')
158162

159163
# Global attributes
@@ -197,13 +201,14 @@ def create_new_version(self):
197201
# Variable length time steps
198202
self.vlen_f = result_sos.createVLType(np.float64, "vlen_float")
199203
self.vlen_i = result_sos.createVLType(np.int32, "vlen_int")
204+
self.vlen_i8 = result_sos.createVLType(np.int64, "vlen_int64")
200205
self.vlen_s = result_sos.createVLType("S1", "vlen_str")
201206

202207
# Node and reach group
203208
write_reaches(prior_sos, result_sos, self.metadata_json)
204209

205210
# netCDF4 library is not reading in node_ids - use xarray
206-
ds = xr.open_dataset(self.sos_cur / f"{continent}_{self.PRIORS_SUFFIX}.nc",
211+
ds = xr.open_dataset(self.sos_cur / f"{continent}_{self.priors_suffix}.nc",
207212
group="nodes", drop_variables="river_name")
208213
node_ids = ds["node_id"].data
209214
ds.close()
@@ -217,9 +222,14 @@ def append_data(self):
217222
"""Append data to the SoS by executing module storage operations."""
218223

219224
for module in self.modules:
220-
module.append_module(self.metadata_json)
221-
self.logger.info(f"Appended {module.__class__.__name__} data to {self.sos_file.name}.")
222-
225+
try:
226+
module.append_module(self.metadata_json)
227+
self.logger.info(f"Appended {module.__class__.__name__} data to {self.sos_file.name}.")
228+
except Exception as e:
229+
import traceback
230+
self.logger.error(f"Failed to append {module.__class__.__name__}: {e}")
231+
self.logger.error(traceback.format_exc())
232+
223233
def create_modules(self, run_type, input_dir, diag_dir, flpe_dir, moi_dir, \
224234
off_dir, val_dir, consensus_dir, lakeflow_dir, ssc_dir):
225235

@@ -285,7 +295,7 @@ def create_modules(self, run_type, input_dir, diag_dir, flpe_dir, moi_dir, \
285295
self.sos_nids))
286296
if module == "priors" and run_type == "constrained":
287297
self.modules.append(Priors(list(self.cont.values())[0], \
288-
self.sos_cur, self.sos_file, self.logger, self.PRIORS_SUFFIX))
298+
self.sos_cur, self.sos_file, self.logger, self.priors_suffix))
289299
if module == "sad":
290300
self.modules.append(Sad(list(self.cont.values())[0], \
291301
flpe_dir, self.sos_file, self.logger, self.vlen_f, self.vlen_i, \
@@ -301,7 +311,7 @@ def create_modules(self, run_type, input_dir, diag_dir, flpe_dir, moi_dir, \
301311

302312
if module == "consensus":
303313
self.modules.append(Consensus(list(self.cont.values())[0], \
304-
flpe_dir, self.sos_file, self.logger, self.vlen_f, self.vlen_i, \
314+
flpe_dir, self.sos_file, self.logger, self.vlen_f, self.vlen_i8, \
305315
self.vlen_s, self.sos_rids))
306316

307317
if module == "ssc":
@@ -484,4 +494,4 @@ def set_variable_atts(variable, variable_dict):
484494
"""Set the variable attribute metdata."""
485495

486496
for name, value in variable_dict.items():
487-
setattr(variable, name, value)
497+
setattr(variable, name, value)

output/Append.py

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,6 @@ class Append:
6363
list of AbstractModule objects to execute result storage ops for
6464
MODULES_LIST: list
6565
list of string module names to create objects for
66-
PRIORS_SUFFIX: str
67-
string suffix for priors file name
68-
RESULTS_SUFFIX: str
69-
string suffix for output file name
7066
sos_nrids: nd.array
7167
array of SOS reach identifiers on the node-level
7268
sos_nids: nd.array
@@ -99,20 +95,22 @@ class Append:
9995
"""
10096

10197

102-
PRIORS_SUFFIX = "sword_v16_SOS_priors"
103-
RESULTS_SUFFIX = "sword_v16_SOS_results"
104-
# PRIORS_SUFFIX = "sword_v11_SOS_priors"
105-
# RESULTS_SUFFIX = "sword_v11_SOS_results"
10698
VERS_LENGTH = 4
10799
INT_FILL_VALUE = -999
108100

109101
def __init__(self, cont_json, index, input_dir, output_dir, modules, logger,
110-
metadata_json):
102+
metadata_json, sword_version="17"):
111103
"""
112104
TODO: Remove "temp" from output_dir (self.sos_new)
113105
114106
Parameters
115107
----------
108+
sword_version: str
109+
string arg input of SWORD version that built priors
110+
priors_suffix: str
111+
string suffix for priors file name
112+
results_suffix: str
113+
string suffix for output file name
116114
cont_json: Path
117115
path to continent JSON file
118116
index: int
@@ -125,12 +123,18 @@ def __init__(self, cont_json, index, input_dir, output_dir, modules, logger,
125123
list of module results to append to the SoS
126124
logger: Logger
127125
logger to use for logging state
126+
sword_version: str, optional
127+
SWORD version number (default: "16")
128128
"""
129129

130+
self.sword_version = sword_version
131+
self.priors_suffix = f"sword_v{sword_version}_SOS_priors"
132+
self.results_suffix = f"sword_v{sword_version}_SOS_results"
133+
130134
self.cont = get_cont_data(cont_json, index)
131135
self.sos_cur = input_dir / "sos"
132-
self.sos_file = output_dir / "sos" / f"{list(self.cont.keys())[0]}_{self.RESULTS_SUFFIX}.nc"
133-
sos_data = get_continent_sos_data(self.sos_cur, list(self.cont.keys())[0], self.PRIORS_SUFFIX)
136+
self.sos_file = output_dir / "sos" / f"{list(self.cont.keys())[0]}_{self.results_suffix}.nc"
137+
sos_data = get_continent_sos_data(self.sos_cur, list(self.cont.keys())[0], self.priors_suffix)
134138
self.sos_rids = sos_data["reaches"]
135139
self.sos_nrids = sos_data["node_reaches"]
136140
self.sos_nids = sos_data["nodes"]
@@ -153,7 +157,7 @@ def create_new_version(self):
153157
# Create directory and file
154158
self.sos_file.parent.mkdir(parents=True, exist_ok=True)
155159
continent = self.sos_file.name.split('_')[0]
156-
prior_sos = Dataset(self.sos_cur / f"{continent}_{self.PRIORS_SUFFIX}.nc")
160+
prior_sos = Dataset(self.sos_cur / f"{continent}_{self.priors_suffix}.nc")
157161
result_sos = Dataset(self.sos_file, 'w')
158162

159163
# Global attributes
@@ -204,7 +208,7 @@ def create_new_version(self):
204208
write_reaches(prior_sos, result_sos, self.metadata_json)
205209

206210
# netCDF4 library is not reading in node_ids - use xarray
207-
ds = xr.open_dataset(self.sos_cur / f"{continent}_{self.PRIORS_SUFFIX}.nc",
211+
ds = xr.open_dataset(self.sos_cur / f"{continent}_{self.priors_suffix}.nc",
208212
group="nodes", drop_variables="river_name")
209213
node_ids = ds["node_id"].data
210214
ds.close()
@@ -218,9 +222,14 @@ def append_data(self):
218222
"""Append data to the SoS by executing module storage operations."""
219223

220224
for module in self.modules:
221-
module.append_module(self.metadata_json)
222-
self.logger.info(f"Appended {module.__class__.__name__} data to {self.sos_file.name}.")
223-
225+
try:
226+
module.append_module(self.metadata_json)
227+
self.logger.info(f"Appended {module.__class__.__name__} data to {self.sos_file.name}.")
228+
except Exception as e:
229+
import traceback
230+
self.logger.error(f"Failed to append {module.__class__.__name__}: {e}")
231+
self.logger.error(traceback.format_exc())
232+
224233
def create_modules(self, run_type, input_dir, diag_dir, flpe_dir, moi_dir, \
225234
off_dir, val_dir, consensus_dir, lakeflow_dir, ssc_dir):
226235

@@ -286,7 +295,7 @@ def create_modules(self, run_type, input_dir, diag_dir, flpe_dir, moi_dir, \
286295
self.sos_nids))
287296
if module == "priors" and run_type == "constrained":
288297
self.modules.append(Priors(list(self.cont.values())[0], \
289-
self.sos_cur, self.sos_file, self.logger, self.PRIORS_SUFFIX))
298+
self.sos_cur, self.sos_file, self.logger, self.priors_suffix))
290299
if module == "sad":
291300
self.modules.append(Sad(list(self.cont.values())[0], \
292301
flpe_dir, self.sos_file, self.logger, self.vlen_f, self.vlen_i, \

output/Upload.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,19 @@ class Upload:
2525
Transfers SOS data to S3 from EFS
2626
"""
2727

28-
SWORD_VERSION = "v16"
2928
VERS_LENGTH = 4
3029

3130
def __init__(self, sos_file, sos_bucket, podaac_upload, podaac_bucket, \
32-
continent, run_date, run_type, logger):
31+
continent, run_date, run_type, logger, sword_version="17"):
3332
"""
3433
Parameters
3534
----------
3635
sos_file: Path
3736
path to new SoS file to upload
3837
logger: Logger
3938
logger to use for logging state
39+
sword_version: str, optional
40+
SWORD version number (default: "17")
4041
"""
4142

4243
self.sos_file = sos_file
@@ -47,6 +48,7 @@ def __init__(self, sos_file, sos_bucket, podaac_upload, podaac_bucket, \
4748
self.run_date = run_date
4849
self.run_type = run_type
4950
self.logger = logger
51+
self.sword_version = sword_version
5052

5153
def upload_data(self, output_dir, val_dir, run_type, modules):
5254
"""Uploads SoS result file to confluence-sos S3 bucket.
@@ -109,7 +111,7 @@ def upload_data(self, output_dir, val_dir, run_type, modules):
109111
def upload_podaac(self, vers):
110112
"""Upload SoS to PO.DAAC bucket."""
111113

112-
sos_filename = f"{self.continent}_sword_{self.SWORD_VERSION}_SOS_results_{self.run_type}_{vers}_{self.run_date.strftime('%Y%m%dT%H%M%S')}.nc"
114+
sos_filename = f"{self.continent}_sword_{self.sword_version}_SOS_results_{self.run_type}_{vers}_{self.run_date.strftime('%Y%m%dT%H%M%S')}.nc"
113115
try:
114116
s3 = boto3.client("s3")
115117
response = s3.upload_file(str(self.sos_file),

0 commit comments

Comments
 (0)