Skip to content

Commit 5e95fd3

Browse files
committed
end_to_end for water application is working now
1 parent ef5f20b commit 5e95fd3

File tree

9 files changed

+360
-563
lines changed

9 files changed

+360
-563
lines changed

hypernets_processor/calibration/calibrate.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,8 @@ def calibrate_l1a(self, measurandstring, dataset_l0, dataset_l0_bla):
3636
calibrate_function = self._measurement_function_factory.get_measurement_function(
3737
self.context.get_config_value("measurement_function_calibrate"))
3838
input_vars = calibrate_function.get_argument_names()
39-
print("the used variables are:", input_vars)
4039

4140
dataset_l1a = self.l1a_template_from_l0_dataset(measurandstring, dataset_l0)
42-
#dataset_l0 = self.correct_DN_units(dataset_l0,dataset_l0_bla)
4341
dataset_l0, dataset_l1a = self.preprocess_l0(dataset_l0, dataset_l1a)
4442

4543
calibration_data = self.prepare_calibration_data(measurandstring)
@@ -228,8 +226,18 @@ def preprocess_l0(self, datasetl0, datasetl1a):
228226
du = DatasetUtil()
229227

230228
mask = self.clip_and_mask(datasetl0)
231-
datasetl0["quality_flag"].values = mask
232-
datasetl1a["quality_flag"].values = mask
229+
# datasetl0["quality_flag"].values = mask
230+
# datasetl1a["quality_flag"].values = mask
231+
232+
flagval = 2 ** (self.context.get_config_value("outliers"))
233+
234+
datasetl0["quality_flag"].values = [
235+
flagval + datasetl0["quality_flag"].values[i] if mask[i] == 1 else
236+
datasetl0["quality_flag"].values[i] for i in range(len(mask))]
237+
238+
datasetl1a["quality_flag"].values = [
239+
flagval + datasetl1a["quality_flag"].values[i] if mask[i] == 1 else
240+
datasetl1a["quality_flag"].values[i] for i in range(len(mask))]
233241

234242
DN_rand = du.create_variable([len(datasetl0["wavelength"]), len(datasetl0["scan"])],
235243
dim_names=["wavelength", "scan"], dtype=np.uint32, fill_value=0)
@@ -258,8 +266,8 @@ def clip_and_mask(self, dataset, k_unc=3):
258266
for i in range(len(series_ids)):
259267
ids = np.where(dataset['series_id'] == series_ids[i])
260268
intsig = np.nansum((dataset["digital_number"].values[:, ids]), axis=0)[0]
261-
noisestd, noiseavg = self.sigma_clip(intsig)
262-
maski = np.zeros_like(intsig)
269+
noisestd, noiseavg = self.sigma_clip(intsig) # calculate std and avg for non NaN columns
270+
maski = np.zeros_like(intsig) # mask the columns that have NaN
263271
maski[np.where(np.abs(intsig - noiseavg) >= k_unc * noisestd)] = 1
264272
mask = np.append(mask, maski)
265273
# print("mask",mask)
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
FLAG_MEANINGS = ["good_data", "flag1", "flag2", "flag3", "flag4", "flag5", "flag6", "flag7", "flag8"]
1+
FLAG_MEANINGS = ["saturation", "nonlinearity", "bad_pointing", "placeholder1", "lon_default", "lat_default", "outliers",
2+
"angles_missing", "lu_eq_missing", "fresnel_angle_missing", "fresnel_default", "temp_variability_ed",
3+
"temp_variability_lu", "min_nbred", "min_nbrlu", "min_nbrlsky", "def_wind_flag", "simil_fail"]
4+

hypernets_processor/data_io/format/variables.py

Lines changed: 176 additions & 304 deletions
Large diffs are not rendered by default.

