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