ATLAS Offline Software
Loading...
Searching...
No Matches
InvariantMassDeltaPhiInclusive2.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 * InvariantMassDeltaPhiInclusive2.cxx
6 * Based on V Sorin 2014 implementation of InvariantMassInclusive2. For questions contact atlas-trig-l1topo-algcom@cern.ch.
7 *
8 * @brief algorithm calculates the sqr of the INVMASS between two lists and applies invmass criteria. For pairs passing the INVMASS cut a further requirement based on DeltaPhi
9 * 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(InvariantMassDeltaPhiInclusive2)
22
23
25{
26 defineParameter("InputWidth1", 9);
27 defineParameter("InputWidth2", 9);
28 defineParameter("MaxTob1", 0);
29 defineParameter("MaxTob2", 0);
30 defineParameter("NumResultBits", 6);
31 defineParameter("MinMSqr", 0, 0);
32 defineParameter("MaxMSqr", 999, 0);
33 defineParameter("MinMSqr", 0, 1);
34 defineParameter("MaxMSqr", 999, 1);
35 defineParameter("MinMSqr", 0, 2);
36 defineParameter("MaxMSqr", 999, 2);
37 defineParameter("MinMSqr", 0, 3);
38 defineParameter("MaxMSqr", 999, 3);
39 defineParameter("MinMSqr", 0, 4);
40 defineParameter("MaxMSqr", 999, 4);
41 defineParameter("MinMSqr", 0, 5);
42 defineParameter("MaxMSqr", 999, 5);
43 defineParameter("MinET1",0,0);
44 defineParameter("MinET2",0,0);
45 defineParameter("MinET1",0,1);
46 defineParameter("MinET2",0,1);
47 defineParameter("MinET1",0,2);
48 defineParameter("MinET2",0,2);
49 defineParameter("MinET1",0,3);
50 defineParameter("MinET2",0,3);
51 defineParameter("MinET1",0,4);
52 defineParameter("MinET2",0,4);
53 defineParameter("MinET1",0,5);
54 defineParameter("MinET2",0,5);
55 defineParameter("ApplyEtaCut", 0);
56 defineParameter("MinEta1", 0);
57 defineParameter("MaxEta1", 31);
58 defineParameter("MinEta2", 0);
59 defineParameter("MaxEta2", 31);
60 defineParameter("MinDeltaPhi", 0, 0);
61 defineParameter("MaxDeltaPhi", 31, 0);
62 defineParameter("MinDeltaPhi", 0, 1);
63 defineParameter("MaxDeltaPhi", 31, 1);
64 defineParameter("MinDeltaPhi", 0, 2);
65 defineParameter("MaxDeltaPhi", 31, 2);
66 defineParameter("MinDeltaPhi", 0, 3);
67 defineParameter("MaxDeltaPhi", 31, 3);
68 defineParameter("MinDeltaPhi", 0, 4);
69 defineParameter("MaxDeltaPhi", 31, 4);
70 defineParameter("MinDeltaPhi", 0, 5);
71 defineParameter("MaxDeltaPhi", 31, 5);
72 //does this need to change?
74}
75
77
78
81 p_NumberLeading1 = parameter("InputWidth1").value();
82 p_NumberLeading2 = parameter("InputWidth2").value();
83 if(parameter("MaxTob1").value() > 0) p_NumberLeading1 = parameter("MaxTob1").value();
84 if(parameter("MaxTob2").value() > 0) p_NumberLeading2 = parameter("MaxTob2").value();
85
86 for(unsigned int i=0; i<numberOutputBits(); ++i) {
87 p_InvMassMin[i] = parameter("MinMSqr", i).value();
88 p_InvMassMax[i] = parameter("MaxMSqr", i).value();
89 p_DeltaPhiMin[i] = parameter("MinDeltaPhi", i).value();
90 p_DeltaPhiMax[i] = parameter("MaxDeltaPhi", i).value();
91 p_MinET1[i] = parameter("MinET1",i).value();
92 p_MinET2[i] = parameter("MinET2",i).value();
93 }
94
95 TRG_MSG_INFO("NumberLeading1 : " << p_NumberLeading1);
96 TRG_MSG_INFO("NumberLeading2 : " << p_NumberLeading2);
97 for(unsigned int i=0; i<numberOutputBits(); ++i) {
98 TRG_MSG_INFO("InvMassMin : " << p_InvMassMin[i]);
99 TRG_MSG_INFO("InvMassMax : " << p_InvMassMax[i]);
100 TRG_MSG_INFO("DeltaPhiMin : " << p_DeltaPhiMin[i]);
101 TRG_MSG_INFO("DeltaPhiMax : " << p_DeltaPhiMax[i]);
102 TRG_MSG_INFO("MinET1 : " << p_MinET1[i]);
103 TRG_MSG_INFO("MinET2 : " << p_MinET2[i]);
104 }
105
106 p_ApplyEtaCut = parameter("ApplyEtaCut").value();
107 p_MinEta1 = parameter("MinEta1" ).value();
108 p_MaxEta1 = parameter("MaxEta1" ).value();
109 p_MinEta2 = parameter("MinEta2" ).value();
110 p_MaxEta2 = parameter("MaxEta2" ).value();
111 TRG_MSG_INFO("ApplyEtaCut : "<<p_ApplyEtaCut );
112 TRG_MSG_INFO("MinEta1 : "<<p_MinEta1 );
113 TRG_MSG_INFO("MaxEta1 : "<<p_MaxEta1 );
114 TRG_MSG_INFO("MinEta2 : "<<p_MinEta2 );
115 TRG_MSG_INFO("MaxEta2 : "<<p_MaxEta2 );
116
117 TRG_MSG_INFO("number output : " << numberOutputBits());
118
119 // book histograms
120 for(unsigned int i=0; i<numberOutputBits(); ++i) {
121 std::string hname_accept = "hInvariantMassDeltaPhiInclusive2_accept_bit"+std::to_string((int)i);
122 std::string hname_reject = "hInvariantMassDeltaPhiInclusive2_reject_bit"+std::to_string((int)i);
123 // mass
124 bookHist(m_histAcceptM, hname_accept, "INVM vs DPHI", 100, sqrt(p_InvMassMin[i]), sqrt(p_InvMassMax[i]), 100, p_DeltaPhiMin[i], p_DeltaPhiMax[i]);
125 bookHist(m_histRejectM, hname_reject, "INVM vs DPHI", 100, sqrt(p_InvMassMin[i]), sqrt(p_InvMassMax[i]), 100, p_DeltaPhiMin[i], p_DeltaPhiMax[i]);
126 // eta2 vs. eta1
127 bookHist(m_histAcceptEta1Eta2, hname_accept, "ETA vs ETA", 100, p_MinEta1, p_MaxEta1, 100, p_MinEta2, p_MaxEta2);
128 bookHist(m_histRejectEta1Eta2, hname_reject, "ETA vs ETA", 100, p_MinEta1, p_MaxEta1, 100, p_MinEta2, p_MaxEta2);
129 }
130 return StatusCode::SUCCESS;
131}
132
133
134
136TCS::InvariantMassDeltaPhiInclusive2::processBitCorrect( const std::vector<TCS::TOBArray const *> & input,
137 const std::vector<TCS::TOBArray *> & output,
138 Decision & decision )
139{
140
141 if( input.size() == 2) {
142 for( TOBArray::const_iterator tob1 = input[0]->begin();
143 tob1 != input[0]->end() && distance(input[0]->begin(), tob1) < p_NumberLeading1;
144 ++tob1)
145 {
146 if (p_NumberLeading1 < input[0]->size()) {
147 TCS::TOBArray::const_iterator tob1_plus1 = tob1; ++tob1_plus1;
148 if ((*tob1)->Et() == (*tob1_plus1)->Et() && distance(input[0]->begin(), tob1) == p_NumberLeading1 - 1) {
149 for(unsigned int i=0; i<numberOutputBits(); ++i) {
150 output[i]->setAmbiguityFlag(true);
151 }
152 }
153 }
154 for( TCS::TOBArray::const_iterator tob2 = input[1]->begin();
155 tob2 != input[1]->end() && distance(input[1]->begin(), tob2) < p_NumberLeading2;
156 ++tob2) {
157 // Inv Mass calculation
158 unsigned int invmass2 = calcInvMassBW( *tob1, *tob2 );
159 // test DeltaPhiMin, DeltaPhiMax
160 unsigned int deltaPhi = calcDeltaPhiBW( *tob1, *tob2 );
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 for(unsigned int i=0; i<numberOutputBits(); ++i) {
166 bool accept = false;
167 if( parType_t((*tob1)->Et()) <= p_MinET1[i]) continue; // ET cut
168 if( parType_t((*tob2)->Et()) <= p_MinET2[i]) continue; // ET cut
169 if(p_ApplyEtaCut &&
170 ((aeta1 < p_MinEta1 || aeta1 > p_MaxEta1 ) ||
171 (aeta2 < p_MinEta2 || aeta2 > p_MaxEta2 ) )) continue;
172 accept = invmass2 >= p_InvMassMin[i] && invmass2 <= p_InvMassMax[i] && deltaPhi >= p_DeltaPhiMin[i] && deltaPhi <= p_DeltaPhiMax[i];
173 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(i) : accept);
174 const bool fillReject = fillHistos() and not fillAccept;
175 const bool alreadyFilled = decision.bit(i);
176 if( accept ) {
177 decision.setBit(i, true);
178 output[i]->push_back( TCS::CompositeTOB(*tob1, *tob2) );
179 }
180 if(fillAccept and not alreadyFilled) {
181 fillHist2D(m_histAcceptM[i],sqrt((float)invmass2),(float)deltaPhi);
182 fillHist2D(m_histAcceptEta1Eta2[i],eta1, eta2);
183 } else if(fillReject) {
184 fillHist2D(m_histRejectM[i],sqrt((float)invmass2),(float)deltaPhi);
185 fillHist2D(m_histRejectEta1Eta2[i],eta1, eta2);
186 }
187 TRG_MSG_DEBUG("Decision " << i << ": " << (accept?"pass":"fail") << " invmass2 = " << invmass2);
188 }
189 }
190 }
191 for (unsigned int i=0; i < numberOutputBits(); ++i) {
192 bool hasAmbiguousInputs = TSU::isAmbiguousTruncation(input[0], p_NumberLeading1, p_MinET1[i])
194 output[i]->setAmbiguityFlag(hasAmbiguousInputs);
195 }
196 } else {
197
198 TCS_EXCEPTION("InvariantMassDeltaPhiInclusive2 alg must have 2 inputs, but got " << input.size());
199
200 }
202
203}
204
206TCS::InvariantMassDeltaPhiInclusive2::process( const std::vector<TCS::TOBArray const *> & input,
207 const std::vector<TCS::TOBArray *> & output,
208 Decision & decision )
209{
210
211
212 if( input.size() == 2) {
213 for( TOBArray::const_iterator tob1 = input[0]->begin();
214 tob1 != input[0]->end() && distance(input[0]->begin(), tob1) < p_NumberLeading1;
215 ++tob1)
216 {
217 if (p_NumberLeading1 < input[0]->size()) {
218 TCS::TOBArray::const_iterator tob1_plus1 = tob1; ++tob1_plus1;
219 if ((*tob1)->Et() == (*tob1_plus1)->Et() && distance(input[0]->begin(), tob1) == p_NumberLeading1 - 1) {
220 for(unsigned int i=0; i<numberOutputBits(); ++i) {
221 output[i]->setAmbiguityFlag(true);
222 }
223 }
224 }
225 for( TCS::TOBArray::const_iterator tob2 = input[1]->begin();
226 tob2 != input[1]->end() && distance(input[1]->begin(), tob2) < p_NumberLeading2;
227 ++tob2) {
228 // Inv Mass calculation
229 unsigned int invmass2 = calcInvMass( *tob1, *tob2 );
230 // test DeltaPhiMin, DeltaPhiMax
231 unsigned int deltaPhi = calcDeltaPhi( *tob1, *tob2 );
232 const int eta1 = (*tob1)->eta();
233 const int eta2 = (*tob2)->eta();
234 const unsigned int aeta1 = std::abs(eta1);
235 const unsigned int aeta2 = std::abs(eta2);
236 for(unsigned int i=0; i<numberOutputBits(); ++i) {
237 if( parType_t((*tob1)->Et()) <= p_MinET1[i]) continue; // ET cut
238 if( parType_t((*tob2)->Et()) <= p_MinET2[i]) continue; // ET cut
239 if(p_ApplyEtaCut &&
240 ((aeta1 < p_MinEta1 || aeta1 > p_MaxEta1 ) ||
241 (aeta2 < p_MinEta2 || aeta2 > p_MaxEta2 ) )) continue;
242 bool accept = invmass2 >= p_InvMassMin[i] && invmass2 <= p_InvMassMax[i] && deltaPhi >= p_DeltaPhiMin[i] && deltaPhi <= p_DeltaPhiMax[i];
243 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(i) : accept);
244 const bool fillReject = fillHistos() and not fillAccept;
245 const bool alreadyFilled = decision.bit(i);
246 if( accept ) {
247 decision.setBit(i, true);
248 output[i]->push_back( TCS::CompositeTOB(*tob1, *tob2) );
249 }
250 if(fillAccept and not alreadyFilled) {
251 fillHist2D(m_histAcceptM[i],sqrt((float)invmass2),(float)deltaPhi);
252 fillHist2D(m_histAcceptEta1Eta2[i],eta1, eta2);
253 } else if(fillReject) {
254 fillHist2D(m_histRejectM[i],sqrt((float)invmass2),(float)deltaPhi);
255 fillHist2D(m_histRejectEta1Eta2[i],eta1, eta2);
256 }
257 TRG_MSG_DEBUG("Decision " << i << ": " << (accept ?"pass":"fail") << " invmass2 = " << invmass2);
258 }
259 }
260 }
261 } else {
262 TCS_EXCEPTION("InvariantMassDeltaPhiInclusive2 alg must have 2 inputs, but got " << input.size());
263 }
265}
#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 processBitCorrect(const std::vector< TCS::TOBArray const * > &input, const std::vector< TCS::TOBArray * > &output, Decision &decison) override final
virtual StatusCode process(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.