@@ -112,16 +112,16 @@ def qc_scan(self, dataset, measurandstring):
112112
113113 def cycleparse (self , rad , irr ):
114114
115- protocol = self .context .get_config_value ("protocol " )
115+ protocol = self .context .get_config_value ("measurement_function_surface_reflectance " )
116116 print (protocol )
117117 nbrlu = self .context .get_config_value ("n_upwelling_rad" )
118118 nbred = self .context .get_config_value ("n_upwelling_irr" )
119119 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" )
120+ flag_nbrlu = 2 ** self .context .get_config_value ("min_nbrlu" )
121+ flag_nbred = 2 ** self .context .get_config_value ("min_nbred" )
122+ flag_nbrlsky = 2 ** self .context .get_config_value ("min_nbrlsky" )
123123
124- if protocol != 'water_std ' :
124+ if protocol != 'WaterNetworkProtocol ' :
125125 # here we should simply provide surface reflectance?
126126 # what about a non-standard protocol but that includes the required standard series?
127127 print ('Unknown measurement protocol: {}' .format (protocol ))
@@ -193,32 +193,28 @@ def cycleparse(self, rad, irr):
193193 in ['scan' , 'quality_flag' ]])))
194194
195195 # check if correct number of radiance and irradiance data
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-
200196 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' ]]
197+ lu ["quality_flag" ].values = [lu .sel (scan = i )["quality_flag" ]. values + flag_nbrlu for i in lu ['scan' ]]
202198 if self .context .get_config_value ("verbosity" ) > 2 :
203199 print ("No enough upwelling radiance data for sequence {}" .format (lu .attrs ['sequence_id' ]))
204200 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' ]]
201+ lsky ["quality_flag" ]. values = [lsky .sel (scan = i )["quality_flag" ]. values + flag_nbrlsky for i in lsky ['scan' ]]
206202 if self .context .get_config_value ("verbosity" ) > 2 :
207203 print ("No enough downwelling radiance data for sequence {}" .format (lsky .attrs ['sequence_id' ]))
208204
209205 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' ]]
206+ irr ["quality_flag" ]. values = [irr .sel (scan = i )["quality_flag" ]. values + 2 ** flag_nbred for i in irr ['scan' ]]
211207 if self .context .get_config_value ("verbosity" ) > 2 :
212208 print ("No enough irradiance data for sequence {}" .format (irr .attrs ['sequence_id' ]))
213209
214- return lu , lsky , irr
210+ return lu , lsky , irr
215211
216212 def get_wind (self , l1b ):
217213
218214 lat = l1b .attrs ['site_latitude' ]
219215 lon = l1b .attrs ['site_latitude' ]
220216 wind = []
221- flagval = self .context .get_config_value ("wind_default " )
217+ flagval = self .context .get_config_value ("def_wind_flag " )
222218 for i in range (len (l1b .scan )):
223219 wa = self .context .get_config_value ("wind_ancillary" )
224220 if wa == False :
@@ -284,58 +280,17 @@ def get_fresnelrefl(self, l1b):
284280
285281 return l1b
286282
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
312-
313- def get_rhow_nosc (self , l1b ):
314-
315- ## read mobley rho lut
316-
317- wavelength = l1b ['wavelength' ].values
318- fresnel_coeff = l1b ['rhof' ].values
319- rhow_nosc_all = np .zeros ((len (l1b .scan ), len (wavelength )))
320- lw_all = np .zeros ((len (l1b .scan ), len (wavelength )))
321- rhow_all = np .zeros ((len (l1b .scan ), len (wavelength )))
322- epsilon = np .zeros (len (l1b .scan ))
323- simil_flag = np .zeros (len (l1b .scan ))
324-
325- for i in range (len (l1b .scan )):
326- ## compute rhow
327- lu = l1b ['upwelling_radiance' ][:, i ].values
328- # should I average here or take the downwelling radiance per scan???
329- # mls stands for mean sky/downwelling radiance, so need to check if mean is better than interpolated?
330- mls = l1b ['downwelling_radiance' ][:, i ].values
331- # same for ed? Better interpolated or mean Ed???
332- med = l1b ['irradiance' ][:, i ].values
283+ def get_epsilon (self , rhow_nosc , wavelength ):
333284
334- lw_all [i ] = [(lu [w ] - (fresnel_coeff [i ] * mls [w ])) for w in range (len (wavelength ))]
335- rhow_nosc_all [i ] = [np .pi * (lu [w ] - (fresnel_coeff [i ] * mls [w ])) / med [w ] for w in range (len (wavelength ))]
285+ # wavelength = l1b['wavelength'].values
286+ #get length of transposed rhow_nosc (1 epsilon per scan!)
287+ epsilon = np .zeros (len (rhow_nosc .T ))
288+ failSimil = np .zeros (len (rhow_nosc .T ))
336289
290+ ## compute similarity epsilon
291+ for i in range (len (rhow_nosc .T )):
337292 ## compute similarity epsilon
338- fail_simil , eps = self .qc_similarity (wavelength , rhow_nosc_all [i ],
293+ fail_simil , eps = self .qc_similarity (wavelength , rhow_nosc . T [i ],
339294 self .context .get_config_value ("similarity_wr" ),
340295 self .context .get_config_value ("similarity_wp" ),
341296 self .context .get_config_value ("similarity_w1" ),
@@ -344,70 +299,30 @@ def get_rhow_nosc(self, l1b):
344299
345300 ## R2005 quality control
346301 ## skip spectra not following similarity
347- if self .context .get_config_value ("similarity_test" )== True :
302+ if self .context .get_config_value ("similarity_test" ) == True :
348303 if fail_simil :
349- if verbosity > 2 : print ('Failed simil test.' )
350- simil_flag [i ] = 10
304+ if self .context .get_config_value ("verbosity" ) > 2 : print ('Failed simil test.' )
351305 continue
352306 else :
353- if verbosity > 2 : print ('Passed simil test.' )
354- simil_flag [i ] = 0
355-
356- ## R2005 correction
357- if self .context .get_config_value ("similarity_correct" )== True :
358- # print(epsilon)
359- rhow_all [i ] = [r - eps for r in rhow_nosc_all [i ]]
360- else :
361- rhow_all [i ] = rhow_nosc_all [i ]
362-
307+ if self .context .get_config_value ("verbosity" ) > 2 : print ('Passed simil test.' )
363308 epsilon [i ] = eps
309+ failSimil [i ]= fail_simil
310+ return epsilon , failSimil
364311
365- return rhow_nosc_all , rhow_all , epsilon , lw_all , simil_flag
366312
367- def fresnelrefl_qc_simil (self , l1b , wind ):
313+ def get_rhow_nosc (self , l1b ):
368314
369315 ## read mobley rho lut
370- rholut = self .rhymerproc .mobley_lut_read (self )
371316
372317 wavelength = l1b ['wavelength' ].values
373-
374- fresnel_coeff = np .zeros (len (l1b .scan ))
318+ fresnel_coeff = l1b ['rhof' ].values
375319 rhow_nosc_all = np .zeros ((len (l1b .scan ), len (wavelength )))
376320 lw_all = np .zeros ((len (l1b .scan ), len (wavelength )))
377- rhow_all = np .zeros ((len (l1b .scan ), len (wavelength )))
378- epsilon = np .zeros (len (l1b .scan ))
321+ # rhow_all = np.zeros((len(l1b.scan), len(wavelength)))
322+ # epsilon = np.zeros(len(l1b.scan))
379323 simil_flag = np .zeros (len (l1b .scan ))
380324
381325 for i in range (len (l1b .scan )):
382- vza = l1b ['viewing_zenith_angle' ][i ].values
383- sza = l1b ['solar_zenith_angle' ][i ].values
384-
385- diffa = l1b ['viewing_azimuth_angle' ][i ].values - l1b ['viewing_azimuth_angle' ][i ].values
386-
387- if diffa >= 360 :
388- diffa = diffa - 360
389- elif 0 <= diffa < 360 :
390- diffa = diffa
391- else :
392- diffa = diffa + 360
393- raa = abs ((diffa - 180 ))
394- sza = l1b ['solar_zenith_angle' ][i ].values
395- ## get fresnel reflectance
396- if self .fresnel_option == 'Mobley' :
397- if (sza is not None ) & (raa is not None ):
398- sza_ = min (sza , 79.999 )
399- rhof = self .rhymerproc .mobley_lut_interp (sza , vza , raa ,
400- wind = wind [i ],
401- rholut = rholut )
402- else :
403- # add a quality flag!
404- fresnel = 'fixed'
405-
406- if self .fresnel_option == 'Ruddick2006' :
407- rhof = self .rhof_default
408- ## R2006
409- if wind is not None :
410- rhof = rhof + 0.00039 * wind + 0.000034 * wind ** 2
411326 ## compute rhow
412327 lu = l1b ['upwelling_radiance' ][:, i ].values
413328 # should I average here or take the downwelling radiance per scan???
@@ -416,40 +331,10 @@ def fresnelrefl_qc_simil(self, l1b, wind):
416331 # same for ed? Better interpolated or mean Ed???
417332 med = l1b ['irradiance' ][:, i ].values
418333
419- lw_all [i ] = [(lu [w ] - (rhof * mls [w ])) for w in range (len (wavelength ))]
420- rhow_nosc_all [i ] = [np .pi * (lu [w ] - (rhof * mls [w ])) / med [w ] for w in range (len (wavelength ))]
421- fresnel_coeff [i ] = rhof
422-
423- ## compute similarity epsilon
424- print (self .similarity_alpha )
425- fail_simil , eps = self .qc_similarity (wavelength , rhow_nosc_all [i ],
426- self .similarity_wr ,
427- self .similarity_wp ,
428- self .similarity_w1 ,
429- self .similarity_w2 ,
430- self .similarity_alpha )
431-
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
442-
443- ## R2005 correction
444- if self .similarity_correct :
445- # print(epsilon)
446- rhow_all [i ] = [r - eps for r in rhow_nosc_all [i ]]
447- else :
448- rhow_all [i ] = rhow_nosc_all [i ]
449-
450- epsilon [i ] = eps
334+ lw_all [i ] = [(lu [w ] - (fresnel_coeff [i ] * mls [w ])) for w in range (len (wavelength ))]
335+ rhow_nosc_all [i ] = [np .pi * (lu [w ] - (fresnel_coeff [i ] * mls [w ])) / med [w ] for w in range (len (wavelength ))]
451336
452- return lw_all , rhow_all , rhow_nosc_all , epsilon , simil_flag
337+ return rhow_nosc_all , lw_all
453338
454339 ## QC a single rhow scan from PANTHYR
455340 ## according to R2005
@@ -494,24 +379,25 @@ def process_l1b(self, L1a_rad, L1a_irr):
494379
495380 # INTERPOLATE Lsky and Ed FOR EACH Lu SCAN! Threshold in time -> ASSIGN FLAG
496381 L1b = self .intp .interpolate_l1b_w (L1a_uprad , L1b_downrad , L1b_irr )
497- L1b = self .get_wind (L1b )
498- L1b = self .get_fresnelrefl (L1b )
499382 if self .context .get_config_value ("write_l1b" )== True :
500383 self .writer .write (L1b , overwrite = True )
501384 return L1b
502385
503386 def process_l1c (self , l1b ):
504387
505- rhow_nosc_all , rhow_all , epsilon , lw_all , simil_flag = self .get_rhow_nosc (l1b )
506388 l1c_dim_sizes_dict = {"wavelength" : len (l1b ["wavelength" ]),
507389 "scan" : len (np .unique (l1b ['scan' ]))}
508390 dataset_l1c = self .hdsb .create_ds_template (l1c_dim_sizes_dict , "W_L1C" , propagate_ds = l1b )
509- dataset_l1c ['reflectance' ].values = rhow_all .T
510391
511- print (rhow_nosc_all .T )
392+ dataset_l1c = self .get_wind (dataset_l1c )
393+ dataset_l1c = self .get_fresnelrefl (dataset_l1c )
394+
395+ rhow_nosc_all , lw_all = self .get_rhow_nosc (dataset_l1c )
396+
397+ #dataset_l1c['reflectance'].values = rhow_all.T
512398
513399 dataset_l1c ['reflectance_nosc' ].values = rhow_nosc_all .T
514- dataset_l1c ['epsilon' ].values = epsilon
400+ # dataset_l1c['epsilon'].values = epsilon
515401 dataset_l1c ['water_leaving_radiance' ].values = lw_all .T
516402
517403 return dataset_l1c
0 commit comments