ATLAS Offline Software
Loading...
Searching...
No Matches
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
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 for (const auto &sys : m_systematicsList.systematicsVector())
64 {
65 // retrieve the EventInfo
66 const xAOD::EventInfo *evtInfo = nullptr;
67 ANA_CHECK(m_eventInfoHandle.retrieve(evtInfo, sys, ctx));
68
69 // check the preselection
70 if (m_preselection && !m_preselection.getBool(*evtInfo, sys))
71 continue;
72
73 // retrieve objects
74 const xAOD::ElectronContainer *electrons = nullptr;
75 ANA_CHECK(m_electronsHandle.retrieve(electrons, sys, ctx));
76 const xAOD::MuonContainer *muons = nullptr;
77 ANA_CHECK(m_muonsHandle.retrieve(muons, sys, ctx));
78 const xAOD::TauJetContainer *taus = nullptr;
79 ANA_CHECK(m_tausHandle.retrieve(taus, sys, ctx));
80 const xAOD::JetContainer *jets = nullptr;
81 ANA_CHECK(m_jetsHandle.retrieve(jets, sys, ctx));
82 const xAOD::MissingETContainer *met = nullptr;
83 ANA_CHECK(m_metHandle.retrieve(met, sys, ctx));
84
85 // apply object-wise selection
90
91 for (const xAOD::Electron *el : *electrons)
92 {
93 if (m_electronSelection.getBool(*el, sys))
94 selected_electrons.push_back(el);
95 }
96
97 for (const xAOD::Muon *mu : *muons)
98 {
99 if (m_muonSelection.getBool(*mu, sys))
100 selected_muons.push_back(mu);
101 }
102
103 for (const xAOD::TauJet *tau : *taus)
104 {
105 if (m_tauSelection.getBool(*tau, sys))
106 selected_taus.push_back(tau);
107 }
108
109 for (const xAOD::Jet *jet : *jets)
110 {
111 if (m_jetSelection.getBool(*jet, sys))
112 selected_jets.push_back(jet);
113 }
114
115 int nJets = selected_jets.size();
116
117 const xAOD::IParticle *vis1 = 0, *vis2 = 0;
118 // to assign the visible particles on which to run the MMC, we assume that the user would prefer
119 // 1) tau_had + tau_had
120 // 2) tau_had + e
121 // 3) tau_had + mu
122 // 4) e + mu
123 // 5) mu + mu
124 // 6) e + e
125 // To force a custom ordering, simply decorate your desired selection onto the particles before running this algorithm.
126 // e.g. you could "book" an OSSF pair of light leptons as originating from a Z boson, and remove them from consideration here.
127
128 if (selected_taus.size() >= 2)
129 {
130 vis1 = selected_taus.at(0);
131 vis2 = selected_taus.at(1);
132 }
133 else if (selected_taus.size() == 1 && selected_electrons.size() >= 1)
134 {
135 vis1 = selected_taus.at(0);
136 vis2 = selected_electrons.at(0);
137 }
138 else if (selected_taus.size() == 1 && selected_muons.size() >= 1)
139 {
140 vis1 = selected_taus.at(0);
141 vis2 = selected_muons.at(0);
142 }
143 else if (selected_electrons.size() >= 1 && selected_muons.size() >= 1)
144 {
145 vis1 = selected_electrons.at(0);
146 vis2 = selected_muons.at(0);
147 }
148 else if (selected_muons.size() >= 2)
149 {
150 vis1 = selected_muons.at(0);
151 vis2 = selected_muons.at(1);
152 }
153 else if (selected_electrons.size() >= 2)
154 {
155 vis1 = selected_electrons.at(0);
156 vis2 = selected_electrons.at(1);
157 }
158 else
159 {
160 ANA_MSG_WARNING("Not enough charged leptons in the event to run the MMC!");
161 }
162
163 if ((*met)["Final"] == nullptr) {
164 ANA_MSG_ERROR("The MET term " << "Final" << " doesn't exist! Aborting.");
165 return StatusCode::FAILURE;
166 }
167
168 ANA_CHECK(m_mmc->apply(*evtInfo, vis1, vis2, (*met)["Final"], nJets));
169
170 // retrieve the output variables and decorate them
171 PtEtaPhiMVector null4V(0.0, 0.0, 0.0, 0.0);
172 int fitStatus = m_mmc->GetFitStatus(0);
173 double mlm_mass = fitStatus == 1 ? m_mmc->GetFittedMass(DiTauMassTools::MMCFitMethod::MLM) : -1;
174 if (m_doMAXW) {
175 double maxw_mass = fitStatus == 1 ? m_mmc->GetFittedMass(DiTauMassTools::MMCFitMethod::MAXW) : -1;
176 PtEtaPhiMVector maxw_res_4vect = fitStatus == 1 ? m_mmc->GetResonanceVec(DiTauMassTools::MMCFitMethod::MAXW) : null4V;
177 PtEtaPhiMVector maxw_nu1_4vect = fitStatus == 1 ? m_mmc->GetNeutrino4vec(DiTauMassTools::MMCFitMethod::MAXW, 0) : null4V;
178 PtEtaPhiMVector maxw_nu2_4vect = fitStatus == 1 ? m_mmc->GetNeutrino4vec(DiTauMassTools::MMCFitMethod::MAXW, 1) : null4V;
179 PtEtaPhiMVector maxw_tau1_4vect = fitStatus == 1 ? m_mmc->GetTau4vec(DiTauMassTools::MMCFitMethod::MAXW, 0) : null4V;
180 PtEtaPhiMVector maxw_tau2_4vect = fitStatus == 1 ? m_mmc->GetTau4vec(DiTauMassTools::MMCFitMethod::MAXW, 1) : null4V;
181 m_maxw_mass_decor.set(*evtInfo, maxw_mass, sys);
182 m_maxw_res_4vect_decor.set(*evtInfo, maxw_res_4vect, sys);
183 m_maxw_nu1_4vect_decor.set(*evtInfo, maxw_nu1_4vect, sys);
184 m_maxw_nu2_4vect_decor.set(*evtInfo, maxw_nu2_4vect, sys);
185 m_maxw_tau1_4vect_decor.set(*evtInfo, maxw_tau1_4vect, sys);
186 m_maxw_tau2_4vect_decor.set(*evtInfo, maxw_tau2_4vect, sys);
187 }
188 if (m_doMLNU3P) {
189 double mlnu3p_mass = fitStatus == 1 ? m_mmc->GetFittedMass(DiTauMassTools::MMCFitMethod::MLNU3P) : -1;
190 PtEtaPhiMVector mlnu3p_res_4vect = fitStatus == 1 ? m_mmc->GetResonanceVec(DiTauMassTools::MMCFitMethod::MLNU3P) : null4V;
191 PtEtaPhiMVector mlnu3p_nu1_4vect = fitStatus == 1 ? m_mmc->GetNeutrino4vec(DiTauMassTools::MMCFitMethod::MLNU3P, 0) : null4V;
192 PtEtaPhiMVector mlnu3p_nu2_4vect = fitStatus == 1 ? m_mmc->GetNeutrino4vec(DiTauMassTools::MMCFitMethod::MLNU3P, 1) : null4V;
193 PtEtaPhiMVector mlnu3p_tau1_4vect = fitStatus == 1 ? m_mmc->GetTau4vec(DiTauMassTools::MMCFitMethod::MLNU3P, 0) : null4V;
194 PtEtaPhiMVector mlnu3p_tau2_4vect = fitStatus == 1 ? m_mmc->GetTau4vec(DiTauMassTools::MMCFitMethod::MLNU3P, 1) : null4V;
195 m_mlnu3p_mass_decor.set(*evtInfo, mlnu3p_mass, sys);
196 m_mlnu3p_res_4vect_decor.set(*evtInfo, mlnu3p_res_4vect, sys);
197 m_mlnu3p_nu1_4vect_decor.set(*evtInfo, mlnu3p_nu1_4vect, sys);
198 m_mlnu3p_nu2_4vect_decor.set(*evtInfo, mlnu3p_nu2_4vect, sys);
199 m_mlnu3p_tau1_4vect_decor.set(*evtInfo, mlnu3p_tau1_4vect, sys);
200 m_mlnu3p_tau2_4vect_decor.set(*evtInfo, mlnu3p_tau2_4vect, sys);
201 }
202 m_fitStatus_decor.set(*evtInfo, fitStatus, sys);
203 m_mlm_mass_decor.set(*evtInfo, mlm_mass, sys);
204
205 // retrieve results for collinear approximation
207 double coll_mass = -1234.;
208 double coll_x0 = -1234.;
209 double coll_x1 = -1234.;
210
211 ANA_CHECK(m_mmc->doCollinearApprox(vis1, vis2, (*met)["Final"], true, coll_mass, coll_x0, coll_x1));
212
213 m_coll_approx_mass_decor.set(*evtInfo, coll_mass, sys);
214 m_coll_approx_x0_decor.set(*evtInfo, coll_x0, sys);
215 m_coll_approx_x1_decor.set(*evtInfo, coll_x1, sys);
216 }
217
218 }
219
220 return StatusCode::SUCCESS;
221 }
222
223} // namespace
DataVector adapter that acts like it holds const pointers.
#define ANA_MSG_ERROR(xmsg)
Macro printing error messages.
#define ANA_MSG_WARNING(xmsg)
Macro printing warning messages.
#define ANA_CHECK(EXP)
check whether the given expression was successful
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".