@@ -6,11 +6,12 @@ verbose = false
66 if verbose println (" # Loading NeidSolarScripts" ) end
77 using SunAsAStar
88 using NeidSolarScripts
9- using ArgParse
9+ # using ArgParse
1010
1111println (" # Parsing arguments..." )
1212 lsf_width = 3.0e3
13- function parse_commandline ()
13+ #=
14+ function parse_commandline()
1415 s = ArgParseSettings( description = "Calculate order CCFs from NEID L2 FITS files.")
1516 #import_settings!(s, s_files_only, args_only=false)
1617 add_arg_group!(s, "Files", :argg_files)
@@ -165,6 +166,46 @@ println("# Parsing arguments...")
165166 help = "Maximum airmass for clean spectrum."
166167 arg_type = Float64
167168 default = 2.0
169+ "--min_expmeter"
170+ help = "Minimum mean exposure meter flux."
171+ arg_type = Float64
172+ default = 6e4
173+ "--min_expmeter_clean"
174+ help = "Minimum mean exposure meter flux for clean spectrum."
175+ arg_type = Float64
176+ default = 1e5
177+ "--min_pyrhelio"
178+ help = "Minimum mean pyrheliometer flux."
179+ arg_type = Float64
180+ default = 10^2.95
181+ "--min_pyrhelio_clean"
182+ help = "Minimum mean pyrheliometer flux for clean spectrum."
183+ arg_type = Float64
184+ default = 10^2.95
185+ "--max_expmeter_rms_frac"
186+ help = "Maximum fractional RMS exposure meter flux."
187+ arg_type = Float64
188+ default = 0.003
189+ "--max_expmeter_rms_frac_clean"
190+ help = "Maximum fractional RMS exposure meter flux for clean spectrum."
191+ arg_type = Float64
192+ default = 0.003
193+ "--max_pyrhelio_rms_frac"
194+ help = "Maximum fractional RMS pyrheliometer flux."
195+ arg_type = Float64
196+ default = 0.0035
197+ "--max_pyrhelio_rms_frac_clean"
198+ help = "Maximum fractional RMS pyrheliometer flux for clean spectrum."
199+ arg_type = Float64
200+ default = 0.0035
201+ "--min_expmeter_to_pyrhelio"
202+ help = "Minimum mean exposure meter flux relative to pyrheliometer flux."
203+ arg_type = Float64
204+ default = 0.0
205+ "--min_expmeter_to_pyrhelio_clean"
206+ help = "Minimum mean exposure meter flux relative to pyrheliometer flux for clean spectrum."
207+ arg_type = Float64
208+ default = 0.0 # 150 from DRP v1.1
168209#=
169210 "--min_snr_factor"
170211 help = "Minimum SNR relative to max_snr."
@@ -190,6 +231,16 @@ println("# Parsing arguments...")
190231 #default = [ min_order(NEID2D()), max_order(NEID2D()) ]
191232 #default = [22, 30]
192233 default = [23, 59]
234+ "--start_time_clean"
235+ help = "Specify daily start time for CCFs for clean spectrum"
236+ nargs = 2
237+ arg_type = Int64
238+ default = [17, 30]
239+ "--stop_time_clean"
240+ help = "Specify daily stop time for CCFs for clean spectrum"
241+ nargs = 2
242+ arg_type = Int64
243+ default = [22, 12]
193244 "--max_num_spectra"
194245 help = "Maximum number of spectra to process."
195246 arg_type = Int
@@ -204,6 +255,8 @@ println("# Parsing arguments...")
204255 return parse_args(s)
205256 end
206257 args = parse_commandline()
258+ =#
259+ args = parse_commandline_calc_order_ccfs ()
207260
208261verbose = haskey (args," verbose" ) ? args[" verbose" ] : verbose
209262
@@ -215,6 +268,15 @@ if verbose println("# Loading other packages 2/2") end
215268 using JLD2, FileIO, MD5 # , SHA
216269 using StatsBase, Statistics, NaNMath
217270
271+ function extract_time_from_filename (fn:: AbstractString )
272+ m = match (r" neidL\d _(\d {4})(\d {2})(\d {2})T(\d {2})(\d {2})(\d {2})\. fits$" ,basename (fn))
273+ if length (m)< 6
274+ @warn (" Can't extract time from " * fn)
275+ return nothing
276+ end
277+ return Time (parse (Int,m[4 ]),parse (Int,m[5 ]),parse (Int,m[6 ]))
278+ end
279+
218280 # Filename arguments
219281 @assert isfile (args[" manifest" ]) || islink (args[" manifest" ])
220282 manifest_filename = args[" manifest" ]
@@ -302,6 +364,8 @@ if verbose println("# Loading other packages 2/2") end
302364 @assert 0 <= range_no_mask_change <= 10
303365 start_time = args[" start_time" ] != nothing && length (args[" start_time" ]) == 2 ? Time (args[" start_time" ][1 ], args[" start_time" ][2 ]) : Time (0 ,0 )
304366 stop_time = args[" stop_time" ] != nothing && length (args[" stop_time" ]) == 2 ? Time (args[" stop_time" ][1 ], args[" stop_time" ][2 ]) : Time (12 ,59 ,59 )
367+ start_time_clean = args[" start_time_clean" ] != nothing && length (args[" start_time_clean" ]) == 2 ? Time (args[" start_time_clean" ][1 ], args[" start_time_clean" ][2 ]) : Time (0 ,0 )
368+ stop_time_clean = args[" stop_time_clean" ] != nothing && length (args[" stop_time_clean" ]) == 2 ? Time (args[" stop_time_clean" ][1 ], args[" stop_time_clean" ][2 ]) : Time (12 ,59 ,59 )
305369
306370 @assert 3 <= args[" continuum_poly_half_width" ] <= 200 # arbitrary limits for now
307371 @assert 0.5 <= args[" quantile_fit_continuum" ] <= 1 - 1 / (2 * args[" smoothing_half_width" ])
@@ -368,34 +432,64 @@ if verbose println("# Reading manifest of files to process.") end
368432 @filter ( args[" target" ] == nothing || _. target == args[" target" ] ) |>
369433 DataFrame
370434 df_files_use = df_files_use |>
371- @filter ( args[" datestr" ] == nothing || occursin (args[" datestr" ],_. target ) ) |>
435+ @filter ( args[" datestr" ] == nothing || occursin (args[" datestr" ],_. Filename ) ) |>
372436 DataFrame
373437 df_files_use = df_files_use |>
374- @filter ( args[ " max_airmass " ] == nothing || _ . airmass <= args[ " max_airmass " ] ) |>
438+ @filter ( _ . drpversion != " " && (min_drp_minor_version <= Base . thisminor ( VersionNumber (_ . drpversion)) <= max_drp_minor_version )) |>
375439 DataFrame
376440 df_files_use = df_files_use |>
377441 @filter ( args[" max_solar_hour_angle" ] == nothing || abs (_. hour_angle) <= args[" max_solar_hour_angle" ] ) |>
378442 DataFrame
379443 df_files_use = df_files_use |>
380- @filter ( args[" start_time" ] == nothing || Time (julian2datetime (_. bjd)) >= start_time ) |>
381- DataFrame
382- df_files_use = df_files_use |>
383- @filter ( args[" stop_time" ] == nothing || Time (julian2datetime (_. bjd)) <= stop_time ) |> # TODO for other instruments may need to deal wtih cross end of 24 UTC
444+ @filter ( args[" max_airmass" ] == nothing || _. airmass <= args[" max_airmass" ] ) |>
384445 DataFrame
385446 df_files_use = df_files_use |>
386- @filter ( _ . drpversion != " " && (min_drp_minor_version <= Base . thisminor ( VersionNumber (_ . drpversion)) <= max_drp_minor_version )) |>
447+ @filter ( args[ " min_expmeter " ] == nothing || _ . expmeter_mean >= args[ " min_expmeter " ] ) |>
387448 DataFrame
388- # @filter( args["min_snr_factor"] == nothing || sum(_.order_snrs) >= args["min_snr_factor"] * max_snr ) |>
389- # TODO : Replace to use expmeter or pyrheliometer data
390449 if ! hasproperty (df_files_use,:mean_pyroflux ) || ! hasproperty (df_files_use,:rms_pyroflux ) || any (ismissing .(df_files_use. mean_pyroflux)) || any (ismissing .(df_files_use. rms_pyroflux))
391450 @error " Manifest file doesn't include valid mean_pyroflux and/or rms_pyroflux." manifest_filename
392451 end
393452 df_files_use = df_files_use |>
453+ @filter ( args[" min_pyrhelio" ] == nothing || _. mean_pyroflux >= args[" min_pyrhelio" ] ) |>
454+ DataFrame
455+ df_files_use = df_files_use |>
456+ @filter ( args[" max_expmeter_rms_frac" ] == nothing || _. expmeter_rms <= args[" max_expmeter_rms_frac" ]* _. expmeter_mean ) |>
457+ DataFrame
458+ df_files_use = df_files_use |>
459+ @filter ( args[" max_pyrhelio_rms_frac" ] == nothing || _. rms_pyroflux <= args[" max_pyrhelio_rms_frac" ]* _. mean_pyroflux ) |>
460+ DataFrame
461+ df_files_use = df_files_use |>
462+ @filter ( args[" min_expmeter_to_pyrhelio" ] == nothing || _. expmeter_mean >= args[" min_expmeter_to_pyrhelio" ]* _. mean_pyroflux ) |>
463+ DataFrame
464+ df_files_use = df_files_use |>
465+ @filter ( args[" start_time" ] == nothing || extract_time_from_filename (_. Filename) >= start_time ) |>
466+ DataFrame
467+ df_files_use = df_files_use |>
468+ @filter ( args[" stop_time" ] == nothing || extract_time_from_filename (_. Filename) <= stop_time ) |> # TODO for other instruments may need to deal wtih cross end of 24 UTC
469+ DataFrame
470+ df_files_use = df_files_use |>
471+ @filter ( args[" max_airmass" ] == nothing || _. airmass <= args[" max_airmass" ] ) |>
472+ DataFrame
473+ if hasproperty (df_files_use,:dq1level )
474+ df_files_use = df_files_use |>
475+ @filter ( mod (_. dq1level,4 ) < 2 ) |>
476+ DataFrame
477+ end
478+
479+ #=
480+ df_files_use = df_files_use |>
481+ @filter( _.drpversion != "" && (min_drp_minor_version <= Base.thisminor(VersionNumber(_.drpversion)) <= max_drp_minor_version )) |>
482+ DataFrame
483+ if !hasproperty(df_files_use,:mean_pyroflux) || !hasproperty(df_files_use,:rms_pyroflux) || any(ismissing.(df_files_use.mean_pyroflux)) || any(ismissing.(df_files_use.rms_pyroflux))
484+ @error "Manifest file doesn't include valid mean_pyroflux and/or rms_pyroflux." manifest_filename
485+ end
486+ df_files_use = df_files_use |>
394487 @filter( _.rms_pyroflux <= 0.0035* _.mean_pyroflux ) |>
395488 DataFrame
396489 df_files_use = df_files_use |>
397490 @filter( _.expmeter_mean >= 6e4 ) |>
398491 DataFrame
492+ =#
399493 df_files_use = df_files_use |>
400494 @filter ( _. driftfun == " dailymodel0" ) |>
401495 DataFrame
@@ -412,16 +506,137 @@ if verbose println("# Reading manifest of files to process.") end
412506
413507# max_drp_minor_version = Base.thisminor(maximum(VersionNumber.(df_files_use.drpversion)))
414508
509+ #=
510+ df_files_cleanest = df_files_use |>
511+ @filter( min_drp_minor_version <= Base.thisminor(VersionNumber(_.drpversion)) <= max_drp_minor_version ) |>
512+ @filter( _.airmass <= args["max_airmass_clean"] ) |>
513+ @filter( abs(_.hour_angle) <= args["max_solar_hour_angle_clean"] ) |>
514+ DataFrame
515+ println("# Found ", size(df_files_cleanest,1), " files considered clean 1.")
516+
517+ df_files_cleanest = df_files_use |>
518+ @filter( min_drp_minor_version <= Base.thisminor(VersionNumber(_.drpversion)) <= max_drp_minor_version ) |>
519+ @filter( _.airmass <= args["max_airmass_clean"] ) |>
520+ @filter( abs(_.hour_angle) <= args["max_solar_hour_angle_clean"] ) |>
521+ @filter( _.expmeter_mean >= args["min_expmeter_clean"] ) |>
522+ @filter( _.mean_pyroflux >= args["min_pyrhelio_clean"] ) |>
523+ @take(args["max_num_spectra_clean"] ) |>
524+ DataFrame
525+ println("# Found ", size(df_files_cleanest,1), " files considered clean 2.")
526+
527+ df_files_cleanest = df_files_use |>
528+ @filter( min_drp_minor_version <= Base.thisminor(VersionNumber(_.drpversion)) <= max_drp_minor_version ) |>
529+ @filter( _.airmass <= args["max_airmass_clean"] ) |>
530+ @filter( abs(_.hour_angle) <= args["max_solar_hour_angle_clean"] ) |>
531+ @filter( _.expmeter_mean >= args["min_expmeter_clean"] ) |>
532+ @filter( _.mean_pyroflux >= args["min_pyrhelio_clean"] ) |>
533+ @filter( _.expmeter_rms <= args["max_expmeter_rms_frac_clean"]*_.expmeter_mean ) |>
534+ @filter( _.rms_pyroflux <= args["max_pyrhelio_rms_frac_clean"]*_.mean_pyroflux ) |>
535+ DataFrame
536+ println("# Found ", size(df_files_cleanest,1), " files considered clean. 3")
537+ =#
538+
539+ println (" # Extracting time (" , extract_time_from_filename (df_files_use. Filename[1 ]), " ) from first filename (" , df_files_use. Filename[1 ], " )" )
540+ println (" # start_time_clean = " , start_time_clean)
541+ println (" # stop_time_clean = " , stop_time_clean)
542+ for fn in df_files_use. Filename
543+ println (" # " , start_time_clean<= extract_time_from_filename (fn)<= stop_time_clean, " time (" , extract_time_from_filename (fn), " ) from filename (" , fn, " )" )
544+ end
545+
415546df_files_cleanest = df_files_use |>
416547 @filter ( min_drp_minor_version <= Base. thisminor (VersionNumber (_. drpversion)) <= max_drp_minor_version ) |>
417- # @filter( _.airmass <= 2.0 ) |>
418548 @filter ( _. airmass <= args[" max_airmass_clean" ] ) |>
419549 @filter ( abs (_. hour_angle) <= args[" max_solar_hour_angle_clean" ] ) |>
550+ DataFrame
551+ println (" # Found " , size (df_files_cleanest,1 ), " files considered clean 0." )
552+
553+ df_files_cleanest = df_files_use |>
554+ @filter ( min_drp_minor_version <= Base. thisminor (VersionNumber (_. drpversion)) <= max_drp_minor_version ) |>
555+ @filter ( _. airmass <= args[" max_airmass_clean" ] ) |>
556+ @filter ( abs (_. hour_angle) <= args[" max_solar_hour_angle_clean" ] ) |>
557+ @filter ( _. expmeter_mean >= args[" min_expmeter_clean" ] ) |>
558+ @filter ( _. mean_pyroflux >= args[" min_pyrhelio_clean" ] ) |>
559+ DataFrame
560+ println (" # Found " , size (df_files_cleanest,1 ), " files considered clean 1." )
561+
562+ df_files_cleanest = df_files_use |>
563+ @filter ( min_drp_minor_version <= Base. thisminor (VersionNumber (_. drpversion)) <= max_drp_minor_version ) |>
564+ @filter ( _. airmass <= args[" max_airmass_clean" ] ) |>
565+ @filter ( abs (_. hour_angle) <= args[" max_solar_hour_angle_clean" ] ) |>
566+ @filter ( _. expmeter_mean >= args[" min_expmeter_clean" ] ) |>
567+ @filter ( _. mean_pyroflux >= args[" min_pyrhelio_clean" ] ) |>
568+ @filter ( _. expmeter_rms <= args[" max_expmeter_rms_frac_clean" ]* _. expmeter_mean ) |>
569+ @filter ( _. rms_pyroflux <= args[" max_pyrhelio_rms_frac_clean" ]* _. mean_pyroflux ) |>
570+ DataFrame
571+ println (" # Found " , size (df_files_cleanest,1 ), " files considered clean 2." )
572+
573+ df_files_cleanest = df_files_use |>
574+ @filter ( min_drp_minor_version <= Base. thisminor (VersionNumber (_. drpversion)) <= max_drp_minor_version ) |>
575+ @filter ( _. airmass <= args[" max_airmass_clean" ] ) |>
576+ @filter ( abs (_. hour_angle) <= args[" max_solar_hour_angle_clean" ] ) |>
577+ @filter ( _. expmeter_mean >= args[" min_expmeter_clean" ] ) |>
578+ @filter ( _. mean_pyroflux >= args[" min_pyrhelio_clean" ] ) |>
579+ @filter ( _. expmeter_rms <= args[" max_expmeter_rms_frac_clean" ]* _. expmeter_mean ) |>
580+ @filter ( _. rms_pyroflux <= args[" max_pyrhelio_rms_frac_clean" ]* _. mean_pyroflux ) |>
581+ @filter ( _. expmeter_mean >= args[" min_expmeter_to_pyrhelio_clean" ]* _. mean_pyroflux ) |>
582+ DataFrame
583+ println (" # Found " , size (df_files_cleanest,1 ), " files considered clean 3." )
584+
585+ df_files_cleanest = df_files_use |>
586+ @filter ( min_drp_minor_version <= Base. thisminor (VersionNumber (_. drpversion)) <= max_drp_minor_version ) |>
587+ @filter ( _. airmass <= args[" max_airmass_clean" ] ) |>
588+ @filter ( abs (_. hour_angle) <= args[" max_solar_hour_angle_clean" ] ) |>
589+ @filter ( _. expmeter_mean >= args[" min_expmeter_clean" ] ) |>
590+ @filter ( _. mean_pyroflux >= args[" min_pyrhelio_clean" ] ) |>
591+ @filter ( _. expmeter_rms <= args[" max_expmeter_rms_frac_clean" ]* _. expmeter_mean ) |>
592+ @filter ( _. rms_pyroflux <= args[" max_pyrhelio_rms_frac_clean" ]* _. mean_pyroflux ) |>
593+ @filter ( _. expmeter_mean >= args[" min_expmeter_to_pyrhelio_clean" ]* _. mean_pyroflux ) |>
594+ @filter ( extract_time_from_filename (_. Filename) >= start_time_clean ) |>
595+ DataFrame
596+ println (" # Found " , size (df_files_cleanest,1 ), " files considered clean 4." )
597+
598+ df_files_cleanest = df_files_use |>
599+ @filter ( min_drp_minor_version <= Base. thisminor (VersionNumber (_. drpversion)) <= max_drp_minor_version ) |>
600+ @filter ( _. airmass <= args[" max_airmass_clean" ] ) |>
601+ @filter ( abs (_. hour_angle) <= args[" max_solar_hour_angle_clean" ] ) |>
602+ @filter ( _. expmeter_mean >= args[" min_expmeter_clean" ] ) |>
603+ @filter ( _. mean_pyroflux >= args[" min_pyrhelio_clean" ] ) |>
604+ @filter ( _. expmeter_rms <= args[" max_expmeter_rms_frac_clean" ]* _. expmeter_mean ) |>
605+ @filter ( _. rms_pyroflux <= args[" max_pyrhelio_rms_frac_clean" ]* _. mean_pyroflux ) |>
606+ @filter ( _. expmeter_mean >= args[" min_expmeter_to_pyrhelio_clean" ]* _. mean_pyroflux ) |>
607+ @filter ( extract_time_from_filename (_. Filename) <= stop_time_clean ) |>
608+ DataFrame
609+ println (" # Found " , size (df_files_cleanest,1 ), " files considered clean 5." )
610+
611+ df_files_cleanest = df_files_use |>
612+ @filter ( min_drp_minor_version <= Base. thisminor (VersionNumber (_. drpversion)) <= max_drp_minor_version ) |>
613+ @filter ( _. airmass <= args[" max_airmass_clean" ] ) |>
614+ @filter ( abs (_. hour_angle) <= args[" max_solar_hour_angle_clean" ] ) |>
615+ @filter ( _. expmeter_mean >= args[" min_expmeter_clean" ] ) |>
616+ @filter ( _. mean_pyroflux >= args[" min_pyrhelio_clean" ] ) |>
617+ @filter ( _. expmeter_rms <= args[" max_expmeter_rms_frac_clean" ]* _. expmeter_mean ) |>
618+ @filter ( _. rms_pyroflux <= args[" max_pyrhelio_rms_frac_clean" ]* _. mean_pyroflux ) |>
619+ @filter ( _. expmeter_mean >= args[" min_expmeter_to_pyrhelio_clean" ]* _. mean_pyroflux ) |>
620+ @filter ( extract_time_from_filename (_. Filename) >= start_time_clean ) |>
621+ @filter ( extract_time_from_filename (_. Filename) <= stop_time_clean ) |>
420622 @orderby ( abs (_. hour_angle) ) |>
421623 @take (args[" max_num_spectra_clean" ] ) |>
422624 DataFrame
423625 println (" # Found " , size (df_files_cleanest,1 ), " files considered clean." )
424- # @assert size(df_files_cleanest,1) >= 1
626+
627+
628+ @assert size (df_files_cleanest,1 ) >= 1
629+
630+ if hasproperty (df_files_cleanest,:dq1level )
631+ df_files_cleanest = df_files_cleanest |>
632+ @filter ( mod (_. dq1level,4 ) == 0 ) |>
633+ DataFrame
634+ end
635+
636+ if ! (size (df_files_cleanest,1 ) >= 1 )
637+ @warn (" No inputs passed all test for making clean spectra." )
638+ end
639+ @assert size (df_files_cleanest,1 ) >= 1
425640
426641clean_obs_mask = map (fn-> in (fn, df_files_cleanest. Filename),df_files_use. Filename)
427642
0 commit comments