ATLAS Offline Software
Loading...
Searching...
No Matches
InvariantMassDeltaPhiSumEtInclusive1.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4/*********************************
5 * InvariantMassDeltaPhiSumEtInclusive1.cxx
6 * Based on implementation of InvariantMassDeltaPhiInclusive2. For questions contact atlas-trig-l1topo-algcom@cern.ch.
7 *
8 * @brief algorithm calculates the sqr of the INVMASS between all element of a list and applies invmass criteria.
9 * For pairs passing the INVMASS cut a further requirement based on DeltaPhi is applied, addressing ATR-19377
10 *
11**********************************/
12// TO DO size of the input list to be possbly refined
13
18
19#include <cmath>
20
21REGISTER_ALG_TCS(InvariantMassDeltaPhiSumEtInclusive1)
22
23
25{
26 defineParameter("InputWidth", 9);
27 defineParameter("MaxTob", 0);
28 defineParameter("NumResultBits", 6);
29 defineParameter("MinMSqr", 0, 0);
30 defineParameter("MaxMSqr", 999, 0);
31 defineParameter("MinMSqr", 0, 1);
32 defineParameter("MaxMSqr", 999, 1);
33 defineParameter("MinMSqr", 0, 2);
34 defineParameter("MaxMSqr", 999, 2);
35 defineParameter("MinMSqr", 0, 3);
36 defineParameter("MaxMSqr", 999, 3);
37 defineParameter("MinMSqr", 0, 4);
38 defineParameter("MaxMSqr", 999, 4);
39 defineParameter("MinMSqr", 0, 5);
40 defineParameter("MaxMSqr", 999, 5);
41 defineParameter("MinSumEt", 0, 0);
42 defineParameter("MaxSumEt", 999, 0);
43 defineParameter("MinSumEt", 0, 1);
44 defineParameter("MaxSumEt", 999, 1);
45 defineParameter("MinSumEt", 0, 2);
46 defineParameter("MaxSumEt", 999, 2);
47 defineParameter("MinSumEt", 0, 3);
48 defineParameter("MaxSumEt", 999, 3);
49 defineParameter("MinSumEt", 0, 4);
50 defineParameter("MaxSumEt", 999, 4);
51 defineParameter("MinSumEt", 0, 5);
52 defineParameter("MaxSumEt", 999, 5);
53 defineParameter("MinET1",0,0);
54 defineParameter("MinET1",0,1);
55 defineParameter("MinET1",0,2);
56 defineParameter("MinET1",0,3);
57 defineParameter("MinET1",0,4);
58 defineParameter("MinET1",0,5);
59 defineParameter("MinET2",0,0);
60 defineParameter("MinET2",0,1);
61 defineParameter("MinET2",0,2);
62 defineParameter("MinET2",0,3);
63 defineParameter("MinET2",0,4);
64 defineParameter("MinET2",0,5);
65 defineParameter("ApplyEtaCut", 0);
66 defineParameter("MinEta1", 0);
67 defineParameter("MaxEta1", 31);
68 defineParameter("MinEta2", 0);
69 defineParameter("MaxEta2", 31);
70 defineParameter("MinDeltaPhi", 0, 0);
71 defineParameter("MaxDeltaPhi", 31, 0);
72 defineParameter("MinDeltaPhi", 0, 1);
73 defineParameter("MaxDeltaPhi", 31, 1);
74 defineParameter("MinDeltaPhi", 0, 2);
75 defineParameter("MaxDeltaPhi", 31, 2);
76 defineParameter("MinDeltaPhi", 0, 3);
77 defineParameter("MaxDeltaPhi", 31, 3);
78 defineParameter("MinDeltaPhi", 0, 4);
79 defineParameter("MaxDeltaPhi", 31, 4);
80 defineParameter("MinDeltaPhi", 0, 5);
81 defineParameter("MaxDeltaPhi", 31, 5);
82 //does this need to change?
84}
85
87
88
91 p_NumberLeading = parameter("InputWidth").value();
92 if(parameter("MaxTob").value() > 0) p_NumberLeading = parameter("MaxTob").value();
93
94 for(unsigned int i=0; i<numberOutputBits(); ++i) {
95 p_InvMassMin[i] = parameter("MinMSqr", i).value();
96 p_InvMassMax[i] = parameter("MaxMSqr", i).value();
97 p_SumEtMin[i] = parameter("MinSumEt", i).value();
98 p_SumEtMax[i] = parameter("MaxSumEt", i).value();
99 p_DeltaPhiMin[i] = parameter("MinDeltaPhi", i).value();
100 p_DeltaPhiMax[i] = parameter("MaxDeltaPhi", i).value();
101 p_MinET1[i] = parameter("MinET1",i).value();
102 p_MinET2[i] = parameter("MinET2",i).value();
103 }
104
105 TRG_MSG_INFO("NumberLeading : " << p_NumberLeading);
106 for(unsigned int i=0; i<numberOutputBits(); ++i) {
107 TRG_MSG_INFO("InvMassMin : " << p_InvMassMin[i]);
108 TRG_MSG_INFO("InvMassMax : " << p_InvMassMax[i]);
109 TRG_MSG_INFO("SumEtMin : " << p_SumEtMin[i]);
110 TRG_MSG_INFO("SumEtMax : " << p_SumEtMax[i]);
111 TRG_MSG_INFO("DeltaPhiMin : " << p_DeltaPhiMin[i]);
112 TRG_MSG_INFO("DeltaPhiMax : " << p_DeltaPhiMax[i]);
113 TRG_MSG_INFO("MinET1 : " << p_MinET1[i]);
114 TRG_MSG_INFO("MinET2 : " << p_MinET2[i]);
115 }
116
117 p_ApplyEtaCut = parameter("ApplyEtaCut").value();
118 p_MinEta1 = parameter("MinEta1" ).value();
119 p_MaxEta1 = parameter("MaxEta1" ).value();
120 p_MinEta2 = parameter("MinEta2" ).value();
121 p_MaxEta2 = parameter("MaxEta2" ).value();
122 TRG_MSG_INFO("ApplyEtaCut : "<<p_ApplyEtaCut );
123 TRG_MSG_INFO("MinEta1 : "<<p_MinEta1 );
124 TRG_MSG_INFO("MaxEta1 : "<<p_MaxEta1 );
125 TRG_MSG_INFO("MinEta2 : "<<p_MinEta2 );
126 TRG_MSG_INFO("MaxEta2 : "<<p_MaxEta2 );
127
128 TRG_MSG_INFO("number output : " << numberOutputBits());
129
130 // book histograms
131 for(unsigned int i=0; i<numberOutputBits(); ++i) {
132 std::string hname_accept = "hInvariantMassDeltaPhiSumEtInclusive1_accept_bit"+std::to_string((int)i);
133 std::string hname_reject = "hInvariantMassDeltaPhiSumEtInclusive1_reject_bit"+std::to_string((int)i);
134 // mass
135 bookHist(m_histAcceptM, hname_accept, "INVM vs DPHI", 100, sqrt(p_InvMassMin[i]), sqrt(p_InvMassMax[i]), 100, p_DeltaPhiMin[i], p_DeltaPhiMax[i]);
136 bookHist(m_histRejectM, hname_reject, "INVM vs DPHI", 100, sqrt(p_InvMassMin[i]), sqrt(p_InvMassMax[i]), 100, p_DeltaPhiMin[i], p_DeltaPhiMax[i]);
137 // eta2 vs. eta1
138 bookHist(m_histAcceptEta1Eta2, hname_accept, "ETA vs ETA", 100, p_MinEta1, p_MaxEta1, 100, p_MinEta2, p_MaxEta2);
139 bookHist(m_histRejectEta1Eta2, hname_reject, "ETA vs ETA", 100, p_MinEta1, p_MaxEta1, 100, p_MinEta2, p_MaxEta2);
140 }
141 return StatusCode::SUCCESS;
142}
143
144
145
147TCS::InvariantMassDeltaPhiSumEtInclusive1::processBitCorrect( const std::vector<TCS::TOBArray const *> & input,
148 const std::vector<TCS::TOBArray *> & output,
149 Decision & decision )
150{
151 int k=0; int j;
152 if( input.size() == 1) {
153 for( TOBArray::const_iterator tob1 = input[0]->begin();
154 tob1 != input[0]->end() && distance(input[0]->begin(), tob1) < p_NumberLeading;
155 ++tob1)
156 {
157 k++; j=0;
158 if (p_NumberLeading < input[0]->size()) {
159 TCS::TOBArray::const_iterator tob1_plus1 = tob1; ++tob1_plus1;
160 if ((*tob1)->Et() == (*tob1_plus1)->Et() && distance(input[0]->begin(), tob1) == p_NumberLeading - 1) {
161 for(unsigned int i=0; i<numberOutputBits(); ++i) {
162 output[i]->setAmbiguityFlag(true);
163 }
164 }
165 }
166 for( TCS::TOBArray::const_iterator tob2 = input[0]->begin();
167 tob2 != input[0]->end() && distance(input[0]->begin(), tob2) < p_NumberLeading;
168 ++tob2) {
169 j++; if(j==k) continue; //Avoid diagonal cases. Both above and below diagonal cases are calculated due to asymmetric ET and eta cuts
170
171 // Inv Mass calculation
172 unsigned int invmass2 = calcInvMassBW( *tob1, *tob2 );
173 // test DeltaPhiMin, DeltaPhiMax
174 unsigned int deltaPhi = calcDeltaPhiBW( *tob1, *tob2 );
175 const int eta1 = (*tob1)->eta();
176 const int eta2 = (*tob2)->eta();
177 const unsigned int aeta1 = std::abs(eta1);
178 const unsigned int aeta2 = std::abs(eta2);
179 for(unsigned int i=0; i<numberOutputBits(); ++i) {
180 bool accept = false;
181 if( parType_t((*tob1)->Et()) + parType_t((*tob2)->Et()) <= p_SumEtMin[i] ) continue; // MinSumEt cut (accepted range is *exclusive* of the threshold value)
182 if( parType_t((*tob1)->Et()) + parType_t((*tob2)->Et()) > p_SumEtMax[i] ) continue; // MaxSumEt cut (accepted range is *inclusive* of the threshold value)
183 if( parType_t((*tob1)->Et()) <= p_MinET1[i]) continue; // ET cut
184 if( parType_t((*tob2)->Et()) <= p_MinET2[i]) continue; // ET cut
185 if(p_ApplyEtaCut &&
186 ((aeta1 < p_MinEta1 || aeta1 > p_MaxEta1 ) ||
187 (aeta2 < p_MinEta2 || aeta2 > p_MaxEta2 ) )) continue;
188 accept = invmass2 >= p_InvMassMin[i] && invmass2 <= p_InvMassMax[i] && deltaPhi >= p_DeltaPhiMin[i] && deltaPhi <= p_DeltaPhiMax[i];
189 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(i) : accept);
190 const bool fillReject = fillHistos() and not fillAccept;
191 const bool alreadyFilled = decision.bit(i);
192 if( accept ) {
193 decision.setBit(i, true);
194 output[i]->push_back( TCS::CompositeTOB(*tob1, *tob2) );
195 }
196 if(fillAccept and not alreadyFilled) {
197 fillHist2D(m_histAcceptM[i],sqrt((float)invmass2),(float)deltaPhi);
198 fillHist2D(m_histAcceptEta1Eta2[i],eta1, eta2);
199 } else if(fillReject) {
200 fillHist2D(m_histRejectM[i],sqrt((float)invmass2),(float)deltaPhi);
201 fillHist2D(m_histRejectEta1Eta2[i],eta1, eta2);
202 }
203 TRG_MSG_DEBUG("Decision " << i << ": " << (accept?"pass":"fail") << " invmass2 = " << invmass2);
204 }
205 }
206 }
207 for (unsigned int i=0; i < numberOutputBits(); ++i) {
208 bool hasAmbiguousInputs = TSU::isAmbiguousTruncation(input[0], p_NumberLeading, p_MinET1[i])
210 output[i]->setAmbiguityFlag(hasAmbiguousInputs);
211 }
212 } else {
213
214 TCS_EXCEPTION("InvariantMassDeltaPhiSumEtInclusive1 alg must have 1 inputs, but got " << input.size());
215
216 }
218
219}
220
222TCS::InvariantMassDeltaPhiSumEtInclusive1::process( const std::vector<TCS::TOBArray const *> & input,
223 const std::vector<TCS::TOBArray *> & output,
224 Decision & decision )
225{
226
227
228 if( input.size() == 1) {
229 int k=0; int j;
230 for( TOBArray::const_iterator tob1 = input[0]->begin();
231 tob1 != input[0]->end() && distance(input[0]->begin(), tob1) < p_NumberLeading;
232 ++tob1)
233 {
234 k++; j=0;
235 if (p_NumberLeading < input[0]->size()) {
236 TCS::TOBArray::const_iterator tob1_plus1 = tob1; ++tob1_plus1;
237 if ((*tob1)->Et() == (*tob1_plus1)->Et() && distance(input[0]->begin(), tob1) == p_NumberLeading - 1) {
238 for(unsigned int i=0; i<numberOutputBits(); ++i) {
239 output[i]->setAmbiguityFlag(true);
240 }
241 }
242 }
243 for( TCS::TOBArray::const_iterator tob2 = input[0]->begin();
244 tob2 != input[0]->end() && distance(input[0]->begin(), tob2) < p_NumberLeading;
245 ++tob2) {
246 j++; if (j==k) continue; //Avoid diagonal cases. Both above and below diagonal cases are calculated due to asymmetric ET and eta cuts
247 // Inv Mass calculation
248 unsigned int invmass2 = calcInvMass( *tob1, *tob2 );
249 // test DeltaPhiMin, DeltaPhiMax
250 unsigned int deltaPhi = calcDeltaPhi( *tob1, *tob2 );
251 const int eta1 = (*tob1)->eta();
252 const int eta2 = (*tob2)->eta();
253 const unsigned int aeta1 = std::abs(eta1);
254 const unsigned int aeta2 = std::abs(eta2);
255 for(unsigned int i=0; i<numberOutputBits(); ++i) {
256 bool accept = false;
257 if( parType_t((*tob1)->Et()) + parType_t((*tob2)->Et()) <= p_SumEtMin[i] ) continue; // MinSumEt cut
258 if( parType_t((*tob1)->Et()) + parType_t((*tob2)->Et()) >= p_SumEtMax[i] ) continue; // MaxSumEt cut
259 if( parType_t((*tob1)->Et()) <= p_MinET1[i]) continue; // ET cut
260 if( parType_t((*tob2)->Et()) <= p_MinET2[i]) continue; // ET cut
261 if(p_ApplyEtaCut &&
262 ((aeta1 < p_MinEta1 || aeta1 > p_MaxEta1 ) ||
263 (aeta2 < p_MinEta2 || aeta2 > p_MaxEta2 ) )) continue;
264 accept = invmass2 >= p_InvMassMin[i] && invmass2 <= p_InvMassMax[i] && deltaPhi >= p_DeltaPhiMin[i] && deltaPhi <= p_DeltaPhiMax[i];
265 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(i) : accept);
266 const bool fillReject = fillHistos() and not fillAccept;
267 const bool alreadyFilled = decision.bit(i);
268 if( accept ) {
269 decision.setBit(i, true);
270 output[i]->push_back( TCS::CompositeTOB(*tob1, *tob2) );
271 }
272 if(fillAccept and not alreadyFilled) {
273 fillHist2D(m_histAcceptM[i],sqrt((float)invmass2),(float)deltaPhi);
274 fillHist2D(m_histAcceptEta1Eta2[i],eta1, eta2);
275 } else if(fillReject) {
276 fillHist2D(m_histRejectM[i],sqrt((float)invmass2),(float)deltaPhi);
277 fillHist2D(m_histRejectEta1Eta2[i],eta1, eta2);
278 }
279 TRG_MSG_DEBUG("Decision " << i << ": " << (accept ?"pass":"fail") << " invmass2 = " << invmass2);
280 }
281 }
282 }
283 } else {
284 TCS_EXCEPTION("InvariantMassDeltaPhiSumEtInclusive1 alg must have 1 inputs, but got " << input.size());
285 }
287}
#define REGISTER_ALG_TCS(CLASS)
Definition AlgFactory.h:62
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
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 calcDeltaPhiBW(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 calcDeltaPhi(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.