@@ -58,20 +58,40 @@ struct ComparisonTest
5858end
5959
6060""" Constructor where there is no selector_name given"""
61- function ComparisonTest (events_file, fastjet_outputs, algorithm, strategy, power, R,
62- selector)
61+ function ComparisonTest (events_file, fastjet_outputs, algorithm, strategy, power, R, selector)
6362 selector_name = " "
64- ComparisonTest (events_file, fastjet_outputs, algorithm, strategy, power, R, selector,
65- selector_name, addjets, nothing )
63+ ComparisonTest (events_file, fastjet_outputs, algorithm, strategy, power, R, selector, selector_name, addjets, nothing )
6664end
6765
6866""" Constructor with no recombine or preprocess specified"""
69- function ComparisonTest (events_file, fastjet_outputs, algorithm, strategy, power, R,
70- selector, selector_name)
71- ComparisonTest (events_file, fastjet_outputs, algorithm, strategy, power, R, selector,
72- selector_name, addjets, nothing )
67+ function ComparisonTest (events_file, fastjet_outputs, algorithm, strategy, power, R, selector, selector_name)
68+ ComparisonTest (events_file, fastjet_outputs, algorithm, strategy, power, R, selector, selector_name, addjets, nothing )
7369end
7470
71+ """
72+ struct ComparisonTestValencia
73+
74+ Test parameters for Valencia jet algorithm comparison, with explicit gamma parameter.
75+ """
76+ struct ComparisonTestValencia
77+ events_file:: AbstractString
78+ fastjet_outputs:: AbstractString
79+ algorithm:: JetAlgorithm.Algorithm
80+ strategy:: RecoStrategy.Strategy
81+ power:: Real
82+ R:: Real
83+ γ:: Real
84+ selector:: Any
85+ selector_name:: AbstractString
86+ recombine:: Any
87+ preprocess:: Any
88+ end
89+
90+ function ComparisonTestValencia (events_file, fastjet_outputs, algorithm, strategy, power, R, γ, selector, selector_name)
91+ ComparisonTestValencia (events_file, fastjet_outputs, algorithm, strategy, power, R, γ, selector, selector_name, addjets, nothing )
92+ end
93+
94+
7595""" Read JSON file with fastjet jets in it"""
7696function read_fastjet_outputs (fname)
7797 f = JetReconstruction. open_with_stream (fname)
@@ -106,11 +126,22 @@ function run_reco_test(test::ComparisonTest; testname = nothing)
106126 # Run the jet reconstruction
107127 jet_collection = Vector {FinalJets} ()
108128 for (ievent, event) in enumerate (events)
109- cluster_seq = JetReconstruction. jet_reconstruct (event; R = test. R, p = test. power,
110- algorithm = test. algorithm,
111- strategy = test. strategy,
112- recombine = test. recombine,
113- preprocess = test. preprocess)
129+ if test. algorithm == JetAlgorithm. Valencia
130+ # For VLC: pass both beta (power) and γ
131+ cluster_seq = JetReconstruction. jet_reconstruct (event; R = test. R, p = test. power,
132+ γ = getfield (test, :γ ),
133+ algorithm = test. algorithm,
134+ strategy = test. strategy,
135+ recombine = test. recombine,
136+ preprocess = test. preprocess)
137+ else
138+ # All other algorithms
139+ cluster_seq = JetReconstruction. jet_reconstruct (event; R = test. R, p = test. power,
140+ algorithm = test. algorithm,
141+ strategy = test. strategy,
142+ recombine = test. recombine,
143+ preprocess = test. preprocess)
144+ end
114145 finaljets = final_jets (test. selector (cluster_seq))
115146 sort_jets! (finaljets)
116147 push! (jet_collection, FinalJets (ievent, finaljets))
@@ -146,3 +177,95 @@ function run_reco_test(test::ComparisonTest; testname = nothing)
146177 end
147178 end
148179end
180+
181+ function run_reco_test (test:: ComparisonTestValencia ; testname = nothing )
182+ events = JetReconstruction. read_final_state_particles (test. events_file)
183+ fastjet_jets = read_fastjet_outputs (test. fastjet_outputs)
184+ sort_jets! (fastjet_jets)
185+
186+ jet_collection = Vector {FinalJets} ()
187+ for (ievent, event) in enumerate (events)
188+ cluster_seq = JetReconstruction. jet_reconstruct (event; R = test. R, p = test. power,
189+ γ = test. γ,
190+ algorithm = test. algorithm,
191+ strategy = test. strategy,
192+ recombine = test. recombine,
193+ preprocess = test. preprocess)
194+ finaljets = final_jets (test. selector (cluster_seq))
195+ sort_jets! (finaljets)
196+ push! (jet_collection, FinalJets (ievent, finaljets))
197+ end
198+
199+ if isnothing (testname)
200+ testname = " FastJet comparison: alg=$(test. algorithm) , p=$(test. power) , R=$(test. R) , strategy=$(test. strategy) "
201+ if test. selector_name != " "
202+ testname *= " , $(test. selector_name) "
203+ end
204+ end
205+
206+ @testset " $testname " begin
207+ for (ievt, event) in enumerate (jet_collection)
208+ @testset " Event $(ievt) " begin
209+ @test size (event. jets) == size (fastjet_jets[ievt][" jets" ])
210+ # For each reconstructed jet, find the closest reference jet in deltaR
211+ ref_jets = fastjet_jets[ievt][" jets" ]
212+ used_refs = falses (length (ref_jets))
213+ function deltaR (rap1, phi1, rap2, phi2)
214+ dphi = abs (phi1 - phi2)
215+ if dphi > π
216+ dphi -= 2 π
217+ end
218+ return sqrt ((rap1 - rap2)^ 2 + dphi^ 2 )
219+ end
220+ for (ijet, jet) in enumerate (event. jets)
221+ # Find closest reference jet in deltaR that hasn't been used
222+ minidx = 0
223+ mindr = Inf
224+ norm_phi = jet. phi < 0.0 ? jet. phi + 2 π : jet. phi
225+ for (ridx, rjet) in enumerate (ref_jets)
226+ if used_refs[ridx]
227+ continue
228+ end
229+ norm_phi_ref = rjet[" phi" ] < 0.0 ? rjet[" phi" ] + 2 π : rjet[" phi" ]
230+ dr = deltaR (jet. rap, norm_phi, rjet[" rap" ], norm_phi_ref)
231+ if dr < mindr
232+ mindr = dr
233+ minidx = ridx
234+ end
235+ end
236+ if minidx == 0
237+ println (" No unused reference jet found for reconstructed jet $(ijet) " )
238+ continue
239+ end
240+ used_refs[minidx] = true
241+ rjet = ref_jets[minidx]
242+ rap_ref = rjet[" rap" ]
243+ phi_ref = rjet[" phi" ]
244+ pt_ref = rjet[" pt" ]
245+ normalised_phi_ref = phi_ref < 0.0 ? phi_ref + 2 π : phi_ref
246+ rap_test = isapprox (jet. rap, rap_ref; atol= 2e-1 )
247+ phi_test = isapprox (norm_phi, normalised_phi_ref; atol= 2e-1 )
248+ pt_test = isapprox (jet. pt, pt_ref; rtol= 2e0 )
249+ if ! rap_test || ! phi_test || ! pt_test
250+ println (" Jet mismatch in Event $(ievt) , Jet $(ijet) :" )
251+ println (" Failing Jet: pt=$(jet. pt) , rap=$(jet. rap) , phi=$(norm_phi) " )
252+ println (" Reference Jet: pt=$(pt_ref) , rap=$(rap_ref) , phi=$(phi_ref) " )
253+ println (" Passes: pt=$(pt_test) , rap=$(rap_test) , phi=$(phi_test) " )
254+ println (" \n All jets in this event:" )
255+ for (jidx, j) in enumerate (event. jets)
256+ norm_phi_j = j. phi < 0.0 ? j. phi + 2 π : j. phi
257+ println (" Jet $(jidx) : pt=$(j. pt) , rap=$(j. rap) , phi=$(norm_phi_j) " )
258+ end
259+ println (" \n All reference jets in this event:" )
260+ for (ridx, rjet2) in enumerate (ref_jets)
261+ println (" Ref Jet $(ridx) : pt=$(rjet2[" pt" ]) , rap=$(rjet2[" rap" ]) , phi=$(rjet2[" phi" ]) " )
262+ end
263+ end
264+ @test rap_test
265+ @test phi_test
266+ @test pt_test
267+ end
268+ end
269+ end
270+ end
271+ end
0 commit comments