Skip to content

Commit 424306b

Browse files
committed
adding more param and filtering for DRP v1.2
1 parent 9a4d741 commit 424306b

File tree

2 files changed

+233
-18
lines changed

2 files changed

+233
-18
lines changed

Project.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "NeidSolarScripts"
22
uuid = "71cacfaf-3521-4e83-9e04-9e5e1461b034"
33
authors = ["Eric Ford", "Shubham Kanodia", "Andrea Lin"]
4-
version = "0.1.4"
4+
version = "0.1.5"
55

66
[deps]
77
ArgParse = "c7e460c6-2fb9-53a9-8c5b-16f535851c63"
@@ -52,8 +52,8 @@ TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
5252
[compat]
5353
CSV = "0.7, 0.8, 0.9.11, 0.10"
5454
DataFrames = "0.20, 0.21, 0.22, 0.23, 0.24, 1, 1.1"
55-
EchelleCCFs = ">=0.2.6"
56-
EchelleInstruments = ">=0.2.7"
55+
EchelleCCFs = ">=0.2.8"
56+
EchelleInstruments = ">=0.2.10"
5757
FileIO = "1.4"
5858
JLD2 = "0.4"
5959
LsqFit = "0.12, 0.13"
@@ -62,8 +62,8 @@ Missings = "0.4, 1"
6262
MultivariateStats = "0.8, 0.9, 0.10"
6363
Plots = "1"
6464
Query = "1"
65-
RvSpectML = ">=0.2.3"
66-
RvSpectMLBase = ">=0.2.1"
65+
RvSpectML = ">=0.2.7"
66+
RvSpectMLBase = ">=0.2.3"
6767
Scalpels = "0.1"
6868
SortFilters = "0.1"
6969
StatsBase = "0.33, 0.34"

examples/calc_order_ccfs_using_continuum_1.2.jl

Lines changed: 228 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1111
println("# 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

208261
verbose = 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+
415546
df_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

426641
clean_obs_mask = map(fn->in(fn, df_files_cleanest.Filename),df_files_use.Filename)
427642

0 commit comments

Comments
 (0)