hypernets_processor/data_io/hypernets_writer.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ def write(
8282

8383

8484
if fmt == "nc":
85-
print('here')
8685
HypernetsWriter._write_netcdf(ds, path, compression_level=compression_level)
8786

8887
elif fmt == "csv":

hypernets_processor/etc/processor.config

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ model=series_rep,series_id,vaa,azimuth_ref,vza,mode,action,it,scan_total,series_
1616
#model=seq_rep,seq_line,vaa,azimuth_ref,vza,mode,action,it,scan_total,series_time
1717

1818
[WaterStandardProtocol]
19-
protocol: water_std
19+
measurement_function_surface_reflectance: WaterNetworkProtocol
2020
n_upwelling_rad: 6
2121
n_upwelling_irr: 3
2222
n_downwelling_rad: 3
@@ -59,18 +59,19 @@ test_var_wave: 780
5959
test_var_threshold: 0.10
6060

6161
[Flags]
62-
lon_default:7
63-
lat_default:8
64-
angles_missing:9
65-
lu_eq_missing:10
66-
fresnel_angle_missing:11
67-
fresnel_default:12
68-
temp_variability_ed:13
69-
temp_variability_lu:14
62+
lon_default: 5
63+
lat_default: 6
64+
outliers: 7
65+
angles_missing: 9
66+
lu_eq_missing: 10
67+
fresnel_angle_missing: 11
68+
fresnel_default: 12
69+
temp_variability_ed: 13
70+
temp_variability_lu: 14
7071
## inf_or_nan:15
71-
min_nbred:16
72-
min_nbrlu:17
73-
min_nrblsky:18
74-
simil_fail:19
75-
wind_default:20
72+
min_nbred: 16
73+
min_nbrlu: 17
74+
min_nbrlsky: 18
75+
simil_fail: 19
76+
def_wind_flag: 20
7677

hypernets_processor/interpolation/interpolate.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ def interpolate_l1b_w(self,dataset_l1a_rad,dataset_l1b_uprad, dataset_l1b_irr):
2929
# chek for upwelling radiance
3030
upscan = [i for i, e in enumerate(dataset_l1a_rad['viewing_zenith_angle'].values) if e <= 90]
3131

32-
print("upscan {}".format(upscan) + "is the same as L1A-rad {}".format(len(dataset_l1a_rad.scan)))
33-
3432
l1b_dim_sizes_dict = {"wavelength":len(dataset_l1a_rad["wavelength"]),
3533
"scan":len(upscan)}
3634

hypernets_processor/rhymer/rhymer/hypstar/rhymer_hypstar.py

Lines changed: 37 additions & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -112,16 +112,16 @@ def qc_scan(self, dataset, measurandstring):
112112

113113
def cycleparse(self, rad, irr):
114114

115-
protocol = self.context.get_config_value("protocol")
115+
protocol = self.context.get_config_value("measurement_function_surface_reflectance")
116116
print(protocol)
117117
nbrlu = self.context.get_config_value("n_upwelling_rad")
118118
nbred = self.context.get_config_value("n_upwelling_irr")
119119
nbrlsky = self.context.get_config_value("n_downwelling_rad")
120-
flag_nbrlu = self.context.get_config_value("min_nbrlu")
121-
flag_nbred = self.context.get_config_value("min_nbred")
122-
flag_nbrlsky = self.context.get_config_value("min_nbrlsky")
120+
flag_nbrlu = 2**self.context.get_config_value("min_nbrlu")
121+
flag_nbred = 2**self.context.get_config_value("min_nbred")
122+
flag_nbrlsky = 2**self.context.get_config_value("min_nbrlsky")
123123

124-
if protocol != 'water_std':
124+
if protocol != 'WaterNetworkProtocol':
125125
# here we should simply provide surface reflectance?
126126
# what about a non-standard protocol but that includes the required standard series?
127127
print('Unknown measurement protocol: {}'.format(protocol))
@@ -193,32 +193,28 @@ def cycleparse(self, rad, irr):
193193
in ['scan', 'quality_flag']])))
194194

