ATLAS Offline Software
DiTauMassCalculatorAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
9 
10 namespace CP {
11 
13  {
14 
15  // the Missing Mass Calculator tool
16  ANA_CHECK(m_mmc.retrieve());
17 
18  // input handles
21 
24 
27 
30 
34 
35  // output handles
50 
52 
53  return StatusCode::SUCCESS;
54  }
55 
57  {
58  for (const auto &sys : m_systematicsList.systematicsVector())
59  {
60  // retrieve the EventInfo
61  const xAOD::EventInfo *evtInfo = nullptr;
62  ANA_CHECK(m_eventInfoHandle.retrieve(evtInfo, sys));
63 
64  // check the preselection
65  if (m_preselection && !m_preselection.getBool(*evtInfo, sys))
66  continue;
67 
68  // retrieve objects
69  const xAOD::ElectronContainer *electrons = nullptr;
71  const xAOD::MuonContainer *muons = nullptr;
73  const xAOD::TauJetContainer *taus = nullptr;
75  const xAOD::JetContainer *jets = nullptr;
77  const xAOD::MissingETContainer *met = nullptr;
78  ANA_CHECK(m_metHandle.retrieve(met, sys));
79 
80  // apply object-wise selection
85 
86  for (const xAOD::Electron *el : *electrons)
87  {
89  selected_electrons.push_back(el);
90  }
91 
92  for (const xAOD::Muon *mu : *muons)
93  {
95  selected_muons.push_back(mu);
96  }
97 
98  for (const xAOD::TauJet *tau : *taus)
99  {
100  if (m_tauSelection.getBool(*tau, sys))
101  selected_taus.push_back(tau);
102  }
103 
104  for (const xAOD::Jet *jet : *jets)
105  {
106  if (m_jetSelection.getBool(*jet, sys))
107  selected_jets.push_back(jet);
108  }
109 
110  int nJets = selected_jets.size();
111 
112  const xAOD::IParticle *vis1 = 0, *vis2 = 0;
113  // to assign the visible particles on which to run the MMC, we assume that the user would prefer
114  // 1) tau_had + tau_had
115  // 2) tau_had + e
116  // 3) tau_had + mu
117  // 4) e + mu
118  // 5) mu + mu
119  // 6) e + e
120  // To force a custom ordering, simply decorate your desired selection onto the particles before running this algorithm.
121  // e.g. you could "book" an OSSF pair of light leptons as originating from a Z boson, and remove them from consideration here.
122 
123  if (selected_taus.size() >= 2)
124  {
125  vis1 = selected_taus.at(0);
126  vis2 = selected_taus.at(1);
127  }
128  else if (selected_taus.size() == 1 && selected_electrons.size() >= 1)
129  {
130  vis1 = selected_taus.at(0);
131  vis2 = selected_electrons.at(0);
132  }
133  else if (selected_taus.size() == 1 && selected_muons.size() >= 1)
134  {
135  vis1 = selected_taus.at(0);
136  vis2 = selected_muons.at(0);
137  }
138  else if (selected_electrons.size() >= 1 && selected_muons.size() >= 1)
139  {
140  vis1 = selected_electrons.at(0);
141  vis2 = selected_muons.at(0);
142  }
143  else if (selected_muons.size() >= 2)
144  {
145  vis1 = selected_muons.at(0);
146  vis2 = selected_muons.at(1);
147  }
148  else if (selected_electrons.size() >= 2)
149  {
150  vis1 = selected_electrons.at(0);
151  vis2 = selected_electrons.at(1);
152  }
153  else
154  {
155  ANA_MSG_WARNING("Not enough charged leptons in the event to run the MMC!");
156  }
157 
158  ANA_CHECK(m_mmc->apply(*evtInfo, vis1, vis2, (*met)["Final"], nJets));
159 
160  // retrieve the output variables and decorate them
161  TLorentzVector null4V(-1, -1, -1, -1);
162  int fitStatus = m_mmc->GetFitStatus(0);
163  double mlm_mass = fitStatus == 1 ? m_mmc->GetFittedMass(DiTauMassTools::MMCFitMethodV2::MLM) : -1;
164  if (m_doMAXW) {
165  double maxw_mass = fitStatus == 1 ? m_mmc->GetFittedMass(DiTauMassTools::MMCFitMethodV2::MAXW) : -1;
166  TLorentzVector maxw_res_4vect = fitStatus == 1 ? m_mmc->GetResonanceVec(DiTauMassTools::MMCFitMethodV2::MAXW) : null4V;
167  TLorentzVector maxw_nu1_4vect = fitStatus == 1 ? m_mmc->GetNeutrino4vec(DiTauMassTools::MMCFitMethodV2::MAXW, 0) : null4V;
168  TLorentzVector maxw_nu2_4vect = fitStatus == 1 ? m_mmc->GetNeutrino4vec(DiTauMassTools::MMCFitMethodV2::MAXW, 1) : null4V;
169  TLorentzVector maxw_tau1_4vect = fitStatus == 1 ? m_mmc->GetTau4vec(DiTauMassTools::MMCFitMethodV2::MAXW, 0) : null4V;
170  TLorentzVector maxw_tau2_4vect = fitStatus == 1 ? m_mmc->GetTau4vec(DiTauMassTools::MMCFitMethodV2::MAXW, 1) : null4V;
171  m_maxw_mass_decor.set(*evtInfo, maxw_mass, sys);
172  m_maxw_res_4vect_decor.set(*evtInfo, maxw_res_4vect, sys);
173  m_maxw_nu1_4vect_decor.set(*evtInfo, maxw_nu1_4vect, sys);
174  m_maxw_nu2_4vect_decor.set(*evtInfo, maxw_nu2_4vect, sys);
175  m_maxw_tau1_4vect_decor.set(*evtInfo, maxw_tau1_4vect, sys);
176  m_maxw_tau2_4vect_decor.set(*evtInfo, maxw_tau2_4vect, sys);
177  }
178  if (m_doMLNU3P) {
179  double mlnu3p_mass = fitStatus == 1 ? m_mmc->GetFittedMass(DiTauMassTools::MMCFitMethodV2::MLNU3P) : -1;
180  TLorentzVector mlnu3p_res_4vect = fitStatus == 1 ? m_mmc->GetResonanceVec(DiTauMassTools::MMCFitMethodV2::MLNU3P) : null4V;
181  TLorentzVector mlnu3p_nu1_4vect = fitStatus == 1 ? m_mmc->GetNeutrino4vec(DiTauMassTools::MMCFitMethodV2::MLNU3P, 0) : null4V;
182  TLorentzVector mlnu3p_nu2_4vect = fitStatus == 1 ? m_mmc->GetNeutrino4vec(DiTauMassTools::MMCFitMethodV2::MLNU3P, 1) : null4V;
183  TLorentzVector mlnu3p_tau1_4vect = fitStatus == 1 ? m_mmc->GetTau4vec(DiTauMassTools::MMCFitMethodV2::MLNU3P, 0) : null4V;
184  TLorentzVector mlnu3p_tau2_4vect = fitStatus == 1 ? m_mmc->GetTau4vec(DiTauMassTools::MMCFitMethodV2::MLNU3P, 1) : null4V;
185  m_mlnu3p_mass_decor.set(*evtInfo, mlnu3p_mass, sys);
186  m_mlnu3p_res_4vect_decor.set(*evtInfo, mlnu3p_res_4vect, sys);
187  m_mlnu3p_nu1_4vect_decor.set(*evtInfo, mlnu3p_nu1_4vect, sys);
188  m_mlnu3p_nu2_4vect_decor.set(*evtInfo, mlnu3p_nu2_4vect, sys);
189  m_mlnu3p_tau1_4vect_decor.set(*evtInfo, mlnu3p_tau1_4vect, sys);
190  m_mlnu3p_tau2_4vect_decor.set(*evtInfo, mlnu3p_tau2_4vect, sys);
191  }
192  m_fitStatus_decor.set(*evtInfo, fitStatus, sys);
193  m_mlm_mass_decor.set(*evtInfo, mlm_mass, sys);
194  }
195 
196  return StatusCode::SUCCESS;
197  }
198 
200  {
201  ANA_CHECK(m_mmc->finalize());
202 
203  return StatusCode::SUCCESS;
204  }
205 
206 } // namespace
CP::DiTauMassCalculatorAlg::m_jetsHandle
SysReadHandle< xAOD::JetContainer > m_jetsHandle
Definition: DiTauMassCalculatorAlg.h:57
CP::SysWriteDecorHandle::set
void set(const SG::AuxElement &object, const T &value, const CP::SystematicSet &sys) const
set the object decoration for the given systematic
CP::DiTauMassCalculatorAlg::m_doMAXW
Gaudi::Property< bool > m_doMAXW
Definition: DiTauMassCalculatorAlg.h:41
CP::DiTauMassCalculatorAlg::m_maxw_tau1_4vect_decor
SysWriteDecorHandle< TLorentzVector > m_maxw_tau1_4vect_decor
Definition: DiTauMassCalculatorAlg.h:82
ConstDataVector::at
ElementProxy at(size_type n)
Access an element, as an lvalue.
CP::DiTauMassCalculatorAlg::m_maxw_nu1_4vect_decor
SysWriteDecorHandle< TLorentzVector > m_maxw_nu1_4vect_decor
Definition: DiTauMassCalculatorAlg.h:80
CP::DiTauMassCalculatorAlg::m_mlnu3p_tau2_4vect_decor
SysWriteDecorHandle< TLorentzVector > m_mlnu3p_tau2_4vect_decor
Definition: DiTauMassCalculatorAlg.h:78
SG::VIEW_ELEMENTS
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
Definition: OwnershipPolicy.h:18
ConstDataVector.h
DataVector adapter that acts like it holds const pointers.
CP::DiTauMassCalculatorAlg::m_mlnu3p_res_4vect_decor
SysWriteDecorHandle< TLorentzVector > m_mlnu3p_res_4vect_decor
Definition: DiTauMassCalculatorAlg.h:74
CP::DiTauMassCalculatorAlg::initialize
virtual StatusCode initialize() override
Definition: DiTauMassCalculatorAlg.cxx:12
CP::DiTauMassCalculatorAlg::m_muonsHandle
SysReadHandle< xAOD::MuonContainer > m_muonsHandle
Definition: DiTauMassCalculatorAlg.h:54
CP::DiTauMassCalculatorAlg::m_metHandle
SysReadHandle< xAOD::MissingETContainer > m_metHandle
Definition: DiTauMassCalculatorAlg.h:63
CP::DiTauMassCalculatorAlg::m_maxw_res_4vect_decor
SysWriteDecorHandle< TLorentzVector > m_maxw_res_4vect_decor
Definition: DiTauMassCalculatorAlg.h:79
CP::DiTauMassCalculatorAlg::m_fitStatus_decor
SysWriteDecorHandle< int > m_fitStatus_decor
Definition: DiTauMassCalculatorAlg.h:70
CP::DiTauMassCalculatorAlg::m_eventInfoHandle
SysReadHandle< xAOD::EventInfo > m_eventInfoHandle
Definition: DiTauMassCalculatorAlg.h:65
ANA_CHECK
#define ANA_CHECK(EXP)
check whether the given expression was successful
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:324
CP::DiTauMassCalculatorAlg::m_mmc
ToolHandle< DiTauMassTools::MissingMassToolV2 > m_mmc
Definition: DiTauMassCalculatorAlg.h:45
CP::SysReadHandle::retrieve
::StatusCode retrieve(const T *&object, const CP::SystematicSet &sys) const
retrieve the object for the given name
CP::SysListHandle::systematicsVector
const std::vector< CP::SystematicSet > & systematicsVector() const
the list of systematics to loop over
Definition: SysListHandle.cxx:96
xAOD::IParticle
Class providing the definition of the 4-vector interface.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:40
DiTauMassCalculatorAlg.h
CP::DiTauMassCalculatorAlg::m_tausHandle
SysReadHandle< xAOD::TauJetContainer > m_tausHandle
Definition: DiTauMassCalculatorAlg.h:60
CP
Select isolated Photons, Electrons and Muons.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:48
mapkey::sys
@ sys
Definition: TElectronEfficiencyCorrectionTool.cxx:42
xAOD::Muon_v1
Class describing a Muon.
Definition: Muon_v1.h:38
CP::DiTauMassCalculatorAlg::m_muonSelection
SysReadSelectionHandle m_muonSelection
Definition: DiTauMassCalculatorAlg.h:55
DiTauMassTools::MMCFitMethodV2::MAXW
@ MAXW
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:42
CP::DiTauMassCalculatorAlg::m_electronsHandle
SysReadHandle< xAOD::ElectronContainer > m_electronsHandle
Definition: DiTauMassCalculatorAlg.h:51
CP::SysReadHandle::initialize
StatusCode initialize(SysListHandle &sysListHandle)
initialize this handle
met
Definition: IMETSignificance.h:24
CP::DiTauMassCalculatorAlg::m_tauSelection
SysReadSelectionHandle m_tauSelection
Definition: DiTauMassCalculatorAlg.h:61
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
CP::SysListHandle::initialize
::StatusCode initialize()
intialize this property
Definition: SysListHandle.cxx:69
CP::SysReadSelectionHandle::getBool
bool getBool(const SG::AuxElement &element, const CP::SystematicSet &sys) const
get the selection as a bool
CP::DiTauMassCalculatorAlg::m_electronSelection
SysReadSelectionHandle m_electronSelection
Definition: DiTauMassCalculatorAlg.h:52
CP::DiTauMassCalculatorAlg::m_mlnu3p_mass_decor
SysWriteDecorHandle< double > m_mlnu3p_mass_decor
Definition: DiTauMassCalculatorAlg.h:73
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
CP::SysWriteDecorHandle::initialize
StatusCode initialize(SysListHandle &sysListHandle, const ISysHandleBase &objectHandle)
initialize this handle
CP::DiTauMassCalculatorAlg::m_mlnu3p_nu1_4vect_decor
SysWriteDecorHandle< TLorentzVector > m_mlnu3p_nu1_4vect_decor
Definition: DiTauMassCalculatorAlg.h:75
xAOD::TauJet_v3
Class describing a tau jet.
Definition: TauJet_v3.h:41
CP::DiTauMassCalculatorAlg::m_mlnu3p_nu2_4vect_decor
SysWriteDecorHandle< TLorentzVector > m_mlnu3p_nu2_4vect_decor
Definition: DiTauMassCalculatorAlg.h:76
ANA_MSG_WARNING
#define ANA_MSG_WARNING(xmsg)
Macro printing warning messages.
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:292
plotIsoValidation.el
el
Definition: plotIsoValidation.py:197
CP::DiTauMassCalculatorAlg::m_maxw_tau2_4vect_decor
SysWriteDecorHandle< TLorentzVector > m_maxw_tau2_4vect_decor
Definition: DiTauMassCalculatorAlg.h:83
CP::DiTauMassCalculatorAlg::m_mlnu3p_tau1_4vect_decor
SysWriteDecorHandle< TLorentzVector > m_mlnu3p_tau1_4vect_decor
Definition: DiTauMassCalculatorAlg.h:77
DiTauMassTools::MMCFitMethodV2::MLNU3P
@ MLNU3P
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:42
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
CP::DiTauMassCalculatorAlg::finalize
virtual StatusCode finalize() override
Definition: DiTauMassCalculatorAlg.cxx:199
CP::DiTauMassCalculatorAlg::m_doMLNU3P
Gaudi::Property< bool > m_doMLNU3P
Definition: DiTauMassCalculatorAlg.h:42
xAOD::MissingETContainer_v1
Container for xAOD::MissingET_v1 objects.
Definition: MissingETContainer_v1.h:21
CP::DiTauMassCalculatorAlg::m_jetSelection
SysReadSelectionHandle m_jetSelection
Definition: DiTauMassCalculatorAlg.h:58
CP::DiTauMassCalculatorAlg::m_preselection
SysReadSelectionHandle m_preselection
Definition: DiTauMassCalculatorAlg.h:67
ConstDataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
DiTauMassTools::MMCFitMethodV2::MLM
@ MLM
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:42
xAOD::Electron_v1
Definition: Electron_v1.h:34
CP::DiTauMassCalculatorAlg::execute
virtual StatusCode execute() override
Definition: DiTauMassCalculatorAlg.cxx:56
xAOD::EventInfo_v1
Class describing the basic event information.
Definition: EventInfo_v1.h:43
CP::DiTauMassCalculatorAlg::m_maxw_mass_decor
SysWriteDecorHandle< double > m_maxw_mass_decor
Definition: DiTauMassCalculatorAlg.h:71
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
ConstDataVector
DataVector adapter that acts like it holds const pointers.
Definition: ConstDataVector.h:76
CP::SysReadSelectionHandle::initialize
StatusCode initialize(SysListHandle &sysListHandle, const ISysHandleBase &objectHandle)
initialize the accessor
Definition: SysReadSelectionHandle.cxx:34
CP::DiTauMassCalculatorAlg::m_maxw_nu2_4vect_decor
SysWriteDecorHandle< TLorentzVector > m_maxw_nu2_4vect_decor
Definition: DiTauMassCalculatorAlg.h:81
defineDB.jets
list jets
Definition: JetTagCalibration/share/defineDB.py:24
CP::DiTauMassCalculatorAlg::m_systematicsList
SysListHandle m_systematicsList
Definition: DiTauMassCalculatorAlg.h:48
CP::DiTauMassCalculatorAlg::m_mlm_mass_decor
SysWriteDecorHandle< double > m_mlm_mass_decor
Definition: DiTauMassCalculatorAlg.h:72
CaloNoise_fillDB.mu
mu
Definition: CaloNoise_fillDB.py:53
SG::AllowEmpty
@ AllowEmpty
Definition: StoreGate/StoreGate/VarHandleKey.h:30
InDetDD::electrons
@ electrons
Definition: InDetDD_Defs.h:17