Skip to content

Commit bdf03e0

Browse files
authored
Merge pull request #69 from ECOSTRESS-Collection-3/evandjpl/same-day-prior-attempt-two
Second attempt at working around same-day priors, replacing #41
2 parents e549156 + d878146 commit bdf03e0

3 files changed

Lines changed: 119 additions & 52 deletions

File tree

ECOv003_L2T_STARS/load_prior.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,12 @@ def load_prior(
3737
prior_date_UTC = None
3838
prior_NDVI_filename = None
3939
prior_NDVI_UQ_filename = None
40+
prior_NDVI_flag_filename = None
4041
prior_NDVI_bias_filename = None
4142
prior_NDVI_bias_UQ_filename = None
4243
prior_albedo_filename = None
4344
prior_albedo_UQ_filename = None
45+
prior_albedo_flag_filename = None
4446
prior_albedo_bias_filename = None
4547
prior_albedo_bias_UQ_filename = None
4648

@@ -161,6 +163,12 @@ def load_prior(
161163
else:
162164
prior_albedo_bias_UQ_filename = None # Set to None if not available
163165

166+
# HACK: Define prior_NDVI_flag_filename and prior_albedo_flag_filename using the Apache
167+
# Zip VFS syntax, to allow for reading directly from the zip file in the rare case that
168+
# it's necessary
169+
170+
prior_NDVI_flag_filename = L2T_STARS_prior_granule.layer_URI("NDVI-flag")
171+
prior_albedo_flag_filename = L2T_STARS_prior_granule.layer_URI("albedo-flag")
164172

165173
using_prior = True # Mark that a prior was successfully loaded
166174
except Exception as e:
@@ -228,21 +236,19 @@ def load_prior(
228236
prior_albedo_filename = None
229237
prior_albedo_UQ_filename = None
230238

231-
# FIXME where are `prior_NDVI_flag_filename` and `prior_albedo_flag_filename` defined?
232-
233239
# Create and return the Prior object
234240
prior = Prior(
235241
using_prior=using_prior,
236242
prior_date_UTC=prior_date_UTC,
237243
L2T_STARS_prior_filename=L2T_STARS_prior_filename,
238244
prior_NDVI_filename=prior_NDVI_filename,
239245
prior_NDVI_UQ_filename=prior_NDVI_UQ_filename,
240-
# prior_NDVI_flag_filename=prior_NDVI_flag_filename,
246+
prior_NDVI_flag_filename=prior_NDVI_flag_filename,
241247
prior_NDVI_bias_filename=prior_NDVI_bias_filename,
242248
prior_NDVI_bias_UQ_filename=prior_NDVI_bias_UQ_filename,
243249
prior_albedo_filename=prior_albedo_filename,
244250
prior_albedo_UQ_filename=prior_albedo_UQ_filename,
245-
# prior_albedo_flag_filename=prior_albedo_flag_filename,
251+
prior_albedo_flag_filename=prior_albedo_flag_filename,
246252
prior_albedo_bias_filename=prior_albedo_bias_filename,
247253
prior_albedo_bias_UQ_filename=prior_albedo_bias_UQ_filename,
248254
)

ECOv003_L2T_STARS/prior.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ class Prior:
99
to constrain the solution and improve accuracy, especially when
1010
observations for the current date are sparse.
1111
12+
# WARNING: prior_NDVI_flag_filename and prior_albedo_flag_filename are using Apache Zip VFS
13+
# syntax, and are not suitable for use with Julia or GDAL.
14+
1215
Attributes:
1316
using_prior (bool): True if a prior product is being used, False otherwise.
1417
prior_date_UTC (date): The UTC date of the prior product.

ECOv003_L2T_STARS/process_STARS_product.py

Lines changed: 106 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,32 @@
2727

2828
logger = logging.getLogger(__name__)
2929

30+
31+
def copy_prior_to_posterior(
32+
posterior_filename: str,
33+
posterior_UQ_filename: str,
34+
posterior_flag_filename: str,
35+
posterior_bias_filename: str,
36+
posterior_bias_UQ_filename: str,
37+
prior_filename: str,
38+
prior_UQ_filename: str,
39+
prior_flag_filename: str,
40+
prior_bias_filename: str,
41+
prior_bias_UQ_filename: str,
42+
):
43+
"""Helper function to assist with creating nearly-identical STARS granules"""
44+
pairings = [
45+
(posterior_filename, prior_filename),
46+
(posterior_UQ_filename, prior_UQ_filename),
47+
(posterior_flag_filename, prior_flag_filename),
48+
(posterior_bias_filename, prior_bias_filename),
49+
(posterior_bias_UQ_filename, prior_bias_UQ_filename),
50+
]
51+
52+
for posterior, prior in pairings:
53+
image = Raster.open(prior)
54+
image.to_geotiff(posterior, use_compression=False, include_preview=False)
55+
3056
def process_STARS_product(
3157
tile: str,
3258
date_UTC: date,
@@ -192,30 +218,46 @@ def process_STARS_product(
192218

193219
# Run Julia data fusion for NDVI, conditionally including prior data
194220
if using_prior:
195-
logger.info("Running Julia data fusion for NDVI with prior data.")
196-
process_julia_data_fusion(
197-
tile=tile,
198-
coarse_cell_size=NDVI_resolution,
199-
fine_cell_size=target_resolution,
200-
VIIRS_start_date=VIIRS_start_date,
201-
VIIRS_end_date=VIIRS_end_date,
202-
HLS_start_date=HLS_start_date,
203-
HLS_end_date=HLS_end_date,
204-
downsampled_directory=downsampled_directory,
205-
product_name="NDVI",
206-
posterior_filename=posterior_NDVI_filename,
207-
posterior_UQ_filename=posterior_NDVI_UQ_filename,
208-
posterior_flag_filename=posterior_NDVI_flag_filename,
209-
posterior_bias_filename=posterior_NDVI_bias_filename,
210-
posterior_bias_UQ_filename=posterior_NDVI_bias_UQ_filename,
211-
prior_filename=prior.prior_NDVI_filename,
212-
prior_UQ_filename=prior.prior_NDVI_UQ_filename,
213-
prior_bias_filename=prior.prior_NDVI_bias_filename,
214-
prior_bias_UQ_filename=prior.prior_NDVI_bias_UQ_filename,
215-
initialize_julia=initialize_julia,
216-
threads=threads,
217-
num_workers=num_workers,
218-
)
221+
if prior.prior_date_UTC == date_UTC:
222+
# WARNING: prior_NDVI_flag_filename is using Apache Zip VFS syntax, and is not suitable
223+
# for use with Julia or GDAL
224+
copy_prior_to_posterior(
225+
posterior_filename=posterior_NDVI_filename,
226+
posterior_UQ_filename=posterior_NDVI_UQ_filename,
227+
posterior_flag_filename=posterior_NDVI_flag_filename,
228+
posterior_bias_filename=posterior_NDVI_bias_filename,
229+
posterior_bias_UQ_filename=posterior_NDVI_bias_UQ_filename,
230+
prior_filename=prior.prior_NDVI_filename,
231+
prior_UQ_filename=prior.prior_NDVI_UQ_filename,
232+
prior_flag_filename=prior.prior_NDVI_flag_filename,
233+
prior_bias_filename=prior.prior_NDVI_bias_filename,
234+
prior_bias_UQ_filename=prior.prior_NDVI_bias_UQ_filename,
235+
)
236+
else:
237+
logger.info("Running Julia data fusion for NDVI with prior data.")
238+
process_julia_data_fusion(
239+
tile=tile,
240+
coarse_cell_size=NDVI_resolution,
241+
fine_cell_size=target_resolution,
242+
VIIRS_start_date=VIIRS_start_date,
243+
VIIRS_end_date=VIIRS_end_date,
244+
HLS_start_date=HLS_start_date,
245+
HLS_end_date=HLS_end_date,
246+
downsampled_directory=downsampled_directory,
247+
product_name="NDVI",
248+
posterior_filename=posterior_NDVI_filename,
249+
posterior_UQ_filename=posterior_NDVI_UQ_filename,
250+
posterior_flag_filename=posterior_NDVI_flag_filename,
251+
posterior_bias_filename=posterior_NDVI_bias_filename,
252+
posterior_bias_UQ_filename=posterior_NDVI_bias_UQ_filename,
253+
prior_filename=prior.prior_NDVI_filename,
254+
prior_UQ_filename=prior.prior_NDVI_UQ_filename,
255+
prior_bias_filename=prior.prior_NDVI_bias_filename,
256+
prior_bias_UQ_filename=prior.prior_NDVI_bias_UQ_filename,
257+
initialize_julia=initialize_julia,
258+
threads=threads,
259+
num_workers=num_workers,
260+
)
219261
else:
220262
logger.info("Running Julia data fusion for NDVI without prior data.")
221263
process_julia_data_fusion(
@@ -294,30 +336,46 @@ def process_STARS_product(
294336

295337
# Run Julia data fusion for albedo, conditionally including prior data
296338
if using_prior:
297-
logger.info("Running Julia data fusion for albedo with prior data.")
298-
process_julia_data_fusion(
299-
tile=tile,
300-
coarse_cell_size=albedo_resolution,
301-
fine_cell_size=target_resolution,
302-
VIIRS_start_date=VIIRS_start_date,
303-
VIIRS_end_date=VIIRS_end_date,
304-
HLS_start_date=HLS_start_date,
305-
HLS_end_date=HLS_end_date,
306-
downsampled_directory=downsampled_directory,
307-
product_name="albedo",
308-
posterior_filename=posterior_albedo_filename,
309-
posterior_UQ_filename=posterior_albedo_UQ_filename,
310-
posterior_flag_filename=posterior_albedo_flag_filename,
311-
posterior_bias_filename=posterior_albedo_bias_filename,
312-
posterior_bias_UQ_filename=posterior_albedo_bias_UQ_filename,
313-
prior_filename=prior.prior_albedo_filename,
314-
prior_UQ_filename=prior.prior_albedo_UQ_filename,
315-
prior_bias_filename=prior.prior_albedo_bias_filename,
316-
prior_bias_UQ_filename=prior.prior_albedo_bias_UQ_filename,
317-
initialize_julia=initialize_julia,
318-
threads=threads,
319-
num_workers=num_workers,
320-
)
339+
if prior.prior_date_UTC == date_UTC:
340+
# WARNING: prior_NDVI_flag_filename is using Apache Zip VFS syntax, and is not suitable
341+
# for use with Julia or GDAL
342+
copy_prior_to_posterior(
343+
posterior_filename=posterior_albedo_filename,
344+
posterior_UQ_filename=posterior_albedo_UQ_filename,
345+
posterior_flag_filename=posterior_albedo_flag_filename,
346+
posterior_bias_filename=posterior_albedo_bias_filename,
347+
posterior_bias_UQ_filename=posterior_albedo_bias_UQ_filename,
348+
prior_filename=prior.prior_albedo_filename,
349+
prior_UQ_filename=prior.prior_albedo_UQ_filename,
350+
prior_flag_filename=prior.prior_albedo_flag_filename,
351+
prior_bias_filename=prior.prior_albedo_bias_filename,
352+
prior_bias_UQ_filename=prior.prior_albedo_bias_UQ_filename,
353+
)
354+
else:
355+
logger.info("Running Julia data fusion for albedo with prior data.")
356+
process_julia_data_fusion(
357+
tile=tile,
358+
coarse_cell_size=albedo_resolution,
359+
fine_cell_size=target_resolution,
360+
VIIRS_start_date=VIIRS_start_date,
361+
VIIRS_end_date=VIIRS_end_date,
362+
HLS_start_date=HLS_start_date,
363+
HLS_end_date=HLS_end_date,
364+
downsampled_directory=downsampled_directory,
365+
product_name="albedo",
366+
posterior_filename=posterior_albedo_filename,
367+
posterior_UQ_filename=posterior_albedo_UQ_filename,
368+
posterior_flag_filename=posterior_albedo_flag_filename,
369+
posterior_bias_filename=posterior_albedo_bias_filename,
370+
posterior_bias_UQ_filename=posterior_albedo_bias_UQ_filename,
371+
prior_filename=prior.prior_albedo_filename,
372+
prior_UQ_filename=prior.prior_albedo_UQ_filename,
373+
prior_bias_filename=prior.prior_albedo_bias_filename,
374+
prior_bias_UQ_filename=prior.prior_albedo_bias_UQ_filename,
375+
initialize_julia=initialize_julia,
376+
threads=threads,
377+
num_workers=num_workers,
378+
)
321379
else:
322380
logger.info("Running Julia data fusion for albedo without prior data.")
323381
process_julia_data_fusion(

0 commit comments

Comments
 (0)