Skip to content

Commit 7c9f6d1

Browse files
committed
fixed flags issues for water after pull master branch
1 parent 3c73ab3 commit 7c9f6d1

File tree

6 files changed

+119
-366
lines changed

6 files changed

+119
-366
lines changed

hypernets_processor/calibration/calibrate.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ def calibrate_l1a(self, measurandstring, dataset_l0, dataset_l0_bla):
7474
def prepare_calibration_data(self,measurandstring):
7575
hypstar=self.context.get_config_value("hypstar_cal_number")
7676
directory=self.context.get_config_value("calibration_directory")
77+
print(directory)
7778
caldates=[os.path.basename(path) for path in glob.glob
7879
(os.path.join(directory,"hypstar_"+str(hypstar)+"/radiometric/*"))]
7980
caldate=caldates[0]
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
[Job]
2+
job_name = run_20201028T150017
3+
job_working_directory = home/cgoyens/.hypernets/tmp
4+
5+
#SEQ20201016T141413
6+
sequence_id: SEQ20200821T154756
7+
Lat: 43.69886
8+
Lon: 7.30720
9+
site_abbr: test
10+
11+
[Input]
12+
raw_data_directory = /home/cgoyens/OneDrive/BackUpThinkpadClem/Projects/HYPERNETS/NetworkDesign_D52/DataProcChain/hypernets_processor/hypernets_processor/data_io/tests/reader/SEQ20200821T154756
13+
[Log]
14+
log_path = test.log
15+
verbose = True
16+
quiet = False
17+
18+
[Processor]
19+
network = l
20+
21+
[Output]
22+
product_format = netcdf
23+
write_l0 = False
24+
write_l1a = False
25+
write_l1b = True
26+
write_l1c = False
27+
write_l2a = True
28+
archive_directory = home/cgoyens/OneDrive/BackUpThinkpadClem/Projects/HYPERNETS/NetworkDesign_D52/DataProcChain/hypernets_processor/hypernets_processor/test_hypernets
29+
30+
31+
[Plotting]
32+
plotting_directory: ./out/plots/
33+
plotting_format: png
34+
plot_l1a: True
35+
plot_l1b: True
36+
plot_l2a: True
37+
38+
[Calibration]
39+
calibration_directory: /home/cgoyens/OneDrive/BackUpThinkpadClem/Projects/HYPERNETS/NetworkDesign_D52/DataProcChain/hypernets_processor/calibration_files/HYPSTAR_cal
40+
hypstar_cal_number:220241
41+
cal_date:200728
42+
measurement_function_calibrate: StandardMeasurementFunction
43+
44+
[Combine VIS-SWIR]
45+
measurement_function_combine: StepCombine
46+
wavelength_switch: 1044
47+
48+
[Interpolate]
49+
measurement_function_interpolate: WaterNetworkInterpolationLinear
50+
51+
[SurfaceReflectance]
52+
measurement_function_surface_reflectance = WaterNetworkProtocol

hypernets_processor/rhymer/rhymer/hypstar/rhymer_hypstar.py

Lines changed: 55 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from hypernets_processor.plotting.plotting import Plotting
1717
from hypernets_processor.data_io.format.metadata import METADATA_DEFS
1818
from hypernets_processor.data_io.format.variables import VARIABLES_DICT_DEFS
19+
from hypernets_processor.data_io.dataset_util import DatasetUtil as du
1920

2021
import numpy as np
2122
import math
@@ -29,7 +30,7 @@ def __init__(self, context):
2930
self.writer = HypernetsWriter(context)
3031
self.cal = Calibrate(context, MCsteps=100)
3132
self.intp = Interpolate(context, MCsteps=1000)
32-
self.plot=Plotting(context)
33+
self.plot = Plotting(context)
3334
self.rhymeranc = RhymerAncillary(context)
3435
self.rhymerproc = RhymerProcessing(context)
3536
self.rhymershared = RhymerShared(context)
@@ -89,26 +90,18 @@ def qc_scan(self, dataset, measurandstring):
8990
if v > self.context.get_config_value("diff_threshold"):
9091
# get flag value for the temporal variability
9192
if measurandstring == 'irradiance':
92-
flagval=2 ** (self.context.get_config_value("temp_variability_ed"))
93+
dataset['quality_flag'][scans[i]] = du.set_flag(dataset["quality_flag"][scans[i]],
94+
"temp_variability_ed")
9395
else:
94-
flagval = 2 ** (self.context.get_config_value("temp_variability_lu"))
96+
dataset['quality_flag'][scans[i]] = du.set_flag(dataset["quality_flag"][scans[i]],
97+
"temp_variability_lu")
9598

