1616from hypernets_processor .plotting .plotting import Plotting
1717from hypernets_processor .data_io .format .metadata import METADATA_DEFS
1818from hypernets_processor .data_io .format .variables import VARIABLES_DICT_DEFS
19+ from hypernets_processor .data_io .dataset_util import DatasetUtil as du
1920
2021import numpy as np
2122import math
@@ -29,7 +30,7 @@ def __init__(self, context):
2930 self .writer = HypernetsWriter (context )
3031 self .cal = Calibrate (context , MCsteps = 100 )
3132 self .intp = Interpolate (context , MCsteps = 1000 )
32- self .plot = Plotting (context )
33+ self .plot = Plotting (context )
3334 self .rhymeranc = RhymerAncillary (context )
3435 self .rhymerproc = RhymerProcessing (context )
3536 self .rhymershared = RhymerShared (context )
@@ -89,26 +90,18 @@ def qc_scan(self, dataset, measurandstring):
8990 if v > self .context .get_config_value ("diff_threshold" ):
9091 # get flag value for the temporal variability
9192 if measurandstring == 'irradiance' :
92- flagval = 2 ** (self .context .get_config_value ("temp_variability_ed" ))
93+ dataset ['quality_flag' ][scans [i ]] = du .set_flag (dataset ["quality_flag" ][scans [i ]],
94+ "temp_variability_ed" )
9395 else :
94- flagval = 2 ** (self .context .get_config_value ("temp_variability_lu" ))
96+ dataset ['quality_flag' ][scans [i ]] = du .set_flag (dataset ["quality_flag" ][scans [i ]],
97+ "temp_variability_lu" )
9598
96- dataset ['quality_flag' ][scans [i ]] = dataset ['quality_flag' ][scans [i ]]+ flagval
9799 seq = dataset .attrs ["sequence_id" ]
98100 ts = datetime .utcfromtimestamp (dataset ['acquisition_time' ][i ])
99101
100- if verbosity > 2 : self .context .logger .info ('Temporal jump: in {}: Aquisition time {}, {}' .format (seq , ts , ', ' .join (
101- ['{}:{}' .format (k , dataset [k ][scans [i ]].values ) for k in ['scan' , 'quality_flag' ]])))
102-
103- # ## check for complete spectra
104- # ## assumed here they are masked by inf or nan by calibration step
105- # if any([not np.isfinite(j) for j in data[i]]):
106- # # set quality flag to 10
107- # flagval = 2 ** (self.context.get_config_value("inf_nan"))
108- # dataset['quality_flag'][scans[i]] = dataset['quality_flag'][scans[i]] + flagval
109- # ts = datetime.utcfromtimestamp(dataset['acquisition_time'][i])
110- # if verbosity > 2: print('inf or Nan data in: Aquisition time {}, {}'.format(ts, ', '.join(
111- # ['{}:{}'.format(k, dataset[k][scans[i]].values) for k in ['scan', 'quality_flag']])))
102+ if verbosity > 2 : self .context .logger .info (
103+ 'Temporal jump: in {}: Aquisition time {}, {}' .format (seq , ts , ', ' .join (
104+ ['{}:{}' .format (k , dataset [k ][scans [i ]].values ) for k in ['scan' , 'quality_flag' ]])))
112105
113106 return dataset
114107
@@ -119,9 +112,6 @@ def cycleparse(self, rad, irr):
119112 nbrlu = self .context .get_config_value ("n_upwelling_rad" )
120113 nbred = self .context .get_config_value ("n_upwelling_irr" )
121114 nbrlsky = self .context .get_config_value ("n_downwelling_rad" )
122- flag_nbrlu = 2 ** self .context .get_config_value ("min_nbrlu" )
123- flag_nbred = 2 ** self .context .get_config_value ("min_nbred" )
124- flag_nbrlsky = 2 ** self .context .get_config_value ("min_nbrlsky" )
125115
126116 if protocol != 'WaterNetworkProtocol' :
127117 # here we should simply provide surface reflectance?
@@ -142,12 +132,9 @@ def cycleparse(self, rad, irr):
142132 senz = float (senz )
143133 sena = abs (float (sena ))
144134 else :
145- flagval = 2 ** (self .context .get_config_value ("angles_missing" ))
146- scani ['quality_flag' ] = scani ['quality_flag' ] + flagval
147- if self .context .get_config_value ("verbosity" ) > 2 :
148- self .context .logger .info (
149- 'NULL angles: Aquisition time {}, {}' .format (ts , ', ' .join (
150- ['{}:{}' .format (k , scani [k ].values ) for k in ['scan' , 'quality_flag' ]])))
135+ scani ['quality_flag' ] = du .set_flag (scani ['quality_flag' ], "angles_missing" )
136+ self .context .logger .info ('NULL angles: Aquisition time {}, {}' .format (ts , ', ' .join (
137+ ['{}:{}' .format (k , scani [k ].values ) for k in ['scan' , 'quality_flag' ]])))
151138 continue
152139
153140 # ## identify measurement
@@ -169,46 +156,47 @@ def cycleparse(self, rad, irr):
169156 sena_lsky = np .unique (lsky ["viewing_azimuth_angle" ].values )
170157 for i in sena_lu :
171158 if i not in sena_lsky :
172- flagval = self . context . get_config_value ( "lu_eq_missing" )
173- lu [ "quality_flag" ][ lu [ "viewing_azimuth_angle" ] == i ] = lu ["quality_flag" ][lu ["viewing_azimuth_angle" ] == i ]+ 2 ** flagval
159+ lu [ "quality_flag" ][ lu [ "viewing_azimuth_angle" ] == i ] = du . set_flag (
160+ lu ["quality_flag" ][lu ["viewing_azimuth_angle" ] == i ], "lu_eq_missing" )
174161 if self .context .get_config_value ("verbosity" ) > 2 :
175162 ts = [datetime .utcfromtimestamp (x ) for x in
176163 lu ['acquisition_time' ][lu ["viewing_azimuth_angle" ] == i ].values ]
177- self .context .logger .info ('No azimuthal equivalent downwelling radiance measurement: Aquisition time {}, {}' .format (
178- ts , ', ' .join (
179- ['{}:{}' .format (k , lu [k ][lu ["viewing_azimuth_angle" ] == i ].values ) for k in
180- ['scan' , 'quality_flag' ]])))
164+ self .context .logger .info (
165+ 'No azimuthal equivalent downwelling radiance measurement: Aquisition time {}, {}' .format (
166+ ts , ', ' .join (
167+ ['{}:{}' .format (k , lu [k ][lu ["viewing_azimuth_angle" ] == i ].values ) for k in
168+ ['scan' , 'quality_flag' ]])))
181169
182170 # check if we have the required fresnel angle for lsky
183171 senz_lu = np .unique (lu ["viewing_zenith_angle" ].values )
184172 senz_lsky = 180 - np .unique (lsky ["viewing_zenith_angle" ].values )
185173 for i in senz_lu :
186174 if i not in senz_lsky :
187- flagval = self .context .get_config_value ("fresnel_angle_missing" )
188- lu ["quality_flag" ][lu ["viewing_azimuth_angle" ] == i ] = lu ["quality_flag" ][lu ["viewing_azimuth_angle" ] == i ] + 2 ** flagval
189- if self .context .get_config_value ("verbosity" ) > 2 :
190- ts = [datetime .utcfromtimestamp (x ) for x in
191- lu ['acquisition_time' ][lu ["viewing_zenith_angle" ] == i ].values ]
192- self .context .logger .info (
175+ lu ["quality_flag" ][lu ["viewing_azimuth_angle" ] == i ] = du .set_flag (lu ["quality_flag" ][lu ["viewing_azimuth_angle" ]== i ],"fresnel_angle_missing" )
176+ ts = [datetime .utcfromtimestamp (x ) for x in lu ['acquisition_time' ][lu ["viewing_zenith_angle" ] == i ].values ]
177+ self .context .logger .info (
193178 'No downwelling radiance measurement at appropriate fresnel angle: Aquisition time {}, {}' .format (
194179 ts , ', ' .join (
195180 ['{}:{}' .format (k , lu [k ][lu ["viewing_azimuth_angle" ] == i ].values ) for k
196181 in ['scan' , 'quality_flag' ]])))
197182
198183 # check if correct number of radiance and irradiance data
184+
199185 if lu .scan [lu ['quality_flag' ] <= 0 ].count () < nbrlu :
200- lu ["quality_flag" ].values = [lu .sel (scan = i )["quality_flag" ].values + flag_nbrlu for i in lu ['scan' ]]
201- if self .context .get_config_value ("verbosity" ) > 2 :
202- self .context .logger .info ("No enough upwelling radiance data for sequence {}" .format (lu .attrs ['sequence_id' ]))
186+ lu ["quality_flag" ].values = [du .set_flag (lu ["quality_flag" ][lu ["scan" ] == i ], "min_nbrlu" ) for
187+ i in lu ["scan" ]]
188+ self .context .logger .info (
189+ "No enough upwelling radiance data for sequence {}" .format (lu .attrs ['sequence_id' ]))
203190 if lsky .scan [lsky ['quality_flag' ] <= 1 ].count () < nbrlsky :
204- lsky ["quality_flag" ].values = [lsky . sel ( scan = i ) ["quality_flag" ]. values + flag_nbrlsky for i in lsky [ 'scan' ]]
205- if self . context . get_config_value ( "verbosity" ) > 2 :
206- self .context .logger .info ("No enough downwelling radiance data for sequence {}" . format ( lsky . attrs [ 'sequence_id' ]))
207-
191+ lsky ["quality_flag" ].values = [du . set_flag ( lsky ["quality_flag" ][ lu [ "scan" ] == i ], "min_nbrlu" ) for
192+ i in lsky [ "scan" ]]
193+ self .context .logger .info (
194+ "No enough downwelling radiance data for sequence {}" . format ( lsky . attrs [ 'sequence_id' ]))
208195 if irr .scan [irr ['quality_flag' ] <= 1 ].count () < nbred :
209- irr ["quality_flag" ].values = [irr .sel (scan = i )["quality_flag" ].values + 2 ** flag_nbred for i in irr ['scan' ]]
210- if self .context .get_config_value ("verbosity" ) > 2 :
211- self .context .logger .info ("No enough irradiance data for sequence {}" .format (irr .attrs ['sequence_id' ]))
196+ irr ["quality_flag" ].values = [du .set_flag (lsky ["quality_flag" ][irr ["scan" ] == i ], "min_nbrlu" ) for
197+ i in irr ["scan" ]]
198+ self .context .logger .info (
199+ "No enough downwelling irradiance data for sequence {}" .format (irr .attrs ['sequence_id' ]))
212200
213201 return lu , lsky , irr
214202
@@ -217,11 +205,11 @@ def get_wind(self, l1b):
217205 lat = l1b .attrs ['site_latitude' ]
218206 lon = l1b .attrs ['site_latitude' ]
219207 wind = []
220- flagval = self .context .get_config_value ("def_wind_flag" )
221208 for i in range (len (l1b .scan )):
222209 wa = self .context .get_config_value ("wind_ancillary" )
223- if wa == False :
224- l1b .sel (scan = i )["quality_flag" ]= l1b .sel (scan = i )["quality_flag" ] + 2 ** flagval
210+ if not wa :
211+ l1b ["quality_flag" ][l1b ["scan" ] == i ] = du .set_flag (l1b ["quality_flag" ][l1b ["scan" ] == i ],
212+ "def_wind_flag" )
225213 self .context .logger .info ("Default wind speed {}" .format (self .context .get_config_value ("wind_default" )))
226214 wind .append (self .context .get_config_value ("wind_default" ))
227215 else :
@@ -261,18 +249,16 @@ def get_fresnelrefl(self, l1b):
261249 if (fresnel_sza [i ] is not None ) & (fresnel_raa [i ] is not None ):
262250 sza = min (fresnel_sza [i ], 79.999 )
263251 rhof = self .rhymerproc .mobley_lut_interp (sza , fresnel_vza [i ], fresnel_raa [i ],
264- wind = wind [i ])
252+ wind = wind [i ])
265253 else :
266- # add a quality flag!
267- flagval = self .context .get_config_value ("fresnel_default" )
268- l1b ["quality_flag" ][i ].values = l1b ["quality_flag" ][i ].values + 2 ** flagval
254+ l1b ["quality_flag" ][l1b ["scan" ] == i ] = du .set_flag (l1b ["quality_flag" ][l1b ["scan" ] == i ],
255+ "fresnel_default" )
269256 rhof = self .context .get_config_value ("rhof_default" )
270-
271257 if self .context .get_config_value ("fresnel_option" ) == 'Ruddick2006' :
272258 rhof = self .context .get_config_value ("rhof_default" )
273259 self .context .logger .info ("Apply Ruddick et al., 2006" )
274260 if wind [i ] is not None :
275- rhof = rhof + 0.00039 * wind [i ] + 0.000034 * wind [i ] ** 2
261+ rhof = rhof + 0.00039 * wind [i ] + 0.000034 * wind [i ] ** 2
276262
277263 fresnel_coeff [i ] = rhof
278264
@@ -286,7 +272,7 @@ def get_fresnelrefl(self, l1b):
286272 def get_epsilon (self , rhow_nosc , wavelength ):
287273
288274 # wavelength = l1b['wavelength'].values
289- #get length of transposed rhow_nosc (1 epsilon per scan!)
275+ # get length of transposed rhow_nosc (1 epsilon per scan!)
290276 epsilon = np .zeros (len (rhow_nosc .T ))
291277 failSimil = np .zeros (len (rhow_nosc .T ))
292278
@@ -309,10 +295,9 @@ def get_epsilon(self, rhow_nosc, wavelength):
309295 else :
310296 if self .context .get_config_value ("verbosity" ) > 2 : self .context .logger .info ('Passed simil test.' )
311297 epsilon [i ] = eps
312- failSimil [i ]= fail_simil
298+ failSimil [i ] = fail_simil
313299 return epsilon , failSimil
314300
315-
316301 def get_rhow_nosc (self , l1b ):
317302
318303 ## read mobley rho lut
@@ -321,8 +306,8 @@ def get_rhow_nosc(self, l1b):
321306 fresnel_coeff = l1b ['rhof' ].values
322307 rhow_nosc_all = np .zeros ((len (l1b .scan ), len (wavelength )))
323308 lw_all = np .zeros ((len (l1b .scan ), len (wavelength )))
324- #rhow_all = np.zeros((len(l1b.scan), len(wavelength)))
325- #epsilon = np.zeros(len(l1b.scan))
309+ # rhow_all = np.zeros((len(l1b.scan), len(wavelength)))
310+ # epsilon = np.zeros(len(l1b.scan))
326311 simil_flag = np .zeros (len (l1b .scan ))
327312
328313 for i in range (len (l1b .scan )):
@@ -381,7 +366,7 @@ def process_l1b(self, L1a_rad, L1a_irr):
381366 L1b_irr = self .cal .average_l1b ("irradiance" , L1a_irr )
382367 # INTERPOLATE Lsky and Ed FOR EACH Lu SCAN! Threshold in time -> ASSIGN FLAG
383368 L1b = self .intp .interpolate_l1b_w (L1a_uprad , L1b_downrad , L1b_irr )
384- if self .context .get_config_value ("write_l1b" )== True :
369+ if self .context .get_config_value ("write_l1b" ) == True :
385370 self .writer .write (L1b , overwrite = True )
386371 return L1b
387372
@@ -393,21 +378,21 @@ def process_l1c(self, l1b):
393378
394379 rhow_nosc_all , lw_all = self .get_rhow_nosc (dataset_l1c )
395380
396- #dataset_l1c['reflectance'].values = rhow_all.T
381+ # dataset_l1c['reflectance'].values = rhow_all.T
397382
398383 dataset_l1c ['reflectance_nosc' ].values = rhow_nosc_all .T
399- #dataset_l1c['epsilon'].values = epsilon
384+ # dataset_l1c['epsilon'].values = epsilon
400385 dataset_l1c ['water_leaving_radiance' ].values = lw_all .T
401386
402387 if self .context .get_config_value ("write_l1c" ):
403- self .writer .write (dataset_l1c ,overwrite = True )
388+ self .writer .write (dataset_l1c , overwrite = True )
404389
405390 if self .context .get_config_value ("plot_l1c" ):
406- self .plot .plot_scans_in_series ("irradiance" ,dataset_l1c )
391+ self .plot .plot_scans_in_series ("irradiance" , dataset_l1c )
407392
408393 return dataset_l1c
409394
410- def l1c_from_l1b_dataset (self ,dataset_l1b ):
395+ def l1c_from_l1b_dataset (self , dataset_l1b ):
411396 """
412397 Makes a L2 template of the data, and propagates the appropriate keywords from L1.
413398
@@ -416,10 +401,10 @@ def l1c_from_l1b_dataset(self,dataset_l1b):
416401 :return:
417402 :rtype:
418403 """
419- l1c_dim_sizes_dict = {"wavelength" :len (dataset_l1b ["wavelength" ]),
420- "scan" :len (np .unique (dataset_l1b ['scan' ]))}
404+ l1c_dim_sizes_dict = {"wavelength" : len (dataset_l1b ["wavelength" ]),
405+ "scan" : len (np .unique (dataset_l1b ['scan' ]))}
421406
422- dataset_l1c = self .hdsb .create_ds_template (l1c_dim_sizes_dict ,"W_L1C" ,
407+ dataset_l1c = self .hdsb .create_ds_template (l1c_dim_sizes_dict , "W_L1C" ,
423408 propagate_ds = dataset_l1b )
424409 dataset_l1c = dataset_l1c .assign_coords (wavelength = dataset_l1b .wavelength )
425410
0 commit comments