195195
# check if correct number of radiance and irradiance data
196-
flag_nbrlu = self.context.get_config_value("min_nbrlu")
197-
flag_nbred = self.context.get_config_value("min_nbred")
198-
flag_nbrlsky = self.context.get_config_value("min_nbrlsky")
199-
200196
if lu.scan[lu['quality_flag'] <= 0].count() < nbrlu:
201-
lu["quality_flag"].values = [lu.sel(scan=i)["quality_flag"]+2**flag_nbrlu for i in lu['scan']]
197+
lu["quality_flag"].values = [lu.sel(scan=i)["quality_flag"].values+flag_nbrlu for i in lu['scan']]
202198
if self.context.get_config_value("verbosity") > 2:
203199
print("No enough upwelling radiance data for sequence {}".format(lu.attrs['sequence_id']))
204200
if lsky.scan[lsky['quality_flag'] <= 1].count() < nbrlsky:
205-
lsky["quality_flag"] = [lsky.sel(scan=i)["quality_flag"]+2**flag_nbrlsky for i in lsky['scan']]
201+
lsky["quality_flag"].values = [lsky.sel(scan=i)["quality_flag"].values+flag_nbrlsky for i in lsky['scan']]
206202
if self.context.get_config_value("verbosity") > 2:
207203
print("No enough downwelling radiance data for sequence {}".format(lsky.attrs['sequence_id']))
208204

209205
if irr.scan[irr['quality_flag'] <= 1].count() < nbred:
210-
irr["quality_flag"] = [irr.sel(scan=i)["quality_flag"] + 2 ** flag_nbred for i in irr['scan']]
206+
irr["quality_flag"].values = [irr.sel(scan=i)["quality_flag"].values + 2 ** flag_nbred for i in irr['scan']]
211207
if self.context.get_config_value("verbosity") > 2:
212208
print("No enough irradiance data for sequence {}".format(irr.attrs['sequence_id']))
213209

214-
return lu, lsky, irr
210+
return lu, lsky, irr
215211

216212
def get_wind(self, l1b):
217213

218214
lat = l1b.attrs['site_latitude']
219215
lon = l1b.attrs['site_latitude']
220216
wind = []
221-
flagval = self.context.get_config_value("wind_default")
217+
flagval = self.context.get_config_value("def_wind_flag")
222218
for i in range(len(l1b.scan)):
223219
wa = self.context.get_config_value("wind_ancillary")
224220
if wa == False:
@@ -284,58 +280,17 @@ def get_fresnelrefl(self, l1b):
284280

285281
return l1b
286282

287-
# def get_epsilon(self, rhow_nosc, wavelength):
288-
#
289-
# # wavelength = l1b['wavelength'].values
290-
# epsilon = np.zeros(len(rhow_nosc))
291-
#
292-
# ## compute similarity epsilon
293-
# for i in range(len(rhow_nosc)):
294-
# fail_simil, eps = self.qc_similarity(wavelength, rhow_nosc[i],
295-
# self.similarity_wr,
296-
# self.similarity_wp,
297-
# self.similarity_w1,
298-
# self.similarity_w2,
299-
# self.similarity_alpha)
300-
#
301-
# ## R2005 quality control
302-
# ## skip spectra not following similarity
303-
# if self.similarity_test:
304-
# if fail_simil:
305-
# if verbosity > 2: print('Failed simil test.')
306-
# continue
307-
# else:
308-
# if verbosity > 2: print('Passed simil test.')
309-
# epsilon[i] = eps
310-
# # l1b["epsilon"].values=epsilon
311-
# return epsilon
312-
313-
def get_rhow_nosc(self, l1b):
314-
315-
## read mobley rho lut
316-
317-
wavelength = l1b['wavelength'].values
318-
fresnel_coeff = l1b['rhof'].values
319-
rhow_nosc_all = np.zeros((len(l1b.scan), len(wavelength)))
320-
lw_all = np.zeros((len(l1b.scan), len(wavelength)))
321-
rhow_all = np.zeros((len(l1b.scan), len(wavelength)))
322-
epsilon = np.zeros(len(l1b.scan))
323-
simil_flag = np.zeros(len(l1b.scan))
324-
325-
for i in range(len(l1b.scan)):
326-
## compute rhow
327-
lu = l1b['upwelling_radiance'][:, i].values
328-
# should I average here or take the downwelling radiance per scan???
329-
# mls stands for mean sky/downwelling radiance, so need to check if mean is better than interpolated?
330-
mls = l1b['downwelling_radiance'][:, i].values
331-
# same for ed? Better interpolated or mean Ed???
332-
med = l1b['irradiance'][:, i].values
283+
def get_epsilon(self, rhow_nosc, wavelength):
333284

