ngiab-data-preprocess 4.5.1__py3-none-any.whl → 4.6.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
map_app/views.py CHANGED
@@ -2,12 +2,14 @@ import json
2
2
  import logging
3
3
  from datetime import datetime
4
4
  from pathlib import Path
5
+ import os
6
+ import threading
5
7
 
6
8
  import geopandas as gpd
7
9
  from data_processing.create_realization import create_realization
8
10
  from data_processing.dataset_utils import save_and_clip_dataset
9
11
  from data_processing.datasets import load_aorc_zarr, load_v3_retrospective_zarr
10
- from data_processing.file_paths import file_paths
12
+ from data_processing.file_paths import FilePaths
11
13
  from data_processing.forcings import create_forcings
12
14
  from data_processing.graph_utils import get_upstream_cats, get_upstream_ids
13
15
  from data_processing.subset import subset
@@ -23,24 +25,35 @@ logger = logging.getLogger(__name__)
23
25
  def index():
24
26
  return render_template("index.html")
25
27
 
26
-
28
+ # this subset does not include the downstream nexus
27
29
  @main.route("/get_upstream_catids", methods=["POST"])
28
30
  def get_upstream_catids():
29
31
  cat_id = json.loads(request.data.decode("utf-8"))
30
32
  # give wb_id to get_upstream_cats because the graph search is 1000x faster
31
33
  wb_id = "wb-" + cat_id.split("-")[-1]
32
- upstream_cats = get_upstream_cats(wb_id)
33
- if cat_id in upstream_cats:
34
- upstream_cats.remove(cat_id)
35
- return list(upstream_cats), 200
36
-
37
-
34
+ upstream_cats = get_upstream_ids(wb_id, include_outlet=False)
35
+ cleaned_upstreams = set()
36
+ for id in upstream_cats:
37
+ if id.startswith("wb-"):
38
+ cleaned_upstreams.add("cat-" + id.split("-")[-1])
39
+ if cat_id in cleaned_upstreams:
40
+ cleaned_upstreams.remove(cat_id)
41
+ return list(cleaned_upstreams), 200
42
+
43
+ # this subset includes the downstream nexus
38
44
  @main.route("/get_upstream_wbids", methods=["POST"])
39
45
  def get_upstream_wbids():
40
46
  cat_id = json.loads(request.data.decode("utf-8"))
41
- upstream_ids = get_upstream_ids(cat_id)
42
- # remove the selected cat_id from the set
43
- return [id for id in upstream_ids if id.startswith("wb")], 200
47
+ # give wb_id to get_upstream_cats because the graph search is 1000x faster
48
+ wb_id = "wb-" + cat_id.split("-")[-1]
49
+ upstream_cats = get_upstream_ids(wb_id)
50
+ cleaned_upstreams = set()
51
+ for id in upstream_cats:
52
+ if id.startswith("wb-"):
53
+ cleaned_upstreams.add("cat-" + id.split("-")[-1])
54
+ if cat_id in cleaned_upstreams:
55
+ cleaned_upstreams.remove(cat_id)
56
+ return list(cleaned_upstreams), 200
44
57
 
45
58
 
46
59
  @main.route("/subset_check", methods=["POST"])
@@ -48,20 +61,28 @@ def subset_check():
48
61
  cat_ids = list(json.loads(request.data.decode("utf-8")))
49
62
  logger.info(cat_ids)
50
63
  subset_name = cat_ids[0]
51
- run_paths = file_paths(subset_name)
64
+ run_paths = FilePaths(subset_name)
52
65
  if run_paths.geopackage_path.exists():
53
- return "check required", 409
66
+ return str(run_paths.geopackage_path), 409
54
67
  else:
55
- return "success", 200
68
+ return "no conflict",200
56
69
 
57
70
 
58
71
  @main.route("/subset", methods=["POST"])
59
72
  def subset_selection():
60
- cat_ids = list(json.loads(request.data.decode("utf-8")))
73
+ #body: JSON.stringify({ 'cat_id': [cat_id], 'subset_type': subset_type})
74
+ data = json.loads(request.data.decode("utf-8"))
75
+ cat_ids = data.get("cat_id")
76
+ subset_type = data.get("subset_type")
61
77
  logger.info(cat_ids)
78
+ logger.info(subset_type)
62
79
  subset_name = cat_ids[0]
