Skip to content

Commit d59d818

Browse files
committed
modifications required for different land and water flags
1 parent 09f3906 commit d59d818

File tree

4 files changed

+106
-90
lines changed

4 files changed

+106
-90
lines changed

hypernets_processor/calibration/calibrate.py

Lines changed: 82 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import os
1515
import glob
1616

17-
1817
'''___Authorship___'''
1918
__author__ = "Pieter De Vis"
2019
__created__ = "12/04/2020"
@@ -23,6 +22,7 @@
2322
__email__ = "Pieter.De.Vis@npl.co.uk"
2423
__status__ = "Development"
2524

25+
2626
class Calibrate:
2727
def __init__(self, context, MCsteps=1000, parallel_cores=0):
2828
self._measurement_function_factory = MeasurementFunctionFactory()
@@ -43,7 +43,7 @@ def calibrate_l1a(self, measurandstring, dataset_l0, dataset_l0_bla):
4343
input_vars = calibrate_function.get_argument_names()
4444

4545
calibration_data, wavids = self.prepare_calibration_data(measurandstring)
46-
dataset_l0,dataset_l0_bla = self.preprocess_l0(dataset_l0,dataset_l0_bla,wavids)
46+
dataset_l0, dataset_l0_bla = self.preprocess_l0(dataset_l0, dataset_l0_bla, wavids)
4747
dataset_l1a = self.l1a_template_from_l0_dataset(measurandstring, dataset_l0)
4848

4949
input_qty_l1a = self.find_input(input_vars, dataset_l0, dataset_l0_bla, calibration_data)
@@ -57,7 +57,7 @@ def calibrate_l1a(self, measurandstring, dataset_l0, dataset_l0_bla):
5757
self.writer.write(dataset_l1a, overwrite=True)
5858

5959
if self.context.get_config_value("plot_l1a"):
60-
self.plot.plot_scans_in_series(measurandstring,dataset_l1a)
60+
self.plot.plot_scans_in_series(measurandstring, dataset_l1a)
6161

6262
return dataset_l1a
6363

@@ -71,41 +71,39 @@ def calibrate_l1a(self, measurandstring, dataset_l0, dataset_l0_bla):
7171
# elif self.context.get_config_value("network")=="L":
7272
# non_lin_func=np.poly1d(non_linear_cals[:,0])
7373

74-
def prepare_calibration_data(self,measurandstring):
75-
hypstar=self.context.get_config_value("hypstar_cal_number")
76-
directory=self.context.get_config_value("calibration_directory")
74+
def prepare_calibration_data(self, measurandstring):
75+
hypstar = self.context.get_config_value("hypstar_cal_number")
76+
directory = self.context.get_config_value("calibration_directory")
7777
print(directory)
78-
caldates=[os.path.basename(path) for path in glob.glob
79-
(os.path.join(directory,"hypstar_"+str(hypstar)+"/radiometric/*"))]
80-
caldate=caldates[0]
78+
caldates = [os.path.basename(path) for path in glob.glob
79+
(os.path.join(directory, "hypstar_" + str(hypstar) + "/radiometric/*"))]
80+
caldate = caldates[0]
8181
for f in glob.glob(os.path.join(directory,
82-
"hypstar_"+str(hypstar)+"/radiometric/"+str(caldate)+
83-
"/hypstar_"+str(hypstar)+"_nonlin_corr_coefs_*.dat")):
82+
"hypstar_" + str(hypstar) + "/radiometric/" + str(caldate) +
83+
"/hypstar_" + str(hypstar) + "_nonlin_corr_coefs_*.dat")):
8484
non_linear_cals = np.genfromtxt(f)
8585