334-
lw_all[i] = [(lu[w] - (fresnel_coeff[i] * mls[w])) for w in range(len(wavelength))]
335-
rhow_nosc_all[i] = [np.pi * (lu[w] - (fresnel_coeff[i] * mls[w])) / med[w] for w in range(len(wavelength))]
285+
# wavelength = l1b['wavelength'].values
286+
#get length of transposed rhow_nosc (1 epsilon per scan!)
287+
epsilon = np.zeros(len(rhow_nosc.T))
288+
failSimil = np.zeros(len(rhow_nosc.T))
336289

290+
## compute similarity epsilon
291+
for i in range(len(rhow_nosc.T)):
337292
## compute similarity epsilon
338-
fail_simil, eps = self.qc_similarity(wavelength, rhow_nosc_all[i],
293+
fail_simil, eps = self.qc_similarity(wavelength, rhow_nosc.T[i],
339294
self.context.get_config_value("similarity_wr"),
340295
self.context.get_config_value("similarity_wp"),
341296
self.context.get_config_value("similarity_w1"),
@@ -344,70 +299,30 @@ def get_rhow_nosc(self, l1b):
344299

345300
## R2005 quality control
346301
## skip spectra not following similarity
347-
if self.context.get_config_value("similarity_test")==True:
302+
if self.context.get_config_value("similarity_test") == True:
348303
if fail_simil:
349-
if verbosity > 2: print('Failed simil test.')
350-
simil_flag[i] = 10
304+
if self.context.get_config_value("verbosity") > 2: print('Failed simil test.')
351305
continue
352306
else:
353-
if verbosity > 2: print('Passed simil test.')
354-
simil_flag[i] = 0
355-
356-
## R2005 correction
357-
if self.context.get_config_value("similarity_correct")==True:
358-
# print(epsilon)
359-
rhow_all[i] = [r - eps for r in rhow_nosc_all[i]]
360-
else:
361-
rhow_all[i] = rhow_nosc_all[i]
362-
307+
if self.context.get_config_value("verbosity") > 2: print('Passed simil test.')
363308
epsilon[i] = eps
309+
failSimil[i]=fail_simil
310+
return epsilon, failSimil
364311

365-
return rhow_nosc_all, rhow_all, epsilon, lw_all, simil_flag
366312

367-
def fresnelrefl_qc_simil(self, l1b, wind):
313+
def get_rhow_nosc(self, l1b):
368314

369315
## read mobley rho lut
370-
rholut = self.rhymerproc.mobley_lut_read(self)
371316

372317
wavelength = l1b['wavelength'].values
373-
374-
fresnel_coeff = np.zeros(len(l1b.scan))
318+
fresnel_coeff = l1b['rhof'].values
375319
rhow_nosc_all = np.zeros((len(l1b.scan), len(wavelength)))
376320
lw_all = np.zeros((len(l1b.scan), len(wavelength)))
377-
rhow_all = np.zeros((len(l1b.scan), len(wavelength)))
378-
epsilon = np.zeros(len(l1b.scan))
321+
#rhow_all = np.zeros((len(l1b.scan), len(wavelength)))
322+
#epsilon = np.zeros(len(l1b.scan))
379323
simil_flag = np.zeros(len(l1b.scan))
380324

381325
for i in range(len(l1b.scan)):
382-
vza = l1b['viewing_zenith_angle'][i].values
383-
sza = l1b['solar_zenith_angle'][i].values
384-
385-
diffa = l1b['viewing_azimuth_angle'][i].values - l1b['viewing_azimuth_angle'][i].values
386-
387-
if diffa >= 360:
388-
diffa = diffa - 360
389-
elif 0 <= diffa < 360:
390-
diffa = diffa
391-
else:
392-
diffa = diffa + 360
393-
raa = abs((diffa - 180))
394-
sza = l1b['solar_zenith_angle'][i].values
395-
## get fresnel reflectance
396-
if self.fresnel_option == 'Mobley':
397-
if (sza is not None) & (raa is not None):
398-
sza_ = min(sza, 79.999)
399-
rhof = self.rhymerproc.mobley_lut_interp(sza, vza, raa,
400-
wind=wind[i],
401-
rholut=rholut)
402-
else:
403-
# add a quality flag!
404-
fresnel = 'fixed'
405-
406-
if self.fresnel_option == 'Ruddick2006':
407-
rhof = self.rhof_default
408-
## R2006
409-
if wind is not None:
410-
rhof = rhof + 0.00039 * wind + 0.000034 * wind ** 2
411326
## compute rhow
412327
lu = l1b['upwelling_radiance'][:, i].values
413328
# should I average here or take the downwelling radiance per scan???
@@ -416,40 +331,10 @@ def fresnelrefl_qc_simil(self, l1b, wind):
416331
# same for ed? Better interpolated or mean Ed???
417332
med = l1b['irradiance'][:, i].values
418333

419-
lw_all[i] = [(lu[w] - (rhof * mls[w])) for w in range(len(wavelength))]
420-
rhow_nosc_all[i] = [np.pi * (lu[w] - (rhof * mls[w])) / med[w] for w in range(len(wavelength))]
421-
fresnel_coeff[i] = rhof
422-
423-
## compute similarity epsilon
424-
print(self.similarity_alpha)
425-
fail_simil, eps = self.qc_similarity(wavelength, rhow_nosc_all[i],
426-
self.similarity_wr,
427-
self.similarity_wp,
428-
self.similarity_w1,
429-
self.similarity_w2,
430-
self.similarity_alpha)
431-
432-
# ## R2005 quality control
433-
# ## skip spectra not following similarity
434-
# if self.similarity_test:
435-
# if fail_simil:
436-
# if verbosity > 2: print('Failed simil test.')
437-
# simil_flag[i] = 10
438-
# continue
439-
# else:
440-
# if verbosity > 2: print('Passed simil test.')
441-
# simil_flag[i] = 0
442-
443-
## R2005 correction
444-
if self.similarity_correct:
445-
# print(epsilon)
446-
rhow_all[i] = [r - eps for r in rhow_nosc_all[i]]
447-
else:
448-
rhow_all[i] = rhow_nosc_all[i]
449-
450-
epsilon[i] = eps
334+
lw_all[i] = [(lu[w] - (fresnel_coeff[i] * mls[w])) for w in range(len(wavelength))]
335+
rhow_nosc_all[i] = [np.pi * (lu[w] - (fresnel_coeff[i] * mls[w])) / med[w] for w in range(len(wavelength))]
451336

452-
return lw_all, rhow_all, rhow_nosc_all, epsilon, simil_flag
337+
return rhow_nosc_all, lw_all
453338

454339
## QC a single rhow scan from PANTHYR
455340
## according to R2005
@@ -494,24 +379,25 @@ def process_l1b(self, L1a_rad, L1a_irr):
494379

495380
# INTERPOLATE Lsky and Ed FOR EACH Lu SCAN! Threshold in time -> ASSIGN FLAG
496381
L1b = self.intp.interpolate_l1b_w(L1a_uprad, L1b_downrad, L1b_irr)
497-
L1b = self.get_wind(L1b)
498-
L1b = self.get_fresnelrefl(L1b)
499382
if self.context.get_config_value("write_l1b")==True:
500383
self.writer.write(L1b, overwrite=True)
501384
return L1b
502385

503386
def process_l1c(self, l1b):
504387

505-
rhow_nosc_all, rhow_all, epsilon, lw_all, simil_flag = self.get_rhow_nosc(l1b)
506388
l1c_dim_sizes_dict = {"wavelength": len(l1b["wavelength"]),
507389
"scan": len(np.unique(l1b['scan']))}
508390
dataset_l1c = self.hdsb.create_ds_template(l1c_dim_sizes_dict, "W_L1C", propagate_ds=l1b)
509-
dataset_l1c['reflectance'].values = rhow_all.T
510391

511-
print(rhow_nosc_all.T)
392+
dataset_l1c = self.get_wind(dataset_l1c)
393+
dataset_l1c = self.get_fresnelrefl(dataset_l1c)
394+
395+
rhow_nosc_all, lw_all = self.get_rhow_nosc(dataset_l1c)
396+
397+
#dataset_l1c['reflectance'].values = rhow_all.T
512398

513399
dataset_l1c['reflectance_nosc'].values = rhow_nosc_all.T
514-
dataset_l1c['epsilon'].values = epsilon
400+
#dataset_l1c['epsilon'].values = epsilon
515401
dataset_l1c['water_leaving_radiance'].values = lw_all.T
516402

517403
return dataset_l1c

0 commit comments

Comments
 (0)