Skip to content

Commit d83e8aa

Browse files
committed
Merge remote-tracking branch 'origin/L1_and_L2_processing_structure' into L1_and_L2_processing_structure
# Conflicts: # hypernets_processor/data_io/format/variables.py # hypernets_processor/surface_reflectance/surface_reflectance.py
2 parents 5784b82 + dbe3593 commit d83e8aa

File tree

5 files changed

+103
-65
lines changed

5 files changed

+103
-65
lines changed

hypernets_processor/calibration/calibrate.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
__email__ = "[email protected]"
2020
__status__ = "Development"
2121

22-
2322
class Calibrate:
2423
def __init__(self, context, MCsteps=1000, parallel_cores=0):
2524
self._measurement_function_factory = MeasurementFunctionFactory()
@@ -121,7 +120,7 @@ def calc_mean_masked(self, dataset, var, rand_unc=False, corr=False):
121120
else:
122121
out = np.empty((len(series_id), len(dataset['wavelength'])))
123122
for i in range(len(series_id)):
124-
ids = np.where((dataset['series_id'] == series_id[i]) & (dataset['quality_flag'] == 1))
123+
ids = np.where((dataset['series_id'] == series_id[i]) & (dataset['quality_flag'] == 0))
125124
out[i] = np.mean(dataset[var].values[:, ids], axis=2)[:, 0]
126125
if rand_unc:
127126
out[i] = out[i] / len(ids[0])

hypernets_processor/data_io/hypernets_reader.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ def read_wavelength(self, pix):
132132
print("Wavelength range:", min(wvl), "-", max(wvl))
133133
return wvl
134134

135-
def read_series(self, seq_dir, series, lat, lon, metadata, fileformat):
135+
def read_series(self, seq_dir, series, lat, lon, metadata, flag, fileformat):
136136

137137
model_name = self.model
138138

@@ -195,8 +195,7 @@ def read_series(self, seq_dir, series, lat, lon, metadata, fileformat):
195195

196196
print("Wvl and Scan Dimensions:", len(wvl), scanDim)
197197
# use template from variables and metadata in format
198-
ds = HypernetsDSBuilder()
199-
ds = ds.create_ds_template(dim_sizes_dict=dim_sizes_dict, ds_format=fileformat)
198+
ds = HypernetsDSBuilder().create_ds_template(dim_sizes_dict=dim_sizes_dict, ds_format=fileformat)
200199

201200
ds["wavelength"] = wvl
202201
# ds["bandwidth"]=wvl
@@ -283,7 +282,7 @@ def read_series(self, seq_dir, series, lat, lon, metadata, fileformat):
283282
ds["solar_zenith_angle"][scan_number] = get_altitude(float(lat), float(lon), acquisitionTime)
284283
ds["solar_azimuth_angle"][scan_number] = get_azimuth(float(lat), float(lon), acquisitionTime)
285284

286-
# ds['quality_flag']
285+
ds['quality_flag'][scan_number] = flag
287286
ds['integration_time'][scan_number] = header['integration_time']
288287
ds['temperature'][scan_number] = header['temperature']
289288

@@ -317,7 +316,7 @@ def read_series(self, seq_dir, series, lat, lon, metadata, fileformat):
317316
def read_metadata(self, seq_dir):
318317

319318
model_name=self.model
320-
319+
flag=0
321320
# Spectra name : AA_BBB_CCCC_D_EEEE_FFF_GG_HHHH_II_JJJJ.spe
322321

323322
# A : iterator over "the sequence repeat time"
@@ -373,6 +372,7 @@ def read_metadata(self, seq_dir):
373372
if not lat.isdigit():
374373
print("Latitude is not given, use default")
375374
lat=self.context.get_config_value("lat")
375+
flag=flag+2**self.context.get_config_value("lat_default")
376376

377377
if 'longitude' in globalattr.keys():
378378
lon = globalattr['longitude']
@@ -382,6 +382,7 @@ def read_metadata(self, seq_dir):
382382
if not lon.isdigit():
383383
print("Longitude is not given, use default")
384384
lon=self.context.get_config_value("lon")
385+
flag=flag+2**self.context.get_config_value("lon_default")
385386