63
- run_paths = file_paths(subset_name)
64
- subset(cat_ids, output_gpkg_path=run_paths.geopackage_path, override_gpkg=True)
80
+
81
+ run_paths = FilePaths(subset_name)
82
+ if subset_type == "nexus":
83
+ subset(cat_ids, output_gpkg_path=run_paths.geopackage_path, override_gpkg=True)
84
+ else:
85
+ subset(cat_ids, output_gpkg_path=run_paths.geopackage_path, include_outlet=False, override_gpkg=True)
65
86
  return str(run_paths.geopackage_path), 200
66
87
 
67
88
 
@@ -72,21 +93,57 @@ def subset_to_file():
72
93
  logger.info(cat_ids)
73
94
  subset_name = cat_ids[0]
74
95
  total_subset = get_upstream_ids(cat_ids)
75
- subset_paths = file_paths(subset_name)
96
+ subset_paths = FilePaths(subset_name)
76
97
  output_file = subset_paths.subset_dir / "subset.txt"
77
98
  output_file.parent.mkdir(parents=True, exist_ok=True)
78
99
  with open(output_file, "w") as f:
79
100
  f.write("\n".join(total_subset))
80
101
  return str(subset_paths.subset_dir), 200
81
102
 
82
-
103
+ @main.route("/make_forcings_progress_file", methods=["POST"])
104
+ def make_forcings_progress_file():
105
+ data = json.loads(request.data.decode("utf-8"))
106
+ subset_gpkg = Path(data.split("subset to ")[-1])
107
+ paths = FilePaths(subset_gpkg.stem.split("_")[0])
108
+ paths.forcing_progress_file.parent.mkdir(parents=True, exist_ok=True)
109
+ with open(paths.forcing_progress_file, "w") as f:
110
+ json.dump({"total_steps": 0, "steps_completed": 0}, f)
111
+ return str(paths.forcing_progress_file), 200
112
+
113
+ @main.route("/forcings_progress", methods=["POST"])
114
+ def forcings_progress_endpoint():
115
+ progress_file = Path(json.loads(request.data.decode("utf-8")))
116
+ with open(progress_file, "r") as f:
117
+ forcings_progress = json.load(f)
118
+ forcings_progress_all = forcings_progress['total_steps']
119
+ forcings_progress_completed = forcings_progress['steps_completed']
120
+ try:
121
+ percent = int((forcings_progress_completed / forcings_progress_all) * 100)
122
+ except ZeroDivisionError:
123
+ percent = "NaN"
124
+ return str(percent), 200
125
+
126
+ def download_forcings(data_source, start_time, end_time, paths):
127
+ if data_source == "aorc":
128
+ raw_data = load_aorc_zarr(start_time.year, end_time.year)
129
+ elif data_source == "nwm":
130
+ raw_data = load_v3_retrospective_zarr()
131
+ else:
132
+ raise ValueError(f"Unknown data source: {data_source}")
133
+ gdf = gpd.read_file(paths.geopackage_path, layer="divides")
134
+ cached_data = save_and_clip_dataset(raw_data, gdf, start_time, end_time, paths.cached_nc_file)
135
+ return cached_data
136
+
137
+ def compute_forcings(cached_data, paths):
138
+ create_forcings(cached_data, paths.output_dir.stem) # type: ignore
139
+
83
140
  @main.route("/forcings", methods=["POST"])
84
141
  def get_forcings():
85
142
  # body: JSON.stringify({'forcing_dir': forcing_dir, 'start_time': start_time, 'end_time': end_time}),
86
143
  data = json.loads(request.data.decode("utf-8"))
87
144
  subset_gpkg = Path(data.get("forcing_dir").split("subset to ")[-1])
88
145
  output_folder = Path(subset_gpkg.parent.parent)
89
- paths = file_paths(output_dir=output_folder)
146
+ paths = FilePaths(output_dir=output_folder)
90
147
 
91
148
  start_time = data.get("start_time")
92
149
  end_time = data.get("end_time")
@@ -102,22 +159,14 @@ def get_forcings():
102
159
  app.debug = False
103
160
  logger.debug(f"get_forcings() disabled debug mode at {datetime.now()}")
104
161
  logger.debug(f"forcing_dir: {output_folder}")