86-
8786
if measurandstring == "radiance":
8887
for f in glob.glob(os.path.join(directory,
89-
"hypstar_"+str(hypstar)+"/radiometric/"+str(
90-
caldate)+"/hypstar_"+str(
91-
hypstar)+"_radcal_L_*_vnir.dat")):
88+
"hypstar_" + str(hypstar) + "/radiometric/" + str(
89+
caldate) + "/hypstar_" + str(
90+
hypstar) + "_radcal_L_*_vnir.dat")):
9291
gains = np.genfromtxt(f)
93-
wavids=[int(gains[0,0]),int(gains[-1,0])+1]
92+
wavids = [int(gains[0, 0]), int(gains[-1, 0]) + 1]
9493
else:
9594
for f in glob.glob(os.path.join(directory,
96-
"hypstar_"+str(hypstar)+"/radiometric/"+str(
97-
caldate)+"/hypstar_"+str(
98-
hypstar)+"_radcal_E_*_vnir.dat")):
95+
"hypstar_" + str(hypstar) + "/radiometric/" + str(
96+
caldate) + "/hypstar_" + str(
97+
hypstar) + "_radcal_E_*_vnir.dat")):
9998
gains = np.genfromtxt(f)
100-
wavids=[int(gains[0,0]),int(gains[-1,0])+1]
101-
99+
wavids = [int(gains[0, 0]), int(gains[-1, 0]) + 1]
102100

103101
calibration_data = {}
104-
calibration_data["gains"] = gains[:,2]
105-
calibration_data["u_random_gains"] = gains[:,2]*gains[:,19]/100
106-
calibration_data["u_systematic_gains"] = gains[:,2]*gains[:,3]/100
102+
calibration_data["gains"] = gains[:, 2]
103+
calibration_data["u_random_gains"] = gains[:, 2] * gains[:, 19] / 100
104+
calibration_data["u_systematic_gains"] = gains[:, 2] * gains[:, 3] / 100
107105

108-
calibration_data["non_linearity_coefficients"] = non_linear_cals[:,0]
106+
calibration_data["non_linearity_coefficients"] = non_linear_cals[:, 0]
109107
calibration_data["u_random_non_linearity_coefficients"] = None
110108
calibration_data["u_systematic_non_linearity_coefficients"] = None
111109

@@ -130,10 +128,10 @@ def average_l1b(self, measurandstring, dataset_l1a):
130128
self.writer.write(dataset_l1b, overwrite=True)
131129

132130
if self.context.get_config_value("plot_l1b"):
133-
self.plot.plot_series_in_sequence(measurandstring,dataset_l1b)
131+
self.plot.plot_series_in_sequence(measurandstring, dataset_l1b)
134132

135133
if self.context.get_config_value("plot_diff"):
136-
self.plot.plot_diff_scans(measurandstring,dataset_l1a,dataset_l1b)
134+
self.plot.plot_diff_scans(measurandstring, dataset_l1a, dataset_l1b)
137135
return dataset_l1b
138136

139137
def calc_mean_masked(self, dataset, var, rand_unc=False, corr=False):
@@ -144,7 +142,7 @@ def calc_mean_masked(self, dataset, var, rand_unc=False, corr=False):
144142
out = np.empty((len(series_id), len(dataset['wavelength'])))
145143
for i in range(len(series_id)):
146144
ids = np.where((dataset['series_id'] == series_id[i]) &
147-
np.invert(DatasetUtil.unpack_flags(dataset["quality_flag"])["outliers"]))
145+
np.invert(DatasetUtil.unpack_flags(dataset["quality_flag"])["outliers"]))
148146
out[i] = np.mean(dataset[var].values[:, ids], axis=2)[:, 0]
149147
if rand_unc:
150148
out[i] = out[i] / len(ids[0])
@@ -155,7 +153,7 @@ def calc_mean_masked(self, dataset, var, rand_unc=False, corr=False):
155153
def find_nearest_black(self, dataset, acq_time, int_time):
156154
ids = np.where(
157155
(abs(dataset['acquisition_time'] - acq_time) == min(abs(dataset['acquisition_time'] - acq_time))) & (
158-
dataset['integration_time'] == int_time)) #todo check if interation time alwasy has to be same
156+
dataset['integration_time'] == int_time)) # todo check if interation time alwasy has to be same
159157
return np.mean(dataset["digital_number"].values[:, ids], axis=2)[:, 0]
160158

