ATLAS Offline Software
Loading...
Searching...
No Matches
DiTauMassCalculatorAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6
9
10namespace CP {
11 using ROOT::Math::PtEtaPhiMVector;
12
14 {
15
16 // the Missing Mass Calculator tool
17 ANA_CHECK(m_mmc.retrieve());
18
19 // input handles
22
25
28
31
35
36 // output handles
51
55
56 ANA_CHECK(m_systematicsList.initialize());
57
58 return StatusCode::SUCCESS;
59 }
60
61 StatusCode DiTauMassCalculatorAlg::execute(const EventContext& ctx)
62 {
63 const std::string finalStr{"Final"};
64 for (const auto &sys : m_systematicsList.systematicsVector())
65 {
66 // retrieve the EventInfo
67 const xAOD::EventInfo *evtInfo = nullptr;
68 ANA_CHECK(m_eventInfoHandle.retrieve(evtInfo, sys, ctx));
69
70 // check the preselection
71 if (m_preselection && !m_preselection.getBool(*evtInfo, sys))
72 continue;
73
74 // retrieve objects
75 const xAOD::ElectronContainer *electrons = nullptr;
76 ANA_CHECK(m_electronsHandle.retrieve(electrons, sys, ctx));
77 const xAOD::MuonContainer *muons = nullptr;
78 ANA_CHECK(m_muonsHandle.retrieve(muons, sys, ctx));
79 const xAOD::TauJetContainer *taus = nullptr;
80 ANA_CHECK(m_tausHandle.retrieve(taus, sys, ctx));
81 const xAOD::JetContainer *jets = nullptr;
82 ANA_CHECK(m_jetsHandle.retrieve(jets, sys, ctx));
83 const xAOD::MissingETContainer *met = nullptr;
84 ANA_CHECK(m_metHandle.retrieve(met, sys, ctx));
85
86 // apply object-wise selection
91
92 for (const xAOD::Electron *el : *electrons)
93 {
94 if (m_electronSelection.getBool(*el, sys))
95 selected_electrons.push_back(el);
96 }
97
98 for (const xAOD::Muon *mu : *muons)
99 {
100 if (m_muonSelection.getBool(*mu, sys))
101 selected_muons.push_back(mu);
102 }
103
104 for (const xAOD::TauJet *tau : *taus)
105 {
106 if (m_tauSelection.getBool(*tau, sys))
107 selected_taus.push_back(tau);
108 }
109
110 for (const xAOD::Jet *jet : *jets)
111 {
112 if (m_jetSelection.getBool(*jet, sys))
113 selected_jets.push_back(jet);
114 }
115
116 int nJets = selected_jets.size();
117
118 const xAOD::IParticle *vis1 = 0, *vis2 = 0;
119 // to assign the visible particles on which to run the MMC, we assume that the user would prefer
120 // 1) tau_had + tau_had
121 // 2) tau_had + e
122 // 3) tau_had + mu
123 // 4) e + mu
124 // 5) mu + mu
125 // 6) e + e
126 // To force a custom ordering, simply decorate your desired selection onto the particles before running this algorithm.
127 // e.g. you could "book" an OSSF pair of light leptons as originating from a Z boson, and remove them from consideration here.
128
129 if (selected_taus.size() >= 2)
130 {
131 vis1 = selected_taus.at(0);
132 vis2 = selected_taus.at(1);
133 }
134 else if (selected_taus.size() == 1 && selected_electrons.size() >= 1)
135 {
136 vis1 = selected_taus.at(0);
137 vis2 = selected_electrons.at(0);
138 }
139 else if (selected_taus.size() == 1 && selected_muons.size() >= 1)
140 {
141 vis1 = selected_taus.at(0);
142 vis2 = selected_muons.at(0);
143 }
144 else if (selected_electrons.size() >= 1 && selected_muons.size() >= 1)
145 {
146 vis1 = selected_electrons.at(0);
147 vis2 = selected_muons.at(0);
148 }
149 else if (selected_muons.size() >= 2)
150 {
151 vis1 = selected_muons.at(0);
152 vis2 = selected_muons.at(1);
153 }
154 else if (selected_electrons.size() >= 2)
155 {
156 vis1 = selected_electrons.at(0);
157 vis2 = selected_electrons.at(1);
158 }
159 else
160 {
161 ANA_MSG_WARNING("Not enough charged leptons in the event to run the MMC!");
162 }
163
164 if ((*met)[finalStr] == nullptr) {
165 ANA_MSG_ERROR("The MET term " << finalStr << " doesn't exist! Aborting.");
166 return StatusCode::FAILURE;
167 }
168
169 ANA_CHECK(m_mmc->apply(*evtInfo, vis1, vis2, (*met)[finalStr], nJets));
170
171 // retrieve the output variables and decorate them
172 PtEtaPhiMVector null4V(0.0, 0.0, 0.0, 0.0);
173 int fitStatus = m_mmc->GetFitStatus(0);
174 double mlm_mass = fitStatus == 1 ? m_mmc->GetFittedMass(DiTauMassTools::MMCFitMethod::MLM) : -1;
175 if (m_doMAXW) {
176 double maxw_mass = fitStatus == 1 ? m_mmc->GetFittedMass(DiTauMassTools::MMCFitMethod::MAXW) : -1;
177 PtEtaPhiMVector maxw_res_4vect = fitStatus == 1 ? m_mmc->GetResonanceVec(DiTauMassTools::MMCFitMethod::MAXW) : null4V;
178 PtEtaPhiMVector maxw_nu1_4vect = fitStatus == 1 ? m_mmc->GetNeutrino4vec(DiTauMassTools::MMCFitMethod::MAXW, 0) : null4V;
179 PtEtaPhiMVector maxw_nu2_4vect = fitStatus == 1 ? m_mmc->GetNeutrino4vec(DiTauMassTools::MMCFitMethod::MAXW, 1) : null4V;
180 PtEtaPhiMVector maxw_tau1_4vect = fitStatus == 1 ? m_mmc->GetTau4vec(DiTauMassTools::MMCFitMethod::MAXW, 0) : null4V;
181 PtEtaPhiMVector maxw_tau2_4vect = fitStatus == 1 ? m_mmc->GetTau4vec(DiTauMassTools::MMCFitMethod::MAXW, 1) : null4V;
182 m_maxw_mass_decor.set(*evtInfo, maxw_mass, sys);
183 m_maxw_res_4vect_decor.set(*evtInfo, maxw_res_4vect, sys);
184 m_maxw_nu1_4vect_decor.set(*evtInfo, maxw_nu1_4vect, sys);
185 m_maxw_nu2_4vect_decor.set(*evtInfo, maxw_nu2_4vect, sys);
186 m_maxw_tau1_4vect_decor.set(*evtInfo, maxw_tau1_4vect, sys);
187 m_maxw_tau2_4vect_decor.set(*evtInfo, maxw_tau2_4vect, sys);
188 }
189 if (m_doMLNU3P) {
190 double mlnu3p_mass = fitStatus == 1 ? m_mmc->GetFittedMass(DiTauMassTools::MMCFitMethod::MLNU3P) : -1;
191 PtEtaPhiMVector mlnu3p_res_4vect = fitStatus == 1 ? m_mmc->GetResonanceVec(DiTauMassTools::MMCFitMethod::MLNU3P) : null4V;
192 PtEtaPhiMVector mlnu3p_nu1_4vect = fitStatus == 1 ? m_mmc->GetNeutrino4vec(DiTauMassTools::MMCFitMethod::MLNU3P, 0) : null4V;
193 PtEtaPhiMVector mlnu3p_nu2_4vect = fitStatus == 1 ? m_mmc->GetNeutrino4vec(DiTauMassTools::MMCFitMethod::MLNU3P, 1) : null4V;
194 PtEtaPhiMVector mlnu3p_tau1_4vect = fitStatus == 1 ? m_mmc->GetTau4vec(DiTauMassTools::MMCFitMethod::MLNU3P, 0) : null4V;
195 PtEtaPhiMVector mlnu3p_tau2_4vect = fitStatus == 1 ? m_mmc->GetTau4vec(DiTauMassTools::MMCFitMethod::MLNU3P, 1) : null4V;
196 m_mlnu3p_mass_decor.set(*evtInfo, mlnu3p_mass, sys);
197 m_mlnu3p_res_4vect_decor.set(*evtInfo, mlnu3p_res_4vect, sys);
198 m_mlnu3p_nu1_4vect_decor.set(*evtInfo, mlnu3p_nu1_4vect, sys);
199 m_mlnu3p_nu2_4vect_decor.set(*evtInfo, mlnu3p_nu2_4vect, sys);
200 m_mlnu3p_tau1_4vect_decor.set(*evtInfo, mlnu3p_tau1_4vect, sys);
201 m_mlnu3p_tau2_4vect_decor.set(*evtInfo, mlnu3p_tau2_4vect, sys);
202 }
203 m_fitStatus_decor.set(*evtInfo, fitStatus, sys);
204 m_mlm_mass_decor.set(*evtInfo, mlm_mass, sys);
205
206 // retrieve results for collinear approximation
208 double coll_mass = -1234.;
209 double coll_x0 = -1234.;
210 double coll_x1 = -1234.;
211
212 ANA_CHECK(m_mmc->doCollinearApprox(vis1, vis2, (*met)[finalStr], true, coll_mass, coll_x0, coll_x1));
213
214 m_coll_approx_mass_decor.set(*evtInfo, coll_mass, sys);
215 m_coll_approx_x0_decor.set(*evtInfo, coll_x0, sys);
216 m_coll_approx_x1_decor.set(*evtInfo, coll_x1, sys);
217 }
218
219 }
220
221 return StatusCode::SUCCESS;
222 }
223
224} // namespace
DataVector adapter that acts like it holds const pointers.
#define ANA_MSG_ERROR(xmsg,...)
Macro printing error messages.
#define ANA_CHECK(EXP)
check whether the given expression was successful
#define ANA_MSG_WARNING(xmsg,...)
Macro printing warning messages.
static Double_t taus
SysWriteDecorHandle< PtEtaPhiMVector > m_maxw_res_4vect_decor
SysWriteDecorHandle< double > m_coll_approx_x1_decor
SysWriteDecorHandle< int > m_fitStatus_decor
SysReadSelectionHandle m_preselection
Gaudi::Property< bool > m_doCollinearApprox
SysWriteDecorHandle< double > m_coll_approx_x0_decor
SysWriteDecorHandle< PtEtaPhiMVector > m_mlnu3p_tau2_4vect_decor
SysWriteDecorHandle< PtEtaPhiMVector > m_mlnu3p_nu2_4vect_decor
SysWriteDecorHandle< PtEtaPhiMVector > m_maxw_tau1_4vect_decor
SysWriteDecorHandle< PtEtaPhiMVector > m_maxw_tau2_4vect_decor
SysReadSelectionHandle m_muonSelection
SysWriteDecorHandle< PtEtaPhiMVector > m_mlnu3p_tau1_4vect_decor
Gaudi::Property< bool > m_doMAXW
SysWriteDecorHandle< double > m_mlnu3p_mass_decor
SysWriteDecorHandle< PtEtaPhiMVector > m_mlnu3p_nu1_4vect_decor
SysWriteDecorHandle< double > m_coll_approx_mass_decor
SysReadHandle< xAOD::MuonContainer > m_muonsHandle
Gaudi::Property< bool > m_doMLNU3P
SysReadHandle< xAOD::TauJetContainer > m_tausHandle
SysReadSelectionHandle m_electronSelection
SysWriteDecorHandle< PtEtaPhiMVector > m_maxw_nu1_4vect_decor
virtual StatusCode initialize() override
SysReadSelectionHandle m_tauSelection
ToolHandle< DiTauMassTools::MissingMassTool > m_mmc
SysWriteDecorHandle< double > m_maxw_mass_decor
SysReadHandle< xAOD::MissingETContainer > m_metHandle
SysReadHandle< xAOD::JetContainer > m_jetsHandle
SysReadHandle< xAOD::EventInfo > m_eventInfoHandle
SysWriteDecorHandle< double > m_mlm_mass_decor
SysWriteDecorHandle< PtEtaPhiMVector > m_maxw_nu2_4vect_decor
SysWriteDecorHandle< PtEtaPhiMVector > m_mlnu3p_res_4vect_decor
SysReadHandle< xAOD::ElectronContainer > m_electronsHandle
SysReadSelectionHandle m_jetSelection
DataVector adapter that acts like it holds const pointers.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
ElementProxy at(size_type n)
Access an element, as an lvalue.
virtual::StatusCode execute()
execute this algorithm
Class providing the definition of the 4-vector interface.
Select isolated Photons, Electrons and Muons.
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
Jet_v1 Jet
Definition of the current "jet version".
ElectronContainer_v1 ElectronContainer
Definition of the current "electron container version".
EventInfo_v1 EventInfo
Definition of the latest event info version.
TauJet_v3 TauJet
Definition of the current "tau version".
Definition TauJet.h:17
Muon_v1 Muon
Reference the current persistent version:
JetContainer_v1 JetContainer
Definition of the current "jet container version".
TauJetContainer_v3 TauJetContainer
Definition of the current "taujet container version".
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".
Electron_v1 Electron
Definition of the current "egamma version".