96-
dataset['quality_flag'][scans[i]] = dataset['quality_flag'][scans[i]]+flagval
9799
seq = dataset.attrs["sequence_id"]
98100
ts = datetime.utcfromtimestamp(dataset['acquisition_time'][i])
99101

100-
if verbosity > 2: self.context.logger.info('Temporal jump: in {}: Aquisition time {}, {}'.format(seq, ts, ', '.join(
101-
['{}:{}'.format(k, dataset[k][scans[i]].values) for k in ['scan', 'quality_flag']])))
102-
103-
# ## check for complete spectra
104-
# ## assumed here they are masked by inf or nan by calibration step
105-
# if any([not np.isfinite(j) for j in data[i]]):
106-
# # set quality flag to 10
107-
# flagval = 2 ** (self.context.get_config_value("inf_nan"))
108-
# dataset['quality_flag'][scans[i]] = dataset['quality_flag'][scans[i]] + flagval
109-
# ts = datetime.utcfromtimestamp(dataset['acquisition_time'][i])
110-
# if verbosity > 2: print('inf or Nan data in: Aquisition time {}, {}'.format(ts, ', '.join(
111-
# ['{}:{}'.format(k, dataset[k][scans[i]].values) for k in ['scan', 'quality_flag']])))
102+
if verbosity > 2: self.context.logger.info(
103+
'Temporal jump: in {}: Aquisition time {}, {}'.format(seq, ts, ', '.join(
104+
['{}:{}'.format(k, dataset[k][scans[i]].values) for k in ['scan', 'quality_flag']])))
112105

113106
return dataset
114107

@@ -119,9 +112,6 @@ def cycleparse(self, rad, irr):
119112
nbrlu = self.context.get_config_value("n_upwelling_rad")
120113
nbred = self.context.get_config_value("n_upwelling_irr")
121114
nbrlsky = self.context.get_config_value("n_downwelling_rad")
122-
flag_nbrlu = 2**self.context.get_config_value("min_nbrlu")
123-
flag_nbred = 2**self.context.get_config_value("min_nbred")
124-
flag_nbrlsky = 2**self.context.get_config_value("min_nbrlsky")
125115

126116
if protocol != 'WaterNetworkProtocol':
127117
# here we should simply provide surface reflectance?
@@ -142,12 +132,9 @@ def cycleparse(self, rad, irr):
142132
senz = float(senz)
143133
sena = abs(float(sena))
144134
else:
145-
flagval = 2 ** (self.context.get_config_value("angles_missing"))
146-
scani['quality_flag'] = scani['quality_flag'] + flagval
147-
if self.context.get_config_value("verbosity") > 2:
148-
self.context.logger.info(
149-
'NULL angles: Aquisition time {}, {}'.format(ts, ', '.join(
150-
['{}:{}'.format(k, scani[k].values) for k in ['scan', 'quality_flag']])))
135+
scani['quality_flag'] = du.set_flag(scani['quality_flag'], "angles_missing")
136+
self.context.logger.info('NULL angles: Aquisition time {}, {}'.format(ts, ', '.join(
137+
['{}:{}'.format(k, scani[k].values) for k in ['scan', 'quality_flag']])))
151138
continue
152139

153140
# ## identify measurement
@@ -169,46 +156,47 @@ def cycleparse(self, rad, irr):
169156
sena_lsky = np.unique(lsky["viewing_azimuth_angle"].values)
170157
for i in sena_lu:
171158
if i not in sena_lsky:
172-
flagval=self.context.get_config_value("lu_eq_missing")
173-
lu["quality_flag"][lu["viewing_azimuth_angle"] == i] = lu["quality_flag"][lu["viewing_azimuth_angle"] == i]+2**flagval
159+
lu["quality_flag"][lu["viewing_azimuth_angle"] == i] = du.set_flag(
160+
lu["quality_flag"][lu["viewing_azimuth_angle"] == i], "lu_eq_missing")
174161
if self.context.get_config_value("verbosity") > 2:
175162
ts = [datetime.utcfromtimestamp(x) for x in
176163
lu['acquisition_time'][lu["viewing_azimuth_angle"] == i].values]
177-
self.context.logger.info('No azimuthal equivalent downwelling radiance measurement: Aquisition time {}, {}'.format(
178-
ts, ', '.join(
179-
['{}:{}'.format(k, lu[k][lu["viewing_azimuth_angle"] == i].values) for k in
180-
['scan', 'quality_flag']])))
164+
self.context.logger.info(
165+
'No azimuthal equivalent downwelling radiance measurement: Aquisition time {}, {}'.format(
166+
ts, ', '.join(
167+
['{}:{}'.format(k, lu[k][lu["viewing_azimuth_angle"] == i].values) for k in
168+
['scan', 'quality_flag']])))
181169

