ATLAS Offline Software
Loading...
Searching...
No Matches
PanTauProcessor.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
10
12 : TauRecToolBase(name)
13{}
14
15
17
18
45
46
48 return StatusCode::SUCCESS;
49}
50
51
53 const EventContext& /*ctx*/,
54 xAOD::ParticleContainer& pi0Container,
55 xAOD::PFOContainer& neutralPFOContainer) const {
56
57 //get the current TauJet
58 xAOD::TauJet* curTauJet = &pTau;
59
60 //check for null pointer
61 if(curTauJet == nullptr) {
62 ATH_MSG_WARNING("Pointer to xAOD::TauJet is 0!");
63 return StatusCode::FAILURE;
64 }
65
66 fillDefaultValuesToTau(curTauJet);
67
68 //keep track of the technical quality of the pantau seed to be created
69 std::vector<int> pantauSeed_TechnicalQuality = std::vector<int>((unsigned int)PanTau::PanTauSeed::t_nTechnicalQualities, 0);
70
71 //Only process taus with 1 <= ntracks <= 5:
72 int numTrack = curTauJet->nTracks();
73 if(numTrack == 0 || numTrack > 5) {
74 ATH_MSG_DEBUG("Flagging tau for algorithm CellBased as invalid, because numTrack is " << numTrack);
75 pantauSeed_TechnicalQuality.at(static_cast<int>(PanTau::PanTauSeed::t_NoValidInputTau)) = 1;
76 }
77
78 // if there is substructure info available, get constituents, perform selection and recombination
79 //these vectors will be owned by the PanTauSeed object.
80 std::vector<TauConstituent*> list_TauConstituents = std::vector<TauConstituent*>(0);
81 std::vector<TauConstituent*> list_SelectedTauConstituents = std::vector<TauConstituent*>(0);
82
83 if(pantauSeed_TechnicalQuality.at(static_cast<int>(PanTau::PanTauSeed::t_NoValidInputTau)) == 0) {
84 // Get the constituents for the current tau
85 ATH_CHECK( m_Tool_TauConstituentGetter->GetTauConstituents(curTauJet, list_TauConstituents) );
86 if(list_TauConstituents.empty()) {
87 pantauSeed_TechnicalQuality.at(static_cast<int>(PanTau::PanTauSeed::t_NoConstituentsAtAll)) = 1;
88 ATH_MSG_DEBUG("Seed has no associated constituents!");
89 }
90
91 // Call the TauConstituentSelector tool to throw out bad constituents
92 ATH_CHECK(m_Tool_TauConstituentSelector->SelectTauConstituents(list_TauConstituents, list_SelectedTauConstituents) );
93 if(list_SelectedTauConstituents.empty()) {
94 pantauSeed_TechnicalQuality.at(static_cast<int>(PanTau::PanTauSeed::t_NoSelectedConstituents)) = 1;
95 ATH_MSG_DEBUG("Seed has no associated constituents that pass selection!");
96 }
97
98 //check if there are core objects in the selected constituents
99 bool hasCoreConstituents = false;
100 for(unsigned int iConst=0; iConst<list_SelectedTauConstituents.size(); iConst++) {
101 PanTau::TauConstituent* curConst = list_SelectedTauConstituents.at(iConst);
102 if(curConst->isOfType(PanTau::TauConstituent::t_Charged)) {hasCoreConstituents = true; break;};
103 if(curConst->isOfType(PanTau::TauConstituent::t_Neutral)) {hasCoreConstituents = true; break;};
104 if(curConst->isOfType(PanTau::TauConstituent::t_Pi0Neut)) {hasCoreConstituents = true; break;};
105 }
106
107 if(!hasCoreConstituents) {
108 pantauSeed_TechnicalQuality.at(static_cast<int>(PanTau::PanTauSeed::t_NoSelectedConstituents)) = 1; //use this flag at the moment as a quick hack
109 }
110 }
111
112 //to be consistent, taus without substructure algs run on them also have no constituents
113 if(pantauSeed_TechnicalQuality.at(static_cast<int>(PanTau::PanTauSeed::t_NoValidInputTau)) == 1) {
114 pantauSeed_TechnicalQuality.at(static_cast<int>(PanTau::PanTauSeed::t_NoConstituentsAtAll)) = 1;
115 pantauSeed_TechnicalQuality.at(static_cast<int>(PanTau::PanTauSeed::t_NoSelectedConstituents)) = 1;
116 }
117
118 //check for the pT flag
119 double tauJet_pT = curTauJet->ptIntermediateAxis();
120 if(tauJet_pT < m_Config_MinPt || tauJet_pT > m_Config_MaxPt) {
121 pantauSeed_TechnicalQuality.at(static_cast<int>(PanTau::PanTauSeed::t_BadPtValue)) = 1;
122 }
123
124 // Now build the PanTauSeed with the new Constituents
125 PanTau::PanTauSeed* curPanTauSeed = new PanTau::PanTauSeed(curTauJet,
126 list_SelectedTauConstituents,
127 list_TauConstituents,
128 pantauSeed_TechnicalQuality);
129
130 curPanTauSeed->makePrivateStore();
131
132 // Get the features for this PanTauSeed
133 ATH_CHECK(m_Tool_FeatureExtractor->execute(curPanTauSeed) );
134
135 // Seed finalizing:
136 // 1. Pass the seed to the decay mode determination tool
137 // 2. Pass the seed to the DetailsArranger tool to calculate the four momentum and add the details to tauJet
138
139 // 1. call decay mode determinator for this seed
140 ATH_CHECK( m_Tool_DecayModeDeterminator->execute(curPanTauSeed) );
141
142 // 2. calculate the four momentum and link the details to the tauJet
143 ATH_CHECK( m_Tool_DetailsArranger->execute(curPanTauSeed, pi0Container, neutralPFOContainer) );
144
145 delete curPanTauSeed;
146 return StatusCode::SUCCESS;
147}
148
149
151 //default four momentum set to previous calibration state: TauEnergyScale
152 TLorentzVector defaultP4 = tauJet->p4(xAOD::TauJetParameters::TauEnergyScale);
153 tauJet->setP4(xAOD::TauJetParameters::PanTauCellBased, defaultP4.Pt(), defaultP4.Eta(), defaultP4.Phi(), defaultP4.M());
154
155 //charged
156 std::vector< ElementLink< xAOD::PFOContainer > > chrgPFOLinks = tauJet->protoChargedPFOLinks();
157 tauJet->setChargedPFOLinks(chrgPFOLinks);
158
159 //pi0
160 std::vector< ElementLink< xAOD::PFOContainer > > pi0PFOLinks = tauJet->protoPi0PFOLinks();
161 tauJet->setPi0PFOLinks(pi0PFOLinks);
162
163 //neutrals
164 std::vector< ElementLink< xAOD::PFOContainer > > neutralPFOLinks = tauJet->protoNeutralPFOLinks();
165 tauJet->setNeutralPFOLinks(neutralPFOLinks);
166}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_INFO(x,...)
static StatusCode bindToolHandle(ToolHandle< T > &, std::string)
Gaudi::Property< std::string > m_Tool_TauConstituentSelectorName
ToolHandle< PanTau::ITool_TauConstituentSelector > m_Tool_TauConstituentSelector
std::vector< double > m_Config_PtBins
Gaudi::Property< std::string > m_Tool_DecayModeDeterminatorName
ToolHandle< PanTau::ITool_InformationStore > m_Tool_InformationStore
Gaudi::Property< std::string > m_Tool_DetailsArrangerName
ToolHandle< PanTau::ITool_PanTauTools > m_Tool_FeatureExtractor
Gaudi::Property< std::string > m_Tool_FeatureExtractorName
ToolHandle< PanTau::ITool_PanTauTools > m_Tool_DecayModeDeterminator
Gaudi::Property< std::string > m_Tool_InformationStoreName
virtual StatusCode finalize()
Finalizer.
Gaudi::Property< std::string > m_Tool_TauConstituentGetterName
virtual StatusCode initialize()
Tool initializer.
PanTauProcessor(const std::string &name)
ToolHandle< PanTau::ITool_TauConstituentGetter > m_Tool_TauConstituentGetter
ToolHandle< PanTau::ITool_DetailsArranger > m_Tool_DetailsArranger
virtual StatusCode executeTool(xAOD::TauJet &pTau, const EventContext &ctx, xAOD::ParticleContainer &pi0Container, xAOD::PFOContainer &neutralPFOContainer) const
static void fillDefaultValuesToTau(xAOD::TauJet *tauJet)
Input object for PanTau.
bool isOfType(TauConstituent::Type aType) const
TauRecToolBase(const std::string &name)
void setPi0PFOLinks(const PFOLinks_t &pi0PFOs)
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition TauJet_v3.cxx:96
double ptIntermediateAxis() const
const PFOLinks_t & protoChargedPFOLinks() const
cellbased pfos
void setP4(double pt, double eta, double phi, double m)
Set methods for IParticle values.
void setNeutralPFOLinks(const PFOLinks_t &neutralPFOs)
const PFOLinks_t & protoPi0PFOLinks() const
void setChargedPFOLinks(const PFOLinks_t &chargedPFOs)
size_t nTracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
const PFOLinks_t & protoNeutralPFOLinks() const
PFOContainer_v1 PFOContainer
Definition of the current "pfo container version".
ParticleContainer_v1 ParticleContainer
Define the latest version of the particle class.
TauJet_v3 TauJet
Definition of the current "tau version".
Definition TauJet.h:17