386387
# 2. Estimate wavelengths - NEED TO CHANGE HERE!!!!!!
387388
# ----------------------
@@ -433,7 +434,7 @@ def read_metadata(self, seq_dir):
433434
print("Missing metadata file in sequence directory - check sequence directory")
434435
exit()
435436

436-
return seq, lat, lon, cc, metadata, seriesIrr, seriesRad, seriesBlack, seriesPict
437+
return seq, lat, lon, cc, metadata, seriesIrr, seriesRad, seriesBlack, seriesPict,flag
437438

438439
def read_sequence(self, seq_dir, setfile=None):
439440

@@ -446,11 +447,11 @@ def read_sequence(self, seq_dir, setfile=None):
446447
L0_RAD = None
447448
L0_BLA = None
448449

449-
seq, lat, lon, cc, metadata, seriesIrr, seriesRad, seriesBlack, seriesPict = self.read_metadata(
450+
seq, lat, lon, cc, metadata, seriesIrr, seriesRad, seriesBlack, seriesPict, flag = self.read_metadata(
450451
seq_dir)
451452

452453
if seriesIrr:
453-
L0_IRR = self.read_series(seq_dir, seriesIrr, lat, lon, metadata, "L0_IRR")
454+
L0_IRR = self.read_series(seq_dir, seriesIrr, lat, lon, metadata, flag, "L0_IRR")
454455

455456
# can't use this when non concatanted spectra
456457
# if all([os.path.isfile(os.path.join(seq_dir,"RADIOMETER/",f)) for f in seriesIrr]):
@@ -461,7 +462,7 @@ def read_sequence(self, seq_dir, setfile=None):
461462
print("No irradiance data for this sequence")
462463

463464
if seriesRad:
464-
L0_RAD = self.read_series(seq_dir, seriesRad, lat, lon, metadata, "L0_RAD")
465+
L0_RAD = self.read_series(seq_dir, seriesRad, lat, lon, metadata,flag, "L0_RAD")
465466
# if all([os.path.isfile(os.path.join(seq_dir,"RADIOMETER/",f)) for f in seriesRad]):
466467
# L0_RAD=read_series(seriesRad,cc, lat, lon, metadata, "L0_RAD")
467468
# else:
@@ -470,7 +471,7 @@ def read_sequence(self, seq_dir, setfile=None):
470471
print("No radiance data for this sequence")
471472

472473
if seriesBlack:
473-
L0_BLA = self.read_series(seq_dir, seriesBlack, lat, lon, metadata, "L0_BLA")
474+
L0_BLA = self.read_series(seq_dir, seriesBlack, lat, lon, metadata,flag, "L0_BLA")
474475
# if all([os.path.isfile(os.path.join(seq_dir, "RADIOMETER/", f)) for f in seriesBlack]):
475476
# L0_BLA = self.read_series(seq_dir, seriesBlack, cc, lat, lon, metadata, "L0_BLA")
476477
else:
@@ -484,7 +485,6 @@ def read_sequence(self, seq_dir, setfile=None):
484485
return L0_IRR, L0_RAD, L0_BLA
485486

486487
def read_flag(self, flagint):
487-
#flag = 2 ** 1 + 2 ** 3 + 2 ** 5 # 2+8+32
488488
flagarray = 2 ** (np.linspace(0, 31, 32))
489489
flags = []
490490
while flagint:

hypernets_processor/etc/processor.config

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,20 @@ test_sun_wave: 750
5757
test_sun_threshold: 0.05
5858
test_var_wave: 780
5959
test_var_threshold: 0.10
60+
61+
[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
70+
## inf_or_nan:15
71+
min_nbred:16
72+
min_nbrlu:17
73+
min_nrblsky:18
74+
simil_fail:19
75+
wind_default:20
76+

hypernets_processor/rhymer/rhymer/hypstar/rhymer_hypstar.py

Lines changed: 73 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -85,22 +85,28 @@ def qc_scan(self, dataset, measurandstring):
8585

8686
## continue if value exceeds the cv threshold
8787
if v > self.context.get_config_value("diff_threshold"):
88-
# set quality flag to 10
89-
dataset['quality_flag'][scans[i]] = 10
88+
# get flag value for the temporal variability
89+
if measurandstring == 'irradiance':
90+
flagval=2 ** (self.context.get_config_value("temp_variability_ed"))
91+
else:
92+
flagval = 2 ** (self.context.get_config_value("temp_variability_lu"))
93+
94+
dataset['quality_flag'][scans[i]] = dataset['quality_flag'][scans[i]]+flagval
9095
seq = dataset.attrs["sequence_id"]
9196
ts = datetime.utcfromtimestamp(dataset['acquisition_time'][i])
9297

9398
if verbosity > 2: print('Temporal jump: in {}: Aquisition time {}, {}'.format(seq, ts, ', '.join(
9499
['{}:{}'.format(k, dataset[k][scans[i]].values) for k in ['scan', 'quality_flag']])))
95100

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

105111
return dataset
106112

@@ -111,6 +117,9 @@ def cycleparse(self, rad, irr):
111117
nbrlu = self.context.get_config_value("n_upwelling_rad")
112118
nbred = self.context.get_config_value("n_upwelling_irr")
113119
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")
114123

115124
if protocol != 'water_std':
116125
# here we should simply provide surface reflectance?
@@ -131,6 +140,8 @@ def cycleparse(self, rad, irr):
131140
senz = float(senz)
132141
sena = abs(float(sena))
133142
else:
143+
flagval = 2 ** (self.context.get_config_value("angles_missing"))
144+
scani['quality_flag'] = scani['quality_flag'] + flagval
134145
if self.context.get_config_value("verbosity") > 2: print(
135146
'NULL angles: Aquisition time {}, {}'.format(ts, ', '.join(
136147
['{}:{}'.format(k, scani[k].values) for k in ['scan', 'quality_flag']])))
@@ -155,7 +166,8 @@ def cycleparse(self, rad, irr):
155166
sena_lsky = np.unique(lsky["viewing_azimuth_angle"].values)
156167
for i in sena_lu:
157168
if i not in sena_lsky:
158-
lu["quality_flag"][lu["viewing_azimuth_angle"] == i] = 10
169+
flagval=self.context.get_config_value("lu_eq_missing")
170+
lu["quality_flag"][lu["viewing_azimuth_angle"] == i] = lu["quality_flag"][lu["viewing_azimuth_angle"] == i]+2**flagval
159171
if self.context.get_config_value("verbosity") > 2:
160172
ts = [datetime.utcfromtimestamp(x) for x in
161173
lu['acquisition_time'][lu["viewing_azimuth_angle"] == i].values]
@@ -169,7 +181,8 @@ def cycleparse(self, rad, irr):
169181
senz_lsky = 180 - np.unique(lsky["viewing_zenith_angle"].values)
170182
for i in senz_lu:
171183
if i not in senz_lsky:
172-
lu["quality_flag"][lu["viewing_zenith_angle"] == i] = 10
184+
flagval = self.context.get_config_value("fresnel_angle_missing")
185+
lu["quality_flag"][lu["viewing_azimuth_angle"] == i] = lu["quality_flag"][lu["viewing_azimuth_angle"] == i] + 2 ** flagval
173186
if self.context.get_config_value("verbosity") > 2:
174187
ts = [datetime.utcfromtimestamp(x) for x in
175188
lu['acquisition_time'][lu["viewing_zenith_angle"] == i].values]
@@ -180,14 +193,21 @@ def cycleparse(self, rad, irr):
180193
in ['scan', 'quality_flag']])))
181194