182170
# check if we have the required fresnel angle for lsky
183171
senz_lu = np.unique(lu["viewing_zenith_angle"].values)
184172
senz_lsky = 180 - np.unique(lsky["viewing_zenith_angle"].values)
185173
for i in senz_lu:
186174
if i not in senz_lsky:
187-
flagval = self.context.get_config_value("fresnel_angle_missing")
188-
lu["quality_flag"][lu["viewing_azimuth_angle"] == i] = lu["quality_flag"][lu["viewing_azimuth_angle"] == i] + 2 ** flagval
189-
if self.context.get_config_value("verbosity") > 2:
190-
ts = [datetime.utcfromtimestamp(x) for x in
191-
lu['acquisition_time'][lu["viewing_zenith_angle"] == i].values]
192-
self.context.logger.info(
175+
lu["quality_flag"][lu["viewing_azimuth_angle"] == i] = du.set_flag(lu["quality_flag"][lu["viewing_azimuth_angle"]==i],"fresnel_angle_missing")
176+
ts = [datetime.utcfromtimestamp(x) for x in lu['acquisition_time'][lu["viewing_zenith_angle"] == i].values]
177+
self.context.logger.info(
193178
'No downwelling radiance measurement at appropriate fresnel angle: Aquisition time {}, {}'.format(
194179
ts, ', '.join(
195180
['{}:{}'.format(k, lu[k][lu["viewing_azimuth_angle"] == i].values) for k
196181
in ['scan', 'quality_flag']])))
197182

198183
# check if correct number of radiance and irradiance data
184+
199185
if lu.scan[lu['quality_flag'] <= 0].count() < nbrlu:
200-
lu["quality_flag"].values = [lu.sel(scan=i)["quality_flag"].values+flag_nbrlu for i in lu['scan']]
201-
if self.context.get_config_value("verbosity") > 2:
202-
self.context.logger.info("No enough upwelling radiance data for sequence {}".format(lu.attrs['sequence_id']))
186+
lu["quality_flag"].values = [du.set_flag(lu["quality_flag"][lu["scan"] == i], "min_nbrlu") for
187+
i in lu["scan"]]
188+
self.context.logger.info(
189+
"No enough upwelling radiance data for sequence {}".format(lu.attrs['sequence_id']))
203190
if lsky.scan[lsky['quality_flag'] <= 1].count() < nbrlsky:
204-
lsky["quality_flag"].values = [lsky.sel(scan=i)["quality_flag"].values+flag_nbrlsky for i in lsky['scan']]
205-
if self.context.get_config_value("verbosity") > 2:
206-
self.context.logger.info("No enough downwelling radiance data for sequence {}".format(lsky.attrs['sequence_id']))
207-
191+
lsky["quality_flag"].values = [du.set_flag(lsky["quality_flag"][lu["scan"] == i], "min_nbrlu") for
192+
i in lsky["scan"]]
193+
self.context.logger.info(
194+
"No enough downwelling radiance data for sequence {}".format(lsky.attrs['sequence_id']))
208195
if irr.scan[irr['quality_flag'] <= 1].count() < nbred:
209-
irr["quality_flag"].values = [irr.sel(scan=i)["quality_flag"].values + 2 ** flag_nbred for i in irr['scan']]
210-
if self.context.get_config_value("verbosity") > 2:
211-
self.context.logger.info("No enough irradiance data for sequence {}".format(irr.attrs['sequence_id']))
196+
irr["quality_flag"].values = [du.set_flag(lsky["quality_flag"][irr["scan"] == i], "min_nbrlu") for
197+
i in irr["scan"]]
198+
self.context.logger.info(
199+
"No enough downwelling irradiance data for sequence {}".format(irr.attrs['sequence_id']))
212200

213201
return lu, lsky, irr
214202

@@ -217,11 +205,11 @@ def get_wind(self, l1b):
217205
lat = l1b.attrs['site_latitude']
218206
lon = l1b.attrs['site_latitude']
219207
wind = []
220-
flagval = self.context.get_config_value("def_wind_flag")
221208
for i in range(len(l1b.scan)):
222209
wa = self.context.get_config_value("wind_ancillary")
223-
if wa == False:
224-
l1b.sel(scan=i)["quality_flag"]=l1b.sel(scan=i)["quality_flag"] + 2 ** flagval
210+
if not wa:
211+
l1b["quality_flag"][l1b["scan"] == i] = du.set_flag(l1b["quality_flag"][l1b["scan"] == i],
212+
"def_wind_flag")
225213
self.context.logger.info("Default wind speed {}".format(self.context.get_config_value("wind_default")))
226214
wind.append(self.context.get_config_value("wind_default"))
227215
else:
@@ -261,18 +249,16 @@ def get_fresnelrefl(self, l1b):
261249
if (fresnel_sza[i] is not None) & (fresnel_raa[i] is not None):
262250
sza = min(fresnel_sza[i], 79.999)
263251
rhof = self.rhymerproc.mobley_lut_interp(sza, fresnel_vza[i], fresnel_raa[i],
264-
wind=wind[i])
252+
wind=wind[i])
265253
else:
266-
# add a quality flag!
267-
flagval = self.context.get_config_value("fresnel_default")
268-
l1b["quality_flag"][i].values = l1b["quality_flag"][i].values + 2 ** flagval
254+
l1b["quality_flag"][l1b["scan"] == i] = du.set_flag(l1b["quality_flag"][l1b["scan"] == i],
255+
"fresnel_default")
269256
rhof = self.context.get_config_value("rhof_default")
270-
271257
if self.context.get_config_value("fresnel_option") == 'Ruddick2006':
272258
rhof = self.context.get_config_value("rhof_default")
273259
self.context.logger.info("Apply Ruddick et al., 2006")
274260
if wind[i] is not None:
275-
rhof = rhof + 0.00039 * wind[i] + 0.000034 * wind[i] ** 2
261+
rhof = rhof + 0.00039 * wind[i] + 0.000034 * wind[i] ** 2
276262