105
- try:
106
- if data_source == "aorc":
107
- data = load_aorc_zarr(start_time.year, end_time.year)
108
- elif data_source == "nwm":
109
- data = load_v3_retrospective_zarr()
110
- gdf = gpd.read_file(paths.geopackage_path, layer="divides")
111
- cached_data = save_and_clip_dataset(data, gdf, start_time, end_time, paths.cached_nc_file)
112
-
113
- create_forcings(cached_data, paths.output_dir.stem) # type: ignore
114
- except Exception as e:
115
- logger.info(f"get_forcings() failed with error: {str(e)}")
116
- return jsonify({"error": str(e)}), 500
117
162
  app.debug = debug_enabled
118
163
 
119
- return "success", 200
120
-
164
+ cached_data = download_forcings(data_source, start_time, end_time, paths)
165
+ # threading implemented so that main process can periodically poll progress file
166
+ thread = threading.Thread(target=compute_forcings,
167
+ args=(cached_data, paths))
168
+ thread.start()
169
+ return "started", 200
121
170
 
122
171
  @main.route("/realization", methods=["POST"])
123
172
  def get_realization():
@@ -9,13 +9,14 @@ with rich.status.Status("loading") as status:
9
9
  import subprocess
10
10
  import time
11
11
  from multiprocessing import cpu_count
12
+ from pathlib import Path
12
13
 
13
14
  import geopandas as gpd
14
15
  from data_processing.create_realization import create_lstm_realization, create_realization
15
16
  from data_processing.dask_utils import shutdown_cluster
16
17
  from data_processing.dataset_utils import save_and_clip_dataset
17
18
  from data_processing.datasets import load_aorc_zarr, load_v3_retrospective_zarr
18
- from data_processing.file_paths import file_paths
19
+ from data_processing.file_paths import FilePaths
19
20
  from data_processing.forcings import create_forcings
20
21
  from data_processing.gpkg_utils import get_cat_from_gage_id, get_catid_from_point
21
22
  from data_processing.graph_utils import get_upstream_cats
@@ -23,57 +24,63 @@ with rich.status.Status("loading") as status:
23
24
  from data_sources.source_validation import validate_hydrofabric, validate_output_dir
24
25
  from ngiab_data_cli.arguments import parse_arguments
25
26
  from ngiab_data_cli.custom_logging import set_logging_to_critical_only, setup_logging
26
-
27
27
 
28
28
 
29
29
  def validate_input(args: argparse.Namespace) -> Tuple[str, str]:
30
30
  """Validate input arguments."""
31
31
 
32
+ feature_name = None
33
+ output_folder = None
34
+
32
35
  if args.vpu:
33
36
  if not args.output_name:
34
37
  args.output_name = f"vpu-{args.vpu}"
35
38
  validate_output_dir()
36
39
  return args.vpu, args.output_name
37
40
 
