8#include "fastjet/PseudoJet.hh"
9#include "fastjet/ClusterSequence.hh"
10#include "fastjet/ClusterSequenceArea.hh"
11#include "fastjet/config.h"
12#include "fastjet/contrib/VariableRPlugin.hh"
39 seeds.push_back(ievt);
40 seeds.push_back(irun);
50 if (
m_fjalg == fastjet::undefined_jet_algorithm)
54 return StatusCode::FAILURE;
59 return StatusCode::FAILURE;
67 fastjet::ClusterSequence cs(
empty, jetdef);
74 ATH_MSG_WARNING(
"A non-empty value was found for the FinalPseudoJets WriteHandleKey -- this will be ignored!");
86 return StatusCode::SUCCESS;
95 using fastjet::contrib::VariableRPlugin;
96 std::unique_ptr<VariableRPlugin> VRJetPlugin(
nullptr);
104 VariableRPlugin::ClusterType VRClusterType = VariableRPlugin::AKTLIKE;
107 case fastjet::kt_algorithm:
108 VRClusterType = VariableRPlugin::KTLIKE;
110 case fastjet::antikt_algorithm:
111 VRClusterType = VariableRPlugin::AKTLIKE;
113 case fastjet::cambridge_algorithm:
114 VRClusterType = VariableRPlugin::CALIKE;
117 ATH_MSG_ERROR(
"Unsupported clustering algorithm for Variable-R jet finding.");
121 jetdef = fastjet::JetDefinition(VRJetPlugin.get());
124 std::unique_ptr<fastjet::ClusterSequence> clSequence(
nullptr);
135 clSequence = std::make_unique<fastjet::ClusterSequenceArea>(*pseudoJetVector, jetdef, adef);
145 clSequence = std::make_unique<fastjet::ClusterSequence>(*pseudoJetVector, jetdef);
164 pjAccessor(
jet) = &pj;
168 jet.setAlgorithmType(ialg);
178 ATH_MSG_VERBOSE(
" xAOD::Jet with pt " << std::setprecision(4) <<
jet.pt() * 1e-3 <<
" has " <<
jet.getConstituents().size() <<
" constituents");
179 ATH_MSG_VERBOSE(
" Leading constituent is of type " <<
jet.getConstituents()[0].rawConstituent()->type());
184 jet.setAssociatedObject(
"OriginVertex", originVertex);
195 auto nullreturn = std::make_pair(std::unique_ptr<xAOD::JetContainer>(
nullptr), std::unique_ptr<SG::IAuxStore>(
nullptr));
208 auto jets = std::make_unique<xAOD::JetContainer>();
209 auto auxCont = std::make_unique<xAOD::JetAuxContainer>();
210 jets->setStore(auxCont.get());
212 const PseudoJetVector *pseudoJetVector = pjContHandle->casVectorPseudoJet();
213 ATH_MSG_DEBUG(
"Pseudojet input container has size " << pseudoJetVector->size());
224 auto pjVector = std::make_unique<PseudoJetVector>(fastjet::sorted_by_pt(clSequence->inclusive_jets(
m_ptmin)));
228 for (
const auto &pj : *pjVector)
230 msg() <<
" Pseudojet with pt " << std::setprecision(4) << pj.Et() * 1e-3 <<
" has " << pj.constituents().size() <<
" constituents" <<
endmsg;
236 if (!pjVector->empty())
239 for (
const fastjet::PseudoJet &pj : *pjVector)
250 if (!pjVectorHandle.
record(std::move(pjVector)))
258 if (!clusterSeqHandle.
record(std::move(clSequence)))
265 ATH_MSG_DEBUG(
"Reconstructed jet count: " << jets->size() <<
" clusterseq=" << clSequence.get());
268 return std::make_pair(std::move(jets), std::move(auxCont));
274 fastjet::GhostedAreaSpec gspec(5.0, 1,
m_ghostarea);
276 std::vector<int> seeds;
282 if (!evtInfoHandle.isValid())
294 ATH_MSG_DEBUG(
" Actual ghost area: " << gspec.actual_ghost_area());
300 if (seeds.size() == 2)
302 ATH_MSG_DEBUG(
" Random seeds: " << seeds[0] <<
", " << seeds[1]);
308 for (
auto seed : seeds)
314 return fastjet::AreaDefinition(fastjet::active_area,
316 .with_fixed_seed(seeds);
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
std::vector< fastjet::PseudoJet > PseudoJetVector
static const Attributes_t empty
bool msgLvl(const MSG::Level lvl) const
Gaudi::Property< float > m_ghostarea
fastjet::AreaDefinition buildAreaDefinition(bool &seedsok) const
Build the area definition when running with area calculation. The seedsok flag is set to false when e...
std::pair< std::unique_ptr< xAOD::JetContainer >, std::unique_ptr< SG::IAuxStore > > getJets() const override
Return the final jets with their aux store.
Gaudi::Property< std::string > m_jetalg
SG::WriteHandleKey< jet::ClusterSequence > m_clusterSequence
Gaudi::Property< int > m_inputType
Gaudi::Property< float > m_massscale
Gaudi::Property< float > m_ptmin
Gaudi::Property< std::string > m_jetRank
SG::ReadHandleKey< xAOD::EventInfo > m_eventinfokey
Handle to EventInfo. This is used to get the evt&run number to set the Ghost area random seeds.
Gaudi::Property< int > m_ranopt
StatusCode initialize() override
Dummy implementation of the initialisation function.
Gaudi::Property< float > m_minrad
void processPseudoJet(const fastjet::PseudoJet &pj, const PseudoJetContainer &pjCont, xAOD::JetContainer *jets, const xAOD::Vertex *vertex) const
translate to xAOD::Jet
SG::AuxElement::Accessor< int > m_jetRankAccessor
Gaudi::Property< float > m_jetrad
std::unique_ptr< fastjet::ClusterSequence > buildClusterSequence(const PseudoJetVector *pseudoJetvector) const
Used to create the cluster sequence.
fastjet::JetAlgorithm m_fjalg
SG::ReadHandleKey< PseudoJetContainer > m_inputPseudoJets
Handle Input PseudoJetContainer.
SG::WriteHandleKey< PseudoJetVector > m_finalPseudoJets
used to build the key under which the final PJ will be stored in evtStore()
xAOD::Jet & translate(const fastjet::PseudoJet &pj, const PseudoJetContainer &pjCont, xAOD::JetContainer &jetCont, const xAOD::Vertex *originVertex=nullptr) const
SG::Accessor< T, ALLOC > Accessor
virtual bool isValid() override final
Can the handle be successfully dereferenced?
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
uint64_t mcEventNumber() const
The MC generator's event number.
bool eventType(EventType type) const
Check for one particular bitmask value.
@ IS_SIMULATION
true: simulation, false: data
uint32_t runNumber() const
The current event's run number.
uint32_t mcChannelNumber() const
The MC generator's channel number.
uint64_t eventNumber() const
The current event's event number.
void seedsFromEventInfo(const xAOD::EventInfo *ei, std::vector< int > &seeds)
Fill seeds vector from run & event number. This functio is separated from the class so it's easier to...
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
ID algId(const std::string &n)
Converts a string into a JetAlgorithmType::ID.
fastjet::JetAlgorithm fastJetDef(ID id)
ID
//////////////////////////////////////// JetAlgorithmType::ID defines most common physics jet finding...
Jet_v1 Jet
Definition of the current "jet version".
EventInfo_v1 EventInfo
Definition of the latest event info version.
Vertex_v1 Vertex
Define the latest version of the vertex class.
JetContainer_v1 JetContainer
Definition of the current "jet container version".