ATLAS Offline Software
Tool_DecayModeDeterminator.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
8 
9 
11  asg::AsgTool(name)
12 {}
13 
14 
16 
17 
19 
20  m_init=true;
21 
22  ATH_CHECK( HelperFunctions::bindToolHandle(m_Tool_InformationStore, m_Tool_InformationStoreName) );
23  ATH_CHECK( HelperFunctions::bindToolHandle(m_Tool_ModeDiscriminator_1p0n_vs_1p1n, m_Tool_ModeDiscriminator_1p0n_vs_1p1nName) );
24  ATH_CHECK( HelperFunctions::bindToolHandle(m_Tool_ModeDiscriminator_1p1n_vs_1pXn, m_Tool_ModeDiscriminator_1p1n_vs_1pXnName) );
25  ATH_CHECK( HelperFunctions::bindToolHandle(m_Tool_ModeDiscriminator_3p0n_vs_3pXn, m_Tool_ModeDiscriminator_3p0n_vs_3pXnName) );
26 
27  //get the discri tools
28  ATH_CHECK(m_Tool_ModeDiscriminator_1p0n_vs_1p1n.retrieve());
29  ATH_CHECK(m_Tool_ModeDiscriminator_1p1n_vs_1pXn.retrieve());
30  ATH_CHECK(m_Tool_ModeDiscriminator_3p0n_vs_3pXn.retrieve());
31 
32  //get the variable prefix
33  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_Basic", m_varTypeName_Prefix_Basic) );
34 
35  //get the BDT cut values
36  ATH_CHECK( m_Tool_InformationStore->getInfo_Double("DecayModeDeterminator_BDTCutValue_R10X_CellBased", m_BDTCutValue_R10X_CellBased) );
37  ATH_CHECK( m_Tool_InformationStore->getInfo_Double("DecayModeDeterminator_BDTCutValue_R11X_CellBased", m_BDTCutValue_R11X_CellBased) );
38  ATH_CHECK( m_Tool_InformationStore->getInfo_Double("DecayModeDeterminator_BDTCutValue_R110_CellBased", m_BDTCutValue_R110_CellBased) );
39  ATH_CHECK( m_Tool_InformationStore->getInfo_Double("DecayModeDeterminator_BDTCutValue_R1XX_CellBased", m_BDTCutValue_R1XX_CellBased) );
40  ATH_CHECK( m_Tool_InformationStore->getInfo_Double("DecayModeDeterminator_BDTCutValue_R30X_CellBased", m_BDTCutValue_R30X_CellBased) );
41  ATH_CHECK( m_Tool_InformationStore->getInfo_Double("DecayModeDeterminator_BDTCutValue_R3XX_CellBased", m_BDTCutValue_R3XX_CellBased) );
42 
43  return StatusCode::SUCCESS;
44 }
45 
46 
48 
49  PanTau::TauFeature* features = inSeed->getFeatures();
50 
51  //check for invalid input seed
53  bool noAnyConstituents = inSeed->isOfTechnicalQuality(PanTau::PanTauSeed::t_NoConstituentsAtAll);
56  bool invalidForDecayMode = (noValidInput || noAnyConstituents || noSelConstituents || badPt);
57 
58  int decayMode_PanTauExtended = PanTau::PanTauSeed::t_ExtModeNotSet;
59  xAOD::TauJet* tauJet = inSeed->getTauJet();
60 
61  if(invalidForDecayMode) {
62  ATH_MSG_DEBUG("Seed has no constituents assigned and/or input seed has no substructure info - use NotSet mode for this");
63  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_RecoMode_PanTau", xAOD::TauJetParameters::Mode_NotSet);
64  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_RecoMode_PanTauExtended", PanTau::PanTauSeed::t_ExtModeNotSet);
66  return StatusCode::SUCCESS;
67  }
68 
69  //get the mode as it was determined by the subalgorithm
70  int decayMode_SubAlg = inSeed->getDecayModeBySubAlg();
71  int decayMode_PanTau = xAOD::TauJetParameters::Mode_NotSet;
72 
73  //and calc the number of additional neutrals, not tagged as pi0
76  int AdditionalNeutrals = nNeutrals_SubAlg - nPi0Neut_SubAlg;
77 
78  //based on the subAlg decay mode, pass to corresponding PanTau BDT...
79  double bdtResponse = -5;
80  DecayModeTest bdtTest = t_UnknownTest;
81  // 1p0n mode
82  if(decayMode_SubAlg == xAOD::TauJetParameters::Mode_1p0n) {
83 
84  //1 prong, and no other objects at all -> use 1p0n
85  if(AdditionalNeutrals == 0) {
86  decayMode_PanTau = xAOD::TauJetParameters::Mode_1p0n;
87  decayMode_PanTauExtended = PanTau::PanTauSeed::t_ExtMode100;
88  bdtResponse = -3.;
89 
90  //if there are neutrals which are not pi0-tagged, check BDT to maybe set 1p1n
91  }
92  else {
93  bool isOK = false;
94  bdtResponse = m_Tool_ModeDiscriminator_1p0n_vs_1p1n->getResponse(inSeed, isOK);
95  bdtTest = t_1p0n_vs_1p1n;
96  decayMode_PanTauExtended = PanTau::PanTauSeed::t_ExtMode10X;
97  if(!isOK) {
98  ATH_MSG_WARNING("WARNING: problems getting bdt response for 1p0n + X-neutrals. use subAlg mode");
99  decayMode_PanTau = decayMode_SubAlg;
100  }
101  else {
102  decayMode_PanTau = (bdtResponse > m_BDTCutValue_R10X_CellBased) ? xAOD::TauJetParameters::Mode_1p0n : xAOD::TauJetParameters::Mode_1p1n;
103  }
104  }
105  }//end 1p0n
106 
107  //1p1n mode
108  else if (decayMode_SubAlg == xAOD::TauJetParameters::Mode_1p1n) {
109  //1prong, 1pi0 and no other neutrals. check 1p0n-vs-1p1n
110  if(AdditionalNeutrals == 0) {
111  bool isOK = false;
112  bdtResponse = m_Tool_ModeDiscriminator_1p0n_vs_1p1n->getResponse(inSeed, isOK);
113  bdtTest = t_1p0n_vs_1p1n;
114  decayMode_PanTauExtended = PanTau::PanTauSeed::t_ExtMode110;
115  if(!isOK) {
116  ATH_MSG_WARNING("WARNING problems getting bdt response for 1p1n + 0-neutrals. use subAlg mode");
117  decayMode_PanTau = decayMode_SubAlg;
118  }
119  else {
120  decayMode_PanTau = (bdtResponse <= m_BDTCutValue_R110_CellBased) ? xAOD::TauJetParameters::Mode_1p1n : xAOD::TauJetParameters::Mode_1p0n;
121  }
122  //1prong, 1pi0 and additional neutrals. check 1p1n vs 1pXn
123  }
124  else {
125  //NOTE: May investigate chain of decisions here: first check 1p0n-1p1n, and then (in case of 1p1n) 1p1n-1pXn
126  bool isOK = false;
127  bdtResponse = m_Tool_ModeDiscriminator_1p1n_vs_1pXn->getResponse(inSeed, isOK);
128  bdtTest = t_1p1n_vs_1pXn;
129  decayMode_PanTauExtended = PanTau::PanTauSeed::t_ExtMode11X;
130  if(!isOK) {
131  ATH_MSG_WARNING("WARNING problems getting bdt response for 1p1n + X-neutrals. use subAlg mode");
132  decayMode_PanTau = decayMode_SubAlg;
133  }
134  else {
135  decayMode_PanTau = (bdtResponse > m_BDTCutValue_R11X_CellBased) ? xAOD::TauJetParameters::Mode_1p1n: xAOD::TauJetParameters::Mode_1pXn;
136  }
137  }
138  }//end 1p1n
139 
140  //1pXn mode
141  else if (decayMode_SubAlg == xAOD::TauJetParameters::Mode_1pXn) {
142  //1prong, Xpi0. check 1p1n-vs-1pXn
143  bool isOK = false;
144  bdtResponse = m_Tool_ModeDiscriminator_1p1n_vs_1pXn->getResponse(inSeed, isOK);
145  bdtTest = t_1p1n_vs_1pXn;
146  decayMode_PanTauExtended = PanTau::PanTauSeed::t_ExtMode1XX;
147  if(!isOK) {
148  ATH_MSG_WARNING("WARNING problems getting bdt response for 1p1n + X-neutrals. use subAlg mode");
149  decayMode_PanTau = decayMode_SubAlg;
150  } else {
151  decayMode_PanTau = (bdtResponse > m_BDTCutValue_R1XX_CellBased) ? xAOD::TauJetParameters::Mode_1p1n : xAOD::TauJetParameters::Mode_1pXn;
152  }
153  }//end 1pXn
154 
155  //3p0n mode
156  else if (decayMode_SubAlg == xAOD::TauJetParameters::Mode_3p0n) {
157  //no additional neutrals.
158  if(AdditionalNeutrals == 0) {
159  decayMode_PanTau = xAOD::TauJetParameters::Mode_3p0n;
160  decayMode_PanTauExtended = PanTau::PanTauSeed::t_ExtMode300;
161  bdtResponse = -2.5;
162  //additional neutrals
163  }
164  else {
165  bool isOK = false;
166  bdtResponse = m_Tool_ModeDiscriminator_3p0n_vs_3pXn->getResponse(inSeed, isOK);
167  bdtTest = t_3p0n_vs_3pXn;
168  decayMode_PanTauExtended = PanTau::PanTauSeed::t_ExtMode30X;
169  if(!isOK) {
170  ATH_MSG_WARNING("WARNING problems getting bdt response for 3p0n + X-neutrals. use subAlg mode");
171  decayMode_PanTau = decayMode_SubAlg;
172  }
173  else {
174  decayMode_PanTau = (bdtResponse > m_BDTCutValue_R30X_CellBased) ? xAOD::TauJetParameters::Mode_3p0n : xAOD::TauJetParameters::Mode_3pXn;
175  }
176  }
177  }//end 3p0n
178 
179  //3pXn mode
180  else if (decayMode_SubAlg == xAOD::TauJetParameters::Mode_3pXn) {
181  //3prong, Xpi0. check 3p0n-vs-3pXn
182  bool isOK = false;
183  bdtResponse = m_Tool_ModeDiscriminator_3p0n_vs_3pXn->getResponse(inSeed, isOK);
184  bdtTest = t_3p0n_vs_3pXn;
185  decayMode_PanTauExtended = PanTau::PanTauSeed::t_ExtMode3XX;
186  if(!isOK) {
187  ATH_MSG_WARNING("WARNING problems getting bdt response for 3p0n + X-neutrals. use subAlg mode");
188  decayMode_PanTau = decayMode_SubAlg;
189  }
190  else {
191  decayMode_PanTau = (bdtResponse > m_BDTCutValue_R3XX_CellBased) ? xAOD::TauJetParameters::Mode_3p0n: xAOD::TauJetParameters::Mode_3pXn;
192  }
193  } //end 3pXn
194 
195  //it's none of 1p0n, 1p1n, 1pXn, 3p0n, 3pXn -> set other mode
196  else {
197  decayMode_PanTau = xAOD::TauJetParameters::Mode_Other;
198  decayMode_PanTauExtended = PanTau::PanTauSeed::t_ExtModeOther;
199  bdtResponse = -4;
200  bdtTest = t_UnknownTest;
201  }
202 
203  // this overrides Pantau BDT 1p1n decision in the following case:
204  // if cell based counted 1 charged, 1 pi0neut, and number of hits in EM1 for the pi0neut is 3 or larger, set 1pXn;
205  if(inSeed->getNumberOfConstituentsOfType(PanTau::TauConstituent::t_Charged) == 1 && nPi0Neut_SubAlg == 1) {
206  //check for shots in EM1
207  bool isOK = false;
209  if(isOK) {
210  double nPhotons = 0.;
211  std::vector<PanTau::TauConstituent*> shots = pi0Neut->getShots();
212 
213  for(unsigned int iShot=0; iShot<shots.size(); iShot++) {
214  nPhotons = nPhotons + static_cast<double>(shots.at(iShot)->getNPhotonsInShot());
215  }
216 
217  if(nPhotons > 2.) {
218  decayMode_SubAlg = xAOD::TauJetParameters::Mode_1pXn;
219  decayMode_PanTau = xAOD::TauJetParameters::Mode_1pXn;
220  decayMode_PanTauExtended = PanTau::PanTauSeed::t_ExtMode11shots;
221  inSeed->setModeHackedByCellBased(true);
222  bdtResponse = -2.;
223  }
224  //end check for pi0 neutrals were found
225  }
226  else {
227  ATH_MSG_WARNING("Could not find expected CellBased neutral -> don't check for photons in cluster");
228  }
229  } //end hack check for 1p1n
230 
231  //update mode of seed and store in features
232  inSeed->setDecayModeByPanTau(decayMode_PanTau);
233  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_RecoMode", static_cast<double>(decayMode_SubAlg));
234  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_RecoMode_PanTau", static_cast<double>(decayMode_PanTau));
235  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_RecoMode_PanTauExtended", static_cast<double>(decayMode_PanTauExtended));
236 
238 
239  if(bdtTest == t_1p0n_vs_1p1n) {
240  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p0n_vs_1p1n", bdtResponse);
241  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p1n_vs_1pXn", -5.);
242  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_BDTValue_3p0n_vs_3pXn", -5.);
243  }
244  if(bdtTest == t_1p1n_vs_1pXn) {
245  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p0n_vs_1p1n", -5.);
246  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p1n_vs_1pXn", bdtResponse);
247  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_BDTValue_3p0n_vs_3pXn", -5.);
248  }
249  if(bdtTest == t_3p0n_vs_3pXn) {
250  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p0n_vs_1p1n", -5.);
251  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p1n_vs_1pXn", -5.);
252  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_BDTValue_3p0n_vs_3pXn", bdtResponse);
253  }
254  if(bdtTest == t_UnknownTest) {
255  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p0n_vs_1p1n", -5.);
256  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_BDTValue_1p1n_vs_1pXn", -5.);
257  features->addFeature("CellBased_" + m_varTypeName_Prefix_Basic + "_BDTValue_3p0n_vs_3pXn", -5.);
258  }
259 
260  return StatusCode::SUCCESS;
261 }
xAOD::TauJetParameters::Mode_1p0n
@ Mode_1p0n
Definition: TauDefs.h:386
PanTauSeed.h
PanTau::PanTauSeed::setDecayModeByPanTau
void setDecayModeByPanTau(int decayModePanTau)
Definition: PanTauSeed.h:230
PanTau::TauConstituent::t_Neutral
@ t_Neutral
Definition: TauConstituent.h:45
xAOD::TauJetParameters::Mode_1p1n
@ Mode_1p1n
Definition: TauDefs.h:387
PanTau::PanTauSeed::getFeatures
const PanTau::TauFeature * getFeatures() const
Definition: PanTauSeed.h:217
PanTau::PanTauSeed::getTauJet
const xAOD::TauJet * getTauJet() const
Definition: PanTauSeed.h:215
PanTau::PanTauSeed::getDecayModeBySubAlg
int getDecayModeBySubAlg() const
Definition: PanTauSeed.h:224
PanTau::TauConstituent::t_Charged
@ t_Charged
Definition: TauConstituent.h:44
PanTau::PanTauSeed::getConstituentsOfType
std::vector< PanTau::TauConstituent * > getConstituentsOfType(int tauConstituent_Type, bool &foundit)
Definition: PanTauSeed.cxx:337
xAOD::TauJet_v3::setPanTauDetail
void setPanTauDetail(TauJetParameters::PanTauDetails panTauDetail, int value)
Definition: TauJet_v3.cxx:367
PanTau::PanTauSeed::t_ExtMode300
@ t_ExtMode300
Definition: PanTauSeed.h:49
PanTau::PanTauSeed::t_NoValidInputTau
@ t_NoValidInputTau
Definition: PanTauSeed.h:34
HelperFunctions.h
asg
Definition: DataHandleTestTool.h:28
PanTau::TauFeature::addFeature
bool addFeature(const std::string &name, const double value)
adds a new feature
Definition: TauFeature.cxx:44
PanTau::TauFeature
Definition: TauFeature.h:19
PanTau::PanTauSeed::t_ExtMode1XX
@ t_ExtMode1XX
Definition: PanTauSeed.h:48
xAOD::TauJetParameters::Mode_1pXn
@ Mode_1pXn
Definition: TauDefs.h:388
PanTau::Tool_DecayModeDeterminator::Tool_DecayModeDeterminator
Tool_DecayModeDeterminator(const std::string &name)
Definition: Tool_DecayModeDeterminator.cxx:10
PanTau::PanTauSeed::t_ExtMode11X
@ t_ExtMode11X
Definition: PanTauSeed.h:47
PanTau::Tool_DecayModeDeterminator::~Tool_DecayModeDeterminator
virtual ~Tool_DecayModeDeterminator()
PanTau::PanTauSeed::t_ExtMode110
@ t_ExtMode110
Definition: PanTauSeed.h:46
Tool_DecayModeDeterminator.h
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
PanTau::Tool_DecayModeDeterminator::initialize
virtual StatusCode initialize()
Dummy implementation of the initialisation function.
Definition: Tool_DecayModeDeterminator.cxx:18
xAOD::TauJet_v3
Class describing a tau jet.
Definition: TauJet_v3.h:41
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
PanTau::PanTauSeed::t_ExtMode30X
@ t_ExtMode30X
Definition: PanTauSeed.h:50
PanTau::Tool_DecayModeDeterminator::DecayModeTest
DecayModeTest
Definition: Tool_DecayModeDeterminator.h:35
xAOD::TauJetParameters::Mode_3p0n
@ Mode_3p0n
Definition: TauDefs.h:389
PanTau::PanTauSeed::t_ExtMode10X
@ t_ExtMode10X
Definition: PanTauSeed.h:45
xAOD::TauJetParameters::PanTau_DecayModeExtended
@ PanTau_DecayModeExtended
Definition: TauDefs.h:376
PanTau::PanTauSeed::t_ExtMode100
@ t_ExtMode100
Definition: PanTauSeed.h:44
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
PanTau::PanTauSeed::t_BadPtValue
@ t_BadPtValue
Definition: PanTauSeed.h:37
PanTau::HelperFunctions::bindToolHandle
static StatusCode bindToolHandle(ToolHandle< T > &, std::string)
Definition: Reconstruction/PanTau/PanTauAlgs/PanTauAlgs/HelperFunctions.h:56
PanTau::PanTauSeed::t_NoConstituentsAtAll
@ t_NoConstituentsAtAll
Definition: PanTauSeed.h:35
PanTau::PanTauSeed::setModeHackedByCellBased
void setModeHackedByCellBased(bool f)
Definition: PanTauSeed.h:153
PanTau::Tool_DecayModeDeterminator::execute
virtual StatusCode execute(PanTau::PanTauSeed *inSeed) const
Definition: Tool_DecayModeDeterminator.cxx:47
PanTau::PanTauSeed::t_ExtModeNotSet
@ t_ExtModeNotSet
Definition: PanTauSeed.h:53
PanTau::TauConstituent::t_Pi0Neut
@ t_Pi0Neut
Definition: TauConstituent.h:46
PanTau::PanTauSeed::t_ExtMode3XX
@ t_ExtMode3XX
Definition: PanTauSeed.h:51
PanTau::PanTauSeed::getNumberOfConstituentsOfType
int getNumberOfConstituentsOfType(int tauConstituent_Type)
Definition: PanTauSeed.cxx:348
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
PanTau::PanTauSeed::isOfTechnicalQuality
bool isOfTechnicalQuality(int pantauSeed_TechnicalQuality) const
Definition: PanTauSeed.cxx:328
PanTau::PanTauSeed::t_ExtMode11shots
@ t_ExtMode11shots
Definition: PanTauSeed.h:55
PanTau::PanTauSeed::t_NoSelectedConstituents
@ t_NoSelectedConstituents
Definition: PanTauSeed.h:36
xAOD::TauJetParameters::Mode_3pXn
@ Mode_3pXn
Definition: TauDefs.h:390
PanTau::TauConstituent
Definition: TauConstituent.h:25
xAOD::TauJetParameters::Mode_NotSet
@ Mode_NotSet
Definition: TauDefs.h:392
PanTau::TauConstituent::getShots
const std::vector< TauConstituent * > & getShots() const
Definition: TauConstituent.cxx:237
xAOD::TauJetParameters::Mode_Other
@ Mode_Other
Definition: TauDefs.h:391
PanTau::PanTauSeed
Definition: PanTauSeed.h:24
PanTau::PanTauSeed::t_ExtModeOther
@ t_ExtModeOther
Definition: PanTauSeed.h:52