1+ using Distributed, ArgParse
2+
3+ function parse_commandline ()
4+ s = ArgParseSettings ()
5+
6+ # Program name (for usage & help screen)
7+ s. prog = " orbitdetermination.jl"
8+ # Desciption (for help screen)
9+ s. description = """
10+ Determines the orbit of a list of NEOs via jet transport
11+ using Julia's interface for distributed computing."""
12+
13+ @add_arg_table! s begin
14+ " --names" , " -n"
15+ help = " File containing the names of the NEOs to be processed"
16+ arg_type = String
17+ default = " names.txt"
18+ " --output" , " -o"
19+ help = " Output directory"
20+ arg_type = String
21+ default = pwd ()
22+ end
23+
24+ s. epilog = """
25+ example:\n
26+ \n
27+ # Run orbitdetermination.jl with 10 workers and 5 threads each\n
28+ julia -p 10 -t 5 --project scripts/orbitdetermination.jl -n names.txt -o orbits/\n
29+ \n
30+ """
31+
32+ return parse_args (s)
33+ end
34+
35+ @everywhere begin
36+ using NEOs, Dates, JLD2
37+ using NEOs: Tracklet, reduce_tracklets, isgauss
38+
39+ # Initial orbit determination routines
40+
41+ # First filter
42+ function iod1 (neo:: String , outdir:: String )
43+ # Output file
44+ filename = joinpath (outdir, replace (neo, " " => " _" ) * " .jld2" )
45+ # Download optical astrometry
46+ radec = fetch_radec_mpc (" designation" => neo)
47+ if length (radec) < 3
48+ jldsave (filename; tracklets = Vector {Tracklet} (undef, 0 ))
49+ return false
50+ end
51+ # Parameters
52+ params = NEOParameters (coeffstol = 10.0 , bwdoffset = 0.007 ,
53+ fwdoffset = 0.007 , jtlsiter = 10 , adamhelp = false )
54+ # Select at most three tracklets
55+ tracklets = reduce_tracklets (radec)
56+ if length (tracklets) > 3
57+ tracklets = tracklets[1 : 3 ]
58+ radec = reduce (vcat, getfield .(tracklets, :radec ))
59+ sort! (radec)
60+ end
61+
62+ try
63+ # Start of computation
64+ init_time = now ()
65+ # Orbit determination
66+ sol = orbitdetermination (radec, params)
67+ # Time of computation
68+ Δ = (now () - init_time). value
69+ # Save orbit
70+ if length (sol. res) != length (radec)
71+ jldsave (filename; tracklets = tracklets, Δ = Δ)
72+ return false
73+ else
74+ jldsave (filename; sol = sol, Δ = Δ)
75+ return true
76+ end
77+ catch
78+ # An error ocurred
79+ jldsave (filename; tracklets = tracklets)
80+ return false
81+ end
82+ end
83+
84+ # Second filter
85+ function iod2 (neo:: String , outdir:: String )
86+ # Output from last filter
87+ filename = joinpath (outdir, replace (neo, " " => " _" ) * " .jld2" )
88+ dict = JLD2. load (filename)
89+ # Previous filter already computed an orbit
90+ " sol" in keys (dict) && return true
91+ # Check tracklets are non empty
92+ tracklets = dict[" tracklets" ]
93+ isempty (tracklets) && return false
94+ # Computation time so far
95+ if " Δ" in keys (dict)
96+ Δ = dict[" Δ" ]
97+ else
98+ Δ = 0
99+ end
100+ # Optical astrometry
101+ radec = reduce (vcat, getfield .(tracklets, :radec ))
102+ sort! (radec)
103+ # Parameters
104+ params = NEOParameters (coeffstol = Inf , bwdoffset = 0.5 ,
105+ fwdoffset = 0.5 , jtlsiter = 10 , adamhelp = true )
106+
107+ try
108+ # Start of computation
109+ init_time = now ()
110+ # Orbit determination
111+ sol = orbitdetermination (radec, params)
112+ # Time of computation
113+ Δ += (now () - init_time). value
114+ # Save orbit
115+ if length (sol. res) != length (radec)
116+ jldsave (filename; tracklets = tracklets, Δ = Δ)
117+ return false
118+ else
119+ jldsave (filename; sol = sol, Δ = Δ)
120+ return true
121+ end
122+ catch
123+ # An error ocurred
124+ jldsave (filename; tracklets = tracklets)
125+ return false
126+ end
127+ end
128+
129+ # Third filter
130+ function iod3 (neo:: String , outdir:: String )
131+ # Output from last filter
132+ filename = joinpath (outdir, replace (neo, " " => " _" ) * " .jld2" )
133+ dict = JLD2. load (filename)
134+ # Previous filter already computed an orbit
135+ " sol" in keys (dict) && return true
136+ # Check tracklets are non empty
137+ tracklets = dict[" tracklets" ]
138+ isempty (tracklets) && return false
139+ # Computation time so far
140+ if " Δ" in keys (dict)
141+ Δ = dict[" Δ" ]
142+ else
143+ Δ = 0
144+ end
145+ # Optical astrometry
146+ radec = reduce (vcat, getfield .(tracklets, :radec ))
147+ sort! (radec)
148+ # Parameters
149+ params = NEOParameters (coeffstol = Inf , bwdoffset = 0.5 ,
150+ fwdoffset = 0.5 , jtlsiter = 10 , adamhelp = true )
151+
152+ try
153+ # Start of computation
154+ init_time = now ()
155+ # Orbit determination
156+ if isgauss (tracklets)
157+ sol = tooshortarc (radec, tracklets, params)
158+ else
159+ sol = gaussinitcond (radec, tracklets, params)
160+ end
161+ # Time of computation
162+ Δ += (now () - init_time). value
163+ # Save orbit
164+ if length (sol. res) != length (radec)
165+ jldsave (filename; tracklets = tracklets, Δ = Δ)
166+ return false
167+ else
168+ jldsave (filename; sol = sol, Δ = Δ)
169+ return true
170+ end
171+ catch
172+ # An error ocurred
173+ jldsave (filename; tracklets = tracklets)
174+ return false
175+ end
176+ end
177+ end
178+
179+ function main ()
180+ # Parse arguments from commandline
181+ parsed_args = parse_commandline ()
182+
183+ println (" Orbit determination for NEOs via jet transport" )
184+ println ()
185+
186+ # NEOs to be processed
187+ namesfile = parsed_args[" names" ]
188+ neos = readlines (namesfile)
189+ println (length (neos), " NEOs to be processed with " , nworkers (), " workers (" ,
190+ Threads. nthreads (), " threads each)" )
191+ println ()
192+ # Output directory
193+ outdir = parsed_args[" output" ]
194+
195+ # Distributed orbit determination
196+
197+ # First filter
198+ mask = pmap (neo -> iod1 (neo, outdir), neos)
199+ all (mask) && return nothing
200+ # Second filter
201+ mask = pmap (neo -> iod2 (neo, outdir), neos)
202+ all (mask) && return nothing
203+ # Third filter
204+ mask = pmap (neo -> iod3 (neo, outdir), neos)
205+ return nothing
206+ end
207+
208+ main ()
0 commit comments