@@ -77,6 +77,9 @@ def calibrate_l1a(self, measurandstring, dataset_l0, dataset_l0_bla, swir=False)
77
77
if self .context .get_config_value ("plot_l1a_diff" ):
78
78
self .plot .plot_diff_scans (measurandstring ,dataset_l1a )
79
79
80
+ if self .context .get_config_value ("plot_uncertainty" ):
81
+ self .plot .plot_relative_uncertainty (measurandstring ,dataset_l1a )
82
+
80
83
return dataset_l1a
81
84
82
85
def prepare_calibration_data (self ,measurandstring , swir = False ):
@@ -153,9 +156,11 @@ def prepare_calibration_data(self,measurandstring, swir=False):
153
156
return calibration_data , wavids
154
157
155
158
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
+
159
164
return np .mean (dataset ["digital_number" ].values [:, ids ], axis = 2 )[:, 0 ]
160
165
161
166
def find_input (self , variables , dataset , datasetbla , ancillary_dataset ):
@@ -259,17 +264,24 @@ def preprocess_l0(self, datasetl0, datasetl0_bla, wavids):
259
264
260
265
DN_rand = DatasetUtil .create_variable ([len (datasetl0 ["wavelength" ]), len (datasetl0 ["scan" ])],
261
266
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 )
264
267
265
268
datasetl0 ["u_random_digital_number" ] = DN_rand
266
269
267
- std = (datasetl0 ['digital_number' ].where (mask == 1 )- datasetl0 ['digital_number' ].where (datasetl0 .quality_flag == 0 )).std (dim = "scan" )
268
270
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
+
271
284
datasetl0 ["u_random_digital_number" ].values = rand
272
- datasetl0 ["u_systematic_digital_number" ] = DN_syst
273
285
274
286
return datasetl0 , datasetl0_bla
275
287
@@ -280,13 +292,13 @@ def clip_and_mask(self, dataset, dataset_bla, k_unc=3):
280
292
281
293
# check if integrated signal is outlier
282
294
series_ids = np .unique (dataset ['series_id' ])
283
- out = np .empty ((len (series_ids ), len (dataset ['wavelength' ])))
284
295
for i in range (len (series_ids )):
285
296
ids = np .where (dataset ['series_id' ] == series_ids [i ])
286
297
dark_signals = self .find_nearest_black (dataset_bla ,np .mean (
287
298
dataset ['acquisition_time' ].values [ids ]),np .mean (
288
299
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 ]
290
302
noisestd , noiseavg = self .sigma_clip (intsig ) # calculate std and avg for non NaN columns
291
303
maski = np .zeros_like (intsig ) # mask the columns that have NaN
292
304
maski [np .where (np .abs (intsig - noiseavg ) >= k_unc * noisestd )] = 1
0 commit comments