ATLAS Offline Software
Loading...
Searching...
No Matches
InvariantMassThreeTOBsIncl1Charge.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4/*********************************
5 * InvariantMassThreeTOBsIncl1Charge.cxx
6 * Created by Paula Martinez based on InvariantMassInclusive1 by V Sorin
7 *
8 * For questions contact atlas-trig-l1topo-algcom@cern.ch.
9 * @brief Algorithm calculates the sqr of the INVMASS of three TOBs from one list and applies invmass criteria.
10 * Events containing 3 TGC muons with same charge are rejected
11 *
12 * @param NumberLeading
13 *
14 * First version assuming same cuts in all TOBs.
15**********************************/
16
17// TO DO size of the input list to be possibly refined
18
19#include <cmath>
20#include <string>
21#include <iostream>
22#include <sstream>
23#include <vector>
24
29
30REGISTER_ALG_TCS(InvariantMassThreeTOBsIncl1Charge)
31
32
34{
35 defineParameter("InputWidth", 3);
36 defineParameter("MaxTob", 0);
37 defineParameter("NumResultBits", 6);
38 defineParameter("RequireOneBarrel", 0);
39 defineParameter("MinMSqr", 0, 0);
40 defineParameter("MaxMSqr", 999, 0);
41 defineParameter("MinMSqr", 0, 1);
42 defineParameter("MaxMSqr", 999, 1);
43 defineParameter("MinMSqr", 0, 2);
44 defineParameter("MaxMSqr", 999, 2);
45 defineParameter("MinMSqr", 0, 3);
46 defineParameter("MaxMSqr", 999, 3);
47 defineParameter("MinMSqr", 0, 4);
48 defineParameter("MaxMSqr", 999, 4);
49 defineParameter("MinMSqr", 0, 5);
50 defineParameter("MaxMSqr", 999, 5);
51 defineParameter("MinET1",0,0);
52 defineParameter("MinET1",0,1);
53 defineParameter("MinET1",0,2);
54 defineParameter("MinET1",0,3);
55 defineParameter("MinET1",0,4);
56 defineParameter("MinET1",0,5);
57
59}
60
62
63
66 if(parameter("MaxTob").value() > 0) {
67 p_NumberLeading1 = parameter("MaxTob").value();
68 } else {
69 p_NumberLeading1 = parameter("InputWidth").value();
70 }
71
72 p_OneBarrel = parameter("RequireOneBarrel").value();
73
74 for(unsigned int i=0; i<numberOutputBits(); ++i) {
75 p_InvMassMin[i] = parameter("MinMSqr", i).value();
76 p_InvMassMax[i] = parameter("MaxMSqr", i).value();
77
78 p_MinET1[i] = parameter("MinET1",i).value();
79 }
80 TRG_MSG_INFO("NumberLeading1 : " << p_NumberLeading1);
81 TRG_MSG_INFO("RequireOneBarrel : " << p_OneBarrel);
82 for(unsigned int i=0; i<numberOutputBits(); ++i) {
83 TRG_MSG_INFO("InvMassMin : " << p_InvMassMin[i]);
84 TRG_MSG_INFO("InvMassMax : " << p_InvMassMax[i]);
85
86 TRG_MSG_INFO("MinET1 : " << p_MinET1[i]);
87 }
88 TRG_MSG_INFO("number output : " << numberOutputBits());
89
90 // book histograms
91 for(unsigned int i=0; i<numberOutputBits(); ++i) {
92 std::string hname_accept = "hInvariantMassThreeTOBsIncl1Charge_accept_bit"+std::to_string(static_cast<int>(i));
93 std::string hname_reject = "hInvariantMassThreeTOBsIncl1Charge_reject_bit"+std::to_string(static_cast<int>(i));
94 std::string hname_acceptEta1Eta2 = "hInvariantMassThreeTOBsIncl1Charge_acceptEta1Eta2_bit"+std::to_string(static_cast<int>(i));
95 std::string hname_rejectEta1Eta2 = "hInvariantMassThreeTOBsIncl1Charge_rejectEta1Eta2_bit"+std::to_string(static_cast<int>(i));
96 std::string hname_acceptEta2Eta3 = "hInvariantMassThreeTOBsIncl1Charge_acceptEta2Eta3_bit"+std::to_string(static_cast<int>(i));
97 std::string hname_rejectEta2Eta3 = "hInvariantMassThreeTOBsIncl1Charge_rejectEta2Eta3_bit"+std::to_string(static_cast<int>(i));
98 std::string hname_acceptEta3Eta1 = "hInvariantMassThreeTOBsIncl1Charge_acceptEta3Eta1_bit"+std::to_string(static_cast<int>(i));
99 std::string hname_rejectEta3Eta1 = "hInvariantMassThreeTOBsIncl1Charge_rejectEta3Eta1_bit"+std::to_string(static_cast<int>(i));
100 // mass
101 bookHist(m_histAccept, hname_accept, "INVM", 100, std::sqrt(p_InvMassMin[i]), std::sqrt(p_InvMassMax[i]));
102 bookHist(m_histReject, hname_reject, "INVM", 100, std::sqrt(p_InvMassMin[i]), std::sqrt(p_InvMassMax[i]));
103 // eta vs eta
104 bookHist(m_histAcceptEta1Eta2, hname_acceptEta1Eta2, "ETA vs ETA", 100, -70, 70, 100, -70, 70);
105 bookHist(m_histRejectEta1Eta2, hname_rejectEta1Eta2, "ETA vs ETA", 100, -70, 70, 100, -70, 70);
106 bookHist(m_histAcceptEta2Eta3, hname_acceptEta2Eta3, "ETA vs ETA", 100, -70, 70, 100, -70, 70);
107 bookHist(m_histRejectEta2Eta3, hname_rejectEta2Eta3, "ETA vs ETA", 100, -70, 70, 100, -70, 70);
108 bookHist(m_histAcceptEta3Eta1, hname_acceptEta3Eta1, "ETA vs ETA", 100, -70, 70, 100, -70, 70);
109 bookHist(m_histRejectEta3Eta1, hname_rejectEta3Eta1, "ETA vs ETA", 100, -70, 70, 100, -70, 70);
110 }
111
112
113
114 return StatusCode::SUCCESS;
115}
116
117
118
120TCS::InvariantMassThreeTOBsIncl1Charge::processBitCorrect( const std::vector<TCS::TOBArray const *> & input,
121 const std::vector<TCS::TOBArray *> & output,
122 Decision & decision )
123{
124
125 if(input.size() == 1) {
126
127 for( TCS::TOBArray::const_iterator tob1 = input[0]->begin();
128 tob1 != input[0]->end() && distance( input[0]->begin(), tob1) < p_NumberLeading1;
129 ++tob1) {
130
131 TCS::TOBArray::const_iterator tob2 = tob1; ++tob2;
132 for( ;
133 tob2 != input[0]->end() && distance( input[0]->begin(), tob2) < p_NumberLeading1;
134 ++tob2) {
135
136 TCS::TOBArray::const_iterator tob3 = tob2; ++tob3;
137 for( ;
138 tob3 != input[0]->end() && distance( input[0]->begin(), tob3) < p_NumberLeading1;
139 ++tob3) {
140
141 // OneBarrel
142 if (p_OneBarrel && static_cast<parType_t>(std::abs((*tob1)->eta())) > 10 && static_cast<parType_t>(std::abs((*tob2)->eta())) > 10 && static_cast<parType_t>(std::abs((*tob3)->eta())) > 10 ) continue;
143
144 // Inv Mass calculation
145 unsigned int invmass2_12 = calcInvMassBW( *tob1, *tob2 );
146 unsigned int invmass2_13 = calcInvMassBW( *tob1, *tob3 );
147 unsigned int invmass2_23 = calcInvMassBW( *tob2, *tob3 );
148 unsigned int invmass2 = invmass2_12 + invmass2_13 + invmass2_23;
149 // Charge cut ( 1 = positive, -1 = negative, 0 = undefined (RPC) )
150 int charge1 = (*tob1)->charge();
151 int charge2 = (*tob2)->charge();
152 int charge3 = (*tob3)->charge();
153 int totalCharge = charge1 + charge2 + charge3;
154 bool acceptCharge = true;
155 if ( std::abs(totalCharge) == 3 ) { acceptCharge = false; }
156 for(unsigned int i=0; i<numberOutputBits(); ++i) {
157 bool accept = false;
158 if( static_cast<parType_t>((*tob1)->Et()) <= p_MinET1[i]) continue; // ET cut
159 if( static_cast<parType_t>((*tob2)->Et()) <= p_MinET1[i]) continue; // ET cut
160 if( static_cast<parType_t>((*tob3)->Et()) <= p_MinET1[i]) continue; // ET cut
161
162 accept = invmass2 >= p_InvMassMin[i] && invmass2 <= p_InvMassMax[i] && acceptCharge;
163 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(i) : accept);
164 const bool fillReject = fillHistos() and not fillAccept;
165 const bool alreadyFilled = decision.bit(i);
166 if( accept ) {
167 std::vector<TCS::GenericTOB*> TOBvector;
168 TOBvector.push_back( *tob1 );
169 TOBvector.push_back( *tob2 );
170 TOBvector.push_back( *tob3 );
171 decision.setBit(i, true);
172 output[i]->push_back( TCS::CompositeTOB(TOBvector) );
173 TOBvector.clear();
174 }
175 if(fillAccept and not alreadyFilled) {
176 fillHist1D(m_histAccept[i],std::sqrt(invmass2));
177 fillHist2D(m_histAcceptEta1Eta2[i],(*tob1)->eta(),(*tob2)->eta());
178 fillHist2D(m_histAcceptEta2Eta3[i],(*tob2)->eta(),(*tob3)->eta());
179 fillHist2D(m_histAcceptEta3Eta1[i],(*tob3)->eta(),(*tob1)->eta());
180 } else if(fillReject) {
181 fillHist1D(m_histReject[i],std::sqrt(invmass2));
182 fillHist2D(m_histRejectEta1Eta2[i],(*tob1)->eta(),(*tob2)->eta());
183 fillHist2D(m_histRejectEta2Eta3[i],(*tob2)->eta(),(*tob3)->eta());
184 fillHist2D(m_histRejectEta3Eta1[i],(*tob3)->eta(),(*tob1)->eta());
185 }
186 TRG_MSG_DEBUG("Decision " << i << ": " << (accept?"pass":"fail") << " invmass2 = " << invmass2);
187
188 }
189 }
190 }
191 }
192 for (unsigned int i=0; i < numberOutputBits(); ++i) {
193 bool hasAmbiguousInputs = TSU::isAmbiguousTruncation(input[0], p_NumberLeading1, p_MinET1[i]);
194 output[i]->setAmbiguityFlag(hasAmbiguousInputs);
195 }
196 } else {
197
198 TCS_EXCEPTION("InvariantMassThreeTOBsIncl1Charge alg must have 1 input list, but got " << input.size());
199
200 }
201
203
204}
205
207TCS::InvariantMassThreeTOBsIncl1Charge::process( const std::vector<TCS::TOBArray const *> & input,
208 const std::vector<TCS::TOBArray *> & output,
209 Decision & decision )
210{
211
212 if(input.size() == 1) {
213
214 for( TCS::TOBArray::const_iterator tob1 = input[0]->begin();
215 tob1 != input[0]->end() && distance( input[0]->begin(), tob1) < p_NumberLeading1;
216 ++tob1) {
217
218 TCS::TOBArray::const_iterator tob2 = tob1; ++tob2;
219 for( ;
220 tob2 != input[0]->end() && distance( input[0]->begin(), tob2) < p_NumberLeading1;
221 ++tob2) {
222
223 TCS::TOBArray::const_iterator tob3 = tob2; ++tob3;
224 for( ;
225 tob3 != input[0]->end() && distance( input[0]->begin(), tob3) < p_NumberLeading1;
226 ++tob3) {
227
228 // OneBarrel
229 if (p_OneBarrel && static_cast<parType_t>(std::abs((*tob1)->eta())) > 10 && static_cast<parType_t>(std::abs((*tob2)->eta())) > 10 && static_cast<parType_t>(std::abs((*tob3)->eta())) > 10 ) continue;
230
231 // Inv Mass calculation
232 unsigned int invmass2_12 = calcInvMass( *tob1, *tob2 );
233 unsigned int invmass2_13 = calcInvMass( *tob1, *tob3 );
234 unsigned int invmass2_23 = calcInvMass( *tob2, *tob3 );
235 unsigned int invmass2 = invmass2_12 + invmass2_13 + invmass2_23;
236 // Charge cut ( 1 = positive, -1 = negative, 0 = undefined (RPC) )
237 int charge1 = (*tob1)->charge();
238 int charge2 = (*tob2)->charge();
239 int charge3 = (*tob3)->charge();
240 int totalCharge = charge1 + charge2 + charge3;
241 bool acceptCharge = true;
242 if ( std::abs(totalCharge) == 3 ) { acceptCharge = false; }
243 for(unsigned int i=0; i<numberOutputBits(); ++i) {
244 bool accept = false;
245 if( static_cast<parType_t>((*tob1)->Et()) <= p_MinET1[i]) continue; // ET cut
246 if( static_cast<parType_t>((*tob2)->Et()) <= p_MinET1[i]) continue; // ET cut
247 if( static_cast<parType_t>((*tob3)->Et()) <= p_MinET1[i]) continue; // ET cut
248
249 accept = invmass2 >= p_InvMassMin[i] && invmass2 <= p_InvMassMax[i] && acceptCharge;
250 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(i) : accept);
251 const bool fillReject = fillHistos() and not fillAccept;
252 const bool alreadyFilled = decision.bit(i);
253 if( accept ) {
254 std::vector<TCS::GenericTOB*> TOBvector;
255 TOBvector.push_back( *tob1 );
256 TOBvector.push_back( *tob2 );
257 TOBvector.push_back( *tob3 );
258 decision.setBit(i, true);
259 output[i]->push_back( TCS::CompositeTOB(TOBvector) );
260 TOBvector.clear();
261 }
262 if(fillAccept and not alreadyFilled) {
263 fillHist1D(m_histAccept[i],std::sqrt(invmass2));
264 fillHist2D(m_histAcceptEta1Eta2[i],(*tob1)->eta(),(*tob2)->eta());
265 fillHist2D(m_histAcceptEta2Eta3[i],(*tob2)->eta(),(*tob3)->eta());
266 fillHist2D(m_histAcceptEta3Eta1[i],(*tob3)->eta(),(*tob1)->eta());
267 } else if(fillReject) {
268 fillHist1D(m_histReject[i],std::sqrt(invmass2));
269 fillHist2D(m_histRejectEta1Eta2[i],(*tob1)->eta(),(*tob2)->eta());
270 fillHist2D(m_histRejectEta2Eta3[i],(*tob2)->eta(),(*tob3)->eta());
271 fillHist2D(m_histRejectEta3Eta1[i],(*tob3)->eta(),(*tob1)->eta());
272 }
273 TRG_MSG_DEBUG("Decision " << i << ": " << (accept?"pass":"fail") << " invmass2 = " << invmass2);
274
275 }
276 }
277 }
278 }
279 } else {
280
281 TCS_EXCEPTION("InvariantMassThreeTOBsIncl1Charge alg must have either 1 input list, but got " << input.size());
282
283 }
284
286}
#define REGISTER_ALG_TCS(CLASS)
Definition AlgFactory.h:62
int charge3(const T &p)
Definition AtlasPID.h:995
const Parameter & parameter(const std::string &parameterName) const
const std::string & name() const
void bookHist(std::vector< std::string > &regName, const std::string &name, const std::string &title, const int binx, const int xmin, const int xmax)
void fillHist1D(const std::string &histName, double x)
unsigned int calcInvMassBW(const TCS::GenericTOB *tob1, const TCS::GenericTOB *tob2)
void defineParameter(const std::string &name, TCS::parType_t value)
unsigned int calcInvMass(const TCS::GenericTOB *tob1, const TCS::GenericTOB *tob2)
void fillHist2D(const std::string &histName, double x, double y)
data_t::const_iterator const_iterator
std::vector< std::string > m_histAcceptEta1Eta2
Definition DecisionAlg.h:79
std::vector< std::string > m_histRejectEta2Eta3
Definition DecisionAlg.h:82
std::vector< std::string > m_histRejectEta3Eta1
Definition DecisionAlg.h:84
void setNumberOutputBits(unsigned int numberOutputBits)
Definition DecisionAlg.h:40
std::vector< std::string > m_histAcceptEta2Eta3
Definition DecisionAlg.h:81
DecisionAlg(const std::string &name)
Definition DecisionAlg.h:25
std::vector< std::string > m_histRejectEta1Eta2
Definition DecisionAlg.h:80
bool fillHistosBasedOnHardware() const
! getter
bool fillHistos() const
whether the monitoring histograms should be filled
std::vector< std::string > m_histAccept
Definition DecisionAlg.h:73
std::vector< std::string > m_histReject
Definition DecisionAlg.h:74
unsigned int numberOutputBits() const
Definition DecisionAlg.h:39
bool getDecisionHardwareBit(const unsigned int &bitNumber) const
! get one hardware decision bit from this algo
std::vector< std::string > m_histAcceptEta3Eta1
Definition DecisionAlg.h:83
bool bit(unsigned int index) const
Definition Decision.h:40
void setBit(unsigned int index, bool value)
Definition Decision.cxx:12
virtual StatusCode process(const std::vector< TCS::TOBArray const * > &input, const std::vector< TCS::TOBArray * > &output, Decision &decison) override final
virtual StatusCode processBitCorrect(const std::vector< TCS::TOBArray const * > &input, const std::vector< TCS::TOBArray * > &output, Decision &decison) override final
uint32_t parType_t
Definition Parameter.h:22
bool isAmbiguousTruncation(TCS::TOBArray const *tobs, size_t pos, unsigned minEt=0)
STL namespace.