161159
def find_input(self, variables, dataset, datasetbla, ancillary_dataset):
@@ -248,20 +246,22 @@ def preprocess_l0(self, datasetl0, datasetl0_bla, wavids):
248246
:return:
249247
:rtype:
250248
"""
251-
datasetl0=datasetl0.isel(wavelength=slice(wavids[0],wavids[1]))
252-
datasetl0_bla=datasetl0_bla.isel(wavelength=slice(wavids[0],wavids[1]))
253-
mask = self.clip_and_mask(datasetl0,datasetl0_bla)
249+
datasetl0 = datasetl0.isel(wavelength=slice(wavids[0], wavids[1]))
250+
datasetl0_bla = datasetl0_bla.isel(wavelength=slice(wavids[0], wavids[1]))
251+
mask = self.clip_and_mask(datasetl0, datasetl0_bla)
254252

255-
datasetl0["quality_flag"][np.where(mask==1)] = DatasetUtil.set_flag(datasetl0["quality_flag"][np.where(mask==1)],"outliers") #for i in range(len(mask))]
253+
datasetl0["quality_flag"][np.where(mask == 1)] = DatasetUtil.set_flag(
254+
datasetl0["quality_flag"][np.where(mask == 1)], "outliers") # for i in range(len(mask))]
256255

257256
DN_rand = DatasetUtil.create_variable([len(datasetl0["wavelength"]), len(datasetl0["scan"])],
258-
dim_names=["wavelength", "scan"], dtype=np.uint32, fill_value=0)
257+
dim_names=["wavelength", "scan"], dtype=np.uint32, fill_value=0)
259258
DN_syst = DatasetUtil.create_variable([len(datasetl0["wavelength"]), len(datasetl0["scan"])],
260-
dim_names=["wavelength", "scan"], dtype=np.uint32, fill_value=0)
259+
dim_names=["wavelength", "scan"], dtype=np.uint32, fill_value=0)
261260

262261
datasetl0["u_random_digital_number"] = DN_rand
263262

264-
std = (datasetl0['digital_number'].where(mask==1)-datasetl0['digital_number'].where(datasetl0.quality_flag == 0)).std(dim="scan")
263+
std = (datasetl0['digital_number'].where(mask == 1) - datasetl0['digital_number'].where(
264+
datasetl0.quality_flag == 0)).std(dim="scan")
265265
rand = np.zeros_like(DN_rand.values)
266266
for i in range(len(datasetl0["scan"])):
267267
rand[:, i] = std
@@ -280,16 +280,15 @@ def clip_and_mask(self, dataset, dataset_bla, k_unc=3):
280280
out = np.empty((len(series_ids), len(dataset['wavelength'])))
281281
for i in range(len(series_ids)):
282282
ids = np.where(dataset['series_id'] == series_ids[i])
283-
dark_signals = self.find_nearest_black(dataset_bla,np.mean(
284-
dataset['acquisition_time'].values[ids]),np.mean(
283+
dark_signals = self.find_nearest_black(dataset_bla, np.mean(
284+
dataset['acquisition_time'].values[ids]), np.mean(
285285
dataset['integration_time'].values[ids]))
286-
intsig = np.nanmean((dataset["digital_number"].values[:, ids]-dark_signals[:,None,None]), axis=0)[0]
287-
noisestd, noiseavg = self.sigma_clip(intsig) # calculate std and avg for non NaN columns
288-
maski = np.zeros_like(intsig) # mask the columns that have NaN
286+
intsig = np.nanmean((dataset["digital_number"].values[:, ids] - dark_signals[:, None, None]), axis=0)[0]
287+
noisestd, noiseavg = self.sigma_clip(intsig) # calculate std and avg for non NaN columns
288+
maski = np.zeros_like(intsig) # mask the columns that have NaN
289289
maski[np.where(np.abs(intsig - noiseavg) >= k_unc * noisestd)] = 1
290290
mask = np.append(mask, maski)
291291

292-
293292
# check if 10% of pixels are outiers
294293

295294
# mask_wvl = np.zeros((len(datasetl0["wavelength"]),len(datasetl0["scan"])))
@@ -343,13 +342,20 @@ def l1a_template_from_l0_dataset(self, measurandstring, dataset_l0):
343342
"""
344343

