17 #include "TLorentzVector.h"
25 , m_expression1(
"true")
26 , m_expression2(
"true")
27 , m_mass1Hypothesis(0.0)
28 , m_mass2Hypothesis(0.0)
31 , m_doTransverseMass(false)
38 declareProperty(
"MinDeltaR",
m_mindR);
46 ATH_MSG_ERROR(
"No SG name provided for the output of EGInvariantMassTool!");
47 return StatusCode::FAILURE;
78 return StatusCode::SUCCESS;
88 auto masses = std::make_unique<std::vector<float>>();
94 return StatusCode::SUCCESS;
99 std::vector<float>&
masses)
const
102 const std::vector<float>* pt1 =
nullptr;
105 pt1 = readHandle.ptr();
107 const std::vector<float>* pt2 =
nullptr;
110 pt2 = readHandle.ptr();
113 const std::vector<float>*
eta1 =
nullptr;
116 eta1 = readHandle.ptr();
118 const std::vector<float>*
eta2 =
nullptr;
121 eta2 = readHandle.ptr();
124 const std::vector<float>* phi1 =
nullptr;
127 phi1 = readHandle.ptr();
129 const std::vector<float>* phi2 =
nullptr;
132 phi2 = readHandle.ptr();
143 std::vector<int> entries1 = m_parser[
kParser1]->evaluateAsVector();
144 unsigned int nEntries1 = entries1.size();
145 std::vector<int> entries2 = m_parser[
kParser2]->evaluateAsVector();
146 unsigned int nEntries2 = entries2.size();
150 if (nEntries1 == 0 || nEntries2 == 0) {
151 return StatusCode::SUCCESS;
155 if (particles1->
size() != nEntries1) {
157 return StatusCode::FAILURE;
159 if (particles2->
size() != nEntries2) {
161 return StatusCode::FAILURE;
163 if ((pt1 && pt1->size() != nEntries1) ||
165 eta1->size() != nEntries1) ||
166 (phi1 && phi1->size() != nEntries1)) {
168 return StatusCode::FAILURE;
170 if ((pt2 && pt2->size() != nEntries2) ||
172 eta2->size() != nEntries2) ||
173 (phi2 && phi2->size() != nEntries2)) {
175 return StatusCode::FAILURE;
179 unsigned int outerIt, innerIt;
180 std::vector<std::vector<int>>
pairs;
181 for (outerIt = 0; outerIt < nEntries1; ++outerIt) {
182 for (innerIt = 0; innerIt < nEntries2; ++innerIt) {
183 std::vector<int> tmpPair;
184 if (entries1[outerIt] == 1 && entries2[innerIt] == 1) {
185 tmpPair.push_back(outerIt);
186 tmpPair.push_back(innerIt);
187 pairs.push_back(tmpPair);
198 type1 = ((*particles1)[0])->
type();
199 type2 = ((*particles2)[0])->
type();
203 "Cannot check charge for particles not of type electron or muon");
204 return StatusCode::FAILURE;
208 for (
const auto& pair :
pairs) {
209 unsigned int first = pair[0];
210 unsigned int second = pair[1];
211 float apt1 = pt1 ? (*pt1)[
first] : ((*particles1)[
first])->p4().Pt();
212 float apt2 = pt2 ? (*pt2)[
second] : ((*particles2)[
second])->p4().Pt();
213 float aeta1(-999.), aeta2(-999.);
215 aeta1 =
eta1 ? (*eta1)[
first] : ((*particles1)[
first])->p4().Eta();
218 float aphi1 = phi1 ? (*phi1)[
first] : ((*particles1)[
first])->p4().Phi();
219 float aphi2 = phi2 ? (*phi2)[
second] : ((*particles2)[
second])->p4().Phi();
222 float deta = aeta1 - aeta2;
223 float dphi = abs(aphi1 - aphi2);
224 if (dphi > TMath::Pi()) {
225 dphi = TMath::TwoPi() - dphi;
227 if (sqrt(deta * deta + dphi * dphi) <
m_mindR) {
233 float q1(0.), q2(0.);
238 ->primaryTrackParticle()
245 ->primaryTrackParticle()
252 TLorentzVector v1,
v2,
v;
260 float mass = (v1 +
v2).M();
263 return StatusCode::SUCCESS;