Skip to content

Commit 8cfe2c7

Browse files
authored
Include plots (#93)
* final edits for v 0.1 * fixing uncertainties and correlation matrices Co-authored-by: Pieter De Vis <pieter.de.vis@npl.co.uk>
1 parent 1d54538 commit 8cfe2c7

File tree

13 files changed

+1895
-149
lines changed

13 files changed

+1895
-149
lines changed

hypernets_processor/calibration/calibrate.py

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ def calibrate_l1a(self, measurandstring, dataset_l0, dataset_l0_bla, swir=False)
7777
if self.context.get_config_value("plot_l1a_diff"):
7878
self.plot.plot_diff_scans(measurandstring,dataset_l1a)
7979

80+
if self.context.get_config_value("plot_uncertainty"):
81+
self.plot.plot_relative_uncertainty(measurandstring,dataset_l1a)
82+
8083
return dataset_l1a
8184

8285
def prepare_calibration_data(self,measurandstring, swir=False):
@@ -153,9 +156,11 @@ def prepare_calibration_data(self,measurandstring, swir=False):
153156
return calibration_data, wavids
154157

155158
def find_nearest_black(self, dataset, acq_time, int_time):
156-
ids = np.where(
157-
(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
159+
ids = np.where((abs(dataset['acquisition_time'] - acq_time) ==
160+
min(abs(dataset['acquisition_time'] - acq_time))) &
161+
(dataset['integration_time'] == int_time))
162+
#todo check if interation time alwasy has to be same
163+
159164
return np.mean(dataset["digital_number"].values[:, ids], axis=2)[:, 0]
160165

161166
def find_input(self, variables, dataset, datasetbla, ancillary_dataset):
@@ -259,17 +264,24 @@ def preprocess_l0(self, datasetl0, datasetl0_bla, wavids):
259264

260265
DN_rand = DatasetUtil.create_variable([len(datasetl0["wavelength"]), len(datasetl0["scan"])],
261266
dim_names=["wavelength", "scan"], dtype=np.uint32, fill_value=0)
262-
DN_syst = DatasetUtil.create_variable([len(datasetl0["wavelength"]), len(datasetl0["scan"])],
263-
dim_names=["wavelength", "scan"], dtype=np.uint32, fill_value=0)
264267

265268
datasetl0["u_random_digital_number"] = DN_rand
266269

267-
std = (datasetl0['digital_number'].where(mask==1)-datasetl0['digital_number'].where(datasetl0.quality_flag == 0)).std(dim="scan")
268270
rand = np.zeros_like(DN_rand.values)
269-
for i in range(len(datasetl0["scan"])):
270-
rand[:, i] = std
271+
series_ids = np.unique(datasetl0['series_id'])
272+
for i in range(len(series_ids)):
273+
ids = np.where(datasetl0['series_id'] == series_ids[i])[0]
274+
ids_masked = np.where((datasetl0['series_id'] == series_ids[i]) & (mask == 0))[0]
275+
dark_signals=np.zeros_like(datasetl0['digital_number'].values[:,ids_masked])
276+
for ii,id in enumerate(ids_masked):
277+
dark_signals[:,ii] = self.find_nearest_black(datasetl0_bla,
278+
datasetl0['acquisition_time'].values[id],
279+
datasetl0['integration_time'].values[id])
280+
std = np.std((datasetl0['digital_number'].values[:,ids_masked]-dark_signals), axis=1)
281+
for ii,id in enumerate(ids):
282+
rand[:, id] = std
283+
271284
datasetl0["u_random_digital_number"].values = rand
272-
datasetl0["u_systematic_digital_number"] = DN_syst
273285

274286
return datasetl0, datasetl0_bla
275287

@@ -280,13 +292,13 @@ def clip_and_mask(self, dataset, dataset_bla, k_unc=3):
280292

281293
# check if integrated signal is outlier
282294
series_ids = np.unique(dataset['series_id'])
283-
out = np.empty((len(series_ids), len(dataset['wavelength'])))
284295
for i in range(len(series_ids)):
285296
ids = np.where(dataset['series_id'] == series_ids[i])
286297
dark_signals = self.find_nearest_black(dataset_bla,np.mean(
287298
dataset['acquisition_time'].values[ids]),np.mean(
288299
dataset['integration_time'].values[ids]))
289-
intsig = np.nanmean((dataset["digital_number"].values[:, ids]-dark_signals[:,None,None]), axis=0)[0]
300+
intsig = np.nanmean((dataset["digital_number"].values[:, ids]-
301+
dark_signals[:,None,None]), axis=0)[0]
290302
noisestd, noiseavg = self.sigma_clip(intsig) # calculate std and avg for non NaN columns
291303
maski = np.zeros_like(intsig) # mask the columns that have NaN
292304
maski[np.where(np.abs(intsig - noiseavg) >= k_unc * noisestd)] = 1

hypernets_processor/calibration/measurement_functions/standard_measurement_function.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def function(self,digital_number,gains,dark_signal,non_linear,int_time):
1010
Each of the arguments can be either a scalar or a vector (1D-array).
1111
'''
1212
DN=digital_number-dark_signal
13+
DN[DN==0]=1
1314
corrected_DN = DN /(non_linear[0]+non_linear[1]*DN+
1415
non_linear[2]*DN**2+
1516
non_linear[3]*DN**3+

hypernets_processor/combine_SWIR/combine_SWIR.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ def combine(self,measurandstring,dataset_l1a,dataset_l1a_swir):
9191
if self.context.get_config_value("plot_l1b"):
9292
self.plot.plot_series_in_sequence(measurandstring,dataset_l1b_comb)
9393

94+
if self.context.get_config_value("plot_uncertainty"):
95+
self.plot.plot_relative_uncertainty(measurandstring,dataset_l1b_comb)
96+
9497
# if self.context.get_config_value("plot_diff"):
9598
# self.plot.plot_diff_scans(measurandstring,dataset_l1a,dataset_l1b)
9699

0 commit comments

Comments
 (0)