ATLAS Offline Software
Tool_DetailsArranger.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "xAODTau/TauJet.h"
9 
11 #include "PanTauAlgs/PanTauSeed.h"
13 
14 
16 
17  return ( i.cachedElement()->bdtPi0Score() > j.cachedElement()->bdtPi0Score() );
18 }
19 
20 
22  asg::AsgTool(name)
23 {
24 }
25 
26 
28 
29 
31 
32  m_init=true;
33 
34  ATH_CHECK( HelperFunctions::bindToolHandle( m_Tool_InformationStore, m_Tool_InformationStoreName ) );
35 
36  ATH_CHECK( m_Tool_InformationStore->getInfo_Double("TauConstituents_Types_DeltaRCore", m_CoreCone) );
37  ATH_CHECK( m_Tool_InformationStore->getInfo_VecDouble("TauConstituents_BinEdges_Eta", m_EtaBinEdges) );
38  ATH_CHECK( m_Tool_InformationStore->getInfo_VecDouble("TauConstituents_Selection_Neutral_EtaBinned_EtCut", m_EtaBinnedEtCuts) );
39  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_Sum", m_varTypeName_Sum) );
40  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_Ratio", m_varTypeName_Ratio) );
41  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_Isolation", m_varTypeName_Isolation) );
42  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_Num", m_varTypeName_Num) );
43  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_Mean", m_varTypeName_Mean) );
44  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_StdDev", m_varTypeName_StdDev) );
45  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_HLV", m_varTypeName_HLV) );
46  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_Angle", m_varTypeName_Angle) );
47  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_DeltaR", m_varTypeName_DeltaR) );
48  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_JetMoment", m_varTypeName_JetMoment) );
49  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_Combined", m_varTypeName_Combined) );
50  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_Basic", m_varTypeName_Basic) );
51  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_PID", m_varTypeName_PID) );
52  ATH_CHECK( m_Tool_InformationStore->getInfo_String("FeatureExtractor_VarTypeName_varTypeName_Shots", m_varTypeName_Shots) );
53 
54  return StatusCode::SUCCESS;
55 }
56 
57 
59 
60  bool noAnyConstituents = inSeed->isOfTechnicalQuality(PanTau::PanTauSeed::t_NoConstituentsAtAll);
62  bool noValidInputTau = inSeed->isOfTechnicalQuality(PanTau::PanTauSeed::t_NoValidInputTau);
63  bool isBadSeed = (noAnyConstituents || noSelConstituents || noValidInputTau);
64 
65  //set the PFO link vector and pantau 4-vector to default values for every tau first (xAOD technicality)
66  //if the tau is valid, overwrite with non-default values
67  xAOD::TauJet* tauJet = inSeed->getTauJet();
68 
69  if (isBadSeed) {
70  ATH_MSG_DEBUG("This seed is not useable for detail arranging (other than validity flag)");
73  return StatusCode::SUCCESS;
74  }
75 
76  ATH_CHECK(arrangePFOLinks(inSeed, tauJet, pi0Container, neutralPFOContainer));
77 
78  //Basic variables
79  addPanTauDetailToTauJet(inSeed, m_varTypeName_Basic + "_isPanTauCandidate", xAOD::TauJetParameters::PanTau_isPanTauCandidate, PanTau::Tool_DetailsArranger::t_Int);
80  addPanTauDetailToTauJet(inSeed, m_varTypeName_Basic + "_RecoMode_PanTau", xAOD::TauJetParameters::PanTau_DecayMode, PanTau::Tool_DetailsArranger::t_Int);
81  addPanTauDetailToTauJet(inSeed, m_varTypeName_Basic + "_BDTValue_1p0n_vs_1p1n", xAOD::TauJetParameters::PanTau_BDTValue_1p0n_vs_1p1n, PanTau::Tool_DetailsArranger::t_Float);
82  addPanTauDetailToTauJet(inSeed, m_varTypeName_Basic + "_BDTValue_1p1n_vs_1pXn", xAOD::TauJetParameters::PanTau_BDTValue_1p1n_vs_1pXn, PanTau::Tool_DetailsArranger::t_Float);
83  addPanTauDetailToTauJet(inSeed, m_varTypeName_Basic + "_BDTValue_3p0n_vs_3pXn", xAOD::TauJetParameters::PanTau_BDTValue_3p0n_vs_3pXn, PanTau::Tool_DetailsArranger::t_Float);
84 
85  //Final 4-vector
86  tauJet->setP4(xAOD::TauJetParameters::PanTauCellBased, inSeed->getFinalMomentum().Pt(), inSeed->getFinalMomentum().Eta(), inSeed->getFinalMomentum().Phi(), inSeed->getFinalMomentum().M());
87 
88  //BDT variables
89  addPanTauDetailToTauJet(inSeed, "Basic_NNeutralConsts",
91  addPanTauDetailToTauJet(inSeed, "Charged_JetMoment_EtDRxTotalEt",
93  addPanTauDetailToTauJet(inSeed, "Charged_StdDev_Et_WrtEtAllConsts",
95  addPanTauDetailToTauJet(inSeed, "Neutral_HLV_SumM",
97  addPanTauDetailToTauJet(inSeed, "Neutral_PID_BDTValues_BDTSort_1",
99  addPanTauDetailToTauJet(inSeed, "Neutral_PID_BDTValues_BDTSort_2",
101  addPanTauDetailToTauJet(inSeed, "Neutral_Ratio_1stBDTEtOverEtAllConsts",
103  addPanTauDetailToTauJet(inSeed, "Neutral_Ratio_EtOverEtAllConsts",
105  addPanTauDetailToTauJet(inSeed, "Neutral_Shots_NPhotonsInSeed",
107  addPanTauDetailToTauJet(inSeed, "Combined_DeltaR1stNeutralTo1stCharged",
109  addPanTauDetailToTauJet(inSeed, "Charged_HLV_SumM",
111 
112  return StatusCode::SUCCESS;
113 }
114 
115 
117  const std::string& featName,
119  PanTauDetailsType detailType) const {
120 
121  bool isValid;
122  const PanTau::TauFeature* features = inSeed->getFeatures();
123  std::string fullFeatName = "CellBased_" + featName;
124 
125  double theValue = features->value(fullFeatName, isValid);
126  if (!isValid) {
127  bool noAnyConstituents = inSeed->isOfTechnicalQuality(PanTau::PanTauSeed::t_NoConstituentsAtAll);
128  bool noSelConstituents = inSeed->isOfTechnicalQuality(PanTau::PanTauSeed::t_NoSelectedConstituents);
129  bool noValidInputTau = inSeed->isOfTechnicalQuality(PanTau::PanTauSeed::t_NoValidInputTau);
130  bool isBadSeed = (noAnyConstituents || noSelConstituents || noValidInputTau);
131 
132  if (!isBadSeed) {
133  ATH_MSG_DEBUG("WARNING --- Problems getting value for feature " << fullFeatName << " from map! This should not happen for this seed!");
134  ATH_MSG_DEBUG("WARNING --- Did the ModeDiscriminator set features used in BDTs that were not found to their default values?");
135  ATH_MSG_DEBUG("NOTE --- This can also happen for seeds with (for example) 0 neutrals when trying to get Neutral_SumM - check seed");
136  }
137  theValue = -1111.;
138  }
139 
140  xAOD::TauJet* tauJet = inSeed->getTauJet();
141  int valueToAddInt = -1;
142  float valueToAddFloat = -1.1;
143 
144  switch(detailType) {
146  valueToAddInt = static_cast<int>(theValue);
147  tauJet->setPanTauDetail(detailEnum, valueToAddInt);
148  break;
150  valueToAddFloat = static_cast<float>(theValue);
151  tauJet->setPanTauDetail(detailEnum, valueToAddFloat);
152  break;
153  default:
154  ATH_MSG_WARNING("Unknown PanTauDetailType! Please use enum PanTauDetailsType from PanTauAlgs/Tool_DetailsArranger.h.");
155  ATH_MSG_WARNING("!NOT! adding detail named " << featName);
156  break;
157  }
158 
159  }
160 
161 
163 
164  //get the PFO links
165  std::vector< ElementLink< xAOD::PFOContainer > > chrgPFOLinks = tauJet->protoChargedPFOLinks();
166  std::vector< ElementLink< xAOD::PFOContainer > > neutralPFOLinks = tauJet->protoNeutralPFOLinks();
167  std::vector< ElementLink< xAOD::PFOContainer > > pi0PFOLinks = CollectConstituentsAsPFOLinks( inSeed, tauJet->protoNeutralPFOLinks(), PanTau::TauConstituent::t_Pi0Neut );
168  std::vector< ElementLink< xAOD::PFOContainer > > preSelected_neutralPFOLinks = CollectConstituentsAsPFOLinks( inSeed, tauJet->protoNeutralPFOLinks(), PanTau::TauConstituent::t_Neutral );
169 
170  //clear the default links, just to be safe
171  tauJet->clearChargedPFOLinks();
172  tauJet->clearNeutralPFOLinks();
173  tauJet->clearPi0PFOLinks();
174 
175  std::vector< ElementLink< xAOD::PFOContainer > > preLinkPi0PFOLinks = tauJet->pi0PFOLinks();
176 
177  // sort PFO links according to pi0 BDT score:
178  std::sort (pi0PFOLinks.begin(), pi0PFOLinks.end(), sortBDTscore);
179  std::sort (preSelected_neutralPFOLinks.begin(), preSelected_neutralPFOLinks.end(), sortBDTscore);
180  std::sort (neutralPFOLinks.begin(), neutralPFOLinks.end(), sortBDTscore);
181 
182  // set the masses of all neutrals *and pi0 neutrals* to 0:
183  SetNeutralConstituentVectorMasses(neutralPFOLinks, neutralPFOContainer, 0.);
184 
185  // arrange charged & neutral PFOs: they are not changed -> copy from cellbased
186  tauJet->setChargedPFOLinks(chrgPFOLinks);
187  tauJet->setNeutralPFOLinks(neutralPFOLinks);
188 
189  tauJet->setDetail(xAOD::TauJetParameters::nCharged, static_cast<int>(chrgPFOLinks.size()));
190 
191  //arrange pi0 pfos: depends on decay mode classification
192  int decayModeProto = inSeed->getDecayModeBySubAlg();
193  int decayModeFinal = inSeed->getDecayModeByPanTau();
194 
195  if(decayModeFinal == xAOD::TauJetParameters::Mode_Other) {
196  tauJet->setPi0PFOLinks(pi0PFOLinks);
197  SetHLVTau(inSeed, tauJet, m_varTypeName_Basic);
198 
199  return StatusCode::SUCCESS;
200  }
201 
202  //if pantau sets the same decay mode as the substructure algorithm, just copy the links
203  if(decayModeProto == decayModeFinal) {
204 
205  if( decayModeFinal == xAOD::TauJetParameters::Mode_3pXn && pi0PFOLinks.size() > 1 ){
206 
207  // assign all neutrals but only one pi0 neutral to Pantau:
208  preLinkPi0PFOLinks.push_back( pi0PFOLinks.at(0) );
209 
210  // set all masses correctly:
211  SetNeutralConstituentVectorMasses(preLinkPi0PFOLinks, neutralPFOContainer, MASS_PI0);
212 
213  } else {
214 
215  // assign the same constituents to Pantau:
216  preLinkPi0PFOLinks=pi0PFOLinks;
217 
218  // set all masses correctly:
219  SetNeutralConstituentVectorMasses(preLinkPi0PFOLinks, neutralPFOContainer, MASS_PI0);
220  }
221 
222  } else {
223 
224  if( decayModeFinal == xAOD::TauJetParameters::Mode_1p1n && decayModeProto == xAOD::TauJetParameters::Mode_1p0n ){
225 
226  // add the highest BDT-score neutral from the sub-alg:
227  if(!preSelected_neutralPFOLinks.empty()) preLinkPi0PFOLinks.push_back( preSelected_neutralPFOLinks.at(0) );
228  else ATH_MSG_WARNING("No neutral PFO Links although there should be!!");
229 
230  // set the mass:
231  SetNeutralConstituentVectorMasses(preLinkPi0PFOLinks, neutralPFOContainer, MASS_PI0);
232 
233  } else if( decayModeFinal == xAOD::TauJetParameters::Mode_1p0n && decayModeProto == xAOD::TauJetParameters::Mode_1p1n ){
234 
235  // do nothing (leave the pi0 neutrals list empty)
236 
237  } else if( decayModeFinal == xAOD::TauJetParameters::Mode_1pXn && decayModeProto == xAOD::TauJetParameters::Mode_1p1n ){
238 
239 
240  if( pi0PFOLinks.size() == 1 && HasMultPi0sInOneCluster(pi0PFOLinks.at(0).cachedElement(), decayModeProto) ){
241 
242  // assign twice the pi0 mass to the one pi0 PFO:
243  SetNeutralConstituentVectorMasses(pi0PFOLinks, neutralPFOContainer, 2*MASS_PI0);
244 
245  // assign the same constituents to Pantau:
246  preLinkPi0PFOLinks=pi0PFOLinks;
247 
248  } else {
249 
250  // copy all (really only one) pi0s from the sub-alg and add
251  // the highest BDT-score neutral:
252  preLinkPi0PFOLinks=pi0PFOLinks;
253  if(!preSelected_neutralPFOLinks.empty()) preLinkPi0PFOLinks.push_back( preSelected_neutralPFOLinks.at(0) );
254  else ATH_MSG_WARNING("No neutral PFO Links although there should be!!");
255 
256  // set the mass:
257  SetNeutralConstituentVectorMasses(preLinkPi0PFOLinks, neutralPFOContainer, MASS_PI0);
258  }
259 
260  } else if( decayModeFinal == xAOD::TauJetParameters::Mode_1p1n && decayModeProto == xAOD::TauJetParameters::Mode_1pXn ){
261 
262  // copy all (two) pi0s from the sub-alg:
263  preLinkPi0PFOLinks.push_back( pi0PFOLinks.at(0) );
264  preLinkPi0PFOLinks.push_back( pi0PFOLinks.at(1) );
265 
266  // set both pi0neutrals to mass 0 (photon mass):
267  SetNeutralConstituentVectorMasses(preLinkPi0PFOLinks, neutralPFOContainer, 0.);
268 
269  } else if( decayModeFinal == xAOD::TauJetParameters::Mode_3pXn && decayModeProto == xAOD::TauJetParameters::Mode_3p0n ){
270 
271  // add the highest BDT-score neutral from the sub-alg:
272  if(!preSelected_neutralPFOLinks.empty()) preLinkPi0PFOLinks.push_back( preSelected_neutralPFOLinks.at(0) );
273  else ATH_MSG_WARNING("No neutral PFO Links although there should be!!");
274 
275  // set the mass:
276  SetNeutralConstituentVectorMasses(preLinkPi0PFOLinks, neutralPFOContainer, MASS_PI0);
277 
278  } else if( decayModeFinal == xAOD::TauJetParameters::Mode_3p0n && decayModeProto == xAOD::TauJetParameters::Mode_3pXn ){
279 
280  // do nothing (leave the pi0 neutrals list empty)
281  }
282  }
283 
284  tauJet->setPi0PFOLinks(preLinkPi0PFOLinks);
285 
286  SetHLVTau(inSeed, tauJet, m_varTypeName_Basic);
287 
288  std::vector< ElementLink< xAOD::PFOContainer > > finalChrgPFOLinks = tauJet->chargedPFOLinks();
289  std::vector< ElementLink< xAOD::PFOContainer > > finalPi0PFOLinks = tauJet->pi0PFOLinks();
290  std::vector< ElementLink< xAOD::PFOContainer > > finalNeutralPFOLinks = tauJet->neutralPFOLinks();
291 
292  // vector of 4-vectors of actual pi0s and a vector with pointers to PFOs:
293  std::vector< TLorentzVector > vec_pi04vec;
294  std::vector< std::vector< ElementLink<xAOD::PFOContainer> > > vec_pi0pfos;
295  createPi0Vectors(tauJet, vec_pi04vec, vec_pi0pfos);
296 
297  for(unsigned int itlv=0; itlv!=vec_pi04vec.size(); ++itlv) {
299  pi0Container.push_back(p);
300  p->setPxPyPzE(vec_pi04vec.at(itlv).Px(), vec_pi04vec.at(itlv).Py(), vec_pi04vec.at(itlv).Pz(), vec_pi04vec.at(itlv).E());
301  std::vector< ElementLink< xAOD::PFOContainer > > pfo_link_vector;
302  for( uint ipfo = 0; ipfo != vec_pi0pfos.at(itlv).size(); ++ipfo) {
303  pfo_link_vector.push_back(vec_pi0pfos.at(itlv).at(ipfo));
304  }
305 
306  static const SG::Accessor<std::vector< ElementLink< xAOD::PFOContainer > > > accPi0PFOLinks("pi0PFOLinks");
307  accPi0PFOLinks(*p) = pfo_link_vector;
308 
310  linkToPi0.toContainedElement(pi0Container, dynamic_cast<xAOD::IParticle*> (p));
311 
312  tauJet->addPi0Link(linkToPi0);
313  }
314 
315  return StatusCode::SUCCESS;
316 }
317 
318 
319 // Calculate final 4-vector:
320 void PanTau::Tool_DetailsArranger::SetHLVTau( PanTau::PanTauSeed* inSeed, xAOD::TauJet* tauJet, const std::string& varTypeName_Basic) {
321 
322  std::vector< ElementLink< xAOD::PFOContainer > > finalChrgPFOLinks = tauJet->chargedPFOLinks();
323  std::vector< ElementLink< xAOD::PFOContainer > > finalPi0PFOLinks = tauJet->pi0PFOLinks();
324 
325  unsigned int NCharged = finalChrgPFOLinks.size();
326  unsigned int NPi0Neut = finalPi0PFOLinks.size();
327 
328  TLorentzVector tlv_PanTau_Final;
329  for(unsigned int iPFO=0; iPFO<NCharged; iPFO++) {
330  const xAOD::PFO* pfo = finalChrgPFOLinks.at(iPFO).cachedElement();
331  tlv_PanTau_Final += pfo->p4();
332  }
333  for(unsigned int iPFO=0; iPFO<NPi0Neut; iPFO++) {
334  const xAOD::PFO* pfo = finalPi0PFOLinks.at(iPFO).cachedElement();
335  tlv_PanTau_Final += pfo->p4();
336  }
337 
338  inSeed->setFinalMomentum(tlv_PanTau_Final);
339 
340  PanTau::TauFeature* featureMap = inSeed->getFeatures();
341  featureMap->addFeature("CellBased_" + varTypeName_Basic + "_FinalMomentumCore_pt", tlv_PanTau_Final.Pt() );
342  featureMap->addFeature("CellBased_" + varTypeName_Basic + "_FinalMomentumCore_eta", tlv_PanTau_Final.Eta() );
343  featureMap->addFeature("CellBased_" + varTypeName_Basic + "_FinalMomentumCore_phi", tlv_PanTau_Final.Phi() );
344  featureMap->addFeature("CellBased_" + varTypeName_Basic + "_FinalMomentumCore_m", tlv_PanTau_Final.M() );
345 }
346 
347 
348 bool PanTau::Tool_DetailsArranger::HasMultPi0sInOneCluster(const xAOD::PFO* pfo, int decayModeProto) const {
349 
350  // this is only relevant for reco 1p1n modes, hence restrict the output to these modes
351 
352  int nPi0sPerCluster = 1;
353 
354  // cell-based sets this to 1pXn however below this function is
355  // called with the decayModeProto as evaluated by Pantau!
356  if (decayModeProto != xAOD::TauJetParameters::Mode_1p1n ) return (nPi0sPerCluster > 1);
357 
358  if( !pfo->attribute(xAOD::PFODetails::nPi0Proto, nPi0sPerCluster) ) {
359  ATH_MSG_WARNING("Could not retrieve nPi0Proto. Will set it to 1.");
360  nPi0sPerCluster = 1;
361  }
362 
363  return (nPi0sPerCluster > 1);
364 }
365 
366 
368 
369  TLorentzVector momentum;
370  PanTau::SetP4EEtaPhiM( momentum, neutral_pfo->e(), neutral_pfo->eta(), neutral_pfo->phi(), mass);
371  neutral_pfo->setP4(momentum.Pt(), neutral_pfo->eta(), neutral_pfo->phi(), mass);
372 }
373 
374 
375 void PanTau::Tool_DetailsArranger::SetNeutralConstituentVectorMasses(const std::vector< ElementLink<xAOD::PFOContainer> >& neutralPFOLinks, xAOD::PFOContainer& neutralPFOContainer, double mass) {
376 
377  for (const auto& link : neutralPFOLinks) {
378  size_t index = link.index();
379  xAOD::PFO* curNeutralPFO = neutralPFOContainer.at(index);
380  SetNeutralConstituentMass(curNeutralPFO, mass);
381  }
382 
383  }
384 
385 
386 std::vector< ElementLink< xAOD::PFOContainer > > PanTau::Tool_DetailsArranger::CollectConstituentsAsPFOLinks( PanTau::PanTauSeed* inSeed,
387  const std::vector< ElementLink< xAOD::PFOContainer > >& cellbased_neutralPFOLinks,
389  // collect element links from tau constituents in the Pantau
390  // seed of type "type". cellbased_neutralPFOLinks is only used
391  // to obtain the ElementLinks.
392 
393  std::vector< ElementLink< xAOD::PFOContainer > > new_links;
394 
395  unsigned int nConstsOfType=0;
396  bool foundIt=false;
397  std::vector<PanTau::TauConstituent*> tauConstituents=inSeed->getConstituentsOfType(type,foundIt);
398 
400  ATH_MSG_WARNING("CollectConstituentsAsPFOLinks: Function was called with type = " << type << " , however it was only designed for types t_Pi0Neut and t_Neutral! Returning...");
401  return new_links;
402  }
403 
404  for(unsigned int iConst=0; iConst<tauConstituents.size(); iConst++) {
405  bool isOfType = tauConstituents[iConst]->isOfType(type);
406  if(!isOfType) continue;
407 
408  // if the requested type is t_Neutral then exclude any t_Pi0Neut
409  // from the list (note: tau constituents that are t_Pi0Neut are
410  // also t_Neutral at the same time):
411  if(type==PanTau::TauConstituent::t_Neutral && tauConstituents[iConst]->isOfType(PanTau::TauConstituent::t_Pi0Neut) ) continue;
412  ++nConstsOfType;
413 
414  for(unsigned int iPFO=0; iPFO<cellbased_neutralPFOLinks.size(); iPFO++) {
415  const xAOD::PFO* pfo = cellbased_neutralPFOLinks.at(iPFO).cachedElement();
416 
417  if( tauConstituents[iConst]->getPFO() != pfo ) continue;
418 
419  new_links.push_back( cellbased_neutralPFOLinks.at(iPFO) );
420  }
421  }
422 
423  if( nConstsOfType != new_links.size() ){
424  ATH_MSG_WARNING("CollectConstituentsAsPFOLinks: Couldn't find PFOLinks " << new_links.size() << " for all tau constituents (" << tauConstituents.size() << ")!");
425  }
426 
427  return new_links;
428 }
429 
430 
431 //______________________________________________________________________________
432 void PanTau::Tool_DetailsArranger::createPi0Vectors(xAOD::TauJet* tauJet, std::vector<TLorentzVector>& vPi0s, std::vector< std::vector< ElementLink< xAOD::PFOContainer > > > &vec_pi0pfos)
433 {
434  // reset the pi0s
435  vPi0s.clear();
436  vec_pi0pfos.clear();
437 
438  // Since the PFO links as they come out of reconstruction, only correspond to
439  // calorimeter clusters, whereas we want the consts_pi0 vectors to correspond
440  // to real pi0s, we need to be careful to collect the PFOs correctly to pi0s
441  // for the cases where number of pi0s does not match to the decay mode:
442  size_t iNumPi0PFO = tauJet->nPi0PFOs();
443 
444  int iDecayMode = -1;
446 
447  if (iDecayMode == xAOD::TauJetParameters::Mode_1p1n && iNumPi0PFO > 1) {
448 
449  // float fMassPi0 = ParticleConstants::piZeroMassInMeV;
450  float fMassPi0Squared = MASS_PI0*MASS_PI0;
451 
452  // combine both photons (with 0 mass that is already set) to one pi0 vector:
453  const xAOD::PFO* xPfo1 = tauJet->pi0PFO(0);
454  const xAOD::PFO* xPfo2 = tauJet->pi0PFO(1);
455  vPi0s.push_back(xPfo1->p4() + xPfo2->p4());
456 
457  // re-set the mass to one pi0:
458  double dNewMomentum = std::sqrt(vPi0s[0].E() * vPi0s[0].E() - fMassPi0Squared);
459  vPi0s[0].SetPxPyPzE(vPi0s[0].Vect().Unit().Px() * dNewMomentum,
460  vPi0s[0].Vect().Unit().Py() * dNewMomentum,
461  vPi0s[0].Vect().Unit().Pz() * dNewMomentum,
462  vPi0s[0].E());
463 
464  std::vector< ElementLink<xAOD::PFOContainer> > pfovec;
465  pfovec.push_back(tauJet->pi0PFOLinks()[0]);
466  pfovec.push_back(tauJet->pi0PFOLinks()[1]);
467  vec_pi0pfos.push_back( pfovec );
468 
469  } else if (iDecayMode == xAOD::TauJetParameters::DecayMode::Mode_1pXn && iNumPi0PFO == 1){
470 
471  // make a single pi0 from a PFO that contains two pi0s:
472  const xAOD::PFO* xPfo = tauJet->pi0PFO(0);
473  // add the 2-pi0 vector preliminarily to the pi0vector:
474  vPi0s.push_back(xPfo->p4());
475 
476  // re-set the mass back to one pi0:
477  double dNewMomentum = std::sqrt( (vPi0s[0].E()/2.)*(vPi0s[0].E()/2.) - MASS_PI0*MASS_PI0 );
478  vPi0s[0].SetVectM(vPi0s[0].Vect().Unit() * dNewMomentum, MASS_PI0 );
479 
480  // create another pi0 from the same vector:
481  vPi0s.push_back(vPi0s[0]);
482 
483  std::vector< ElementLink<xAOD::PFOContainer> > pfovec;
484  pfovec.push_back(tauJet->pi0PFOLinks()[0]);
485  vec_pi0pfos.push_back( pfovec );
486  vec_pi0pfos.push_back( pfovec );//fix rare crash?
487 
488  } else {
489  // if it's not any of the special cases above then just collect the PFOs:
490  for (size_t iPFO = 0; iPFO < iNumPi0PFO; iPFO++){
491  vPi0s.push_back(tauJet->pi0PFO(iPFO)->p4());
492  std::vector< ElementLink<xAOD::PFOContainer> > pfovec;
493  pfovec.push_back(tauJet->pi0PFOLinks()[iPFO]);
494  vec_pi0pfos.push_back( pfovec );
495  }
496  }
497 
498 }
PanTau::Tool_DetailsArranger::SetNeutralConstituentMass
static void SetNeutralConstituentMass(xAOD::PFO *neutral_pfo, double mass)
Definition: Tool_DetailsArranger.cxx:367
xAOD::TauJetParameters::Mode_1p0n
@ Mode_1p0n
Definition: TauDefs.h:386
PanTauSeed.h
xAOD::TauJetParameters::PanTau_DecayMode
@ PanTau_DecayMode
Definition: TauDefs.h:360
xAOD::TauJetParameters::PanTau_BDTVar_Neutral_Ratio_1stBDTEtOverEtAllConsts
@ PanTau_BDTVar_Neutral_Ratio_1stBDTEtOverEtAllConsts
Definition: TauDefs.h:372
PanTau::Tool_DetailsArranger::t_Int
@ t_Int
Definition: Tool_DetailsArranger.h:46
xAOD::TauJetParameters::PanTau_BDTVar_Combined_DeltaR1stNeutralTo1stCharged
@ PanTau_BDTVar_Combined_DeltaR1stNeutralTo1stCharged
Definition: TauDefs.h:375
PanTau::TauConstituent::t_Neutral
@ t_Neutral
Definition: TauConstituent.h:45
xAOD::TauJetParameters::Mode_1p1n
@ Mode_1p1n
Definition: TauDefs.h:387
PanTau::TauConstituent::Type
Type
Type enumeration to specify type of this tau constituent.
Definition: TauConstituent.h:42
PanTau::PanTauSeed::getFeatures
const PanTau::TauFeature * getFeatures() const
Definition: PanTauSeed.h:217
TauAnalysisTools::createPi0Vectors
void createPi0Vectors(const xAOD::TauJet *xTau, std::vector< TLorentzVector > &vPi0s)
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:317
PanTau::PanTauSeed::getTauJet
const xAOD::TauJet * getTauJet() const
Definition: PanTauSeed.h:215
PanTau::PanTauSeed::getDecayModeBySubAlg
int getDecayModeBySubAlg() const
Definition: PanTauSeed.h:224
Base_Fragment.mass
mass
Definition: Sherpa_i/share/common/Base_Fragment.py:59
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:68
xAOD::TauJetParameters::nCharged
@ nCharged
Definition: TauDefs.h:266
PanTau::PanTauSeed::getDecayModeByPanTau
int getDecayModeByPanTau() const
Definition: PanTauSeed.h:225
index
Definition: index.py:1
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
xAOD::TauJetParameters::PanTau_BDTValue_3p0n_vs_3pXn
@ PanTau_BDTValue_3p0n_vs_3pXn
Definition: TauDefs.h:364
xAOD::PFO_v1::attribute
bool attribute(PFODetails::PFOAttributes AttributeType, T &anAttribute) const
get a PFO Variable via enum
xAOD::PFO_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
Definition: PFO_v1.cxx:60
PanTau::PanTauSeed::t_NoValidInputTau
@ t_NoValidInputTau
Definition: PanTauSeed.h:34
HelperFunctions.h
xAOD::TauJet_v3::clearNeutralPFOLinks
void clearNeutralPFOLinks()
Remove all neutral PFOs from the tau.
Definition: TauJet_v3.cxx:819
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
xAOD::TauJet_v3::setNeutralPFOLinks
void setNeutralPFOLinks(const PFOLinks_t &neutralPFOs)
PanTau::PanTauSeed::getFinalMomentum
TLorentzVector getFinalMomentum() const
Definition: PanTauSeed.h:223
xAOD::TauJet_v3::clearPi0PFOLinks
void clearPi0PFOLinks()
Remove all pi0 PFOs from the tau.
Definition: TauJet_v3.cxx:850
PFOContainer.h
PanTau::Tool_DetailsArranger::addPanTauDetailToTauJet
void addPanTauDetailToTauJet(PanTauSeed *inSeed, const std::string &featName, xAOD::TauJetParameters::PanTauDetails detailEnum, PanTauDetailsType detailType) const
Definition: Tool_DetailsArranger.cxx:116
xAOD::TauJet_v3::panTauDetail
bool panTauDetail(TauJetParameters::PanTauDetails panTauDetail, int &value) const
Get and set values of pantau details variables via enum.
Definition: TauJet_v3.cxx:339
PanTau::Tool_DetailsArranger::PanTauDetailsType
PanTauDetailsType
Definition: Tool_DetailsArranger.h:45
PanTau::Tool_DetailsArranger::~Tool_DetailsArranger
virtual ~Tool_DetailsArranger()
PanTau::TauFeature
Definition: TauFeature.h:19
sortBDTscore
bool sortBDTscore(const ElementLink< xAOD::PFOContainer > &i, const ElementLink< xAOD::PFOContainer > &j)
Definition: Tool_DetailsArranger.cxx:15
isValid
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition: AtlasPID.h:867
xAOD::IParticle
Class providing the definition of the 4-vector interface.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:41
xAOD::TauJet_v3::nPi0PFOs
size_t nPi0PFOs() const
Get the number of pi0 PFO particles associated with this tau.
Definition: TauJet_v3.cxx:840
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
xAOD::TauJet_v3::setP4
void setP4(double pt, double eta, double phi, double m)
Set methods for IParticle values.
Definition: TauJet_v3.cxx:171
xAOD::Particle
Particle_v1 Particle
Define the latest version of the particle class.
Definition: Event/xAOD/xAODParticleEvent/xAODParticleEvent/Particle.h:17
xAOD::TauJetParameters::PanTau_BDTVar_Neutral_HLV_SumM
@ PanTau_BDTVar_Neutral_HLV_SumM
Definition: TauDefs.h:369
xAOD::TauJetParameters::Mode_1pXn
@ Mode_1pXn
Definition: TauDefs.h:388
xAOD::TauJet_v3::pi0PFO
const PFO * pi0PFO(size_t i) const
Get the pointer to a given pi0 PFO associated with this tau.
xAOD::PFO_v1::e
virtual double e() const
The total energy of the particle.
Definition: PFO_v1.cxx:81
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
uint
unsigned int uint
Definition: LArOFPhaseFill.cxx:20
PanTau::PanTauSeed::setFinalMomentum
void setFinalMomentum(TLorentzVector finalMom)
Definition: PanTauSeed.h:229
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:209
PanTau::Tool_DetailsArranger::CollectConstituentsAsPFOLinks
std::vector< ElementLink< xAOD::PFOContainer > > CollectConstituentsAsPFOLinks(PanTau::PanTauSeed *inSeed, const std::vector< ElementLink< xAOD::PFOContainer > > &cellbased_neutralPFOLinks, PanTau::TauConstituent::Type type) const
Definition: Tool_DetailsArranger.cxx:386
xAOD::TauJetParameters::PanTau_BDTValue_1p1n_vs_1pXn
@ PanTau_BDTValue_1p1n_vs_1pXn
Definition: TauDefs.h:363
ParticleGun_EoverP_Config.momentum
momentum
Definition: ParticleGun_EoverP_Config.py:63
xAOD::TauJet_v3::protoNeutralPFOLinks
const PFOLinks_t & protoNeutralPFOLinks() const
PanTau::Tool_DetailsArranger::arrangePFOLinks
StatusCode arrangePFOLinks(PanTau::PanTauSeed *inSeed, xAOD::TauJet *tauJet, xAOD::ParticleContainer &pi0Container, xAOD::PFOContainer &neutralPFOContainer) const
Definition: Tool_DetailsArranger.cxx:162
xAOD::TauJet_v3::neutralPFOLinks
const PFOLinks_t & neutralPFOLinks() const
PanTau::Tool_DetailsArranger::initialize
virtual StatusCode initialize()
Dummy implementation of the initialisation function.
Definition: Tool_DetailsArranger.cxx:30
lumiFormat.i
int i
Definition: lumiFormat.py:85
ParticleContainer.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::TauFeature::value
double value(const std::string &name, bool &isValid) const
returns the value of the feature given by its name
Definition: TauFeature.cxx:23
xAOD::TauJet_v3
Class describing a tau jet.
Definition: TauJet_v3.h:41
xAOD::PFO_v1::p4
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition: PFO_v1.cxx:95
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAOD::PFO_v1::phi
virtual double phi() const
The azimuthal angle ( ) of the particle.
Definition: PFO_v1.cxx:67
xAOD::TauJetParameters::PanTau_BDTValue_1p0n_vs_1p1n
@ PanTau_BDTValue_1p0n_vs_1p1n
Definition: TauDefs.h:362
xAOD::TauJetParameters::PanTauCellBased
@ PanTauCellBased
Definition: TauDefs.h:344
PanTau::Tool_DetailsArranger::execute
virtual StatusCode execute(PanTau::PanTauSeed *inSeed, xAOD::ParticleContainer &pi0Container, xAOD::PFOContainer &neutralPFOContainer) const
Definition: Tool_DetailsArranger.cxx:58
xAOD::TauJet_v3::addPi0Link
void addPi0Link(const ElementLink< IParticleContainer > &tr)
add a pi0 link to the tau
Definition: TauJet_v3.cxx:609
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
xAOD::Particle_v1
Description of a generic particle.
Definition: Particle_v1.h:31
PanTau::Tool_DetailsArranger::SetHLVTau
static void SetHLVTau(PanTau::PanTauSeed *inSeed, xAOD::TauJet *tauJet, const std::string &varTypeName_Basic)
Definition: Tool_DetailsArranger.cxx:320
xAOD::TauJetParameters::Mode_3p0n
@ Mode_3p0n
Definition: TauDefs.h:389
xAOD::PFO_v1
Class describing a particle flow object.
Definition: PFO_v1.h:35
Tool_DetailsArranger.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
VP1PartSpect::E
@ E
Definition: VP1PartSpectFlags.h:21
PanTau::HelperFunctions::bindToolHandle
static StatusCode bindToolHandle(ToolHandle< T > &, std::string)
Definition: Reconstruction/PanTau/PanTauAlgs/PanTauAlgs/HelperFunctions.h:56
Particle.h
PanTau::Tool_DetailsArranger::HasMultPi0sInOneCluster
bool HasMultPi0sInOneCluster(const xAOD::PFO *pfo, int decayModeProto) const
Definition: Tool_DetailsArranger.cxx:348
xAOD::TauJetParameters::PanTau_BDTVar_Neutral_PID_BDTValues_BDTSort_2
@ PanTau_BDTVar_Neutral_PID_BDTValues_BDTSort_2
Definition: TauDefs.h:371
PanTau::Tool_DetailsArranger::Tool_DetailsArranger
Tool_DetailsArranger(const std::string &name)
Definition: Tool_DetailsArranger.cxx:21
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
PanTau::PanTauSeed::t_NoConstituentsAtAll
@ t_NoConstituentsAtAll
Definition: PanTauSeed.h:35
xAOD::TauJet_v3::pi0PFOLinks
const PFOLinks_t & pi0PFOLinks() const
xAOD::PFODetails::nPi0Proto
@ nPi0Proto
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:31
xAOD::TauJet_v3::setChargedPFOLinks
void setChargedPFOLinks(const PFOLinks_t &chargedPFOs)
xAOD::TauJet_v3::clearChargedPFOLinks
void clearChargedPFOLinks()
Remove all charged PFOs from the tau.
Definition: TauJet_v3.cxx:788
PanTau::Tool_DetailsArranger::SetNeutralConstituentVectorMasses
static void SetNeutralConstituentVectorMasses(const std::vector< ElementLink< xAOD::PFOContainer > > &neutralPFOLinks, xAOD::PFOContainer &neutralPFOContainer, double mass)
Definition: Tool_DetailsArranger.cxx:375
PanTau::Tool_DetailsArranger::t_Float
@ t_Float
Definition: Tool_DetailsArranger.h:47
PanTau::TauConstituent::t_Pi0Neut
@ t_Pi0Neut
Definition: TauConstituent.h:46
xAOD::PFO_v1::setP4
void setP4(const FourMom_t &vec)
set the 4-vec
Definition: PFO_v1.cxx:107
xAOD::TauJet_v3::setPi0PFOLinks
void setPi0PFOLinks(const PFOLinks_t &pi0PFOs)
xAOD::TauJetParameters::PanTauDetails
PanTauDetails
Enum for tau details (scalar) calculated by pantau.
Definition: TauDefs.h:355
xAOD::TauJetParameters::PanTau_BDTVar_Charged_StdDev_Et_WrtEtAllConsts
@ PanTau_BDTVar_Charged_StdDev_Et_WrtEtAllConsts
Definition: TauDefs.h:368
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
TauJet.h
PanTau::Tool_DetailsArranger::createPi0Vectors
static void createPi0Vectors(xAOD::TauJet *tauJet, std::vector< TLorentzVector > &vPi0s, std::vector< std::vector< ElementLink< xAOD::PFOContainer > > > &vec_pi0pfos)
Definition: Tool_DetailsArranger.cxx:432
PanTau::PanTauSeed::t_NoSelectedConstituents
@ t_NoSelectedConstituents
Definition: PanTauSeed.h:36
xAOD::TauJet_v3::protoChargedPFOLinks
const PFOLinks_t & protoChargedPFOLinks() const
cellbased pfos
xAOD::TauJet_v3::setDetail
void setDetail(TauJetParameters::Detail detail, int value)
Definition: TauJet_v3.cxx:309
xAOD::TauJetParameters::Mode_3pXn
@ Mode_3pXn
Definition: TauDefs.h:390
xAOD::TauJetParameters::PanTau_isPanTauCandidate
@ PanTau_isPanTauCandidate
Definition: TauDefs.h:357
xAOD::TauJetParameters::PanTau_BDTVar_Basic_NNeutralConsts
@ PanTau_BDTVar_Basic_NNeutralConsts
Definition: TauDefs.h:366
xAOD::TauJet_v3::chargedPFOLinks
const PFOLinks_t & chargedPFOLinks() const
default pfos
DataVector::at
const T * at(size_type n) const
Access an element, as an rvalue.
xAOD::TauJetParameters::PanTau_BDTVar_Neutral_Shots_NPhotonsInSeed
@ PanTau_BDTVar_Neutral_Shots_NPhotonsInSeed
Definition: TauDefs.h:374
xAOD::TauJetParameters::PanTau_BDTVar_Charged_HLV_SumM
@ PanTau_BDTVar_Charged_HLV_SumM
Definition: TauDefs.h:379
xAOD::TauJetParameters::Mode_NotSet
@ Mode_NotSet
Definition: TauDefs.h:392
xAOD::TauJetParameters::PanTau_BDTVar_Charged_JetMoment_EtDRxTotalEt
@ PanTau_BDTVar_Charged_JetMoment_EtDRxTotalEt
Definition: TauDefs.h:367
xAOD::TauJetParameters::PanTau_BDTVar_Neutral_Ratio_EtOverEtAllConsts
@ PanTau_BDTVar_Neutral_Ratio_EtOverEtAllConsts
Definition: TauDefs.h:373
xAOD::TauJetParameters::Mode_Other
@ Mode_Other
Definition: TauDefs.h:391
PanTau::PanTauSeed
Definition: PanTauSeed.h:24
xAOD::TauJetParameters::PanTau_BDTVar_Neutral_PID_BDTValues_BDTSort_1
@ PanTau_BDTVar_Neutral_PID_BDTValues_BDTSort_1
Definition: TauDefs.h:370