ATLAS Offline Software
Loading...
Searching...
No Matches
InvariantMassInclusiveDeltaRSqrIncl2Charge.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 * Created by Paula Martinez based on V Sorin and Joerg Stelzer.
6 *
7 * @brief algorithm calculates the sqr of the INVMASS and DeltaR between two lists and applies invmass and deltaR criteria
8 * Events containing a pair of TGC muons with same charge are rejected
9 *
10 * @param NumberLeading
11 *
12 * For questions contact atlas-trig-l1topo-algcom@cern.ch.
13**********************************/
14
15
17
21
22#include <cmath>
23
24REGISTER_ALG_TCS(InvariantMassInclusiveDeltaRSqrIncl2Charge)
25
26
28{
29 defineParameter("InputWidth1", 9);
30 defineParameter("InputWidth2", 9);
31 defineParameter("MaxTob1", 0);
32 defineParameter("MaxTob2", 0);
33 defineParameter("NumResultBits", 6);
34 defineParameter("MinMSqr", 0, 0);
35 defineParameter("MaxMSqr", 999, 0);
36 defineParameter("MinMSqr", 0, 1);
37 defineParameter("MaxMSqr", 999, 1);
38 defineParameter("MinMSqr", 0, 2);
39 defineParameter("MaxMSqr", 999, 2);
40 defineParameter("MinMSqr", 0, 3);
41 defineParameter("MaxMSqr", 999, 3);
42 defineParameter("MinMSqr", 0, 4);
43 defineParameter("MaxMSqr", 999, 4);
44 defineParameter("MinMSqr", 0, 5);
45 defineParameter("MaxMSqr", 999, 5);
46 defineParameter("MinET1",0,0);
47 defineParameter("MinET2",0,0);
48 defineParameter("MinET1",0,1);
49 defineParameter("MinET2",0,1);
50 defineParameter("MinET1",0,2);
51 defineParameter("MinET2",0,2);
52 defineParameter("MinET1",0,3);
53 defineParameter("MinET2",0,3);
54 defineParameter("MinET1",0,4);
55 defineParameter("MinET2",0,4);
56 defineParameter("MinET1",0,5);
57 defineParameter("MinET2",0,5);
58 defineParameter("ApplyEtaCut", 0);
59 defineParameter("MinEta1", 0);
60 defineParameter("MaxEta1", 31);
61 defineParameter("MinEta2", 0);
62 defineParameter("MaxEta2", 31);
63 defineParameter("DeltaRMin", 0, 0);
64 defineParameter("DeltaRMax", 0, 0);
65 defineParameter("DeltaRMin", 0, 1);
66 defineParameter("DeltaRMax", 0, 1);
67 defineParameter("DeltaRMin", 0, 2);
68 defineParameter("DeltaRMax", 0, 2);
69 defineParameter("DeltaRMin", 0, 3);
70 defineParameter("DeltaRMax", 0, 3);
71 defineParameter("DeltaRMin", 0, 4);
72 defineParameter("DeltaRMax", 0, 4);
73 defineParameter("DeltaRMin", 0, 5);
74 defineParameter("DeltaRMax", 0, 5);
75
77}
78
80
81
84
85 m_NumberLeading1 = parameter("InputWidth1").value();
86 m_NumberLeading2 = parameter("InputWidth2").value();
87 if(parameter("MaxTob1").value() > 0) m_NumberLeading1 = parameter("MaxTob1").value();
88 if(parameter("MaxTob2").value() > 0) m_NumberLeading2 = parameter("MaxTob2").value();
89 TRG_MSG_INFO("NumberLeading1 : " << m_NumberLeading1);
90 TRG_MSG_INFO("NumberLeading2 : " << m_NumberLeading2);
91
92 for(unsigned int i=0; i<numberOutputBits(); ++i) {
93
94 m_InvMassMin[i] = parameter("MinMSqr", i).value();
95 m_InvMassMax[i] = parameter("MaxMSqr", i).value();
96 m_MinET1[i] = parameter("MinET1",i).value();
97 m_MinET2[i] = parameter("MinET2",i).value();
98 m_DeltaRMin[i] = parameter("DeltaRMin", i).value();
99 m_DeltaRMax[i] = parameter("DeltaRMax", i).value();
100
101 TRG_MSG_INFO("InvMassMin "<< i << " : " << m_InvMassMin[i]);
102 TRG_MSG_INFO("InvMassMax "<< i << " : " << m_InvMassMax[i]);
103 TRG_MSG_INFO("MinET1 "<< i << " : " << m_MinET1[i]);
104 TRG_MSG_INFO("MinET2 "<< i << " : " << m_MinET2[i]);
105 TRG_MSG_INFO("DeltaRMin "<< i << " : " << m_DeltaRMin[i]);
106 TRG_MSG_INFO("DeltaRMax "<< i << " : " << m_DeltaRMax[i]);
107
108 }
109
110 m_ApplyEtaCut = parameter("ApplyEtaCut").value();
111 m_MinEta1 = parameter("MinEta1" ).value();
112 m_MaxEta1 = parameter("MaxEta1" ).value();
113 m_MinEta2 = parameter("MinEta2" ).value();
114 m_MaxEta2 = parameter("MaxEta2" ).value();
115 TRG_MSG_INFO("ApplyEtaCut : "<<m_ApplyEtaCut );
116 TRG_MSG_INFO("MinEta1 : "<<m_MinEta1 );
117 TRG_MSG_INFO("MaxEta1 : "<<m_MaxEta1 );
118 TRG_MSG_INFO("MinEta2 : "<<m_MinEta2 );
119 TRG_MSG_INFO("MaxEta2 : "<<m_MaxEta2 );
120
121 TRG_MSG_INFO("number output : " << numberOutputBits());
122
123 // book histograms
124 for(unsigned int i=0; i<numberOutputBits(); ++i) {
125 std::string hname_accept = "hInvariantMassInclusiveDeltaRSqrIncl2Charge_accept_bit"+std::to_string(static_cast<int>(i));
126 std::string hname_reject = "hInvariantMassInclusiveDeltaRSqrIncl2Charge_reject_bit"+std::to_string(static_cast<int>(i));
127 // mass
128 bookHist(m_histAcceptM, hname_accept, "INVM vs DR", 100, std::sqrt(m_InvMassMin[i]), std::sqrt(m_InvMassMax[i]), 100, std::sqrt(m_DeltaRMin[i]), std::sqrt(m_DeltaRMax[i]));
129 bookHist(m_histRejectM, hname_reject, "INVM vs DR", 100, std::sqrt(m_InvMassMin[i]), std::sqrt(m_InvMassMax[i]), 100, std::sqrt(m_DeltaRMin[i]), std::sqrt(m_DeltaRMax[i]));
130 // eta2 vs. eta1
131 bookHist(m_histAcceptEta1Eta2, hname_accept, "ETA vs ETA", 100, -70, 70, 100, -70, 70);
132 bookHist(m_histRejectEta1Eta2, hname_reject, "ETA vs ETA", 100, -70, 70, 100, -70, 70);
133 }
134
135 return StatusCode::SUCCESS;
136}
137
138
139
141TCS::InvariantMassInclusiveDeltaRSqrIncl2Charge::processBitCorrect( const std::vector<TCS::TOBArray const *> & input,
142 const std::vector<TCS::TOBArray *> & output,
143 Decision & decision )
144{
145
146 if( input.size() == 2) {
147 for( TOBArray::const_iterator tob1 = input[0]->begin();
148 tob1 != input[0]->end() && distance(input[0]->begin(), tob1) < m_NumberLeading1;
149 ++tob1)
150 {
151
152
153 for( TCS::TOBArray::const_iterator tob2 = input[1]->begin();
154 tob2 != input[1]->end() && distance(input[1]->begin(), tob2) < m_NumberLeading2;
155 ++tob2) {
156 // Inv Mass calculation
157 unsigned int invmass2 = calcInvMassBW( *tob1, *tob2 );
158 // test DeltaR2Min, DeltaR2Max
159 unsigned int deltaR2 = calcDeltaR2BW( *tob1, *tob2 );
160 TRG_MSG_DEBUG("Jet1 = " << **tob1 << ", Jet2 = " << **tob2 << ", invmass2 = " << invmass2 << ", deltaR2 = " << deltaR2);
161 const int eta1 = (*tob1)->eta();
162 const int eta2 = (*tob2)->eta();
163 const unsigned int aeta1 = std::abs(eta1);
164 const unsigned int aeta2 = std::abs(eta2);
165 // Charge cut ( 1 = positive, -1 = negative, 0 = undefined (RPC) )
166 int charge1 = (*tob1)->charge();
167 int charge2 = (*tob2)->charge();
168 int totalCharge = charge1 + charge2;
169 bool acceptCharge = true;
170 if ( std::abs(totalCharge) == 2 ) { acceptCharge = false; }
171 for(unsigned int i=0; i<numberOutputBits(); ++i) {
172 bool accept = false;
173 if( parType_t((*tob1)->Et()) <= m_MinET1[i]) continue; // ET cut
174 if( parType_t((*tob2)->Et()) <= m_MinET2[i]) continue; // ET cut
175 if(m_ApplyEtaCut &&
176 ((aeta1 < m_MinEta1 || aeta1 > m_MaxEta1 ) ||
177 (aeta2 < m_MinEta2 || aeta2 > m_MaxEta2 ) )) continue;
178 accept = invmass2 >= m_InvMassMin[i] && invmass2 <= m_InvMassMax[i] &&
179 deltaR2 >= m_DeltaRMin[i] && deltaR2 <= m_DeltaRMax[i] && acceptCharge;
180 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(i) : accept);
181 const bool fillReject = fillHistos() and not fillAccept;
182 const bool alreadyFilled = decision.bit(i);
183 if( accept ) {
184 decision.setBit(i, true);
185 output[i]->push_back( TCS::CompositeTOB(*tob1, *tob2) );
186 }
187 if(fillAccept and not alreadyFilled) {
188 fillHist2D(m_histAcceptM[i],std::sqrt(static_cast<float>(invmass2)),std::sqrt(static_cast<float>(deltaR2)));
189 fillHist2D(m_histAcceptEta1Eta2[i],(*tob1)->eta(),(*tob2)->eta());
190 } else if(fillReject) {
191 fillHist2D(m_histRejectM[i],std::sqrt(static_cast<float>(invmass2)),std::sqrt(static_cast<float>(deltaR2)));
192 fillHist2D(m_histRejectEta1Eta2[i],(*tob1)->eta(),(*tob2)->eta());
193 }
194 TRG_MSG_DEBUG("Decision " << i << ": " << (accept?"pass":"fail") << " invmass2 = " << invmass2 << " deltaR2 = " << deltaR2 );
195 }
196 }
197 }
198 for (unsigned int i=0; i < numberOutputBits(); ++i) {
199 bool hasAmbiguousInputs = TSU::isAmbiguousTruncation(input[0], m_NumberLeading1, m_MinET1[i])
201 output[i]->setAmbiguityFlag(hasAmbiguousInputs);
202 }
203 } else {
204
205 TCS_EXCEPTION("InvariantMassInclusiveDeltaRSqrIncl2Charge alg must have 2 inputs, but got " << input.size());
206
207 }
209
210}
211
213TCS::InvariantMassInclusiveDeltaRSqrIncl2Charge::process( const std::vector<TCS::TOBArray const *> & input,
214 const std::vector<TCS::TOBArray *> & output,
215 Decision & decision )
216{
217
218
219 if( input.size() == 2) {
220 for( TOBArray::const_iterator tob1 = input[0]->begin();
221 tob1 != input[0]->end() && distance(input[0]->begin(), tob1) < m_NumberLeading1;
222 ++tob1)
223 {
224 for( TCS::TOBArray::const_iterator tob2 = input[1]->begin();
225 tob2 != input[1]->end() && distance(input[1]->begin(), tob2) < m_NumberLeading2;
226 ++tob2) {
227
228 // Inv Mass calculation
229 unsigned int invmass2 = calcInvMass( *tob1, *tob2 );
230 // test DeltaR2Min, DeltaR2Max
231 unsigned int deltaR2 = calcDeltaR2( *tob1, *tob2 );
232 TRG_MSG_DEBUG("Jet1 = " << **tob1 << ", Jet2 = " << **tob2 << ", invmass2 = " << invmass2 << ", deltaR2 = " << deltaR2);
233 const int eta1 = (*tob1)->eta();
234 const int eta2 = (*tob2)->eta();
235 const unsigned int aeta1 = std::abs(eta1);
236 const unsigned int aeta2 = std::abs(eta2);
237 // Charge cut ( 1 = positive, -1 = negative, 0 = undefined (RPC) )
238 int charge1 = (*tob1)->charge();
239 int charge2 = (*tob2)->charge();
240 int totalCharge = charge1 + charge2;
241 bool acceptCharge = true;
242 if ( std::abs(totalCharge) == 2 ) { acceptCharge = false; }
243 for(unsigned int i=0; i<numberOutputBits(); ++i) {
244 if( parType_t((*tob1)->Et()) <= m_MinET1[i]) continue; // ET cut
245 if( parType_t((*tob2)->Et()) <= m_MinET2[i]) continue; // ET cut
246 if(m_ApplyEtaCut &&
247 ((aeta1 < m_MinEta1 || aeta1 > m_MaxEta1 ) ||
248 (aeta2 < m_MinEta2 || aeta2 > m_MaxEta2 ) )) continue;
249 bool accept = invmass2 >= m_InvMassMin[i] && invmass2 <= m_InvMassMax[i] &&
250 deltaR2 >= m_DeltaRMin[i] && deltaR2 <= m_DeltaRMax[i] && acceptCharge;
251 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(i) : accept);
252 const bool fillReject = fillHistos() and not fillAccept;
253 const bool alreadyFilled = decision.bit(i);
254 if( accept ) {
255 decision.setBit(i, true);
256 output[i]->push_back( TCS::CompositeTOB(*tob1, *tob2) );
257 }
258 if(fillAccept and not alreadyFilled) {
259 fillHist2D(m_histAcceptM[i],std::sqrt(static_cast<float>(invmass2)),std::sqrt(static_cast<float>(deltaR2)));
260 fillHist2D(m_histAcceptEta1Eta2[i],(*tob1)->eta(),(*tob2)->eta());
261 } else if(fillReject) {
262 fillHist2D(m_histRejectM[i],std::sqrt(static_cast<float>(invmass2)),std::sqrt(static_cast<float>(deltaR2)));
263 fillHist2D(m_histRejectEta1Eta2[i],(*tob1)->eta(),(*tob2)->eta());
264 }
265 TRG_MSG_DEBUG("Decision " << i << ": " << (accept?"pass":"fail") << " invmass2 = " << invmass2 << " deltaR2 = " << deltaR2 );
266 }
267 }
268 }
269 } else {
270 TCS_EXCEPTION("InvariantMassInclusiveDeltaRSqrIncl2Charge alg must have 2 inputs, but got " << input.size());
271 }
273}
#define REGISTER_ALG_TCS(CLASS)
Definition AlgFactory.h:62
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)
unsigned int calcDeltaR2BW(const TCS::GenericTOB *tob1, const TCS::GenericTOB *tob2)
unsigned int calcInvMassBW(const TCS::GenericTOB *tob1, const TCS::GenericTOB *tob2)
void defineParameter(const std::string &name, TCS::parType_t value)
unsigned int calcDeltaR2(const TCS::GenericTOB *tob1, const TCS::GenericTOB *tob2)
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_histAcceptM
Definition DecisionAlg.h:75
void setNumberOutputBits(unsigned int numberOutputBits)
Definition DecisionAlg.h:40
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
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_histRejectM
Definition DecisionAlg.h:76
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.