182195
# check if correct number of radiance and irradiance data
183-
if lu.scan[lu['quality_flag'] <= 1].count() < nbrlu:
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+
200+
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']]
184202
if self.context.get_config_value("verbosity") > 2:
185203
print("No enough upwelling radiance data for sequence {}".format(lu.attrs['sequence_id']))
186204
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']]
187206
if self.context.get_config_value("verbosity") > 2:
188207
print("No enough downwelling radiance data for sequence {}".format(lsky.attrs['sequence_id']))
189208

190209
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']]
191211
if self.context.get_config_value("verbosity") > 2:
192212
print("No enough irradiance data for sequence {}".format(irr.attrs['sequence_id']))
193213

@@ -198,9 +218,11 @@ def get_wind(self, l1b):
198218
lat = l1b.attrs['site_latitude']
199219
lon = l1b.attrs['site_latitude']
200220
wind = []
221+
flagval = self.context.get_config_value("wind_default")
201222
for i in range(len(l1b.scan)):
202223
wa = self.context.get_config_value("wind_ancillary")
203224
if wa == False:
225+
l1b.sel(scan=i)["quality_flag"]=l1b.sel(scan=i)["quality_flag"] + 2 ** flagval
204226
print("Default wind speed {}".format(self.context.get_config_value("wind_default")))
205227
wind.append(self.context.get_config_value("wind_default"))
206228
else:
@@ -237,15 +259,15 @@ def get_fresnelrefl(self, l1b):
237259

