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