38
- input_feature = args.input_feature.replace("_", "-")
39
-
40
- # look at the prefix for autodetection, if -g or -l is used then there is no prefix
41
- if len(input_feature.split("-")) > 1:
42
- prefix = input_feature.split("-")[0]
43
- if prefix.lower() == "gage":
44
- args.gage = True
45
- elif prefix.lower() == "wb":
46
- logging.warning("Waterbody IDs are no longer supported!")
47
- logging.warning(f"Automatically converting {input_feature} to catid")
48
- time.sleep(2)
49
-
50
- # always add or replace the prefix with cat if it is not a lat lon or gage
51
- if not args.latlon and not args.gage:
52
- input_feature = "cat-" + input_feature.split("-")[-1]
53
-
54
- if args.latlon and args.gage:
55
- raise ValueError("Cannot use both --latlon and --gage options at the same time.")
56
-
57
- if args.latlon:
58
- validate_hydrofabric()
59
- feature_name = get_cat_id_from_lat_lon(input_feature)
60
- logging.info(f"Found {feature_name} from {input_feature}")
61
- elif args.gage:
62
- validate_hydrofabric()
63
- feature_name = get_cat_from_gage_id(input_feature)
64
- logging.info(f"Found {feature_name} from {input_feature}")
65
- else:
66
- feature_name = input_feature
67
-
68
- if args.output_name:
69
- output_folder = args.output_name
70
- validate_output_dir()
71
- elif args.gage:
72
- output_folder = input_feature
73
- validate_output_dir()
74
- else:
75
- output_folder = feature_name
76
- validate_output_dir()
41
+ if args.input_feature:
42
+ input_feature = args.input_feature.replace("_", "-")
43
+
44
+ if args.gage and not input_feature.startswith("gage-"):
45
+ input_feature = "gage-" + input_feature
46
+
47
+ # look at the prefix for autodetection, if -g or -l is used then there is no prefix
48
+ if len(input_feature.split("-")) > 1:
49
+ prefix = input_feature.split("-")[0]
50
+ if prefix.lower() == "gage":
51
+ args.gage = True
52
+ elif prefix.lower() == "wb":
53
+ logging.warning("Waterbody IDs are no longer supported!")
54
+ logging.warning(f"Automatically converting {input_feature} to catid")
55
+ time.sleep(2)
56
+
57
+ # always add or replace the prefix with cat if it is not a lat lon or gage
58
+ if not args.latlon and not args.gage:
59
+ input_feature = "cat-" + input_feature.split("-")[-1]
60
+
61
+ if args.latlon and args.gage:
62
+ raise ValueError("Cannot use both --latlon and --gage options at the same time.")
63
+
64
+ if args.latlon:
65
+ validate_hydrofabric()
66
+ feature_name = get_cat_id_from_lat_lon(input_feature)
67
+ logging.info(f"Found {feature_name} from {input_feature}")
68
+ elif args.gage:
69
+ validate_hydrofabric()
70
+ feature_name = get_cat_from_gage_id(input_feature)
71
+ logging.info(f"Found {feature_name} from {input_feature}")
72
+ else:
73
+ feature_name = input_feature
74
+
75
+ if args.output_name:
76
+ output_folder = args.output_name
77
+ validate_output_dir()
78
+ elif args.gage:
79
+ output_folder = input_feature
80
+ validate_output_dir()
81
+ else:
82
+ output_folder = feature_name
83
+ validate_output_dir()
77
84
 
78
85
  return feature_name, output_folder
79
86
 
@@ -87,7 +94,7 @@ def get_cat_id_from_lat_lon(input_feature: str) -> str:
87
94
  raise ValueError("Lat Lon input must be comma separated e.g. -l 54.33,-69.4")
88
95
 
89
96
 
90
- def set_dependent_flags(args, paths: file_paths):
97
+ def set_dependent_flags(args, paths: FilePaths):
91
98
  # if validate is set, run everything that is missing
92
99
  if args.validate:
93
100
  logging.info("Running all missing steps required to run ngiab.")
@@ -109,7 +116,7 @@ def set_dependent_flags(args, paths: file_paths):
109
116
  return args
110
117
 
111
118
 
112
- def validate_run_directory(args, paths: file_paths):
119
+ def validate_run_directory(args, paths: FilePaths):
113
120
  # checks the folder that is going to be run, enables steps that are needed to populate the folder
114
121
  if not paths.subset_dir.exists():
115
122
  logging.info("Subset folder does not exist, enabling subset, forcings, and realization.")
@@ -134,8 +141,23 @@ def main() -> None:
134
141
  args = parse_arguments()
135
142
  if args.debug:
136
143
  logging.getLogger("data_processing").setLevel(logging.DEBUG)
144
+
145
+ if args.output_root:
146
+ with open(FilePaths.config_file, "w") as config_file:
147
+ config_file.write(str(Path(args.output_root).expanduser().absolute()))
148
+ logging.info(
149
+ f"Changed default directory where outputs are stored to {args.output_root}"
150
+ )
151
+
137
152
  feature_to_subset, output_folder = validate_input(args)
138
- paths = file_paths(output_folder)
153
+
154
+ if (feature_to_subset, output_folder) == (
155
+ None,
156
+ None,
157
+ ): # in case someone just passes an argument to change default output dir
158
+ return
159
+
160
+ paths = FilePaths(output_folder)
139
161
  args = set_dependent_flags(args, paths) # --validate
140
162
  if feature_to_subset:
141
163
  logging.info(f"Processing {feature_to_subset} in {paths.output_dir}")
@@ -186,9 +208,14 @@ def main() -> None:
186
208
  gage_id = None
187
209
  if args.gage:
188
210
  gage_id = args.input_feature
