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