@@ -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 :
0 commit comments