345344
l1a_dim_sizes_dict = {"wavelength": len(dataset_l0["wavelength"]), "scan": len(dataset_l0["scan"])}
346-
if measurandstring == "radiance":
347-
dataset_l1a = self.hdsb.create_ds_template(l1a_dim_sizes_dict, ds_format="L_L1A_RAD",
348-
propagate_ds=dataset_l0)
349-
elif measurandstring == "irradiance":
350-
dataset_l1a = self.hdsb.create_ds_template(l1a_dim_sizes_dict, "L_L1A_IRR", propagate_ds=dataset_l0)
345+
if self.context.get_config_value("network") == "l":
346+
if measurandstring == "radiance":
347+
dataset_l1a = self.hdsb.create_ds_template(l1a_dim_sizes_dict, ds_format="L_L1A_RAD",
348+
propagate_ds=dataset_l0)
349+
elif measurandstring == "irradiance":
350+
dataset_l1a = self.hdsb.create_ds_template(l1a_dim_sizes_dict, "L_L1A_IRR", propagate_ds=dataset_l0)
351+
else:
352+
if measurandstring == "radiance":
353+
dataset_l1a = self.hdsb.create_ds_template(l1a_dim_sizes_dict, ds_format="W_L1A_RAD",
354+
propagate_ds=dataset_l0)
355+
elif measurandstring == "irradiance":
356+
dataset_l1a = self.hdsb.create_ds_template(l1a_dim_sizes_dict, "W_L1A_IRR", propagate_ds=dataset_l0)
351357

352-
dataset_l1a=dataset_l1a.assign_coords(wavelength=dataset_l0.wavelength)
358+
dataset_l1a = dataset_l1a.assign_coords(wavelength=dataset_l0.wavelength)
353359

354360
return dataset_l1a
355361

