1414import os
1515import glob
1616
17-
1817'''___Authorship___'''
1918__author__ = "Pieter De Vis"
2019__created__ = "12/04/2020"
2322__email__ = "Pieter.De.Vis@npl.co.uk"
2423__status__ = "Development"
2524
25+
2626class 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
0 commit comments