277263
fresnel_coeff[i] = rhof
278264

@@ -286,7 +272,7 @@ def get_fresnelrefl(self, l1b):
286272
def get_epsilon(self, rhow_nosc, wavelength):
287273

288274
# wavelength = l1b['wavelength'].values
289-
#get length of transposed rhow_nosc (1 epsilon per scan!)
275+
# get length of transposed rhow_nosc (1 epsilon per scan!)
290276
epsilon = np.zeros(len(rhow_nosc.T))
291277
failSimil = np.zeros(len(rhow_nosc.T))
292278

@@ -309,10 +295,9 @@ def get_epsilon(self, rhow_nosc, wavelength):
309295
else:
310296
if self.context.get_config_value("verbosity") > 2: self.context.logger.info('Passed simil test.')
311297
epsilon[i] = eps
312-
failSimil[i]=fail_simil
298+
failSimil[i] = fail_simil
313299
return epsilon, failSimil
314300

315-
316301
def get_rhow_nosc(self, l1b):
317302

318303
## read mobley rho lut
@@ -321,8 +306,8 @@ def get_rhow_nosc(self, l1b):
321306
fresnel_coeff = l1b['rhof'].values
322307
rhow_nosc_all = np.zeros((len(l1b.scan), len(wavelength)))
323308
lw_all = np.zeros((len(l1b.scan), len(wavelength)))
324-
#rhow_all = np.zeros((len(l1b.scan), len(wavelength)))
325-
#epsilon = np.zeros(len(l1b.scan))
309+
# rhow_all = np.zeros((len(l1b.scan), len(wavelength)))
310+
# epsilon = np.zeros(len(l1b.scan))
326311
simil_flag = np.zeros(len(l1b.scan))
327312

328313
for i in range(len(l1b.scan)):
@@ -381,7 +366,7 @@ def process_l1b(self, L1a_rad, L1a_irr):
381366
L1b_irr = self.cal.average_l1b("irradiance", L1a_irr)
382367
# INTERPOLATE Lsky and Ed FOR EACH Lu SCAN! Threshold in time -> ASSIGN FLAG
383368
L1b = self.intp.interpolate_l1b_w(L1a_uprad, L1b_downrad, L1b_irr)
384-
if self.context.get_config_value("write_l1b")==True:
369+
if self.context.get_config_value("write_l1b") == True:
385370
self.writer.write(L1b, overwrite=True)
386371
return L1b
387372

