From d98e7dbfc3a92465b662b78d2bbffabe1a4f7771 Mon Sep 17 00:00:00 2001 From: Graeme A Stewart Date: Tue, 30 Jul 2024 12:11:56 +0200 Subject: [PATCH] Generalised kT Algorithm for pp collisions (#71) Add proper support for the generalised kT algorithm for pp collisions (i.e., operating in $(y, \phi)$ space). Added a `JetAlgorithm` type for generalised kT, viz. `GenKt`. Strategies are restructured to be able to be driven by only the power, or the algorithm, or (for `GenKt`) both. A new function, `get_algorithm_power_consistency` is added that will return the "partner" of a (power/algorithm) given an (algorithm/power). If inconsistent input is given an exception is thrown. Documentation is updated explaining how to call with either `p` or `algorithm`, or both for `GenKt`. ClusterSequence now stores the power value and the algorithm and has to be initialised with both. In addition the power is always stored as a `Float64`. Examples are restructured to also be able to be driven by power, or algorithm, or both. However, if neither is given then the scripts will use `AntiKt` and print a warning. There is also now a clearer separation between calling the jet reconstruction itself and getting the inclusive/exclusive constituents. A test to compare Generalised kT output with FastJet for the case `p=1.5` is added. Tests have been added to run our code examples, to check none of these break (at least for the standalone Julia scripts), but these are currently disabled as some non-trivial problems arose: - The dependencies are heavy and some for GLMakie actually seem to timeout - As these are CI machines, they can't correctly setup GLMakie - There seems to be a weird issue with setting up a different environment for the Julia nightly: > ERROR: LoadError: ArgumentError: Package Pkg does not have Random in its dependencies # Misc - Notebooks are now *not* formatted by JuliaFormatter. - For the tiled algorithm directly calling the real work interface is now discouraged (method is now `_tiled_jet_reconstruct`) to ensure that power and algorithm are handled properly in the public interface (`tiled_jet_reconstruct`). (N.B. this costs about 1us per event) Closes #49 --- .JuliaFormatter.toml | 3 + README.md | 9 +- docs/src/index.md | 9 +- examples/Project.toml | 2 + examples/animate-reconstruction.jl | 16 +- examples/instrumented-jetreco.jl | 54 +- examples/jetreco-constituents.jl | 4 + examples/jetreco.jl | 33 +- examples/visualise-jets.ipynb | 5 +- examples/visualise-jets.jl | 10 +- src/AlgorithmStrategyEnums.jl | 73 +- src/ClusterSequence.jl | 50 +- src/GenericAlgo.jl | 12 +- src/PlainAlgo.jl | 27 +- src/TiledAlgoLL.jl | 55 +- test/bootstrap_examples.jl | 32 + ...lections-fastjet-inclusive-genkt-p1.5.json | 4382 +++++++++++++++++ test/runtests.jl | 54 +- test/tests_examples.jl | 31 + 19 files changed, 4748 insertions(+), 113 deletions(-) create mode 100644 test/bootstrap_examples.jl create mode 100644 test/data/jet-collections-fastjet-inclusive-genkt-p1.5.json create mode 100644 test/tests_examples.jl diff --git a/.JuliaFormatter.toml b/.JuliaFormatter.toml index 8424630..86b7973 100644 --- a/.JuliaFormatter.toml +++ b/.JuliaFormatter.toml @@ -1,2 +1,5 @@ style = "sciml" yas_style_nesting = true + +# Do not format notebooks +ignore = ["*-pluto.jl", "*-nb.jl"] diff --git a/README.md b/README.md index f432a2c..433c298 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ Algorithms used are based on the C++ FastJet package (, [hep-ph/0512210](https://arxiv.org/abs/hep-ph/0512210), [arXiv:1111.6097](https://arxiv.org/abs/1111.6097)), reimplemented natively in Julia. -The algorithms include anti-$`{k}_\text{T}`$, Cambridge/Aachen and inclusive $`k_\text{T}`$. +The algorithms include anti-$`{k}_\text{T}`$, Cambridge/Aachen, inclusive +$`k_\text{T}`$ and generalised $`k_\text{T}`$. ### Interface @@ -35,14 +36,18 @@ cs = jet_reconstruct(particles::Vector{T}; p = -1, R = 1.0, recombine = +, strat The object returned is a `ClusterSequence`, which internally tracks all merge steps. +Alternatively one can swap the `p=...` parameter for +`algorithm=JetReconstruction.{AntiKt,CA,Kt}` for explicit algorithm selection. (Generalised $`{k}_\text{T}`$ requires `algorithm=JetReconstruction.GenKt` *and* `p=N`.) + To obtain the final inclusive jets, use the `inclusive_jets` method: ```julia final_jets = inclusive_jets(cs::ClusterSequence; ptmin=0.0) ``` - Only jets passing the cut $p_T > p_{Tmin}$ will be returned. The result is returned as a `Vector{LorentzVectorHEP}`. + + #### Sorting As sorting vectors is trivial in Julia, no special sorting methods are provided. As an example, to sort exclusive jets of $>5.0$ (usually GeV, depending on your EDM) from highest energy to lowest: diff --git a/docs/src/index.md b/docs/src/index.md index 9b9ac94..9bfb768 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -43,7 +43,14 @@ The main interface for reconstruction is [`jet_reconstruct`](@ref), called as, e jet_reconstruct(particles; p = -1, R = 1.0) ``` -Where `particles` is a collection of 4-vector objects to reconstruct. +or + +```julia +jet_reconstruct(particles; algorithm = JetAlgorithm.AntiKt, R = 1.0) +``` + +Where `particles` is a collection of 4-vector objects to reconstruct and the +algorithm is either given explicitly or implied by the power value. For the case of generalised $k_T$ both the algorithm (`JetAlgorithm.GenKt`) and `p` are needed. The object returned is a [`ClusterSequence`](@ref), which internally tracks all merge steps. diff --git a/examples/Project.toml b/examples/Project.toml index e6ab21f..0f13131 100644 --- a/examples/Project.toml +++ b/examples/Project.toml @@ -7,8 +7,10 @@ GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" JetReconstruction = "44e8cb2c-dfab-4825-9c70-d4808a591196" LorentzVectorHEP = "f612022c-142a-473f-8cfd-a09cf3793c6c" +Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" Pluto = "c3e4b0f8-55cb-11ea-2926-15256bba5781" PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" Profile = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" ProfileSVG = "132c30aa-f267-4189-9183-c8a63c7e05e6" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" StatProfilerHTML = "a8a75453-ed82-57c9-9e16-4cd1196ecbf5" diff --git a/examples/animate-reconstruction.jl b/examples/animate-reconstruction.jl index 2642ae0..596d9d1 100644 --- a/examples/animate-reconstruction.jl +++ b/examples/animate-reconstruction.jl @@ -26,7 +26,10 @@ function main() "--algorithm", "-A" help = """Algorithm to use for jet reconstruction: $(join(JetReconstruction.AllJetRecoAlgorithms, ", "))""" arg_type = JetAlgorithm.Algorithm - default = JetAlgorithm.AntiKt + + "--power", "-p" + help = """Power value for jet reconstruction""" + arg_type = Float64 "--strategy", "-S" help = """Strategy for the algorithm, valid values: $(join(JetReconstruction.AllJetRecoStrategies, ", "))""" @@ -49,9 +52,14 @@ function main() events::Vector{Vector{PseudoJet}} = read_final_state_particles(args[:file], maxevents = args[:event], skipevents = args[:event]) - - power = JetReconstruction.algorithm2power[args[:algorithm]] - cs = jet_reconstruct(events[1], R = args[:distance], p = power, + if isnothing(args[:algorithm]) && isnothing(args[:power]) + @warn "Neither algorithm nor power specified, defaulting to AntiKt" + args[:algorithm] = JetAlgorithm.AntiKt + end + # Set consistent algorithm and power + (p, algorithm) = JetReconstruction.get_algorithm_power_consistency(p = args[:power], + algorithm = args[:algorithm]) + cs = jet_reconstruct(events[1], R = args[:distance], p = p, algorithm = algorithm, strategy = args[:strategy]) animatereco(cs, args[:output]; azimuth = (1.8, 3.0), elevation = 0.5, diff --git a/examples/instrumented-jetreco.jl b/examples/instrumented-jetreco.jl index 01e0e86..d636db6 100644 --- a/examples/instrumented-jetreco.jl +++ b/examples/instrumented-jetreco.jl @@ -23,11 +23,13 @@ using JetReconstruction include(joinpath(@__DIR__, "parse-options.jl")) function profile_code(profile, jet_reconstruction, events, niters; R = 0.4, p = -1, + algorithm::JetAlgorithm.Algorithm = JetAlgorithm.AntiKt, strategy = RecoStrategy.N2Tiled) Profile.init(n = 5 * 10^6, delay = 0.00001) function profile_events(events) for evt in events - jet_reconstruction(evt, R = R, p = p, strategy = strategy) + jet_reconstruction(evt, R = R, p = p, algorithm = algorithm, + strategy = strategy) end end profile_events(events[1:1]) @@ -67,7 +69,8 @@ serialising the reconstructed jet outputs. """ function jet_process(events::Vector{Vector{PseudoJet}}; distance::Real = 0.4, - algorithm::JetAlgorithm.Algorithm = JetAlgorithm.AntiKt, + algorithm::Union{JetAlgorithm.Algorithm, Nothing} = nothing, + p::Union{Real, Nothing} = nothing, ptmin::Real = 5.0, dcut = nothing, njets = nothing, @@ -77,27 +80,30 @@ function jet_process(events::Vector{Vector{PseudoJet}}; profile = nothing, alloc::Bool = false, dump::Union{String, Nothing} = nothing) - @info "Will process $(size(events)[1]) events" - - # Map algorithm to power - power = JetReconstruction.algorithm2power[algorithm] # If we are dumping the results, setup the JSON structure if !isnothing(dump) jet_collection = FinalJets[] end + # Set consistent algorithm and power + (p, algorithm) = JetReconstruction.get_algorithm_power_consistency(p = p, + algorithm = algorithm) + @info "Jet reconstruction will use $(algorithm) with power $(p)" + # Warmup code if we are doing a multi-sample timing run if nsamples > 1 || !isnothing(profile) @info "Doing initial warm-up run" for event in events - _ = inclusive_jets(jet_reconstruct(event, R = distance, p = power, - strategy = strategy); ptmin = ptmin) + _ = inclusive_jets(jet_reconstruct(event, R = distance, p = p, + algorithm = algorithm, + strategy = strategy), ptmin) end end if !isnothing(profile) - profile_code(profile, jet_reconstruct, events, nsamples, R = distance, p = power, + profile_code(profile, jet_reconstruct, events, nsamples, algorithm = algorithm, + R = distance, p = p, strategy = strategy) return nothing end @@ -105,8 +111,9 @@ function jet_process(events::Vector{Vector{PseudoJet}}; if alloc println("Memory allocation statistics:") @timev for event in events - _ = inclusive_jets(jet_reconstruct(event, R = distance, p = power, - strategy = strategy); ptmin = ptmin) + _ = inclusive_jets(jet_reconstruct(event, R = distance, p = p, + algorithm = algorithm, + strategy = strategy), ptmin) end return nothing end @@ -120,18 +127,15 @@ function jet_process(events::Vector{Vector{PseudoJet}}; gcoff && GC.enable(false) t_start = time_ns() for (ievt, event) in enumerate(events) + cs = jet_reconstruct(event, R = distance, p = p, algorithm = algorithm, + strategy = strategy) + strategy = strategy if !isnothing(njets) - finaljets = exclusive_jets(jet_reconstruct(event, R = distance, p = power, - strategy = strategy); - njets = njets) + finaljets = exclusive_jets(cs, njets = njets) elseif !isnothing(dcut) - finaljets = exclusive_jets(jet_reconstruct(event, R = distance, p = power, - strategy = strategy); - dcut = dcut) + finaljets = exclusive_jets(cs, dcut = dcut) else - finaljets = inclusive_jets(jet_reconstruct(event, R = distance, p = power, - strategy = strategy); - ptmin = ptmin) + finaljets = inclusive_jets(cs, ptmin = ptmin) end # Only print the jet content once if irun == 1 @@ -221,7 +225,10 @@ function parse_command_line(args) "--algorithm", "-A" help = """Algorithm to use for jet reconstruction: $(join(JetReconstruction.AllJetRecoAlgorithms, ", "))""" arg_type = JetAlgorithm.Algorithm - default = JetAlgorithm.AntiKt + + "--power", "-p" + help = """Power value for jet reconstruction""" + arg_type = Float64 "--strategy", "-S" help = """Strategy for the algorithm, valid values: $(join(JetReconstruction.AllJetRecoStrategies, ", "))""" @@ -277,7 +284,12 @@ function main() events::Vector{Vector{PseudoJet}} = read_final_state_particles(args[:file], maxevents = args[:maxevents], skipevents = args[:skip]) + if isnothing(args[:algorithm]) && isnothing(args[:power]) + @warn "Neither algorithm nor power specified, defaulting to AntiKt" + args[:algorithm] = JetAlgorithm.AntiKt + end jet_process(events, distance = args[:distance], algorithm = args[:algorithm], + p = args[:power], strategy = args[:strategy], ptmin = args[:ptmin], dcut = args[:exclusive_dcut], njets = args[:exclusive_njets], diff --git a/examples/jetreco-constituents.jl b/examples/jetreco-constituents.jl index 43bdca1..ff080bd 100644 --- a/examples/jetreco-constituents.jl +++ b/examples/jetreco-constituents.jl @@ -5,6 +5,10 @@ # N.B. currently you must use the `jet-constituents` branch of `JetReconstruction`. using JetReconstruction using LorentzVectorHEP +using Logging + +logger = ConsoleLogger(stdout, Logging.Info) +global_logger(logger) input_file = joinpath(dirname(pathof(JetReconstruction)), "..", "test", "data", "events.hepmc3.gz") diff --git a/examples/jetreco.jl b/examples/jetreco.jl index f137a64..4410e0f 100644 --- a/examples/jetreco.jl +++ b/examples/jetreco.jl @@ -25,35 +25,32 @@ Final jets can be serialised if the "dump" option is given """ function jet_process(events::Vector{Vector{PseudoJet}}; distance::Real = 0.4, - algorithm::JetAlgorithm.Algorithm = JetAlgorithm.AntiKt, + algorithm::Union{JetAlgorithm.Algorithm, Nothing} = nothing, + p::Union{Real, Nothing} = nothing, ptmin::Real = 5.0, dcut = nothing, njets = nothing, strategy::RecoStrategy.Strategy, dump::Union{String, Nothing} = nothing) - @info "Will process $(size(events)[1]) events" - # If we are dumping the results, setup the JSON structure - if !isnothing(dump) - jet_collection = FinalJets[] - end + # Set consistent algorithm and power + (p, algorithm) = JetReconstruction.get_algorithm_power_consistency(p = p, + algorithm = algorithm) + @info "Jet reconstruction will use $(algorithm) with power $(p)" # A friendly label for the algorithm and final jet selection if !isnothing(njets) - @info "Running exclusive jets with n_jets = $(njets)" + @info "Will produce exclusive jets with n_jets = $(njets)" elseif !isnothing(dcut) - @info "Running exclusive jets with dcut = $(dcut)" + @info "Will produce exclusive jets with dcut = $(dcut)" else - @info "Running inclusive jets with ptmin = $(ptmin)" + @info "Will produce inclusive jets with ptmin = $(ptmin)" end - # Map algorithm to power - power = JetReconstruction.algorithm2power[algorithm] - # Now run over each event for (ievt, event) in enumerate(events) # Run the jet reconstruction - cluster_seq = jet_reconstruct(event, R = distance, p = power, + cluster_seq = jet_reconstruct(event, R = distance, p = p, algorithm = algorithm, strategy = strategy) # Now select jets, with inclusive or exclusive parameters if !isnothing(njets) @@ -117,7 +114,10 @@ function parse_command_line(args) "--algorithm", "-A" help = """Algorithm to use for jet reconstruction: $(join(JetReconstruction.AllJetRecoAlgorithms, ", "))""" arg_type = JetAlgorithm.Algorithm - default = JetAlgorithm.AntiKt + + "--power", "-p" + help = """Power value for jet reconstruction""" + arg_type = Float64 "--strategy", "-S" help = """Strategy for the algorithm, valid values: $(join(JetReconstruction.AllJetRecoStrategies, ", "))""" @@ -141,7 +141,12 @@ function main() events::Vector{Vector{PseudoJet}} = read_final_state_particles(args[:file], maxevents = args[:maxevents], skipevents = args[:skip]) + if isnothing(args[:algorithm]) && isnothing(args[:power]) + @warn "Neither algorithm nor power specified, defaulting to AntiKt" + args[:algorithm] = JetAlgorithm.AntiKt + end jet_process(events, distance = args[:distance], algorithm = args[:algorithm], + p = args[:power], strategy = args[:strategy], ptmin = args[:ptmin], dcut = args[:exclusive_dcut], njets = args[:exclusive_njets], diff --git a/examples/visualise-jets.ipynb b/examples/visualise-jets.ipynb index 439d876..c663e32 100644 --- a/examples/visualise-jets.ipynb +++ b/examples/visualise-jets.ipynb @@ -26,8 +26,7 @@ "outputs": [], "source": [ "input_file = joinpath(dirname(pathof(JetReconstruction)), \"..\", \"test\", \"data\", \"events.hepmc3.gz\")\n", - "event_number = 5\n", - "power = JetReconstruction.algorithm2power[JetAlgorithm.AntiKt];" + "event_number = 5" ] }, { @@ -47,7 +46,7 @@ "metadata": {}, "outputs": [], "source": [ - "cs = jet_reconstruct(events[1], R = 1.0, p = power);" + "cs = jet_reconstruct(events[1], R = 1.0, algorithm = JetAlgorithm.AntiKt);" ] }, { diff --git a/examples/visualise-jets.jl b/examples/visualise-jets.jl index 64e0613..c151349 100644 --- a/examples/visualise-jets.jl +++ b/examples/visualise-jets.jl @@ -39,7 +39,10 @@ function main() "--algorithm", "-A" help = """Algorithm to use for jet reconstruction: $(join(JetReconstruction.AllJetRecoAlgorithms, ", "))""" arg_type = JetAlgorithm.Algorithm - default = JetAlgorithm.AntiKt + + "--power", "-p" + help = """Power value for jet reconstruction""" + arg_type = Float64 "--strategy", "-S" help = """Strategy for the algorithm, valid values: $(join(JetReconstruction.AllJetRecoStrategies, ", "))""" @@ -63,8 +66,9 @@ function main() maxevents = args[:event], skipevents = args[:event]) - power = JetReconstruction.algorithm2power[args[:algorithm]] - cs = jet_reconstruct(events[1], R = args[:distance], p = power, + (p, algorithm) = JetReconstruction.get_algorithm_power_consistency(p = args[:power], + algorithm = args[:algorithm]) + cs = jet_reconstruct(events[1], R = args[:distance], p = p, algorithm = algorithm, strategy = args[:strategy]) plt = jetsplot(events[1], cs; Module = CairoMakie) diff --git a/src/AlgorithmStrategyEnums.jl b/src/AlgorithmStrategyEnums.jl index f9fceef..ecf4330 100644 --- a/src/AlgorithmStrategyEnums.jl +++ b/src/AlgorithmStrategyEnums.jl @@ -23,16 +23,26 @@ Scoped enumeration (using EnumX) representing different jet algorithms used in t - `AntiKt`: The Anti-Kt algorithm. - `CA`: The Cambridge/Aachen algorithm. - `Kt`: The Inclusive-Kt algorithm. +- `GenKt`: The Generalised Kt algorithm (with arbitrary power). - `EEKt`: The Generalised e+e- kt algorithm. - `Durham`: The e+e- kt algorithm, aka Durham. """ -@enumx T=Algorithm JetAlgorithm AntiKt CA Kt EEKt Durham +@enumx T=Algorithm JetAlgorithm AntiKt CA Kt GenKt EEKt Durham const AllJetRecoAlgorithms = [String(Symbol(x)) for x in instances(JetAlgorithm.Algorithm)] +""" + const varpower_algorithms + +A constant array that contains the jet algorithms for which power is variable. + +""" +const varpower_algorithms = [JetAlgorithm.GenKt, JetAlgorithm.EEKt] + """ power2algorithm -A dictionary that maps power values to corresponding jet algorithm used for pp jet reconstruction. +A dictionary that maps power values to corresponding jet algorithm used for pp +jet reconstruction, where these are fixed. """ const power2algorithm = Dict(-1 => JetAlgorithm.AntiKt, 0 => JetAlgorithm.CA, @@ -58,3 +68,62 @@ Base.tryparse(E::Type{<:Enum}, str::String) = p !== nothing ? insts[p] : nothing end + +""" + set_algorithm_power_consistency(; p::Union{Real, Nothing}, algorithm::Union{JetAlgorithm, Nothing}) + +Get the algorithm and power consistency correct + +This function checks the consistency between the algorithm and power parameters. +If the algorithm is specified, it checks if the power parameter is consistent +with the algorithm's known power. If the power parameter is not specified, it +sets the power parameter based on the algorithm. If neither the algorithm nor +the power parameter is specified, it throws an `ArgumentError`. + +# Arguments +- `p::Union{Real, Nothing}`: The power value. +- `algorithm::Union{JetAlgorithm, Nothing}`: The algorithm. + +# Returns +A named tuple of the consistent power and algorithm values. + +# Throws +- `ArgumentError`: If the algorithm and power are inconsistent or if neither the + algorithm nor the power is specified. + +""" +function get_algorithm_power_consistency(; p::Union{Real, Nothing}, + algorithm::Union{JetAlgorithm.Algorithm, Nothing}) + # For the case where an algorithm has a variable power value + # we need to check that the power value and algorithm are both specified + if algorithm in varpower_algorithms + if isnothing(p) + throw(ArgumentError("Power must be specified for algorithm $algorithm")) + end + return (p = p, algorithm = algorithm) + end + + # Otherwise we check the consistency between the algorithm and power + if !isnothing(algorithm) + power_from_alg = algorithm2power[algorithm] + if !isnothing(p) && p != power_from_alg + throw(ArgumentError("Algorithm and power are inconsistent")) + end + return (p = power_from_alg, algorithm = algorithm) + else + if isnothing(p) + throw(ArgumentError("Either algorithm or power must be specified")) + end + # Set the algorithm from the power + algorithm_from_power = power2algorithm[p] + return (p = p, algorithm = algorithm_from_power) + end +end + +"""Allow a check for algorithm and power consistency""" +function check_algorithm_power_consistency(; p::Union{Real, Nothing}, + algorithm::Union{JetAlgorithm.Algorithm, + Nothing}) + get_algorithm_power_consistency(p = p, algorithm = algorithm) + return true +end diff --git a/src/ClusterSequence.jl b/src/ClusterSequence.jl index d8f7fc9..21a9b8d 100644 --- a/src/ClusterSequence.jl +++ b/src/ClusterSequence.jl @@ -68,18 +68,26 @@ HistoryElement(jetp_index) = HistoryElement(NonexistentParent, NonexistentParent """ struct ClusterSequence -A struct holding the full history of a jet clustering sequence, including the final jets. +A struct holding the full history of a jet clustering sequence, including the +final jets. # Fields - `algorithm::JetAlgorithm.Algorithm`: The algorithm used for clustering. - `strategy::RecoStrategy.Strategy`: The strategy used for clustering. -- `jets::Vector{PseudoJet}`: The physical PseudoJets in the cluster sequence. Each PseudoJet corresponds to a position in the history. -- `n_initial_jets::Int`: The initial number of particles used for exclusive jets. -- `history::Vector{HistoryElement}`: The branching history of the cluster sequence. Each stage in the history indicates where to look in the jets vector to get the physical PseudoJet. +- `power::Float64`: The power value used for the clustering algorithm (not that + this value is always stored as a Float64 to be type stable) +- `jets::Vector{PseudoJet}`: The physical PseudoJets in the cluster sequence. + Each PseudoJet corresponds to a position in the history. +- `n_initial_jets::Int`: The initial number of particles used for exclusive + jets. +- `history::Vector{HistoryElement}`: The branching history of the cluster + sequence. Each stage in the history indicates where to look in the jets vector + to get the physical PseudoJet. - `Qtot::Any`: The total energy of the event. """ struct ClusterSequence algorithm::JetAlgorithm.Algorithm + power::Float64 strategy::RecoStrategy.Strategy jets::Vector{PseudoJet} n_initial_jets::Int @@ -90,10 +98,11 @@ end """ ClusterSequence(p::Int, strategy::RecoStrategy.Strategy, jets, history, Qtot) -Constructs a `ClusterSequence` object with a specific power value mapped to a pp reconstruction algorithm. +Constructs a `ClusterSequence` object with a specific power and algorithm. # Arguments -- `p::Int`: The power value for the algorithm. +- `p::Real`: The power value for the algorithm. +- `algorithm::JetAlgorithm.Algorithm`: The algorithm. - `strategy::RecoStrategy.Strategy`: The reconstruction strategy. - `jets`: The jets to be clustered. - `history`: The length of the jets. @@ -102,35 +111,10 @@ Constructs a `ClusterSequence` object with a specific power value mapped to a pp # Returns A `ClusterSequence` object. """ -ClusterSequence(p::Int, strategy::RecoStrategy.Strategy, jets, history, Qtot) = begin - if !haskey(power2algorithm, p) - raise(ArgumentError("Unrecognised algorithm for power value p=$p")) - end - ClusterSequence(power2algorithm[p], strategy, jets, length(jets), history, Qtot) +ClusterSequence(algorithm::JetAlgorithm.Algorithm, p::Real, strategy::RecoStrategy.Strategy, jets, history, Qtot) = begin + ClusterSequence(algorithm, Float64(p), strategy, jets, length(jets), history, Qtot) end -""" - ClusterSequence(alg::JetAlgorithm.Algorithm, strategy::RecoStrategy.Strategy, jets, history, Qtot) - -Constructs a `ClusterSequence` object with a specific algorithm spcified. - -# Arguments -- `alg::JetAlgorithm.Algorithm`: The algorithm. -- `strategy::RecoStrategy.Strategy`: The reconstruction strategy. -- `jets`: The jets to be clustered. -- `history`: The length of the jets. -- `Qtot`: The total energy of the jets. - -# Returns -A `ClusterSequence` object. -""" -ClusterSequence(alg::JetAlgorithm.Algorithm, strategy::RecoStrategy.Strategy, jets, history, Qtot) = ClusterSequence(alg, - strategy, - jets, - length(jets), - history, - Qtot) - """ add_step_to_history!(clusterseq::ClusterSequence, parent1, parent2, jetp_index, dij) diff --git a/src/GenericAlgo.jl b/src/GenericAlgo.jl index 6e2a392..7b36f51 100644 --- a/src/GenericAlgo.jl +++ b/src/GenericAlgo.jl @@ -36,22 +36,24 @@ default is simply `+(jet1,jet2)`, i.e. 4-momenta addition or the *E*-scheme. jet_reconstruct(particles; p = -1, R = 0.4) ``` """ -function jet_reconstruct(particles; p = -1, R = 1.0, recombine = +, +function jet_reconstruct(particles; p::Union{Real, Nothing} = -1, R = 1.0, + algorithm::Union{JetAlgorithm.Algorithm, Nothing} = nothing, + recombine = +, strategy = RecoStrategy.Best) # Either map to the fixed algorithm corresponding to the strategy # or to an optimal choice based on the density of initial particles if strategy == RecoStrategy.Best # The breakpoint of ~80 is determined empirically on e+e- -> H and 0.5TeV pp -> 5GeV jets - algorithm = length(particles) > 80 ? tiled_jet_reconstruct : plain_jet_reconstruct + alg = length(particles) > 80 ? tiled_jet_reconstruct : plain_jet_reconstruct elseif strategy == RecoStrategy.N2Plain - algorithm = plain_jet_reconstruct + alg = plain_jet_reconstruct elseif strategy == RecoStrategy.N2Tiled - algorithm = tiled_jet_reconstruct + alg = tiled_jet_reconstruct else throw(ErrorException("Invalid strategy: $(strategy)")) end # Now call the chosen algorithm, passing through the other parameters - algorithm(particles; p = p, R = R, recombine = recombine) + alg(particles; p = p, R = R, algorithm = algorithm, recombine = recombine) end diff --git a/src/PlainAlgo.jl b/src/PlainAlgo.jl index f05d8a9..630306f 100644 --- a/src/PlainAlgo.jl +++ b/src/PlainAlgo.jl @@ -181,12 +181,14 @@ end """ plain_jet_reconstruct(particles::Vector{T}; p = -1, R = 1.0, recombine = +) where T -Perform jet reconstruction using the plain algorithm. +Perform pp jet reconstruction using the plain algorithm. # Arguments - `particles::Vector{T}`: A vector of particles used for jet reconstruction, any array of particles, which supports suitable 4-vector methods, viz. pt2(), phi(), rapidity(), px(), py(), pz(), energy(), can be used. for each element. +- `algorithm::Union{JetAlgorithm, Nothing} = nothing`: The explicit jet + algorithm to use. - `p::Int=-1`: The integer value used for jet reconstruction. - `R::Float64=1.0`: The radius parameter used for jet reconstruction. - `recombine::Function=+`: The recombination function used for jet @@ -195,16 +197,27 @@ Perform jet reconstruction using the plain algorithm. **Note** for the `particles` argument, the 4-vector methods need to exist in the JetReconstruction package namespace. +This code will use the `k_t` algorithm types, operating in `(rapidity, φ)` space. + +It is not necessary to specify both the `algorithm` and the `p` (power) value. +If both are given they must be consistent or an exception is thrown. + # Returns - `Vector{PseudoJet}`: A vector of reconstructed jets. # Example ```julia -jets = plain_jet_reconstruct(particles; p = -1, R = 1.0) +jets = plain_jet_reconstruct(particles; p = -1, R = 0.4) +jets = plain_jet_reconstruct(particles; algorithm = JetAlgorithm.Kt, R = 1.0) ``` """ -function plain_jet_reconstruct(particles::Vector{T}; p = -1, R = 1.0, +function plain_jet_reconstruct(particles::Vector{T}; p::Union{Real, Nothing} = -1, R = 1.0, + algorithm::Union{JetAlgorithm.Algorithm, Nothing} = nothing, recombine = +) where {T} + + # Check for consistency between algorithm and power + (p, algorithm) = get_algorithm_power_consistency(p = p, algorithm = algorithm) + # Integer p if possible p = (round(p) == p) ? Int(p) : p @@ -225,6 +238,7 @@ function plain_jet_reconstruct(particles::Vector{T}; p = -1, R = 1.0, # Now call the actual reconstruction method, tuned for our internal EDM _plain_jet_reconstruct(particles = recombination_particles, p = p, R = R, + algorithm = algorithm, recombine = recombine) end @@ -240,7 +254,8 @@ Users of the package should use the `plain_jet_reconstruct` function as their entry point to this jet reconstruction. The power value maps to specific pp jet reconstruction algorithms: -1 = AntiKt, -0 = Cambridge/Aachen, 1 = Inclusive Kt. +0 = Cambridge/Aachen, 1 = Inclusive Kt. Floating point values are allowed for +generalised k_t algorithm. # Arguments - `particles`: A vector of `PseudoJet` objects representing the input particles. @@ -255,6 +270,7 @@ The power value maps to specific pp jet reconstruction algorithms: -1 = AntiKt, reconstructed jets. """ function _plain_jet_reconstruct(; particles::Vector{PseudoJet}, p = -1, R = 1.0, + algorithm::JetAlgorithm.Algorithm = JetAlgorithm.AntiKt, recombine = +) # Bounds N::Int = length(particles) @@ -279,7 +295,8 @@ function _plain_jet_reconstruct(; particles::Vector{PseudoJet}, p = -1, R = 1.0, # Current implementation mutates the particles vector, so need to copy it # for the cluster sequence (there is too much copying happening, so this # needs to be rethought and reoptimised) - clusterseq = ClusterSequence(p, RecoStrategy.N2Plain, particles, history, Qtot) + clusterseq = ClusterSequence(algorithm, p, RecoStrategy.N2Plain, particles, history, + Qtot) # Initialize nearest neighbours @simd for i in 1:N diff --git a/src/TiledAlgoLL.jl b/src/TiledAlgoLL.jl index e2190b3..66a35c1 100644 --- a/src/TiledAlgoLL.jl +++ b/src/TiledAlgoLL.jl @@ -369,12 +369,20 @@ tiled stragegy for generic jet type T. **Note** - if a non-standard recombination is used, it must be defined for JetReconstruction.PseudoJet, as this struct is used internally. +This code will use the `k_t` algorithm types, operating in `(rapidity, φ)` +space. + +It is not necessary to specify both the `algorithm` and the `p` (power) value. +If both are given they must be consistent or an exception is thrown. + ## Arguments - `particles::Vector{T}`: A vector of particles used as input for jet reconstruction. T must support methods px, py, pz and energy (defined in the JetReconstruction namespace) -- `p::Int = -1`: The power parameter for the jet reconstruction algorithm, thus - swiching between different algorithms. +- `p::Union{Real, Nothing} = -1`: The power parameter for the jet reconstruction + algorithm, thus swiching between different algorithms. +- `algorithm::Union{JetAlgorithm, Nothing} = nothing`: The explicit jet + algorithm to use. - `R::Float64 = 1.0`: The jet radius parameter for the jet reconstruction algorithm. - `recombine::Function = +`: The recombination function used for combining @@ -388,16 +396,31 @@ JetReconstruction.PseudoJet, as this struct is used internally. tiled_jet_reconstruct(particles::Vector{LorentzVectorHEP}; p = -1, R = 0.4, recombine = +) ``` """ -function tiled_jet_reconstruct(particles::Vector{T}; p = -1, R = 1.0, +function tiled_jet_reconstruct(particles::Vector{T}; p::Union{Real, Nothing} = -1, R = 1.0, + algorithm::Union{JetAlgorithm.Algorithm, Nothing} = nothing, recombine = +) where {T} - # Here we need to populate the vector of PseudoJets that are the internal - # EDM for the main algorithm, then we call the reconstruction - pseudojets = Vector{PseudoJet}(undef, length(particles)) - for (i, particle) in enumerate(particles) - pseudojets[i] = PseudoJet(px(particle), py(particle), - pz(particle), energy(particle)) + + # Check for consistency between algorithm and power + (p, algorithm) = get_algorithm_power_consistency(p = p, algorithm = algorithm) + + # If we have PseudoJets, we can just call the main algorithm... + if T == PseudoJet + # recombination_particles will become part of the cluster sequence, so size it for + # the starting particles and all N recombinations + recombination_particles = copy(particles) + sizehint!(recombination_particles, length(particles) * 2) + else + recombination_particles = PseudoJet[] + sizehint!(recombination_particles, length(particles) * 2) + for i in eachindex(particles) + push!(recombination_particles, + PseudoJet(px(particles[i]), py(particles[i]), pz(particles[i]), + energy(particles[i]))) + end end - tiled_jet_reconstruct(pseudojets, p = p, R = R, recombine = recombine) + + _tiled_jet_reconstruct(recombination_particles; p = p, R = R, algorithm = algorithm, + recombine = recombine) end """ @@ -405,10 +428,10 @@ Main jet reconstruction algorithm, using PseudoJet objects """ """ - tiled_jet_reconstruct(particles::Vector{PseudoJet}; p = -1, R = 1.0, recombine = +) where {T} + _tiled_jet_reconstruct(particles::Vector{PseudoJet}; p = -1, R = 1.0, recombine = +) where {T} -Main jet reconstruction algorithm entry point for reconstructing jets using the -tiled stragegy for the prefered internal jet type, `PseudoJet`. +Main jet reconstruction algorithm entry point for reconstructing jets once preprocessing +of data types are done. ## Arguments - `particles::Vector{PseudoJet}`: A vector of `PseudoJet` particles used as input for jet @@ -428,7 +451,9 @@ tiled stragegy for the prefered internal jet type, `PseudoJet`. tiled_jet_reconstruct(particles::Vector{PseudoJet}; p = 1, R = 1.0, recombine = +) ``` """ -function tiled_jet_reconstruct(particles::Vector{PseudoJet}; p = -1, R = 1.0, recombine = +) +function _tiled_jet_reconstruct(particles::Vector{PseudoJet}; p::Real = -1, R = 1.0, + algorithm::JetAlgorithm.Algorithm = JetAlgorithm.AntiKt, + recombine = +) # Bounds N::Int = length(particles) @@ -469,7 +494,7 @@ function tiled_jet_reconstruct(particles::Vector{PseudoJet}; p = -1, R = 1.0, re tiling = Tiling(setup_tiling(_eta, R)) # ClusterSequence is the struct that holds the state of the reconstruction - clusterseq = ClusterSequence(p, RecoStrategy.N2Tiled, jets, history, Qtot) + clusterseq = ClusterSequence(algorithm, p, RecoStrategy.N2Tiled, jets, history, Qtot) # Tiled jets is a structure that has additional variables for tracking which tile a jet is in tiledjets = similar(clusterseq.jets, TiledJet) diff --git a/test/bootstrap_examples.jl b/test/bootstrap_examples.jl new file mode 100644 index 0000000..4e9d989 --- /dev/null +++ b/test/bootstrap_examples.jl @@ -0,0 +1,32 @@ +# Bootstrap script to setup this local version of the JetReconstruction package +# for running the examples + +println("Starting example boostrap script") + +# if isfile(joinpath(@__DIR__, "..", "examples", "Manifest.toml")) +# println("Exisiting Manifest.toml found - assuming environment is already setup") +# exit(0) +# end + +local_pkg_path = joinpath(@__DIR__, "..", "..", "JetReconstruction") + +if !isdir(local_pkg_path) + # Try a symlink to the current checkout + local_checkout_path = realpath(joinpath(@__DIR__, "..", "..")) + println("Creating symlink from $local_pkg_path to $local_checkout_path") + symlink(local_checkout_path, local_pkg_path) +else + println(realpath(local_pkg_path)) + println(readdir(local_pkg_path)) +end + +println("Setting up examples project") + +using Pkg +Pkg.instantiate() +Pkg.resolve() +println(("Seting JetReconstruction development package path: $local_pkg_path")) +Pkg.develop(path = local_pkg_path) +Pkg.status() + +println("Finished examples boostrap script") diff --git a/test/data/jet-collections-fastjet-inclusive-genkt-p1.5.json b/test/data/jet-collections-fastjet-inclusive-genkt-p1.5.json new file mode 100644 index 0000000..35c4053 --- /dev/null +++ b/test/data/jet-collections-fastjet-inclusive-genkt-p1.5.json @@ -0,0 +1,4382 @@ +[ + { + "jets": [ + { + "rap": 3.3562760885, + "phi": 2.6847936726, + "pt": 25.9072145686 + }, + { + "rap": -2.1085892166, + "phi": 5.2395949105, + "pt": 17.5258288689 + }, + { + "rap": 1.3771313263, + "phi": 6.1717698496, + "pt": 9.3553211735 + }, + { + "rap": -2.5330361128, + "phi": 5.4309318095, + "pt": 5.7428925597 + } + ], + "jetid": 1 + }, + { + "jets": [ + { + "rap": -1.284602394, + "phi": 5.4974753741, + "pt": 36.7915537719 + }, + { + "rap": 1.3232702573, + "phi": 2.4397431897, + "pt": 21.5868857332 + }, + { + "rap": 1.0124590825, + "phi": 1.9905492017, + "pt": 18.1274307979 + }, + { + "rap": 1.7964041977, + "phi": 5.0838499434, + "pt": 12.3348985043 + }, + { + "rap": -3.3533976868, + "phi": 2.1669905077, + "pt": 12.1167508715 + } + ], + "jetid": 2 + }, + { + "jets": [ + { + "rap": 2.5502440308, + "phi": 5.5470450582, + "pt": 19.6533940853 + }, + { + "rap": 2.5834542043, + "phi": 2.5508266794, + "pt": 16.2070858876 + }, + { + "rap": 4.5715880737, + "phi": 4.2656493466, + "pt": 8.95512769 + }, + { + "rap": 1.7501019244, + "phi": 2.0279477963, + "pt": 5.067658054 + } + ], + "jetid": 3 + }, + { + "jets": [ + { + "rap": -3.5984347624, + "phi": 4.4175192381, + "pt": 22.4528650327 + }, + { + "rap": -2.7198653236, + "phi": 4.9922183713, + "pt": 10.2962627094 + }, + { + "rap": -1.1977837758, + "phi": 0.6298144468, + "pt": 10.0519722005 + }, + { + "rap": -0.7758989096, + "phi": 0.4773294201, + "pt": 9.7798774642 + }, + { + "rap": 4.1575576279, + "phi": 0.9353103058, + "pt": 7.4069308612 + }, + { + "rap": 0.7802663557, + "phi": 0.2096920318, + "pt": 7.2267695554 + }, + { + "rap": 0.0305354394, + "phi": 1.061858679, + "pt": 6.89018539 + }, + { + "rap": 4.8657832574, + "phi": 1.3394934033, + "pt": 6.5117632108 + }, + { + "rap": -0.7917279061, + "phi": 2.9605591389, + "pt": 6.5022331021 + }, + { + "rap": 0.2619754346, + "phi": 5.0275877284, + "pt": 6.2248025909 + }, + { + "rap": 0.9063052645, + "phi": 4.5276093088, + "pt": 5.668588844 + }, + { + "rap": -2.3432987352, + "phi": 0.4713081419, + "pt": 5.5390844333 + }, + { + "rap": -0.0068592798, + "phi": 1.7849238997, + "pt": 5.4693906088 + } + ], + "jetid": 4 + }, + { + "jets": [ + { + "rap": 1.4980907718, + "phi": 6.1112939131, + "pt": 32.4046081882 + }, + { + "rap": 4.0084541443, + "phi": 3.3445548745, + "pt": 26.2780489038 + }, + { + "rap": -0.1867273512, + "phi": 2.4418446655, + "pt": 13.4713039699 + }, + { + "rap": 1.9274063713, + "phi": 2.9470472941, + "pt": 10.1689232716 + }, + { + "rap": 2.6362024647, + "phi": 5.5835654021, + "pt": 9.3227552941 + }, + { + "rap": 3.5972117174, + "phi": 5.9532933454, + "pt": 9.2543492197 + }, + { + "rap": -1.296175277, + "phi": 4.6515423964, + "pt": 8.6640310382 + }, + { + "rap": -2.1273514399, + "phi": 2.4321404709, + "pt": 7.4303656436 + }, + { + "rap": -1.6889149639, + "phi": 3.2756922572, + "pt": 7.4290423755 + }, + { + "rap": -2.4204725695, + "phi": 1.2019536613, + "pt": 7.1776304075 + }, + { + "rap": 0.5397975579, + "phi": 2.2882383292, + "pt": 7.091027451 + }, + { + "rap": 4.5800748021, + "phi": 1.2263311536, + "pt": 6.4509071839 + }, + { + "rap": -2.5286124055, + "phi": 2.213142665, + "pt": 6.1768039003 + }, + { + "rap": -1.543321775, + "phi": 4.1934857988, + "pt": 6.0831593566 + } + ], + "jetid": 5 + }, + { + "jets": [ + { + "rap": -1.1818725334, + "phi": 1.0896778545, + "pt": 23.9559379186 + }, + { + "rap": 1.8388562484, + "phi": 3.2162344752, + "pt": 16.5863081177 + }, + { + "rap": -0.7628914733, + "phi": 6.0127157548, + "pt": 10.7864504999 + }, + { + "rap": -0.9538767226, + "phi": 2.6357955056, + "pt": 8.7977455106 + }, + { + "rap": 0.792071118, + "phi": 4.8801158612, + "pt": 8.5989067189 + }, + { + "rap": 1.8706132004, + "phi": 2.3295547439, + "pt": 7.5037323525 + }, + { + "rap": 0.8981844458, + "phi": 2.2439162935, + "pt": 6.7383775711 + }, + { + "rap": 1.2657611511, + "phi": 4.647708416, + "pt": 5.3078518771 + }, + { + "rap": -0.6871869338, + "phi": 0.9418539708, + "pt": 5.2566088002 + }, + { + "rap": -0.9148910384, + "phi": 5.5906701939, + "pt": 5.1391000645 + } + ], + "jetid": 6 + }, + { + "jets": [ + { + "rap": 3.7823079191, + "phi": 4.728364691, + "pt": 31.6824135426 + }, + { + "rap": 1.80667366, + "phi": 1.823958233, + "pt": 28.7258278103 + }, + { + "rap": -2.6372167309, + "phi": 1.3044867587, + "pt": 6.3474838497 + } + ], + "jetid": 7 + }, + { + "jets": [ + { + "rap": 4.0376877812, + "phi": 1.5076703833, + "pt": 31.7809427444 + }, + { + "rap": 2.9686490641, + "phi": 4.5419080489, + "pt": 21.6856066044 + }, + { + "rap": 2.4915077451, + "phi": 4.3033416429, + "pt": 12.298676832 + }, + { + "rap": -3.1269659388, + "phi": 0.6368243018, + "pt": 8.1228496421 + }, + { + "rap": 2.4370744852, + "phi": 5.1561349479, + "pt": 7.4464561102 + }, + { + "rap": 1.5954215449, + "phi": 2.0864656437, + "pt": 6.7786369138 + }, + { + "rap": 2.658499034, + "phi": 5.8669778913, + "pt": 6.5652173289 + }, + { + "rap": -2.471941713, + "phi": 6.1951568017, + "pt": 6.2442250808 + }, + { + "rap": -1.5536840813, + "phi": 3.0650351758, + "pt": 5.6425649626 + }, + { + "rap": 0.2589570324, + "phi": 5.2690009029, + "pt": 5.4470793243 + } + ], + "jetid": 8 + }, + { + "jets": [ + { + "rap": -0.337354552, + "phi": 3.6081770176, + "pt": 23.0326503785 + }, + { + "rap": -3.6031288142, + "phi": 0.6451980928, + "pt": 9.9143065039 + }, + { + "rap": 0.0418574621, + "phi": 0.2263555738, + "pt": 9.6114177529 + }, + { + "rap": -3.5930078945, + "phi": 5.5746881695, + "pt": 6.8539622086 + }, + { + "rap": 0.6389058741, + "phi": 0.2676919691, + "pt": 6.2570091028 + } + ], + "jetid": 9 + }, + { + "jets": [ + { + "rap": 1.1774424737, + "phi": 2.1744936445, + "pt": 36.2894289803 + }, + { + "rap": -0.4096018028, + "phi": 6.2428502651, + "pt": 35.7073431342 + }, + { + "rap": 2.5083277797, + "phi": 4.9780188648, + "pt": 31.0036474512 + }, + { + "rap": -2.221115842, + "phi": 2.5378817571, + "pt": 20.4152470111 + }, + { + "rap": 3.0178642379, + "phi": 4.2711444134, + "pt": 14.556124887 + }, + { + "rap": 2.5217335633, + "phi": 4.1587498709, + "pt": 5.235263273 + } + ], + "jetid": 10 + }, + { + "jets": [ + { + "rap": 1.6629930266, + "phi": 0.7912173797, + "pt": 17.6194526454 + }, + { + "rap": 2.6855787316, + "phi": 3.8658359221, + "pt": 8.659167823 + } + ], + "jetid": 11 + }, + { + "jets": [ + { + "rap": -3.1400086891, + "phi": 0.5247593949, + "pt": 57.2055827887 + }, + { + "rap": -0.2453318275, + "phi": 3.5760436037, + "pt": 33.2858231665 + }, + { + "rap": -3.8835624976, + "phi": 3.7693704377, + "pt": 22.2173000862 + }, + { + "rap": -3.3160605082, + "phi": 0.9389272028, + "pt": 8.2933366894 + }, + { + "rap": -2.325299628, + "phi": 5.7720979747, + "pt": 5.6371606368 + } + ], + "jetid": 12 + }, + { + "jets": [ + { + "rap": 0.1427365451, + "phi": 1.8812913092, + "pt": 11.4565777915 + }, + { + "rap": -1.3321305555, + "phi": 0.1122375005, + "pt": 9.1351911784 + }, + { + "rap": -3.2928348282, + "phi": 2.7783233905, + "pt": 7.6018687096 + }, + { + "rap": -1.2979437782, + "phi": 5.2894719838, + "pt": 7.436383571 + }, + { + "rap": -2.1252895548, + "phi": 4.534558265, + "pt": 7.3269253807 + }, + { + "rap": -2.4548576393, + "phi": 4.7834343536, + "pt": 6.7518135408 + }, + { + "rap": -1.7590909419, + "phi": 0.3979086636, + "pt": 6.0586129691 + }, + { + "rap": -0.3863042289, + "phi": 1.8920479672, + "pt": 5.8237343419 + }, + { + "rap": -2.984269348, + "phi": 1.3817453819, + "pt": 5.3377276845 + }, + { + "rap": -1.6153891918, + "phi": 4.6101145336, + "pt": 5.0195072312 + } + ], + "jetid": 13 + }, + { + "jets": [ + { + "rap": -0.4624234971, + "phi": 1.2895226847, + "pt": 42.546381546 + }, + { + "rap": 5.4014633361, + "phi": 3.7903692466, + "pt": 16.2266927921 + }, + { + "rap": -0.2432454164, + "phi": 5.444106209, + "pt": 16.1960805242 + }, + { + "rap": -0.7962305945, + "phi": 0.303138058, + "pt": 15.4320998695 + }, + { + "rap": -1.5124029859, + "phi": 0.5095781237, + "pt": 14.777583545 + }, + { + "rap": 1.636571646, + "phi": 4.6670209272, + "pt": 14.50618221 + }, + { + "rap": 1.2891156571, + "phi": 2.4216769021, + "pt": 12.2565992997 + }, + { + "rap": -2.2843956931, + "phi": 5.6747965735, + "pt": 9.8742166369 + }, + { + "rap": 1.6918330447, + "phi": 2.693107475, + "pt": 9.6739364436 + }, + { + "rap": -0.2532675199, + "phi": 3.8687515599, + "pt": 9.1998507778 + }, + { + "rap": -3.6430709023, + "phi": 3.3660627514, + "pt": 9.152428874 + }, + { + "rap": -1.6090938837, + "phi": 5.8202551422, + "pt": 8.9522378498 + }, + { + "rap": 2.5576987544, + "phi": 4.3343622997, + "pt": 7.9163016406 + }, + { + "rap": 2.1395160559, + "phi": 3.4199136121, + "pt": 7.6306838228 + }, + { + "rap": -2.8108629009, + "phi": 5.2854845506, + "pt": 7.3163132338 + }, + { + "rap": -2.5629288483, + "phi": 2.7781275663, + "pt": 6.875277317 + }, + { + "rap": 1.089266485, + "phi": 4.1591473305, + "pt": 6.7384266373 + }, + { + "rap": 0.8279669133, + "phi": 0.9242145428, + "pt": 6.5771695739 + }, + { + "rap": -1.5738926, + "phi": 4.3614894287, + "pt": 6.4870028943 + }, + { + "rap": -1.3343196181, + "phi": 5.1518637118, + "pt": 6.0384429055 + }, + { + "rap": -2.124119915, + "phi": 2.0755980877, + "pt": 5.6225836219 + }, + { + "rap": -0.4148996262, + "phi": 1.7570832725, + "pt": 5.4985915129 + }, + { + "rap": -4.1227871262, + "phi": 4.8689116658, + "pt": 5.2023023552 + }, + { + "rap": 0.4477101835, + "phi": 5.8753780547, + "pt": 5.0718659521 + } + ], + "jetid": 14 + }, + { + "jets": [ + { + "rap": 0.8630925883, + "phi": 5.4488415313, + "pt": 38.1442894451 + }, + { + "rap": -1.0578327322, + "phi": 2.3331170294, + "pt": 11.9082895938 + }, + { + "rap": 3.340853502, + "phi": 2.3710707982, + "pt": 8.4124051859 + }, + { + "rap": -4.6337841506, + "phi": 6.0957982301, + "pt": 8.2125810879 + }, + { + "rap": -1.8965056288, + "phi": 5.475274925, + "pt": 8.1032130804 + }, + { + "rap": 1.3959233446, + "phi": 1.9069922734, + "pt": 6.7416940176 + }, + { + "rap": -4.8802960772, + "phi": 2.3123740515, + "pt": 6.4156654107 + }, + { + "rap": -1.6071856109, + "phi": 2.3249385121, + "pt": 6.3691832517 + }, + { + "rap": -3.5040310184, + "phi": 5.0060434671, + "pt": 5.7323791406 + }, + { + "rap": -0.469537935, + "phi": 3.046976267, + "pt": 5.1525577261 + } + ], + "jetid": 15 + }, + { + "jets": [ + { + "rap": -0.6798503628, + "phi": 0.8648837112, + "pt": 25.2814846679 + }, + { + "rap": 0.7814347818, + "phi": 3.3455205031, + "pt": 20.8794354297 + }, + { + "rap": 3.1482010412, + "phi": 1.0798067906, + "pt": 16.3676258758 + }, + { + "rap": -3.5889391568, + "phi": 5.3741746587, + "pt": 11.4568126623 + }, + { + "rap": 1.309605172, + "phi": 3.8453988591, + "pt": 11.1305238703 + }, + { + "rap": 3.6419750862, + "phi": 0.7950279155, + "pt": 10.6460477326 + }, + { + "rap": 1.9542009463, + "phi": 3.6068359083, + "pt": 10.5441929452 + }, + { + "rap": 2.1599358428, + "phi": 4.0382588379, + "pt": 7.191348385 + }, + { + "rap": 0.4022803706, + "phi": 1.7359510401, + "pt": 5.3497267304 + }, + { + "rap": -0.9830470816, + "phi": 3.9114208101, + "pt": 5.342442696 + }, + { + "rap": -1.9496228465, + "phi": 4.252603418, + "pt": 5.1890277359 + } + ], + "jetid": 16 + }, + { + "jets": [ + { + "rap": 0.7999055498, + "phi": 2.9966799187, + "pt": 26.1111727223 + }, + { + "rap": 3.7389637076, + "phi": 6.1502221836, + "pt": 17.7668564414 + }, + { + "rap": -2.3923113094, + "phi": 0.2684451086, + "pt": 10.1143049403 + }, + { + "rap": -2.1272253029, + "phi": 6.0624880776, + "pt": 7.9104374888 + }, + { + "rap": 1.1936247273, + "phi": 2.9038827331, + "pt": 6.9386826059 + } + ], + "jetid": 17 + }, + { + "jets": [ + { + "rap": -2.4101620202, + "phi": 5.9759818088, + "pt": 22.6550559118 + }, + { + "rap": -1.7381515802, + "phi": 2.557911238, + "pt": 18.5088549994 + }, + { + "rap": -3.8782065603, + "phi": 2.1526268957, + "pt": 9.0143774647 + }, + { + "rap": 3.0560756101, + "phi": 3.3777006566, + "pt": 6.202131749 + }, + { + "rap": 1.0999095536, + "phi": 6.0777741332, + "pt": 5.8987566789 + }, + { + "rap": 1.2193247629, + "phi": 3.9449903865, + "pt": 5.7854074536 + }, + { + "rap": -2.2119633265, + "phi": 1.3565524853, + "pt": 5.3338635623 + } + ], + "jetid": 18 + }, + { + "jets": [ + { + "rap": -1.9432260441, + "phi": 2.5115956233, + "pt": 28.4236949217 + }, + { + "rap": 0.39113289, + "phi": 5.588905101, + "pt": 23.8736411542 + }, + { + "rap": -1.1433672978, + "phi": 1.539267712, + "pt": 6.3182270507 + } + ], + "jetid": 19 + }, + { + "jets": [ + { + "rap": -3.9706459523, + "phi": 0.0837645697, + "pt": 11.4483900823 + }, + { + "rap": -3.7134121022, + "phi": 5.8365601002, + "pt": 10.4336067729 + }, + { + "rap": -4.1906125668, + "phi": 5.6585218845, + "pt": 8.0496626882 + }, + { + "rap": -4.0253511698, + "phi": 0.5785004022, + "pt": 7.8057234616 + }, + { + "rap": 1.6080707573, + "phi": 1.5036675616, + "pt": 5.9920636868 + }, + { + "rap": 4.9517022951, + "phi": 3.4977882594, + "pt": 5.3040754002 + }, + { + "rap": -1.9203390898, + "phi": 2.8038422671, + "pt": 5.0760991976 + }, + { + "rap": -4.1714505379, + "phi": 1.2257663156, + "pt": 5.053591984 + } + ], + "jetid": 20 + }, + { + "jets": [ + { + "rap": 1.8383378579, + "phi": 0.879929217, + "pt": 27.8230700017 + }, + { + "rap": 3.5095051658, + "phi": 3.8792960103, + "pt": 17.3659130229 + }, + { + "rap": -1.3678054868, + "phi": 4.4608345134, + "pt": 12.198897385 + } + ], + "jetid": 21 + }, + { + "jets": [ + { + "rap": -3.7305008844, + "phi": 4.6903391323, + "pt": 26.3635570796 + }, + { + "rap": -2.8049611053, + "phi": 2.1246357275, + "pt": 17.134901884 + }, + { + "rap": -3.8311681477, + "phi": 1.3171667716, + "pt": 11.6188741494 + }, + { + "rap": -1.8697746341, + "phi": 6.2560836897, + "pt": 11.5471723171 + }, + { + "rap": -1.9661194654, + "phi": 1.8283834908, + "pt": 9.9023590757 + }, + { + "rap": -1.2158296257, + "phi": 5.5581570646, + "pt": 6.6641930285 + }, + { + "rap": -1.9796358469, + "phi": 1.4036708133, + "pt": 5.5312587957 + }, + { + "rap": 2.4506628545, + "phi": 0.6685542048, + "pt": 5.5108415251 + }, + { + "rap": 4.1616624545, + "phi": 3.5603135877, + "pt": 5.118886766 + }, + { + "rap": 2.8678817703, + "phi": 6.00307608, + "pt": 5.1039249152 + } + ], + "jetid": 22 + }, + { + "jets": [ + { + "rap": 2.8856276124, + "phi": 2.5991529956, + "pt": 22.480476668 + }, + { + "rap": -1.743710998, + "phi": 0.186292403, + "pt": 12.3206093964 + }, + { + "rap": 2.149076988, + "phi": 3.7410153502, + "pt": 10.8383403119 + }, + { + "rap": -2.0082316225, + "phi": 5.7788479159, + "pt": 8.874857329 + }, + { + "rap": -5.4812927452, + "phi": 1.0318352058, + "pt": 7.1670625475 + }, + { + "rap": 3.014895118, + "phi": 4.3118507891, + "pt": 6.8334685652 + }, + { + "rap": 3.8328858593, + "phi": 3.9916182944, + "pt": 6.3926322951 + } + ], + "jetid": 23 + }, + { + "jets": [ + { + "rap": -0.5692769994, + "phi": 2.1371767759, + "pt": 21.7335177378 + }, + { + "rap": 0.086879958, + "phi": 5.2397063475, + "pt": 21.3153438614 + } + ], + "jetid": 24 + }, + { + "jets": [ + { + "rap": 0.5116091726, + "phi": 2.9708173125, + "pt": 30.9178819685 + }, + { + "rap": -3.7445877904, + "phi": 5.0380525776, + "pt": 19.9201789689 + }, + { + "rap": -2.2787799389, + "phi": 0.6471543932, + "pt": 14.693963325 + }, + { + "rap": 0.4663677601, + "phi": 3.720001276, + "pt": 6.369440738 + }, + { + "rap": -1.8518783642, + "phi": 0.4540066899, + "pt": 5.329583206 + }, + { + "rap": 1.4322973835, + "phi": 5.8840691603, + "pt": 5.1517287323 + }, + { + "rap": -1.4980755839, + "phi": 1.0365380477, + "pt": 5.0835943886 + }, + { + "rap": 0.3348721818, + "phi": 2.4321364707, + "pt": 5.0278612236 + } + ], + "jetid": 25 + }, + { + "jets": [ + { + "rap": 2.4596051644, + "phi": 3.8814232597, + "pt": 42.7779381381 + }, + { + "rap": 1.8858342465, + "phi": 0.7302568676, + "pt": 16.4504196842 + }, + { + "rap": 3.814106708, + "phi": 1.4858588508, + "pt": 13.7029153289 + }, + { + "rap": 2.9653069289, + "phi": 6.1925673916, + "pt": 10.9531049015 + }, + { + "rap": 4.0591740267, + "phi": 1.1459449738, + "pt": 8.3573970637 + }, + { + "rap": 2.4401940521, + "phi": 6.0942865735, + "pt": 5.1312140013 + } + ], + "jetid": 26 + }, + { + "jets": [ + { + "rap": 0.7790258458, + "phi": 3.8210412567, + "pt": 35.405802159 + }, + { + "rap": 1.5955060513, + "phi": 0.8635210075, + "pt": 19.973738531 + }, + { + "rap": -2.2662911912, + "phi": 5.6116136645, + "pt": 16.6419615001 + }, + { + "rap": 4.6213692251, + "phi": 3.7384101254, + "pt": 11.2495674904 + }, + { + "rap": -2.4524731057, + "phi": 0.0516067961, + "pt": 8.9921099139 + }, + { + "rap": -1.7240617995, + "phi": 3.2331686354, + "pt": 8.8178336137 + }, + { + "rap": -0.0313616922, + "phi": 2.9058048171, + "pt": 8.6729757385 + }, + { + "rap": 1.7030326052, + "phi": 5.0561869427, + "pt": 8.0738611328 + }, + { + "rap": 0.9902324907, + "phi": 1.9824936401, + "pt": 7.6041327228 + }, + { + "rap": 0.670166809, + "phi": 1.0826411203, + "pt": 7.343403359 + }, + { + "rap": 0.5479146617, + "phi": 1.7792785936, + "pt": 7.2713963982 + }, + { + "rap": -0.3294995928, + "phi": 0.402168555, + "pt": 7.0018486714 + }, + { + "rap": -3.2388034329, + "phi": 4.3189705757, + "pt": 6.4412473164 + }, + { + "rap": 3.3791156619, + "phi": 1.8032043617, + "pt": 5.9385546995 + }, + { + "rap": 0.1993569643, + "phi": 2.0290487919, + "pt": 5.636532888 + }, + { + "rap": -1.712606114, + "phi": 6.2200154881, + "pt": 5.5907405809 + } + ], + "jetid": 27 + }, + { + "jets": [ + { + "rap": -3.1625479687, + "phi": 2.9065209347, + "pt": 21.0539601454 + }, + { + "rap": -4.6131878952, + "phi": 5.9415930603, + "pt": 20.5510637278 + }, + { + "rap": -0.5796368367, + "phi": 6.1743646915, + "pt": 10.4389683093 + }, + { + "rap": -0.1226895689, + "phi": 0.189495481, + "pt": 10.0407391749 + }, + { + "rap": -2.2010963868, + "phi": 3.121830148, + "pt": 8.4852447127 + }, + { + "rap": -2.5349135625, + "phi": 2.8481679037, + "pt": 5.5167068881 + } + ], + "jetid": 28 + }, + { + "jets": [ + { + "rap": 3.3997979143, + "phi": 4.9606643494, + "pt": 10.9778375881 + }, + { + "rap": 2.8856645138, + "phi": 0.0582163451, + "pt": 6.9238561068 + }, + { + "rap": 3.1467668005, + "phi": 1.9619427394, + "pt": 6.5701741539 + } + ], + "jetid": 29 + }, + { + "jets": [ + { + "rap": 0.8664876548, + "phi": 2.5060506959, + "pt": 62.3827640522 + }, + { + "rap": 1.2181750558, + "phi": 5.3832816793, + "pt": 32.609748559 + }, + { + "rap": -1.068785301, + "phi": 5.7415286452, + "pt": 17.5956686991 + }, + { + "rap": 2.7727657996, + "phi": 5.3531812926, + "pt": 11.5530652841 + }, + { + "rap": -0.9316884878, + "phi": 0.0849077305, + "pt": 10.6814775384 + }, + { + "rap": -2.7351435161, + "phi": 6.0468310815, + "pt": 9.3210437214 + }, + { + "rap": 3.0235668987, + "phi": 1.5751892633, + "pt": 9.1394469556 + }, + { + "rap": -0.2760552196, + "phi": 2.7943136488, + "pt": 8.8742716982 + }, + { + "rap": 4.2967377423, + "phi": 1.6248476712, + "pt": 7.3323475322 + }, + { + "rap": -2.4872634647, + "phi": 3.3645464267, + "pt": 7.3303543546 + }, + { + "rap": -0.6594745871, + "phi": 2.9549841998, + "pt": 6.2954429618 + }, + { + "rap": 2.2741758486, + "phi": 5.8270539211, + "pt": 5.9013614584 + }, + { + "rap": 2.3587287796, + "phi": 5.3175688157, + "pt": 5.8936155476 + }, + { + "rap": -0.1981973448, + "phi": 2.2486257113, + "pt": 5.5942537959 + } + ], + "jetid": 30 + }, + { + "jets": [ + { + "rap": 0.4769584145, + "phi": 1.1428691914, + "pt": 24.0363932717 + }, + { + "rap": 0.4228162665, + "phi": 3.6614622833, + "pt": 21.2143623072 + }, + { + "rap": 0.8634859603, + "phi": 5.1693795572, + "pt": 11.3107612695 + } + ], + "jetid": 31 + }, + { + "jets": [ + { + "rap": 0.5223635468, + "phi": 3.6928221286, + "pt": 25.6087177452 + }, + { + "rap": 2.5183303557, + "phi": 0.5953694911, + "pt": 19.9759035926 + }, + { + "rap": 1.5855443861, + "phi": 2.8158812134, + "pt": 18.3936447498 + }, + { + "rap": 0.0709133626, + "phi": 4.1087978449, + "pt": 14.3862923101 + }, + { + "rap": 0.1610258219, + "phi": 6.0518975785, + "pt": 11.1565406225 + }, + { + "rap": 3.3483175291, + "phi": 5.9662103317, + "pt": 10.1546106151 + }, + { + "rap": 0.5099879633, + "phi": 1.4176389086, + "pt": 9.0051967431 + }, + { + "rap": 3.1315595981, + "phi": 0.5055455527, + "pt": 8.8190906366 + }, + { + "rap": -0.5579782663, + "phi": 0.1721702926, + "pt": 8.267307453 + }, + { + "rap": -3.1993676852, + "phi": 1.3790962502, + "pt": 8.2448289916 + }, + { + "rap": 1.0287246984, + "phi": 6.016717894, + "pt": 8.0194266855 + }, + { + "rap": -1.3888946112, + "phi": 4.300251397, + "pt": 7.1455937176 + }, + { + "rap": 5.7293512104, + "phi": 4.2069728088, + "pt": 6.8323592187 + }, + { + "rap": -3.5621325046, + "phi": 2.4106661236, + "pt": 6.0222097472 + }, + { + "rap": -2.410825269, + "phi": 1.8282795609, + "pt": 5.8757141617 + }, + { + "rap": -2.9221424834, + "phi": 3.4515072032, + "pt": 5.7378644279 + }, + { + "rap": -2.6677266594, + "phi": 2.4120583323, + "pt": 5.36103535 + }, + { + "rap": -5.4540594133, + "phi": 1.721602637, + "pt": 5.3516159951 + }, + { + "rap": 2.0819620402, + "phi": 0.2627438448, + "pt": 5.3290674109 + }, + { + "rap": -0.7121105158, + "phi": 4.5293424736, + "pt": 5.313458388 + }, + { + "rap": -0.6774289259, + "phi": 3.4432663508, + "pt": 5.2611187292 + }, + { + "rap": 1.5683879549, + "phi": 1.3495588454, + "pt": 5.0968772175 + }, + { + "rap": -2.8613629881, + "phi": 5.9803434165, + "pt": 5.0017321153 + } + ], + "jetid": 32 + }, + { + "jets": [ + { + "rap": 1.664674271, + "phi": 4.7450119714, + "pt": 29.57031266 + }, + { + "rap": -2.1743521713, + "phi": 1.2828306719, + "pt": 9.2915077771 + }, + { + "rap": -1.4329395528, + "phi": 2.0826944264, + "pt": 8.1167538516 + }, + { + "rap": -4.7760315953, + "phi": 1.3194529786, + "pt": 7.2256464831 + }, + { + "rap": 0.7467652647, + "phi": 3.1708463397, + "pt": 5.4505976966 + }, + { + "rap": -4.1545958734, + "phi": 0.7175352517, + "pt": 5.2959723052 + }, + { + "rap": 1.7871878409, + "phi": 1.7637544642, + "pt": 5.2838454979 + } + ], + "jetid": 33 + }, + { + "jets": [ + { + "rap": 2.0314440696, + "phi": 1.7958608313, + "pt": 25.9639651946 + }, + { + "rap": 1.7903501094, + "phi": 0.9242731381, + "pt": 15.9797294614 + }, + { + "rap": -1.1378216134, + "phi": 4.9087485363, + "pt": 12.953944765 + }, + { + "rap": -0.0277870318, + "phi": 5.5791431967, + "pt": 12.6140866782 + }, + { + "rap": 0.2966118027, + "phi": 0.676709669, + "pt": 8.1928364084 + }, + { + "rap": 1.3090991996, + "phi": 4.8882028726, + "pt": 7.9787430198 + }, + { + "rap": 2.3204333628, + "phi": 2.7916549189, + "pt": 6.7846780581 + }, + { + "rap": -5.8222723378, + "phi": 3.1525136436, + "pt": 6.2380780007 + }, + { + "rap": -1.9798557813, + "phi": 5.8027710243, + "pt": 5.8508242157 + }, + { + "rap": 1.2586804226, + "phi": 4.4870422242, + "pt": 5.2229398152 + }, + { + "rap": -0.1599624794, + "phi": 3.6635908809, + "pt": 5.0072012989 + } + ], + "jetid": 34 + }, + { + "jets": [ + { + "rap": 3.7591408197, + "phi": 0.8998631143, + "pt": 15.5956175662 + }, + { + "rap": -2.6623701111, + "phi": 5.0042318725, + "pt": 12.9855073843 + }, + { + "rap": -2.219796874, + "phi": 4.8673961794, + "pt": 12.4901608106 + } + ], + "jetid": 35 + }, + { + "jets": [ + { + "rap": -2.5772622154, + "phi": 2.2403731494, + "pt": 13.8016871069 + }, + { + "rap": -1.3180928223, + "phi": 3.8621949772, + "pt": 13.4642093687 + }, + { + "rap": -1.4264698642, + "phi": 1.4695260151, + "pt": 12.0118826917 + }, + { + "rap": -1.9262531813, + "phi": 1.5039831664, + "pt": 8.3016090102 + }, + { + "rap": -2.7553136481, + "phi": 0.1623040938, + "pt": 7.8482765363 + }, + { + "rap": -3.0007029885, + "phi": 3.3334613537, + "pt": 6.2882839999 + }, + { + "rap": 5.1703462283, + "phi": 5.289475168, + "pt": 5.9467999446 + }, + { + "rap": -3.412741346, + "phi": 6.2294723161, + "pt": 5.9024121025 + }, + { + "rap": -0.9109460999, + "phi": 1.4605790526, + "pt": 5.7791000398 + }, + { + "rap": 3.9744768429, + "phi": 4.0742807361, + "pt": 5.3236344957 + } + ], + "jetid": 36 + }, + { + "jets": [ + { + "rap": -0.1358001471, + "phi": 1.9480480932, + "pt": 22.7505802151 + }, + { + "rap": -2.433557923, + "phi": 5.4124115074, + "pt": 11.6456142179 + }, + { + "rap": -1.0284163451, + "phi": 4.5382919111, + "pt": 6.3513606924 + }, + { + "rap": -1.8666885692, + "phi": 5.2827468622, + "pt": 6.0726655922 + } + ], + "jetid": 37 + }, + { + "jets": [ + { + "rap": 4.7456396582, + "phi": 3.6770184685, + "pt": 18.8036363458 + }, + { + "rap": 5.0079494775, + "phi": 0.9485242795, + "pt": 13.1126437024 + }, + { + "rap": -0.6955070488, + "phi": 1.4563200259, + "pt": 7.6265977183 + }, + { + "rap": 2.8951401888, + "phi": 6.0007281714, + "pt": 6.0824015185 + }, + { + "rap": -2.7423160282, + "phi": 1.0175900993, + "pt": 5.5814966925 + } + ], + "jetid": 38 + }, + { + "jets": [ + { + "rap": 0.8987681578, + "phi": 3.0201038196, + "pt": 19.7647663253 + }, + { + "rap": -1.6292059219, + "phi": 6.1969784628, + "pt": 16.0978094705 + }, + { + "rap": 2.073616299, + "phi": 5.070798039, + "pt": 13.2908049416 + }, + { + "rap": -2.5120034914, + "phi": 2.4883288675, + "pt": 11.1026780233 + }, + { + "rap": -1.6467303953, + "phi": 0.3498259496, + "pt": 8.6069592016 + }, + { + "rap": -2.1277809426, + "phi": 2.1132608106, + "pt": 7.7783983494 + }, + { + "rap": -0.5283928887, + "phi": 4.9083193658, + "pt": 7.7448742533 + }, + { + "rap": 1.2564579743, + "phi": 3.4583125004, + "pt": 7.1475878488 + }, + { + "rap": 1.1154742008, + "phi": 4.5882067392, + "pt": 6.9661124134 + }, + { + "rap": -2.5615724074, + "phi": 0.6211230059, + "pt": 5.6711151927 + }, + { + "rap": -0.0477009916, + "phi": 2.3560223154, + "pt": 5.465964416 + } + ], + "jetid": 39 + }, + { + "jets": [ + { + "rap": 3.60285728, + "phi": 0.7273831063, + "pt": 32.3662300315 + }, + { + "rap": -1.4576457046, + "phi": 4.0674470599, + "pt": 9.9600557537 + } + ], + "jetid": 40 + }, + { + "jets": [ + { + "rap": -4.9828159576, + "phi": 5.9589125892, + "pt": 21.4461001359 + }, + { + "rap": -2.2187340549, + "phi": 2.9056543687, + "pt": 14.9775239034 + }, + { + "rap": 1.5864235954, + "phi": 3.4107579675, + "pt": 10.1079376774 + }, + { + "rap": -1.9442345953, + "phi": 2.4857106059, + "pt": 6.7798194214 + }, + { + "rap": -2.4398692151, + "phi": 2.5405303788, + "pt": 6.0610334469 + }, + { + "rap": 0.1741186977, + "phi": 0.3366880857, + "pt": 5.272437856 + }, + { + "rap": 5.651895222, + "phi": 4.6920285902, + "pt": 5.0347831297 + } + ], + "jetid": 41 + }, + { + "jets": [ + { + "rap": 1.812923515, + "phi": 5.1745830845, + "pt": 24.6073117159 + }, + { + "rap": 3.5853744869, + "phi": 1.7936715247, + "pt": 24.1224163876 + }, + { + "rap": 2.6146815991, + "phi": 2.6137455066, + "pt": 11.7815556483 + }, + { + "rap": 4.1780132455, + "phi": 5.0493321463, + "pt": 5.3577953987 + } + ], + "jetid": 42 + }, + { + "jets": [ + { + "rap": 5.1816332346, + "phi": 5.5048277337, + "pt": 29.9762312618 + }, + { + "rap": 5.0956571718, + "phi": 2.1950024596, + "pt": 20.5326601437 + } + ], + "jetid": 43 + }, + { + "jets": [ + { + "rap": -3.4932478947, + "phi": 2.9024380389, + "pt": 33.8168555164 + }, + { + "rap": -2.5214042294, + "phi": 0.6951565791, + "pt": 18.9721572231 + }, + { + "rap": 2.9919388407, + "phi": 5.2196667403, + "pt": 18.2817872584 + }, + { + "rap": -2.1944611725, + "phi": 0.0283735979, + "pt": 17.859559471 + }, + { + "rap": -4.4913739068, + "phi": 2.908896507, + "pt": 13.8927966079 + }, + { + "rap": 3.055329387, + "phi": 1.3155111543, + "pt": 11.0155018647 + }, + { + "rap": -1.7763149912, + "phi": 0.2580889683, + "pt": 9.4663276352 + }, + { + "rap": 2.567037481, + "phi": 4.1650475005, + "pt": 9.0479240847 + }, + { + "rap": -2.0725088447, + "phi": 0.8891954135, + "pt": 6.9481638292 + }, + { + "rap": 0.3373167882, + "phi": 3.272652846, + "pt": 6.7712756394 + }, + { + "rap": -4.6485223354, + "phi": 1.0508649296, + "pt": 5.7836185577 + }, + { + "rap": 0.6544237401, + "phi": 3.7315661207, + "pt": 5.6843615758 + }, + { + "rap": 0.5848299046, + "phi": 2.8889969799, + "pt": 5.1513106086 + }, + { + "rap": 2.4475388534, + "phi": 1.7642639396, + "pt": 5.0630020676 + } + ], + "jetid": 44 + }, + { + "jets": [ + { + "rap": -0.8137851371, + "phi": 3.0992742728, + "pt": 40.9937125353 + }, + { + "rap": 2.6378979864, + "phi": 5.8428410315, + "pt": 12.4438223076 + }, + { + "rap": -3.6578869648, + "phi": 0.3355213748, + "pt": 10.761021376 + }, + { + "rap": 1.9150966863, + "phi": 2.8275099583, + "pt": 9.1277606641 + }, + { + "rap": -4.2009159148, + "phi": 1.0180729573, + "pt": 8.9015111257 + }, + { + "rap": -4.0423439365, + "phi": 4.6748701208, + "pt": 6.985721203 + }, + { + "rap": 2.7609027285, + "phi": 6.2775609192, + "pt": 6.980429028 + }, + { + "rap": 0.2794033671, + "phi": 0.3419628874, + "pt": 6.4833312856 + }, + { + "rap": -2.8919176592, + "phi": 0.7640658798, + "pt": 5.3660945181 + }, + { + "rap": -0.6373308232, + "phi": 0.5757915429, + "pt": 5.1052447634 + } + ], + "jetid": 45 + }, + { + "jets": [ + { + "rap": -0.280086589, + "phi": 5.1261956215, + "pt": 20.3790842939 + }, + { + "rap": 0.2778163388, + "phi": 5.9114091462, + "pt": 12.5554367196 + }, + { + "rap": 2.857764653, + "phi": 3.4523708491, + "pt": 10.9870203172 + }, + { + "rap": -0.1175347062, + "phi": 2.5368116027, + "pt": 10.4908521456 + }, + { + "rap": 2.6859383107, + "phi": 1.1018757648, + "pt": 9.2623881949 + }, + { + "rap": 2.9371052128, + "phi": 1.9770088599, + "pt": 8.4017429532 + }, + { + "rap": -0.1669655716, + "phi": 1.8647912178, + "pt": 8.1959571751 + }, + { + "rap": 3.5329960762, + "phi": 0.6891534306, + "pt": 6.2675121727 + }, + { + "rap": -0.4587571774, + "phi": 0.0316845419, + "pt": 5.8270612287 + }, + { + "rap": 1.5683345141, + "phi": 4.6176016828, + "pt": 5.4026416105 + }, + { + "rap": 1.3923602318, + "phi": 3.0258580034, + "pt": 5.2761784311 + }, + { + "rap": -1.5593009349, + "phi": 5.4910965393, + "pt": 5.0218193163 + } + ], + "jetid": 46 + }, + { + "jets": [ + { + "rap": -1.1192233642, + "phi": 3.8263486324, + "pt": 19.035609549 + }, + { + "rap": -0.2094369448, + "phi": 0.8840084108, + "pt": 10.6995025895 + } + ], + "jetid": 47 + }, + { + "jets": [ + { + "rap": 0.4707091971, + "phi": 2.6178571567, + "pt": 18.537055611 + }, + { + "rap": 3.0915955273, + "phi": 2.4879277309, + "pt": 11.5254181679 + }, + { + "rap": 1.6737715987, + "phi": 0.2425280731, + "pt": 11.0349095925 + }, + { + "rap": -0.1350138861, + "phi": 1.2890378837, + "pt": 9.8065880986 + }, + { + "rap": -2.6252873783, + "phi": 1.4265091186, + "pt": 7.5496931183 + }, + { + "rap": 0.4159422243, + "phi": 0.3509224706, + "pt": 6.9950942133 + }, + { + "rap": 2.9606480594, + "phi": 2.8853599835, + "pt": 6.8251531387 + }, + { + "rap": -1.0861833403, + "phi": 4.17179683, + "pt": 5.9370382855 + }, + { + "rap": 1.6472918085, + "phi": 4.7883405548, + "pt": 5.5451747188 + } + ], + "jetid": 48 + }, + { + "jets": [ + { + "rap": -0.9781114728, + "phi": 1.3485479693, + "pt": 53.9205362813 + }, + { + "rap": -0.8396456934, + "phi": 4.8453549496, + "pt": 49.9788012601 + }, + { + "rap": -1.442439687, + "phi": 4.2173046484, + "pt": 6.7606790259 + }, + { + "rap": -0.9947108804, + "phi": 4.2068406049, + "pt": 5.6423929508 + } + ], + "jetid": 49 + }, + { + "jets": [ + { + "rap": 2.8187186492, + "phi": 3.018157635, + "pt": 19.3605704748 + }, + { + "rap": 3.39495863, + "phi": 0.1946419521, + "pt": 18.2462676779 + }, + { + "rap": 2.4380304853, + "phi": 3.8699624544, + "pt": 6.2554954694 + }, + { + "rap": 4.0628483521, + "phi": 5.8316128431, + "pt": 5.4375182415 + } + ], + "jetid": 50 + }, + { + "jets": [ + { + "rap": -4.1244862975, + "phi": 3.3681522489, + "pt": 21.9767708947 + }, + { + "rap": -4.1361550198, + "phi": 1.1560127568, + "pt": 20.1731218391 + }, + { + "rap": -3.4759607969, + "phi": 5.5156501735, + "pt": 11.1983404243 + }, + { + "rap": 3.3601194697, + "phi": 0.1857087894, + "pt": 6.5679532185 + }, + { + "rap": 5.2153110054, + "phi": 3.9788466064, + "pt": 5.3190890131 + }, + { + "rap": -3.8951400305, + "phi": 5.1502573099, + "pt": 5.2340293419 + } + ], + "jetid": 51 + }, + { + "jets": [ + { + "rap": 0.5159865259, + "phi": 0.7736341387, + "pt": 28.8580791059 + }, + { + "rap": -1.7637536009, + "phi": 4.0084575668, + "pt": 25.4517353074 + }, + { + "rap": -3.072454056, + "phi": 4.3825622013, + "pt": 9.3565586012 + }, + { + "rap": 0.0993250883, + "phi": 1.6737393446, + "pt": 7.0465258873 + }, + { + "rap": -0.4191815739, + "phi": 2.0790726847, + "pt": 6.7307787996 + }, + { + "rap": -0.1197489414, + "phi": 0.8490876249, + "pt": 6.0050137517 + }, + { + "rap": 0.6009973863, + "phi": 1.419673606, + "pt": 5.6249549809 + } + ], + "jetid": 52 + }, + { + "jets": [ + { + "rap": -0.5145842756, + "phi": 0.6748841533, + "pt": 30.1479524592 + }, + { + "rap": 3.1562328456, + "phi": 4.5743516298, + "pt": 12.4068609994 + }, + { + "rap": 5.2721223313, + "phi": 2.0319548191, + "pt": 12.3294574198 + }, + { + "rap": 2.3716383621, + "phi": 0.8186167948, + "pt": 10.1129305865 + }, + { + "rap": -1.2215819103, + "phi": 4.2177118906, + "pt": 7.5071492274 + }, + { + "rap": -1.2530682448, + "phi": 3.7334422032, + "pt": 7.3838473926 + }, + { + "rap": 2.8679117022, + "phi": 4.2591392973, + "pt": 7.290530226 + }, + { + "rap": -2.8193747524, + "phi": 1.6647885473, + "pt": 7.1737368689 + }, + { + "rap": 2.1597531295, + "phi": 4.9284618186, + "pt": 7.0954957903 + }, + { + "rap": 1.9976199013, + "phi": 4.2815285919, + "pt": 6.7278675324 + }, + { + "rap": 0.1208212234, + "phi": 0.1837216857, + "pt": 6.4093696018 + }, + { + "rap": 0.7915637605, + "phi": 6.0481294331, + "pt": 5.914637039 + }, + { + "rap": 5.1931659769, + "phi": 1.2879830995, + "pt": 5.0008345127 + } + ], + "jetid": 53 + }, + { + "jets": [ + { + "rap": 0.0257377655, + "phi": 5.0672332641, + "pt": 21.6052870468 + }, + { + "rap": -1.2484404651, + "phi": 2.7664858843, + "pt": 13.0925993115 + }, + { + "rap": -4.5274282382, + "phi": 1.4124960427, + "pt": 5.1849330145 + } + ], + "jetid": 54 + }, + { + "jets": [ + { + "rap": 2.8295537857, + "phi": 2.5744056792, + "pt": 22.3803720095 + }, + { + "rap": 2.7597539958, + "phi": 5.3551323, + "pt": 19.373276467 + }, + { + "rap": 2.2560696133, + "phi": 0.5578554296, + "pt": 5.4539504658 + } + ], + "jetid": 55 + }, + { + "jets": [ + { + "rap": 1.9020190698, + "phi": 2.1905148673, + "pt": 21.5031556972 + }, + { + "rap": -1.6968061587, + "phi": 5.2639431345, + "pt": 19.4297639245 + }, + { + "rap": -0.581679054, + "phi": 5.2303522095, + "pt": 10.5002660079 + }, + { + "rap": -0.2909126319, + "phi": 0.2243558043, + "pt": 7.0192152735 + }, + { + "rap": -1.4904031841, + "phi": 5.7261740585, + "pt": 6.7150630373 + }, + { + "rap": -0.3873066916, + "phi": 0.6330123877, + "pt": 5.4734893691 + } + ], + "jetid": 56 + }, + { + "jets": [ + { + "rap": -2.070543388, + "phi": 6.0073306979, + "pt": 24.353341653 + }, + { + "rap": -1.6956261293, + "phi": 2.7389895148, + "pt": 11.5714479316 + }, + { + "rap": -1.1986927449, + "phi": 2.3357464276, + "pt": 7.6205580463 + } + ], + "jetid": 57 + }, + { + "jets": [ + { + "rap": -1.4536811371, + "phi": 0.0634864223, + "pt": 26.5939599546 + }, + { + "rap": -1.152161077, + "phi": 2.9237524965, + "pt": 15.9471435976 + }, + { + "rap": -3.0277014261, + "phi": 3.7329750556, + "pt": 11.3031999724 + } + ], + "jetid": 58 + }, + { + "jets": [ + { + "rap": -1.4141836984, + "phi": 3.8651404197, + "pt": 25.4288601665 + }, + { + "rap": 0.9252762636, + "phi": 0.6862500172, + "pt": 21.4294185156 + }, + { + "rap": -0.2759597361, + "phi": 1.8959414894, + "pt": 8.8910187759 + }, + { + "rap": 3.0370269492, + "phi": 2.9635264624, + "pt": 7.009673604 + }, + { + "rap": -2.0291411168, + "phi": 4.0020781334, + "pt": 5.4487020279 + }, + { + "rap": 2.2199006596, + "phi": 1.282501762, + "pt": 5.3570630224 + }, + { + "rap": -4.7325382659, + "phi": 1.9089255825, + "pt": 5.2209167538 + } + ], + "jetid": 59 + }, + { + "jets": [ + { + "rap": 0.6291356108, + "phi": 4.1919767532, + "pt": 33.9220739566 + }, + { + "rap": 0.8972250347, + "phi": 0.8208900359, + "pt": 20.1212001874 + }, + { + "rap": 0.6324376188, + "phi": 1.188812509, + "pt": 12.0428963595 + } + ], + "jetid": 60 + }, + { + "jets": [ + { + "rap": 1.1648351577, + "phi": 1.2472651721, + "pt": 32.3458682222 + }, + { + "rap": 2.8257129098, + "phi": 3.5687982723, + "pt": 13.4029720498 + }, + { + "rap": 5.2866210225, + "phi": 6.2372740136, + "pt": 7.7554998641 + }, + { + "rap": -1.0363021914, + "phi": 5.1308119913, + "pt": 6.1071165922 + }, + { + "rap": 3.4515966878, + "phi": 3.5871914039, + "pt": 5.801724748 + }, + { + "rap": 3.8255644293, + "phi": 3.8571206124, + "pt": 5.3284443284 + } + ], + "jetid": 61 + }, + { + "jets": [ + { + "rap": -1.5225297174, + "phi": 0.7995327058, + "pt": 14.7641445358 + }, + { + "rap": -1.4727847198, + "phi": 1.408480552, + "pt": 13.6697049632 + }, + { + "rap": -3.6691300997, + "phi": 5.0979287716, + "pt": 12.3691082135 + }, + { + "rap": -2.9105057591, + "phi": 3.0146052268, + "pt": 9.99727346 + }, + { + "rap": -0.925807895, + "phi": 4.253812696, + "pt": 9.4142342341 + }, + { + "rap": -5.0581796334, + "phi": 4.736647691, + "pt": 8.037449505 + }, + { + "rap": -1.6813939437, + "phi": 5.1817387389, + "pt": 6.7494690562 + }, + { + "rap": 4.9255083484, + "phi": 0.9248436789, + "pt": 5.6721255235 + }, + { + "rap": 1.1234003668, + "phi": 0.4228742902, + "pt": 5.5017124748 + }, + { + "rap": -1.6294314879, + "phi": 1.8506569866, + "pt": 5.216455831 + }, + { + "rap": 2.6359735296, + "phi": 5.8622220787, + "pt": 5.1800464857 + }, + { + "rap": -0.0537371744, + "phi": 5.2180291535, + "pt": 5.1667793065 + }, + { + "rap": -2.6267065369, + "phi": 2.6475142425, + "pt": 5.1469591674 + }, + { + "rap": -5.6215720117, + "phi": 2.2793930953, + "pt": 5.1467148597 + }, + { + "rap": -1.3749827958, + "phi": 0.0859230972, + "pt": 5.0662863648 + } + ], + "jetid": 62 + }, + { + "jets": [ + { + "rap": -0.6036179606, + "phi": 5.9941331166, + "pt": 28.5846802542 + }, + { + "rap": -2.3415321284, + "phi": 2.6764083763, + "pt": 22.1501467803 + }, + { + "rap": -0.3836396196, + "phi": 2.2629318372, + "pt": 6.2278027528 + }, + { + "rap": -2.3431970904, + "phi": 3.0949176292, + "pt": 5.5382508256 + } + ], + "jetid": 63 + }, + { + "jets": [ + { + "rap": -4.2970051503, + "phi": 2.5874847712, + "pt": 19.2701424923 + }, + { + "rap": 3.5288886869, + "phi": 0.3707025, + "pt": 11.3398531775 + }, + { + "rap": -0.017138311, + "phi": 5.5380536679, + "pt": 10.1676420649 + }, + { + "rap": 0.1484127137, + "phi": 2.2981644116, + "pt": 6.1612485745 + }, + { + "rap": 1.474560007, + "phi": 5.8549007442, + "pt": 5.9201247142 + }, + { + "rap": -0.6739767462, + "phi": 5.0788377069, + "pt": 5.2813729075 + }, + { + "rap": 1.0558124979, + "phi": 6.2106714595, + "pt": 5.2272320022 + } + ], + "jetid": 64 + }, + { + "jets": [ + { + "rap": 1.6024122417, + "phi": 0.1218360479, + "pt": 25.01864219 + }, + { + "rap": 1.3557948102, + "phi": 3.3150875828, + "pt": 9.1132637956 + }, + { + "rap": 0.9163151971, + "phi": 3.4380476714, + "pt": 9.0141272289 + }, + { + "rap": -2.8118056214, + "phi": 3.3300077679, + "pt": 7.5718060369 + }, + { + "rap": 3.6522569787, + "phi": 1.3554615554, + "pt": 7.028059219 + }, + { + "rap": 2.9272534392, + "phi": 1.3174759765, + "pt": 5.8147953555 + }, + { + "rap": 1.0779892124, + "phi": 4.0398555533, + "pt": 5.6859975029 + }, + { + "rap": -0.0618249837, + "phi": 5.1236112645, + "pt": 5.5916892287 + }, + { + "rap": 1.1273028472, + "phi": 2.9707093583, + "pt": 5.377214815 + }, + { + "rap": 4.7990092129, + "phi": 0.3589197012, + "pt": 5.1275526619 + } + ], + "jetid": 65 + }, + { + "jets": [ + { + "rap": -2.1375490641, + "phi": 5.9413186717, + "pt": 18.1135068697 + }, + { + "rap": -0.3569237827, + "phi": 3.1612551384, + "pt": 10.9370567937 + }, + { + "rap": -0.7722955055, + "phi": 3.0348743478, + "pt": 7.5244346746 + }, + { + "rap": 2.997910169, + "phi": 3.2040346622, + "pt": 5.9170135238 + }, + { + "rap": 2.4282867441, + "phi": 5.0753952604, + "pt": 5.6295039215 + }, + { + "rap": 2.5110599132, + "phi": 1.0236204452, + "pt": 5.5922390089 + }, + { + "rap": 4.4150965143, + "phi": 1.6303545111, + "pt": 5.5717092936 + }, + { + "rap": 3.0588624972, + "phi": 0.6367563782, + "pt": 5.2819993721 + }, + { + "rap": -0.6652056171, + "phi": 3.5691328363, + "pt": 5.2419297191 + }, + { + "rap": 1.7362121091, + "phi": 2.9695636658, + "pt": 5.1423199684 + } + ], + "jetid": 66 + }, + { + "jets": [ + { + "rap": 4.1651023455, + "phi": 2.3596538013, + "pt": 28.1627538037 + }, + { + "rap": -3.6841073545, + "phi": 4.4221858933, + "pt": 9.1884343468 + }, + { + "rap": 1.0466952041, + "phi": 5.5608980482, + "pt": 9.1130070375 + }, + { + "rap": 3.2413608941, + "phi": 4.5559275229, + "pt": 5.9939502808 + }, + { + "rap": -0.2650682281, + "phi": 4.1056337603, + "pt": 5.9153102655 + }, + { + "rap": -0.7592055423, + "phi": 4.392956428, + "pt": 5.7508759725 + }, + { + "rap": -1.0886746438, + "phi": 2.276187605, + "pt": 5.7320985162 + }, + { + "rap": 6.282155245, + "phi": 5.7370212134, + "pt": 5.1628257889 + }, + { + "rap": 0.5697459473, + "phi": 5.0226525855, + "pt": 5.0805906804 + }, + { + "rap": -0.7773179424, + "phi": 0.0297910267, + "pt": 5.0133992702 + } + ], + "jetid": 67 + }, + { + "jets": [ + { + "rap": -0.1506687727, + "phi": 0.2068490836, + "pt": 23.2677619337 + }, + { + "rap": -1.7521394703, + "phi": 3.1764913209, + "pt": 20.9876541212 + }, + { + "rap": -1.6852450701, + "phi": 3.774122737, + "pt": 6.9215442475 + } + ], + "jetid": 68 + }, + { + "jets": [ + { + "rap": 1.8573198706, + "phi": 5.5617623888, + "pt": 27.5411457274 + }, + { + "rap": -1.8080611694, + "phi": 3.0239728873, + "pt": 11.1421378894 + }, + { + "rap": -1.7458498103, + "phi": 3.6112724181, + "pt": 10.7848083099 + }, + { + "rap": -1.0073776698, + "phi": 2.9405148656, + "pt": 9.9924892734 + }, + { + "rap": -1.4101786504, + "phi": 3.2997256567, + "pt": 9.6953550979 + }, + { + "rap": -1.4254693604, + "phi": 0.615268554, + "pt": 7.6011086523 + }, + { + "rap": 4.7114686103, + "phi": 3.1616524229, + "pt": 7.4015967164 + }, + { + "rap": -0.1755838839, + "phi": 1.6432186143, + "pt": 7.0488993405 + }, + { + "rap": -4.5524535318, + "phi": 1.4743032059, + "pt": 6.7494261754 + }, + { + "rap": 4.1642449999, + "phi": 6.0091276659, + "pt": 6.4849357018 + }, + { + "rap": 2.7830385142, + "phi": 2.0835216338, + "pt": 6.1195048551 + }, + { + "rap": 5.7437412568, + "phi": 0.1994580948, + "pt": 5.9304349671 + }, + { + "rap": -4.6630720686, + "phi": 0.905129903, + "pt": 5.5568226307 + }, + { + "rap": 3.2639246809, + "phi": 4.5390443218, + "pt": 5.5132287871 + }, + { + "rap": -4.8812533779, + "phi": 5.3967041537, + "pt": 5.4484268227 + }, + { + "rap": 5.5211971249, + "phi": 2.8651647056, + "pt": 5.4449620116 + }, + { + "rap": -2.7525481564, + "phi": 0.6107404999, + "pt": 5.3653105273 + }, + { + "rap": 0.1412415223, + "phi": 0.0172092277, + "pt": 5.0875973168 + } + ], + "jetid": 69 + }, + { + "jets": [ + { + "rap": -0.5138095234, + "phi": 4.2836713828, + "pt": 20.472275472 + }, + { + "rap": -1.3558184439, + "phi": 1.3677406156, + "pt": 13.3884944676 + }, + { + "rap": -3.5652513793, + "phi": 1.1863616507, + "pt": 5.8047814596 + } + ], + "jetid": 70 + }, + { + "jets": [ + { + "rap": 1.7211444034, + "phi": 1.4847226754, + "pt": 18.7709551774 + }, + { + "rap": 1.5977648977, + "phi": 2.421831538, + "pt": 17.5524427099 + }, + { + "rap": 1.9799411557, + "phi": 4.4406491767, + "pt": 17.1352499859 + }, + { + "rap": 2.2838701948, + "phi": 4.7217809769, + "pt": 7.9800028196 + }, + { + "rap": 3.6070462801, + "phi": 5.1831041432, + "pt": 7.051540616 + } + ], + "jetid": 71 + }, + { + "jets": [ + { + "rap": -1.7549666766, + "phi": 5.8214423489, + "pt": 24.2761401632 + }, + { + "rap": -1.0245287274, + "phi": 2.8412354985, + "pt": 13.4468234773 + }, + { + "rap": -0.6112508178, + "phi": 1.6884874092, + "pt": 12.7208845162 + } + ], + "jetid": 72 + }, + { + "jets": [ + { + "rap": 0.1141545101, + "phi": 0.4398900741, + "pt": 18.6289798112 + }, + { + "rap": 0.7337616807, + "phi": 3.3925037392, + "pt": 9.3566250178 + }, + { + "rap": 0.1579896152, + "phi": 3.8587318053, + "pt": 6.2508642605 + }, + { + "rap": -2.7904857157, + "phi": 4.2667431705, + "pt": 5.273835492 + } + ], + "jetid": 73 + }, + { + "jets": [ + { + "rap": -2.7719802981, + "phi": 2.5701800634, + "pt": 32.3167091417 + }, + { + "rap": -2.5140273093, + "phi": 5.2564053656, + "pt": 26.2062921633 + }, + { + "rap": -3.1105757586, + "phi": 0.05244812, + "pt": 5.511616011 + } + ], + "jetid": 74 + }, + { + "jets": [ + { + "rap": 1.6422268342, + "phi": 2.8709914484, + "pt": 25.695785705 + }, + { + "rap": 1.3388218969, + "phi": 3.2143671062, + "pt": 17.6404610292 + }, + { + "rap": -0.4041171646, + "phi": 0.5081360184, + "pt": 12.1189765508 + }, + { + "rap": -1.5535654018, + "phi": 0.6560308025, + "pt": 10.8884820667 + }, + { + "rap": 1.6066603101, + "phi": 5.4064673498, + "pt": 7.2937751702 + }, + { + "rap": -4.4544585841, + "phi": 3.5454505989, + "pt": 6.5700986862 + }, + { + "rap": -4.990572123, + "phi": 5.2708950383, + "pt": 6.2414281757 + }, + { + "rap": -5.1036019705, + "phi": 4.882358426, + "pt": 5.9615095719 + }, + { + "rap": 2.2030529491, + "phi": 1.455323202, + "pt": 5.6081609236 + }, + { + "rap": -1.3231730995, + "phi": 1.7410938301, + "pt": 5.5281464368 + }, + { + "rap": -0.7390036904, + "phi": 2.6935229999, + "pt": 5.2305908002 + }, + { + "rap": -1.4391331869, + "phi": 3.5589427734, + "pt": 5.2066620858 + } + ], + "jetid": 75 + }, + { + "jets": [ + { + "rap": -0.6898198014, + "phi": 4.1709317482, + "pt": 25.2912514109 + }, + { + "rap": 2.157988086, + "phi": 0.4484096062, + "pt": 12.8678855811 + }, + { + "rap": -1.7994723952, + "phi": 1.0576407096, + "pt": 10.6920806515 + }, + { + "rap": -0.897613238, + "phi": 3.5845590375, + "pt": 10.0992494805 + }, + { + "rap": -1.4389150531, + "phi": 3.7855071651, + "pt": 5.7630539834 + } + ], + "jetid": 76 + }, + { + "jets": [ + { + "rap": -3.0722280935, + "phi": 1.9945154322, + "pt": 16.0887588592 + }, + { + "rap": -0.941206291, + "phi": 5.1122987275, + "pt": 9.475738376 + }, + { + "rap": -1.3145711712, + "phi": 4.9494367744, + "pt": 8.9587044252 + }, + { + "rap": -1.7275963045, + "phi": 3.8181175244, + "pt": 7.8621941193 + }, + { + "rap": -2.24823581, + "phi": 1.0743271681, + "pt": 5.9201522346 + }, + { + "rap": 1.502312882, + "phi": 0.4705997767, + "pt": 5.6843572997 + }, + { + "rap": -1.2317209055, + "phi": 5.6338206597, + "pt": 5.2318209525 + } + ], + "jetid": 77 + }, + { + "jets": [ + { + "rap": -4.7799891628, + "phi": 4.9841786266, + "pt": 27.8498271204 + }, + { + "rap": -3.4228229168, + "phi": 5.8743611855, + "pt": 9.6349810124 + }, + { + "rap": -0.4170809019, + "phi": 1.1310215603, + "pt": 9.2975543461 + }, + { + "rap": 0.3808320556, + "phi": 2.0533295357, + "pt": 8.9480089104 + }, + { + "rap": -0.850731075, + "phi": 1.1815499805, + "pt": 8.3736432034 + }, + { + "rap": -0.4704619762, + "phi": 1.5557206465, + "pt": 8.006629297 + }, + { + "rap": -2.868786431, + "phi": 2.9799605467, + "pt": 7.6191936369 + }, + { + "rap": -1.6662264601, + "phi": 2.3286302509, + "pt": 6.9468023475 + }, + { + "rap": -3.5045559225, + "phi": 2.7014606478, + "pt": 6.7161975815 + }, + { + "rap": -0.9525984096, + "phi": 4.1810887838, + "pt": 6.5213574605 + }, + { + "rap": 1.0697914569, + "phi": 2.3681336358, + "pt": 6.4562052641 + }, + { + "rap": -1.8291039752, + "phi": 1.8946345544, + "pt": 5.970397076 + }, + { + "rap": -3.0378482635, + "phi": 2.1818744239, + "pt": 5.8384268656 + }, + { + "rap": 0.5644187244, + "phi": 4.9015385314, + "pt": 5.5777557203 + }, + { + "rap": 1.8510482237, + "phi": 5.2349422998, + "pt": 5.4185803566 + }, + { + "rap": -4.7788884271, + "phi": 5.6207752724, + "pt": 5.1360647201 + }, + { + "rap": -1.1927973081, + "phi": 0.9683312586, + "pt": 5.1355122767 + } + ], + "jetid": 78 + }, + { + "jets": [ + { + "rap": -0.054683142, + "phi": 0.239922759, + "pt": 34.4762404139 + }, + { + "rap": -1.8005242684, + "phi": 3.5672144338, + "pt": 31.6955200952 + }, + { + "rap": 1.2740620832, + "phi": 0.0108764558, + "pt": 6.829969465 + }, + { + "rap": 1.944454931, + "phi": 3.6213048446, + "pt": 5.442940981 + } + ], + "jetid": 79 + }, + { + "jets": [ + { + "rap": -0.010742797, + "phi": 5.4458946098, + "pt": 21.042297892 + }, + { + "rap": -1.6465588274, + "phi": 2.1505270087, + "pt": 9.2671623725 + }, + { + "rap": -0.6301351456, + "phi": 1.5764804141, + "pt": 8.1373462281 + }, + { + "rap": 1.9537973136, + "phi": 3.6109114451, + "pt": 7.427634353 + }, + { + "rap": -2.1592868623, + "phi": 3.8030523031, + "pt": 6.0749135083 + }, + { + "rap": -3.631783897, + "phi": 0.772382779, + "pt": 5.5653961539 + }, + { + "rap": -0.8282919214, + "phi": 0.6677940839, + "pt": 5.370212632 + } + ], + "jetid": 80 + }, + { + "jets": [ + { + "rap": -2.8424975346, + "phi": 2.421448274, + "pt": 23.0009371559 + }, + { + "rap": -2.6134318767, + "phi": 5.4826430906, + "pt": 21.7890947365 + }, + { + "rap": 4.412589071, + "phi": 5.5639120374, + "pt": 5.2769836189 + } + ], + "jetid": 81 + }, + { + "jets": [ + { + "rap": -0.578813164, + "phi": 2.1800219413, + "pt": 55.4517557329 + }, + { + "rap": -1.8716177465, + "phi": 4.7109766328, + "pt": 23.9420052089 + }, + { + "rap": -0.5176545024, + "phi": 5.5717124296, + "pt": 11.7949291825 + }, + { + "rap": 0.8134646461, + "phi": 5.6684202168, + "pt": 10.7302343307 + } + ], + "jetid": 82 + }, + { + "jets": [ + { + "rap": -1.3573689455, + "phi": 0.8486330794, + "pt": 25.9356738673 + }, + { + "rap": 1.6723338931, + "phi": 2.6715204957, + "pt": 23.588637502 + }, + { + "rap": 0.3268541025, + "phi": 1.7581676666, + "pt": 13.6792577813 + }, + { + "rap": -4.3878797068, + "phi": 4.6244239439, + "pt": 12.057204776 + }, + { + "rap": -2.5778545809, + "phi": 4.51596323, + "pt": 9.4808965638 + }, + { + "rap": -5.6105324235, + "phi": 4.8833159509, + "pt": 5.5052842646 + }, + { + "rap": 0.2251077858, + "phi": 5.2551783858, + "pt": 5.3220683578 + }, + { + "rap": 1.2817831146, + "phi": 2.2460547981, + "pt": 5.0765226958 + } + ], + "jetid": 83 + }, + { + "jets": [ + { + "rap": -0.6097044642, + "phi": 0.9198461895, + "pt": 21.8729007157 + }, + { + "rap": -2.2459813376, + "phi": 4.7987750982, + "pt": 21.583361959 + }, + { + "rap": -2.7393661178, + "phi": 1.6626479176, + "pt": 12.4214588124 + }, + { + "rap": -1.691281078, + "phi": 3.4513144798, + "pt": 5.5572381694 + } + ], + "jetid": 84 + }, + { + "jets": [ + { + "rap": -1.6599383222, + "phi": 6.2483700502, + "pt": 19.8265152221 + }, + { + "rap": -1.422523996, + "phi": 3.2894186624, + "pt": 13.6593099994 + }, + { + "rap": -2.6301745478, + "phi": 3.8279369704, + "pt": 10.0189052762 + }, + { + "rap": -5.654923665, + "phi": 1.3749606286, + "pt": 8.02605592 + }, + { + "rap": 0.113532609, + "phi": 0.2393684939, + "pt": 5.4201790541 + }, + { + "rap": 1.555798008, + "phi": 3.6853949227, + "pt": 5.2845777798 + } + ], + "jetid": 85 + }, + { + "jets": [ + { + "rap": -2.9824523633, + "phi": 4.5462775371, + "pt": 38.016749208 + }, + { + "rap": -2.8225631506, + "phi": 1.2747331752, + "pt": 30.8281028404 + }, + { + "rap": -2.6317263811, + "phi": 4.3480665729, + "pt": 15.1389111806 + }, + { + "rap": -3.2664869905, + "phi": 1.1659303418, + "pt": 13.4992234061 + }, + { + "rap": 0.5108368022, + "phi": 1.6900049992, + "pt": 8.8904960827 + }, + { + "rap": 4.1632931259, + "phi": 5.4349836579, + "pt": 7.193609915 + }, + { + "rap": 0.6549007589, + "phi": 2.8794594696, + "pt": 6.7341801604 + }, + { + "rap": 1.7162170692, + "phi": 3.313727134, + "pt": 5.7097323849 + } + ], + "jetid": 86 + }, + { + "jets": [ + { + "rap": 2.001241158, + "phi": 0.3216613718, + "pt": 42.60872343 + }, + { + "rap": -1.0388838309, + "phi": 3.4453114567, + "pt": 42.1104275467 + } + ], + "jetid": 87 + }, + { + "jets": [ + { + "rap": -1.2059834669, + "phi": 3.9720853422, + "pt": 34.1270670978 + }, + { + "rap": 1.6258763763, + "phi": 6.0082035055, + "pt": 21.3083832208 + }, + { + "rap": 1.0102133909, + "phi": 1.5982381316, + "pt": 11.7127291738 + }, + { + "rap": -2.0593265361, + "phi": 1.1047226488, + "pt": 10.6976203467 + }, + { + "rap": -2.7490712034, + "phi": 4.3760134543, + "pt": 6.825803314 + }, + { + "rap": 0.7652647777, + "phi": 3.2311909187, + "pt": 6.2286415585 + }, + { + "rap": 2.0010586273, + "phi": 3.2292523326, + "pt": 5.7874326686 + }, + { + "rap": -0.8288941993, + "phi": 1.0467344642, + "pt": 5.7863196679 + }, + { + "rap": 3.5124539589, + "phi": 0.4732810106, + "pt": 5.6199480765 + }, + { + "rap": -0.123924649, + "phi": 1.6741154233, + "pt": 5.5237555889 + }, + { + "rap": 0.5584688276, + "phi": 1.5114709182, + "pt": 5.5096675477 + }, + { + "rap": 1.5298680057, + "phi": 3.733462158, + "pt": 5.3969065349 + }, + { + "rap": -0.9669693876, + "phi": 2.6133588293, + "pt": 5.3776982088 + }, + { + "rap": -5.8003068881, + "phi": 6.0401791222, + "pt": 5.2709546347 + }, + { + "rap": 0.6117716529, + "phi": 2.4198683637, + "pt": 5.1334992775 + }, + { + "rap": -2.3130515772, + "phi": 4.4891546265, + "pt": 5.0956687881 + } + ], + "jetid": 88 + }, + { + "jets": [ + { + "rap": 0.6097906748, + "phi": 5.834771327, + "pt": 32.3953894028 + }, + { + "rap": 0.45590357, + "phi": 2.0592542995, + "pt": 25.5638982234 + }, + { + "rap": 1.4966083227, + "phi": 2.6182298863, + "pt": 23.7073155485 + }, + { + "rap": 1.5045617684, + "phi": 0.5396364305, + "pt": 13.483321191 + }, + { + "rap": 0.3462737017, + "phi": 4.7072165069, + "pt": 10.5569142255 + }, + { + "rap": -0.2133354791, + "phi": 5.3591805354, + "pt": 8.348597528 + }, + { + "rap": -2.2038988201, + "phi": 3.2004905974, + "pt": 7.7431811965 + }, + { + "rap": 1.94028343, + "phi": 0.2078122932, + "pt": 6.1993724894 + }, + { + "rap": -1.8284477826, + "phi": 4.6215158602, + "pt": 5.6709459911 + }, + { + "rap": 0.8932568391, + "phi": 4.8436743124, + "pt": 5.4912296872 + } + ], + "jetid": 89 + }, + { + "jets": [ + { + "rap": 1.6586818956, + "phi": 5.6259324356, + "pt": 36.219981748 + }, + { + "rap": -0.274438853, + "phi": 2.6369948003, + "pt": 29.1187031647 + }, + { + "rap": 0.986140015, + "phi": 6.2562009327, + "pt": 9.3220961307 + }, + { + "rap": 1.0399342567, + "phi": 0.5253447841, + "pt": 7.2056142982 + }, + { + "rap": 2.4604833607, + "phi": 1.7016794558, + "pt": 7.1684328782 + }, + { + "rap": 3.0790420917, + "phi": 5.6714432327, + "pt": 7.0432268514 + }, + { + "rap": 2.8394299811, + "phi": 2.7444038424, + "pt": 6.5695509278 + }, + { + "rap": -1.7625136426, + "phi": 3.0877664742, + "pt": 5.9941287317 + }, + { + "rap": 2.1018756976, + "phi": 2.4365039325, + "pt": 5.7580378871 + }, + { + "rap": 1.0490392684, + "phi": 5.6722578306, + "pt": 5.6203411631 + }, + { + "rap": -0.2238305821, + "phi": 5.7402887622, + "pt": 5.6024648899 + }, + { + "rap": 0.9777007061, + "phi": 2.7142782671, + "pt": 5.2227177445 + }, + { + "rap": -2.6956375661, + "phi": 0.4357877063, + "pt": 5.1352349812 + }, + { + "rap": 1.9699534942, + "phi": 0.4744501182, + "pt": 5.1131746188 + }, + { + "rap": 0.3853605983, + "phi": 2.0090283944, + "pt": 5.0344590187 + } + ], + "jetid": 90 + }, + { + "jets": [ + { + "rap": 1.7396969214, + "phi": 0.8736199046, + "pt": 34.9333612424 + }, + { + "rap": 1.0695860218, + "phi": 4.4521591208, + "pt": 29.0123032756 + }, + { + "rap": 1.7621017549, + "phi": 3.871677939, + "pt": 13.5028536573 + }, + { + "rap": 3.3202928981, + "phi": 6.0742187413, + "pt": 10.5081742738 + }, + { + "rap": 0.4030552749, + "phi": 4.8882072774, + "pt": 8.3501775312 + }, + { + "rap": 1.9363885217, + "phi": 1.6003433744, + "pt": 7.773703308 + }, + { + "rap": 1.4910623353, + "phi": 3.0837006247, + "pt": 7.4370326275 + }, + { + "rap": -0.2828710931, + "phi": 4.0247430253, + "pt": 7.2489227438 + }, + { + "rap": -1.322121391, + "phi": 4.1431723308, + "pt": 7.1854242168 + }, + { + "rap": 1.0763540869, + "phi": 4.0372482873, + "pt": 6.8458502989 + }, + { + "rap": 0.4961180709, + "phi": 2.6964711383, + "pt": 6.8403233039 + }, + { + "rap": 3.3477063174, + "phi": 1.0044400516, + "pt": 6.6702874303 + }, + { + "rap": -0.8895131424, + "phi": 5.6700529063, + "pt": 6.6209215434 + }, + { + "rap": -3.3876466885, + "phi": 4.1740544788, + "pt": 6.3077057326 + }, + { + "rap": 0.7345007747, + "phi": 0.0309403748, + "pt": 6.2602496321 + }, + { + "rap": -1.853422781, + "phi": 4.0048942516, + "pt": 5.8968158174 + }, + { + "rap": 2.2495746677, + "phi": 1.0886286926, + "pt": 5.811921811 + }, + { + "rap": 2.0481848592, + "phi": 3.0952632599, + "pt": 5.4306797619 + }, + { + "rap": -0.6452874339, + "phi": 5.0011295659, + "pt": 5.2799253995 + }, + { + "rap": -0.8686141891, + "phi": 1.364030773, + "pt": 5.0349302024 + } + ], + "jetid": 91 + }, + { + "jets": [ + { + "rap": -0.1810691199, + "phi": 1.5463358782, + "pt": 26.888798987 + }, + { + "rap": 4.9792263323, + "phi": 5.447893653, + "pt": 21.162989192 + }, + { + "rap": -3.6947431023, + "phi": 5.5176566761, + "pt": 10.8944057343 + }, + { + "rap": -1.998111172, + "phi": 1.8160277867, + "pt": 7.6004707783 + }, + { + "rap": -0.9078661753, + "phi": 4.7283358961, + "pt": 6.9254971418 + }, + { + "rap": -1.5381918814, + "phi": 5.9141800914, + "pt": 6.7353285579 + }, + { + "rap": -2.9060308048, + "phi": 4.1645171429, + "pt": 6.3267403507 + }, + { + "rap": 2.9788130927, + "phi": 1.5239025993, + "pt": 5.836129476 + }, + { + "rap": -1.2049566843, + "phi": 3.5639474488, + "pt": 5.7093532999 + }, + { + "rap": 3.5473223566, + "phi": 3.1832590037, + "pt": 5.5624447237 + }, + { + "rap": 1.4734321298, + "phi": 5.0562709911, + "pt": 5.4067467912 + }, + { + "rap": -2.881794912, + "phi": 0.478605109, + "pt": 5.3596395831 + } + ], + "jetid": 92 + }, + { + "jets": [ + { + "rap": -5.4630069596, + "phi": 2.6963796573, + "pt": 18.7848716934 + }, + { + "rap": -4.2888123451, + "phi": 5.1033118902, + "pt": 11.0865093374 + }, + { + "rap": 4.1905292105, + "phi": 1.8218829294, + "pt": 9.5564028557 + }, + { + "rap": -0.0164762056, + "phi": 1.070251899, + "pt": 9.1947516179 + }, + { + "rap": 0.5686380037, + "phi": 5.4064145832, + "pt": 9.0762148164 + }, + { + "rap": 1.1340232254, + "phi": 6.0943261723, + "pt": 7.756782545 + }, + { + "rap": -0.0457202261, + "phi": 5.0980898992, + "pt": 7.3180910724 + }, + { + "rap": 2.3905646135, + "phi": 3.8570076193, + "pt": 5.3236738321 + }, + { + "rap": -2.9943713872, + "phi": 1.220086607, + "pt": 5.2722820435 + }, + { + "rap": -3.3610045964, + "phi": 0.9666467629, + "pt": 5.1298960484 + }, + { + "rap": 3.1434126761, + "phi": 4.8486727241, + "pt": 5.0899815239 + }, + { + "rap": -0.8232193717, + "phi": 0.4906573714, + "pt": 5.068223901 + } + ], + "jetid": 93 + }, + { + "jets": [ + { + "rap": 5.0136572596, + "phi": 0.3956481936, + "pt": 16.9267340204 + }, + { + "rap": 0.5409394177, + "phi": 4.1000608471, + "pt": 16.2922502355 + }, + { + "rap": 2.8011869775, + "phi": 1.6649106988, + "pt": 16.0790901073 + }, + { + "rap": -0.2075730553, + "phi": 3.7382547931, + "pt": 15.7754460035 + }, + { + "rap": -0.7050575096, + "phi": 3.7829140457, + "pt": 14.0242907096 + }, + { + "rap": 3.3103047377, + "phi": 2.0084827894, + "pt": 12.8022427668 + }, + { + "rap": 0.0223921426, + "phi": 0.7507305361, + "pt": 11.2341540806 + }, + { + "rap": 4.9091881366, + "phi": 3.733645756, + "pt": 10.9970528583 + }, + { + "rap": 4.2058054536, + "phi": 0.3510506092, + "pt": 9.9790781979 + }, + { + "rap": -2.0584496369, + "phi": 3.8041583602, + "pt": 9.8298796527 + }, + { + "rap": 0.5208692017, + "phi": 2.1573526667, + "pt": 9.5475657271 + }, + { + "rap": 3.8530612827, + "phi": 4.8667504525, + "pt": 8.2037232579 + }, + { + "rap": 2.7983830886, + "phi": 2.1358302039, + "pt": 7.7442807863 + }, + { + "rap": 1.0205333559, + "phi": 2.6038552708, + "pt": 7.4361161132 + }, + { + "rap": 0.5577428611, + "phi": 5.526616545, + "pt": 7.0415248856 + }, + { + "rap": 0.2562302121, + "phi": 4.8038734962, + "pt": 6.9614399489 + }, + { + "rap": -1.3614631444, + "phi": 0.2046888317, + "pt": 6.9396069339 + }, + { + "rap": -0.2713670103, + "phi": 2.8347186307, + "pt": 6.4373907786 + }, + { + "rap": 3.3068384891, + "phi": 0.4418478282, + "pt": 6.3829755455 + }, + { + "rap": 2.4980335684, + "phi": 0.2851223102, + "pt": 6.3276898929 + }, + { + "rap": -0.0789519836, + "phi": 4.233896538, + "pt": 6.3189741316 + }, + { + "rap": -1.0842542939, + "phi": 0.6238815278, + "pt": 6.2906207036 + }, + { + "rap": -0.7079980164, + "phi": 4.2465048196, + "pt": 6.0221889109 + }, + { + "rap": 1.024225704, + "phi": 2.1517302662, + "pt": 5.8675400647 + }, + { + "rap": -1.5882686733, + "phi": 3.2906655876, + "pt": 5.5957010769 + }, + { + "rap": -1.4801691902, + "phi": 5.7444988685, + "pt": 5.562995549 + }, + { + "rap": -0.5002530161, + "phi": 5.7225274342, + "pt": 5.1612804601 + }, + { + "rap": -0.3295285704, + "phi": 4.8060621129, + "pt": 5.1295370459 + } + ], + "jetid": 94 + }, + { + "jets": [ + { + "rap": -1.3641564929, + "phi": 3.1254056371, + "pt": 25.3841389186 + }, + { + "rap": 0.0213764737, + "phi": 0.5476373682, + "pt": 14.086329027 + }, + { + "rap": 2.9292582806, + "phi": 5.1974768502, + "pt": 11.4619385329 + }, + { + "rap": -0.9678499204, + "phi": 2.9331519356, + "pt": 8.6461341931 + }, + { + "rap": -0.8979477931, + "phi": 3.7971228876, + "pt": 7.9245128497 + }, + { + "rap": -5.7621551784, + "phi": 6.2429974002, + "pt": 7.8181924821 + }, + { + "rap": -0.3497865753, + "phi": 0.3616507356, + "pt": 7.6055906382 + }, + { + "rap": 0.1227248697, + "phi": 0.0951060422, + "pt": 6.5806100097 + }, + { + "rap": -2.5419488711, + "phi": 1.1525379583, + "pt": 5.6389785142 + } + ], + "jetid": 95 + }, + { + "jets": [ + { + "rap": -4.4262715338, + "phi": 1.4427513135, + "pt": 22.90169969 + }, + { + "rap": -0.4392913313, + "phi": 4.0720172917, + "pt": 21.4591757497 + }, + { + "rap": -4.1297325977, + "phi": 6.2205094187, + "pt": 11.1755261125 + }, + { + "rap": 3.8470868808, + "phi": 4.9281262496, + "pt": 9.9812454448 + } + ], + "jetid": 96 + }, + { + "jets": [ + { + "rap": -0.5788686699, + "phi": 0.3974570291, + "pt": 62.7581228332 + }, + { + "rap": -2.0588122217, + "phi": 4.0437264526, + "pt": 43.272662371 + }, + { + "rap": -0.9668921932, + "phi": 2.9826635505, + "pt": 26.6137978537 + }, + { + "rap": 0.1507150525, + "phi": 1.6335188461, + "pt": 7.9681921501 + }, + { + "rap": 4.3723387556, + "phi": 4.7847518064, + "pt": 5.2770267561 + } + ], + "jetid": 97 + }, + { + "jets": [ + { + "rap": 0.4015578439, + "phi": 2.6347992603, + "pt": 25.4987631986 + }, + { + "rap": 1.4765146781, + "phi": 6.144621631, + "pt": 13.1822960008 + }, + { + "rap": 1.6602344167, + "phi": 5.5722659039, + "pt": 5.2367009793 + } + ], + "jetid": 98 + }, + { + "jets": [ + { + "rap": -1.7049884084, + "phi": 2.9181076656, + "pt": 32.9152177337 + }, + { + "rap": 2.5125360731, + "phi": 0.7062312947, + "pt": 24.0321147999 + }, + { + "rap": -1.6337500089, + "phi": 5.3856678, + "pt": 22.5716059168 + }, + { + "rap": 0.403992883, + "phi": 2.3742623892, + "pt": 14.1794644561 + }, + { + "rap": 0.441442252, + "phi": 3.9566011858, + "pt": 10.0803193761 + }, + { + "rap": -0.517737029, + "phi": 3.2350090703, + "pt": 9.3231356006 + }, + { + "rap": -4.411051177, + "phi": 5.908323852, + "pt": 9.040795026 + }, + { + "rap": 2.9465834552, + "phi": 1.7735068081, + "pt": 7.3337585008 + }, + { + "rap": -2.172368763, + "phi": 2.3052107635, + "pt": 5.2999130793 + }, + { + "rap": 0.2730665503, + "phi": 3.3739018516, + "pt": 5.2591320704 + }, + { + "rap": 1.3396555173, + "phi": 4.6147358601, + "pt": 5.2097777546 + } + ], + "jetid": 99 + }, + { + "jets": [ + { + "rap": -0.7439132065, + "phi": 6.1020564568, + "pt": 68.6022448723 + }, + { + "rap": 1.2143231602, + "phi": 2.607255933, + "pt": 32.7040413484 + }, + { + "rap": -0.1023491868, + "phi": 2.766393042, + "pt": 21.6447561937 + }, + { + "rap": 2.8716231997, + "phi": 4.7026396167, + "pt": 17.9950628009 + }, + { + "rap": 5.7067728977, + "phi": 2.9717667504, + "pt": 7.1526743739 + }, + { + "rap": 5.0309428115, + "phi": 0.0335029798, + "pt": 5.4967919059 + }, + { + "rap": 0.4912571154, + "phi": 3.3133424853, + "pt": 5.2899986764 + }, + { + "rap": -5.6491980661, + "phi": 2.3707769631, + "pt": 5.0620425959 + } + ], + "jetid": 100 + } +] diff --git a/test/runtests.jl b/test/runtests.jl index 2ae5ecd..908ae45 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -10,7 +10,8 @@ const events_file = joinpath(@__DIR__, "data", "events.hepmc3.gz") const algorithms = Dict(-1 => "Anti-kt", 0 => "Cambridge/Achen", - 1 => "Inclusive-kt") + 1 => "Inclusive-kt", + 1.5 => "Generalised-kt") """Simple structure with necessary parameters for an exclusive selection test""" struct InclusiveTest @@ -50,15 +51,45 @@ function sort_jets!(jet_array::Vector{LorentzVectorCyl}) end function main() + # A few unit tests + @testset "Algorithm/power consistency" begin + @test JetReconstruction.check_algorithm_power_consistency(algorithm = JetAlgorithm.AntiKt, + p = -1) + @test JetReconstruction.check_algorithm_power_consistency(algorithm = JetAlgorithm.CA, + p = 0) + @test JetReconstruction.check_algorithm_power_consistency(algorithm = JetAlgorithm.Kt, + p = 1) + + @test JetReconstruction.check_algorithm_power_consistency(algorithm = JetAlgorithm.AntiKt, + p = nothing) + @test JetReconstruction.check_algorithm_power_consistency(algorithm = nothing, + p = -1) + + @test_throws ArgumentError JetReconstruction.check_algorithm_power_consistency(algorithm = JetAlgorithm.AntiKt, + p = 0) + @test_throws ArgumentError JetReconstruction.check_algorithm_power_consistency(algorithm = JetAlgorithm.Kt, + p = 1.5) + + @test JetReconstruction.check_algorithm_power_consistency(algorithm = JetAlgorithm.GenKt, + p = 1.5) + @test JetReconstruction.check_algorithm_power_consistency(algorithm = JetAlgorithm.GenKt, + p = -0.5) + + @test_throws ArgumentError JetReconstruction.check_algorithm_power_consistency(algorithm = JetAlgorithm.GenKt, + p = nothing) + end + # Read our fastjet inclusive outputs (we read for anti-kt, cambridge/achen, inclusive-kt) fastjet_alg_files_inclusive = Dict(-1 => joinpath(@__DIR__, "data", "jet-collections-fastjet-inclusive-akt.json"), 0 => joinpath(@__DIR__, "data", "jet-collections-fastjet-inclusive-ca.json"), 1 => joinpath(@__DIR__, "data", - "jet-collections-fastjet-inclusive-ikt.json")) + "jet-collections-fastjet-inclusive-ikt.json"), + 1.5 => joinpath(@__DIR__, "data", + "jet-collections-fastjet-inclusive-genkt-p1.5.json")) - fastjet_data = Dict{Int, Vector{Any}}() + fastjet_data = Dict{Real, Vector{Any}}() for (k, v) in pairs(fastjet_alg_files_inclusive) fastjet_jets = read_fastjet_outputs(v) sort_jets!(fastjet_jets) @@ -101,6 +132,14 @@ function main() power = test.power, selection = test.selction, njets = test.njets, dijmax = test.dijmax) end + + # Suppress these tests for now, as the examples Project.toml is rather heavy + # because of the GLMakie dependency, plus on a CI there is no GL subsystem, + # so things fail. The examples should be restructured to have a cleaner set + # of examples that are good to run in the CI. + + # Now run a few tests with our examples + # include("tests_examples.jl") end """ @@ -116,7 +155,7 @@ function do_test_compare_to_fastjet(strategy::RecoStrategy.Strategy, fastjet_jet selection = "Inclusive", ptmin::Float64 = 5.0, distance::Float64 = 0.4, - power::Integer = -1, + power::Real = -1, dijmax = nothing, njets = nothing) @@ -140,7 +179,12 @@ function do_test_compare_to_fastjet(strategy::RecoStrategy.Strategy, fastjet_jet jet_collection = FinalJets[] for (ievt, event) in enumerate(events) # First run the reconstruction - cluster_seq = jet_reconstruction(event, R = distance, p = power) + if power == 1.5 + cluster_seq = jet_reconstruction(event, R = distance, + algorithm = JetAlgorithm.GenKt, p = power) + else + cluster_seq = jet_reconstruction(event, R = distance, p = power) + end # Now make the requested selection if !isnothing(dijmax) selected_jets = exclusive_jets(cluster_seq; dcut = dijmax) diff --git a/test/tests_examples.jl b/test/tests_examples.jl new file mode 100644 index 0000000..05bff96 --- /dev/null +++ b/test/tests_examples.jl @@ -0,0 +1,31 @@ +#! /usr/bin/env julia + +using Test + +const example_dir = joinpath(pkgdir(JetReconstruction), "examples") +const test_dir = joinpath(pkgdir(JetReconstruction), "test") + +# Need to ensure examples is properly instatiated +run(`julia --project=$example_dir $test_dir/bootstrap_examples.jl`) + +# Now run a few tests with our examples +@testset "Jet Reconstruction Examples" begin + @test success(run(pipeline(`julia --project=$example_dir $example_dir/jetreco.jl -S N2Plain -A AntiKt -R 1.0 $events_file`, + devnull))) + @test success(run(pipeline(`julia --project=$example_dir $example_dir/jetreco.jl -S N2Tiled -p 1 -R 1.0 $events_file`, + devnull))) + @test success(run(pipeline(`julia --project=$example_dir $example_dir/jetreco.jl -p 1.5 -A GenKt -R 1.0 $events_file`, + devnull))) + + @test success(run(pipeline(`julia --project=$example_dir $example_dir/instrumented-jetreco.jl -S N2Plain -A AntiKt -R 1.0 $events_file`, + devnull))) + @test success(run(pipeline(`julia --project=$example_dir $example_dir/instrumented-jetreco.jl -S N2Tiled -p 1 -R 1.0 $events_file`, + devnull))) + @test success(run(pipeline(`julia --project=$example_dir $example_dir/instrumented-jetreco.jl -p 1.5 -A GenKt -R 1.0 $events_file`, + devnull))) + + @test success(run(pipeline(`julia --project=$example_dir $example_dir/jetreco-constituents.jl`, + devnull))) + @test success(run(pipeline(`julia --project=$example_dir $example_dir/visualise-jets.jl -A AntiKt --event 5 -R 2.0 $events_file $example_dir/jetvis.png`, + devnull))) +end