189
- if args.lstm:
211
+ if not gage_id.startswith("gage-"):
212
+ gage_id = "gage-" + gage_id
213
+ if args.lstm or args.lstm_rust:
190
214
  create_lstm_realization(
191
- output_folder, start_time=args.start_date, end_time=args.end_date
215
+ output_folder,
216
+ start_time=args.start_date,
217
+ end_time=args.end_date,
218
+ use_rust=args.lstm_rust,
192
219
  )
193
220
  else:
194
221
  create_realization(
@@ -202,7 +229,7 @@ def main() -> None:
202
229
 
203
230
  if args.run:
204
231
  logging.info("Running Next Gen using NGIAB...")
205
-
232
+
206
233
  try:
207
234
  subprocess.run("docker pull awiciroh/ciroh-ngen-image:latest", shell=True)
208
235
  except:
@@ -11,7 +11,14 @@ def parse_arguments() -> argparse.Namespace:
11
11
  parser = argparse.ArgumentParser(
12
12
  description="Subsetting hydrofabrics, forcing generation, and realization creation"
13
13
  )
14
- group = parser.add_mutually_exclusive_group(required=True)
14
+ group = parser.add_mutually_exclusive_group(required=False)
15
+
16
+ parser.add_argument(
17
+ "--output_root",
18
+ type=str,
19
+ help="Path to new default directory where outputs in the future will be stored",
20
+ )
21
+
15
22
  group.add_argument(
16
23
  "-i",
17
24
  "--input_feature",
@@ -97,7 +104,7 @@ def parse_arguments() -> argparse.Namespace:
97
104
  "-o",
98
105
  "--output_name",
99
106
  type=str,
100
- help="Name of the output folder",
107
+ help="Custom data output folder name in lieu of the default, which is the ID of the input feature",
101
108
  )
102
109
  parser.add_argument(
103
110
  "-D",
@@ -105,11 +112,17 @@ def parse_arguments() -> argparse.Namespace:
105
112
  action="store_true",
106
113
  help="enable debug logging",
107
114
  )
108
- parser.add_argument(
115
+ lstm_group = parser.add_mutually_exclusive_group(required=False)
116
+ lstm_group.add_argument(
109
117
  "--lstm",
110
118
  action="store_true",
111
119
  help="enable LSTM model realization and forcings",
112
120
  )
121
+ lstm_group.add_argument(
122
+ "--lstm_rust",
123
+ action="store_true",
124
+ help="enable experimental high speed Rust bindings of LSTM model realization and forcings",
125
+ )
113
126
  parser.add_argument(
114
127
  "--nwm_gw",
115
128
  action="store_true",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ngiab_data_preprocess
3
- Version: 4.5.1
3
+ Version: 4.6.1
4
4
  Summary: Graphical Tools for creating Next Gen Water model input data.
5
5
  Author-email: Josh Cunningham <jcunningham8@ua.edu>
6
6
  Project-URL: Homepage, https://github.com/CIROH-UA/NGIAB_data_preprocess
@@ -0,0 +1,43 @@
1
+ data_processing/create_realization.py,sha256=b1a9Wuld9saJ-zzVDPY_kba3-ZOVbRuobyR-QiHLXyY,11550
2
+ data_processing/dask_utils.py,sha256=A2IP94WAz8W9nek3etXKEKTOxGPf0NWSFLh8cZ5S-xU,2454
3
+ data_processing/dataset_utils.py,sha256=0FhspUlGUs0iJLwYY0dl_1fjt0_zwhe9Hl-jikIgrpk,8312
4
+ data_processing/datasets.py,sha256=_EJ1uZSWTU1HWpvF7TQSikneJqWZFikTrdo9usCV8A0,4665
5
+ data_processing/file_paths.py,sha256=7MpwfIQewLRrDpAw1dxTjTperUwOk3EC_kthmnJSRII,4851
6
+ data_processing/forcings.py,sha256=8WY3w-TrhuCexnvUtvNCaUM9Uu3F5IaSO2qpIsUEtyg,21527
7
+ data_processing/gpkg_utils.py,sha256=VoQG53zaGcdmkU9M_7kRrk_vygRGJV9E-wX-T48Rzj8,20576
8
+ data_processing/graph_utils.py,sha256=4D72wMSiCRKCPC7JUz7XCoaISRGLuqDx6wpeO_VP8fk,8301
9
+ data_processing/s3fs_utils.py,sha256=ki1EmA0ezV0r26re6dRWIGzL5FudGdwF9Qw1eVLR0Bc,2747
10
+ data_processing/subset.py,sha256=EwDii-EsOiJBaDMjvYWfz7V9wQSXb887w_fk28u8dlw,3789
11
+ data_sources/cfe-nowpm-realization-template.json,sha256=8an6q1drWD8wU1ocvdPab-GvZDvlQ-0di_-NommH3QI,3528
12
+ data_sources/cfe-template.ini,sha256=6e5-usqjWtm3MWVvtm8CTeZTJJMxO1ZswkOXq0L9mnc,2033
13
+ data_sources/forcing_template.nc,sha256=uRuVAqX3ngdlougZINavtwl_wC2VLD8fHqG7_CLim1s,85284
14
+ data_sources/lstm-catchment-template.yml,sha256=LtknqvxbWrtLLZIXxFgTfbQmM4x8XnHBDFvRIh2EIFI,965
15
+ data_sources/lstm-realization-template.json,sha256=ndz3h5NGhtUSnsZwscgNuXYBG9mlAuz7Lxx7iCw22UY,1270
16
+ data_sources/lstm-rust-realization-template.json,sha256=l6JsJc8bp8MTGV-ED4oI4pvZTa4uReqDRDBHu3Uj1b8,1338
17
+ data_sources/ngen-routing-template.yaml,sha256=wM5v6jj0kwcJBVatLFuy2big6g8nlSXxzc8a23nwI5s,4655
18
+ data_sources/noah-owp-modular-init.namelist.input,sha256=Vb7mp40hFpJogruOrXrDHwVW1bKi9h1ciDNyDvTzn20,3045
19
+ data_sources/source_validation.py,sha256=DMCTo-Tad9QSXFqSDB5guI8hMzY_kQE6aW78-5nqwlU,9457
20
+ data_sources/template.sql,sha256=ZnFqAqleEq9wgmAhNO90Wue_L9k0JAn8KF99DYtcxgs,10457
21
+ data_sources/triggers.sql,sha256=G0d_175eNsamKAFhsbphPATvzMPuPL_iCleIhlToduQ,14906
22
+ map_app/__init__.py,sha256=OarJao9X98kcbLyiwewN4ObWNAYkKDichcxbuWywTsA,818
23
+ map_app/__main__.py,sha256=5qJGypfesfdWDWRsbTQiMs3uL5zPZKRZQq31l7qXqCc,1649
24
+ map_app/views.py,sha256=AxLsXL8ZSnRJzg5zVYDGfVFA_6amgae41AO_E1G7W58,7923
25
+ map_app/static/css/console.css,sha256=xN6G2MMFyKc9YW9HEVpUUTUjx2o2nokBR4nCX5c18UM,803
26
+ map_app/static/css/main.css,sha256=gntWJL4x7Lm3lRDnv0AEmZ18u92C69rSj1HbF_9__f8,7107
27
+ map_app/static/css/toggle.css,sha256=sYxDi381TWNFwDD8wXlJ5n8yAlF9aIR3gkI0QwC8oKM,2555
28
+ map_app/static/js/console.js,sha256=BnG0pED5B9d563sLWshDNt_q-SyoTY48sETvVoOVJkU,1377
29
+ map_app/static/js/data_processing.js,sha256=sfeXvfPtiOvEN1kDFFtibLDOjwyudOpeOjmfXuTcR7Y,8583
30
+ map_app/static/js/main.js,sha256=8vWWO56vc8LEhyp3AeRiJw1tsqebZtkG9IOS65b154w,11063
31
+ map_app/static/resources/loading.gif,sha256=ggdkZf1AD7rSwIpSJwfiIqANgmVV1WHlxGuKxQKv7uY,72191
32
+ map_app/static/resources/screenshot.jpg,sha256=Ia358aX-OHM9BP4B8lX05cLnguF2fHUIimno9bnFLYw,253730
33
+ map_app/templates/index.html,sha256=vgcefTU3GmRDNL6P5Xi284nO2vdLxxIW8c5xp3SHsTg,8664
34
+ ngiab_data_cli/__main__.py,sha256=_8IFqL2CGZGMsC71uutqHOIjZpfYBD91yKTk4dvEa3c,11318
35
+ ngiab_data_cli/arguments.py,sha256=97BFzlj68tt9tRCR3rTPnK6o7zd7dUCdPg8Cypa2aKA,4782
36
+ ngiab_data_cli/custom_logging.py,sha256=iS2XozaxudcxQj17qAsrCgbVK9LJAYAPmarJuVWJo1k,1280
37
+ ngiab_data_cli/forcing_cli.py,sha256=eIWRxRWUwPqR16fihFDEIV4VzGlNuvcD6lJW5VYjkPU,3635
38
+ ngiab_data_preprocess-4.6.1.dist-info/licenses/LICENSE,sha256=6dMSprwwnsRzEm02mEDbKHD9dUbL8bPIt9Vhrhb0Ulk,1081
39
+ ngiab_data_preprocess-4.6.1.dist-info/METADATA,sha256=QMH8sbF6n8UuQQoyQBg7npu849Gm9VmrrAqm2_PzyYY,13344
40
+ ngiab_data_preprocess-4.6.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
41
+ ngiab_data_preprocess-4.6.1.dist-info/entry_points.txt,sha256=spwlhKEJ3ZnNETQsJGeTjD7Vwy8O_zGHb9GdX8ACCtw,128
42
+ ngiab_data_preprocess-4.6.1.dist-info/top_level.txt,sha256=CjhYAUZrdveR2fOK6rxffU09VIN2IuPD7hk4V3l3pV0,52
43
+ ngiab_data_preprocess-4.6.1.dist-info/RECORD,,
@@ -1,42 +0,0 @@
1
- data_processing/create_realization.py,sha256=deRP3p4zfV9PF_vUikYKRiKA994bgj2GtPGCjQDSsTE,10795
2
- data_processing/dask_utils.py,sha256=A2IP94WAz8W9nek3etXKEKTOxGPf0NWSFLh8cZ5S-xU,2454
3
- data_processing/dataset_utils.py,sha256=AJOxE2nRfZnWYon_qqGcfkpRZuRW8Yy8YI86SxVDU3M,11168
4
- data_processing/datasets.py,sha256=_EJ1uZSWTU1HWpvF7TQSikneJqWZFikTrdo9usCV8A0,4665
5
- data_processing/file_paths.py,sha256=MFUShBB1g9IGi9MaJwrl6fKIcsrhbmcYEdTHtmnphZo,4667
6
- data_processing/forcings.py,sha256=k-JhBncTnXcdjSieam1Q2cDx5Xt9hH5Aywv0gDY4O2U,19010
7
- data_processing/gpkg_utils.py,sha256=tSSIMlHeqqgxTJQyF3X9tPmunQTJYx0xrCNHqUBQxkg,20590
8
- data_processing/graph_utils.py,sha256=qvHw6JlzQxLi--eMsGgC_rUBP4nDatl6X9mSa03Xxyo,8306
9
- data_processing/s3fs_utils.py,sha256=ki1EmA0ezV0r26re6dRWIGzL5FudGdwF9Qw1eVLR0Bc,2747
10
- data_processing/subset.py,sha256=XoojOgWCwxOi5Q4KXHXARNQeoZlobJp-mqhIIvTRtTw,3793
11
- data_sources/cfe-nowpm-realization-template.json,sha256=8an6q1drWD8wU1ocvdPab-GvZDvlQ-0di_-NommH3QI,3528
12
- data_sources/cfe-template.ini,sha256=6e5-usqjWtm3MWVvtm8CTeZTJJMxO1ZswkOXq0L9mnc,2033
13
- data_sources/forcing_template.nc,sha256=uRuVAqX3ngdlougZINavtwl_wC2VLD8fHqG7_CLim1s,85284
14
- data_sources/lstm-catchment-template.yml,sha256=LtknqvxbWrtLLZIXxFgTfbQmM4x8XnHBDFvRIh2EIFI,965
15
- data_sources/lstm-realization-template.json,sha256=ndz3h5NGhtUSnsZwscgNuXYBG9mlAuz7Lxx7iCw22UY,1270
16
- data_sources/ngen-routing-template.yaml,sha256=wM5v6jj0kwcJBVatLFuy2big6g8nlSXxzc8a23nwI5s,4655
17
- data_sources/noah-owp-modular-init.namelist.input,sha256=Vb7mp40hFpJogruOrXrDHwVW1bKi9h1ciDNyDvTzn20,3045
18
- data_sources/source_validation.py,sha256=RmvyPLjuDetpuNOUqCclgDfe8zd_Ojr7pfbUoUya2pQ,9498
19
- data_sources/template.sql,sha256=ZnFqAqleEq9wgmAhNO90Wue_L9k0JAn8KF99DYtcxgs,10457
20
- data_sources/triggers.sql,sha256=G0d_175eNsamKAFhsbphPATvzMPuPL_iCleIhlToduQ,14906
21
- map_app/__init__.py,sha256=OarJao9X98kcbLyiwewN4ObWNAYkKDichcxbuWywTsA,818
22
- map_app/__main__.py,sha256=Uj7__cJUyPQkZo2tNQ2x2g6rwizsyg1DcNtJkQniHzY,1650
23
- map_app/views.py,sha256=ajU_QSd-Oa7UrRQEZPX4rmOlaKwo76Q8UPQNXtt-e2k,5622
24
- map_app/static/css/console.css,sha256=xN6G2MMFyKc9YW9HEVpUUTUjx2o2nokBR4nCX5c18UM,803
25
- map_app/static/css/main.css,sha256=HmRIfhWeHTrNLOCHGpaKuzwGj05LkkUiQy538D-ZRLY,6464
26
- map_app/static/css/toggle.css,sha256=Ep6tXT7gCrPRRITuEMpXyisuiTQgiLIEKFFTWRmC82o,1913
27
- map_app/static/js/console.js,sha256=BnG0pED5B9d563sLWshDNt_q-SyoTY48sETvVoOVJkU,1377
28
- map_app/static/js/data_processing.js,sha256=wXv0p_bPmNOrSpU_p6Yqtfd17vqOFRJFAmLdUUWLF7s,5486
29
- map_app/static/js/main.js,sha256=_Yq1tuzyREqWU24rFQJSh5zIaXtAXEGlfZPo36QLHvI,9690
30
- map_app/static/resources/loading.gif,sha256=ggdkZf1AD7rSwIpSJwfiIqANgmVV1WHlxGuKxQKv7uY,72191
31
- map_app/static/resources/screenshot.jpg,sha256=Ia358aX-OHM9BP4B8lX05cLnguF2fHUIimno9bnFLYw,253730
32
- map_app/templates/index.html,sha256=Jy2k1Ob2_et--BPpfmTYO22Yin3vrG6IOeNlwzUoEqY,7878
33
- ngiab_data_cli/__main__.py,sha256=io9YbZY65tQC66gpcP02ECRnGpM-fnjLxQHa1EKDKzc,10269
34
- ngiab_data_cli/arguments.py,sha256=qS8RupcT3Ax7ZRT0uKKzFdUvkDdVugBlYyuzljY_bxo,4290
35
- ngiab_data_cli/custom_logging.py,sha256=iS2XozaxudcxQj17qAsrCgbVK9LJAYAPmarJuVWJo1k,1280
36
- ngiab_data_cli/forcing_cli.py,sha256=eIWRxRWUwPqR16fihFDEIV4VzGlNuvcD6lJW5VYjkPU,3635
37
- ngiab_data_preprocess-4.5.1.dist-info/licenses/LICENSE,sha256=6dMSprwwnsRzEm02mEDbKHD9dUbL8bPIt9Vhrhb0Ulk,1081
38
- ngiab_data_preprocess-4.5.1.dist-info/METADATA,sha256=Sa-C8mvOi-1Qn5u27X2Dz5wYeMPLnjle-nuC_VJ2kZo,13344
39
- ngiab_data_preprocess-4.5.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
- ngiab_data_preprocess-4.5.1.dist-info/entry_points.txt,sha256=spwlhKEJ3ZnNETQsJGeTjD7Vwy8O_zGHb9GdX8ACCtw,128
41
- ngiab_data_preprocess-4.5.1.dist-info/top_level.txt,sha256=CjhYAUZrdveR2fOK6rxffU09VIN2IuPD7hk4V3l3pV0,52
42
- ngiab_data_preprocess-4.5.1.dist-info/RECORD,,