@@ -393,21 +378,21 @@ def process_l1c(self, l1b):
393378

394379
rhow_nosc_all, lw_all = self.get_rhow_nosc(dataset_l1c)
395380

396-
#dataset_l1c['reflectance'].values = rhow_all.T
381+
# dataset_l1c['reflectance'].values = rhow_all.T
397382

398383
dataset_l1c['reflectance_nosc'].values = rhow_nosc_all.T
399-
#dataset_l1c['epsilon'].values = epsilon
384+
# dataset_l1c['epsilon'].values = epsilon
400385
dataset_l1c['water_leaving_radiance'].values = lw_all.T
401386

402387
if self.context.get_config_value("write_l1c"):
403-
self.writer.write(dataset_l1c,overwrite=True)
388+
self.writer.write(dataset_l1c, overwrite=True)
404389

405390
if self.context.get_config_value("plot_l1c"):
406-
self.plot.plot_scans_in_series("irradiance",dataset_l1c)
391+
self.plot.plot_scans_in_series("irradiance", dataset_l1c)
407392

408393
return dataset_l1c
409394

410-
def l1c_from_l1b_dataset(self,dataset_l1b):
395+
def l1c_from_l1b_dataset(self, dataset_l1b):
411396
"""
412397
Makes a L2 template of the data, and propagates the appropriate keywords from L1.
413398
@@ -416,10 +401,10 @@ def l1c_from_l1b_dataset(self,dataset_l1b):
416401
:return:
417402
:rtype:
418403
"""
419-
l1c_dim_sizes_dict = {"wavelength":len(dataset_l1b["wavelength"]),
420-
"scan":len(np.unique(dataset_l1b['scan']))}
404+
l1c_dim_sizes_dict = {"wavelength": len(dataset_l1b["wavelength"]),
405+
"scan": len(np.unique(dataset_l1b['scan']))}
421406

422-
dataset_l1c = self.hdsb.create_ds_template(l1c_dim_sizes_dict,"W_L1C",
407+
dataset_l1c = self.hdsb.create_ds_template(l1c_dim_sizes_dict, "W_L1C",
423408
propagate_ds=dataset_l1b)
424409
dataset_l1c = dataset_l1c.assign_coords(wavelength=dataset_l1b.wavelength)
425410

hypernets_processor/surface_reflectance/surface_reflectance.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,9 @@ def process_l1d(self, dataset_l1c):
4747
dataset_l1d["wavelength"].values)
4848
dataset_l1d["epsilon"].values = epsilon
4949

50-
flagval = 2 ** (self.context.get_config_value("simil_fail"))
51-
52-
dataset_l1d["quality_flag"].values = [
53-
flagval + dataset_l1d["quality_flag"].values[i] if failSimil[i] == True else
54-
dataset_l1d["quality_flag"].values[i] for i in range(len(failSimil))]
50+
dataset_l1d["quality_flag"][dataset_l1d["scan"] == [i for i, x in enumerate(failSimil) if x]] = du.set_flag(
51+
dataset_l1d["quality_flag"][dataset_l1d["scan"] == [i for i, x in enumerate(failSimil) if x]],
52+
"simil_fail")
5553

5654
input_vars = l1ctol1d_function.get_argument_names()
5755
input_qty = self.find_input(input_vars, dataset_l1d)
@@ -260,8 +258,13 @@ def l2_from_l1d_dataset(self, datasetl1d):
260258
"solar_zenith_angle"]:
261259
temp_arr = np.empty(len(series_id))
262260
for i in range(len(series_id)):
263-
ids = np.where((datasetl1d['series_id'] == series_id[i]) & (
264-
datasetl1d['quality_flag'] == 1))
261+
flags = ["saturation", "nonlinearity", "bad_pointing", "outliers",
262+
"angles_missing", "lu_eq_missing", "fresnel_angle_missing",
263+
"fresnel_default", "temp_variability_ed", "temp_variability_lu",
264+
"min_nbred", "min_nbrlu", "min_nbrlsky"]
265+
flagged = np.any([du.unpack_flags(datasetl1d['quality_flag'])[x] for x in flags], axis=0)
266+
ids = np.where(
267+
(datasetl1d['series_id'] == series_id[i]) & (flagged == False))
265268
temp_arr[i] = np.mean(datasetl1d[variablestring].values[ids])
266269
dataset_l2a[variablestring].values = temp_arr
267270

0 commit comments

Comments
 (0)