238260
## get fresnel reflectance
239261
if self.context.get_config_value("fresnel_option") == 'Mobley':
240-
# check here if no inconsistency between LUT and fresnel option??
241-
rholut = self.rhymerproc.mobley_lut_read()
242262
if (fresnel_sza[i] is not None) & (fresnel_raa[i] is not None):
243263
sza = min(fresnel_sza[i], 79.999)
244264
rhof = self.rhymerproc.mobley_lut_interp(sza, fresnel_vza[i], fresnel_raa[i],
245265
wind=wind[i])
246266
else:
247267
# add a quality flag!
248-
fresnel = 'fixed'
268+
flagval = self.context.get_config_value("fresnel_default")
269+
l1b["quality_flag"][i].values = l1b["quality_flag"][i].values + 2 ** flagval
270+
rhof = self.context.get_config_value("rhof_default")
249271

250272
if self.context.get_config_value("fresnel_option") == 'Ruddick2006':
251273
rhof = self.context.get_config_value("rhof_default")
@@ -262,31 +284,31 @@ def get_fresnelrefl(self, l1b):
262284

263285
return l1b
264286

265-
def get_epsilon(self, rhow_nosc, wavelength):
266-
267-
# wavelength = l1b['wavelength'].values
268-
epsilon = np.zeros(len(rhow_nosc))
269-
270-
## compute similarity epsilon
271-
for i in range(len(rhow_nosc)):
272-
fail_simil, eps = self.qc_similarity(wavelength, rhow_nosc[i],
273-
self.similarity_wr,
274-
self.similarity_wp,
275-
self.similarity_w1,
276-
self.similarity_w2,
277-
self.similarity_alpha)
278-
279-
## R2005 quality control
280-
## skip spectra not following similarity
281-
if self.similarity_test:
282-
if fail_simil:
283-
if verbosity > 2: print('Failed simil test.')
284-
continue
285-
else:
286-
if verbosity > 2: print('Passed simil test.')
287-
epsilon[i] = eps
288-
# l1b["epsilon"].values=epsilon
289-
return epsilon
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
290312

291313
def get_rhow_nosc(self, l1b):
292314

@@ -407,16 +429,16 @@ def fresnelrefl_qc_simil(self, l1b, wind):
407429
self.similarity_w2,
408430
self.similarity_alpha)
409431

410-
## R2005 quality control
411-
## skip spectra not following similarity
412-
if self.similarity_test:
413-
if fail_simil:
414-
if verbosity > 2: print('Failed simil test.')
415-
simil_flag[i] = 10
416-
continue
417-
else:
418-
if verbosity > 2: print('Passed simil test.')
419-
simil_flag[i] = 0
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
420442

421443
## R2005 correction
422444
if self.similarity_correct:

hypernets_processor/surface_reflectance/measurement_functions/water_network_protocol.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def function(self,upwelling_radiance,downwelling_radiance,irradiance,rhof,epsilo
1313

1414
rhow_all = [r - epsilon for r in rhow_nosc_all]
1515

16-
return lw_all, rhow_nosc_all, rhow_all
16+
return lw_all, rhow_nosc_all, rhow_all, epsilon
1717

1818
@staticmethod
1919
def get_name():

0 commit comments

Comments
 (0)