@@ -364,25 +370,27 @@ def l1b_template_from_l1a_dataset(self, measurandstring, dataset_l1a):
364370
"""
365371
l1b_dim_sizes_dict = {"wavelength": len(dataset_l1a["wavelength"]),
366372
"series": len(np.unique(dataset_l1a['series_id']))}
373+
if self.context.get_config_value("network") == "l":
374+
dataset_l1b = self.hdsb.create_ds_template(l1b_dim_sizes_dict, "W_L1B", propagate_ds=dataset_l1a)
375+
dataset_l1b = dataset_l1b.assign_coords(wavelength=dataset_l1a.wavelength)
367376

368-
if measurandstring == "radiance":
369-
dataset_l1b = self.hdsb.create_ds_template(l1b_dim_sizes_dict, "L_L1B_RAD", propagate_ds=dataset_l1a)
370-
elif measurandstring == "irradiance":
371-
dataset_l1b = self.hdsb.create_ds_template(l1b_dim_sizes_dict, "L_L1B_IRR", propagate_ds=dataset_l1a)
372-
373-
dataset_l1b=dataset_l1b.assign_coords(wavelength=dataset_l1a.wavelength)
374-
375-
series_id = np.unique(dataset_l1a['series_id'])
376-
dataset_l1b["series_id"].values = series_id
377-
378-
for variablestring in ["acquisition_time", "viewing_azimuth_angle", "viewing_zenith_angle",
379-
"solar_azimuth_angle", "solar_zenith_angle"]:
380-
temp_arr = np.empty(len(series_id))
381-
for i in range(len(series_id)):
382-
ids = np.where((dataset_l1a['series_id'] == series_id[i]) & np.invert(
383-
DatasetUtil.unpack_flags(dataset_l1a["quality_flag"])["outliers"]))
384-
temp_arr[i] = np.mean(dataset_l1a[variablestring].values[ids])
385-
dataset_l1b[variablestring].values = temp_arr
377+
else:
378+
if measurandstring == "radiance":
379+
dataset_l1b = self.hdsb.create_ds_template(l1b_dim_sizes_dict, "L_L1B_RAD", propagate_ds=dataset_l1a)
380+
elif measurandstring == "irradiance":
381+
dataset_l1b = self.hdsb.create_ds_template(l1b_dim_sizes_dict, "L_L1B_IRR", propagate_ds=dataset_l1a)
382+
dataset_l1b = dataset_l1b.assign_coords(wavelength=dataset_l1a.wavelength)
383+
series_id = np.unique(dataset_l1a['series_id'])
384+
dataset_l1b["series_id"].values = series_id
385+
386+
for variablestring in ["acquisition_time", "viewing_azimuth_angle", "viewing_zenith_angle",
387+
"solar_azimuth_angle", "solar_zenith_angle"]:
388+
temp_arr = np.empty(len(series_id))
389+
for i in range(len(series_id)):
390+
ids = np.where((dataset_l1a['series_id'] == series_id[i]) & np.invert(
391+
DatasetUtil.unpack_flags(dataset_l1a["quality_flag"])["outliers"]))
392+
temp_arr[i] = np.mean(dataset_l1a[variablestring].values[ids])
393+
dataset_l1b[variablestring].values = temp_arr
386394

387395
return dataset_l1b
388396

@@ -392,10 +400,10 @@ def process_measurement_function(self, measurandstring, dataset, measurement_fun
392400
datashape = input_quantities[0].shape
393401
for i in range(len(input_quantities)):
394402
if len(input_quantities[i].shape) < len(datashape):
395-
if input_quantities[i].shape[0]==datashape[1]:
396-
input_quantities[i] = np.tile(input_quantities[i],(datashape[0],1))
403+
if input_quantities[i].shape[0] == datashape[1]:
404+
input_quantities[i] = np.tile(input_quantities[i], (datashape[0], 1))
397405
else:
398-
input_quantities[i] = np.tile(input_quantities[i],(datashape[1],1)).T
406+
input_quantities[i] = np.tile(input_quantities[i], (datashape[1], 1)).T
399407

400408
if u_random_input_quantities[i] is not None:
401409
if len(u_random_input_quantities[i].shape) < len(datashape):
@@ -404,12 +412,14 @@ def process_measurement_function(self, measurandstring, dataset, measurement_fun
404412
measurand = measurement_function(*input_quantities)
405413

406414
u_random_measurand = self.prop.propagate_random(measurement_function, input_quantities,
407-
u_random_input_quantities,repeat_dims=1)
415+
u_random_input_quantities, repeat_dims=1)
408416
u_systematic_measurand, corr_systematic_measurand = self.prop.propagate_systematic(measurement_function,
409417
input_quantities,
410-
u_systematic_input_quantities,cov_x=['rand']*len(u_systematic_input_quantities),
418+
u_systematic_input_quantities,
419+
cov_x=['rand'] * len(
420+
u_systematic_input_quantities),
411421
return_corr=True,
412-
repeat_dims=1,corr_axis=0)
422+
repeat_dims=1, corr_axis=0)
413423
dataset[measurandstring].values = measurand
414424
dataset["u_random_" + measurandstring].values = u_random_measurand
415425
dataset["u_systematic_" + measurandstring].values = u_systematic_measurand

hypernets_processor/etc/job_CG.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ verbose = True
1616
quiet = False
1717

1818
[Processor]
19-
network = l
19+
network = w
2020

2121
[Output]
2222
product_format = netcdf

0 commit comments

Comments
 (0)