ATLAS Offline Software
Loading...
Searching...
No Matches
InvariantMassInclusiveDeltaRSqrIncl2.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 * Based on InvariantMassInclusive2 and DeltaRSqrIncl2. 01/03/2019.
6 * Created by V Sorin and Joerg Stelzer 2014.
7 *
8 * @brief algorithm calculates the sqr of the INVMASS and DeltaR between two lists and applies invmass and deltaR criteria
9 *
10 * @param NumberLeading
11 *
12 * For questions contact atlas-trig-l1topo-algcom@cern.ch.
13**********************************/
14
15
20
21#include <cmath>
22
23REGISTER_ALG_TCS(InvariantMassInclusiveDeltaRSqrIncl2)
24
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 p_NumberLeading1 = parameter("InputWidth1").value();
86 p_NumberLeading2 = parameter("InputWidth2").value();
87 if(parameter("MaxTob1").value() > 0) p_NumberLeading1 = parameter("MaxTob1").value();
88 if(parameter("MaxTob2").value() > 0) p_NumberLeading2 = parameter("MaxTob2").value();
89 TRG_MSG_INFO("NumberLeading1 : " << p_NumberLeading1);
90 TRG_MSG_INFO("NumberLeading2 : " << p_NumberLeading2);
91
92 for(unsigned int i=0; i<numberOutputBits(); ++i) {
93
94 p_InvMassMin[i] = parameter("MinMSqr", i).value();
95 p_InvMassMax[i] = parameter("MaxMSqr", i).value();
96 p_MinET1[i] = parameter("MinET1",i).value();
97 p_MinET2[i] = parameter("MinET2",i).value();
98 p_DeltaRMin[i] = parameter("DeltaRMin", i).value();
99 p_DeltaRMax[i] = parameter("DeltaRMax", i).value();
100
101 TRG_MSG_INFO("InvMassMin "<< i << " : " << p_InvMassMin[i]);
102 TRG_MSG_INFO("InvMassMax "<< i << " : " << p_InvMassMax[i]);
103 TRG_MSG_INFO("MinET1 "<< i << " : " << p_MinET1[i]);
104 TRG_MSG_INFO("MinET2 "<< i << " : " << p_MinET2[i]);
105 TRG_MSG_INFO("DeltaRMin "<< i << " : " << p_DeltaRMin[i]);
106 TRG_MSG_INFO("DeltaRMax "<< i << " : " << p_DeltaRMax[i]);
107
108 }
109
110 p_ApplyEtaCut = parameter("ApplyEtaCut").value();
111 p_MinEta1 = parameter("MinEta1" ).value();
112 p_MaxEta1 = parameter("MaxEta1" ).value();
113 p_MinEta2 = parameter("MinEta2" ).value();
114 p_MaxEta2 = parameter("MaxEta2" ).value();
115 TRG_MSG_INFO("ApplyEtaCut : "<<p_ApplyEtaCut );
116 TRG_MSG_INFO("MinEta1 : "<<p_MinEta1 );
117 TRG_MSG_INFO("MaxEta1 : "<<p_MaxEta1 );
118 TRG_MSG_INFO("MinEta2 : "<<p_MinEta2 );
119 TRG_MSG_INFO("MaxEta2 : "<<p_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 = "hInvariantMassInclusiveDeltaRSqrIncl2_accept_bit"+std::to_string((int)i);
126 std::string hname_reject = "hInvariantMassInclusiveDeltaRSqrIncl2_reject_bit"+std::to_string((int)i);
127 // mass
128 bookHist(m_histAcceptM, hname_accept, "INVM vs DR", 100, sqrt(p_InvMassMin[i]), sqrt(p_InvMassMax[i]), 100, sqrt(p_DeltaRMin[i]), sqrt(p_DeltaRMax[i]));
129 bookHist(m_histRejectM, hname_reject, "INVM vs DR", 100, sqrt(p_InvMassMin[i]), sqrt(p_InvMassMax[i]), 100, sqrt(p_DeltaRMin[i]), sqrt(p_DeltaRMax[i]));
130
131 }
132
133 return StatusCode::SUCCESS;
134}
135
136
137
139TCS::InvariantMassInclusiveDeltaRSqrIncl2::processBitCorrect( const std::vector<TCS::TOBArray const *> & input,
140 const std::vector<TCS::TOBArray *> & output,
141 Decision & decision )
142{
143
144 if( input.size() == 2) {
145 for( TOBArray::const_iterator tob1 = input[0]->begin();
146 tob1 != input[0]->end() && distance(input[0]->begin(), tob1) < p_NumberLeading1;
147 ++tob1)
148 {
149
150
151 for( TCS::TOBArray::const_iterator tob2 = input[1]->begin();
152 tob2 != input[1]->end() && distance(input[1]->begin(), tob2) < p_NumberLeading2;
153 ++tob2) {
154 // Inv Mass calculation
155 unsigned int invmass2 = calcInvMassBW( *tob1, *tob2 );
156 // test DeltaR2Min, DeltaR2Max
157 unsigned int deltaR2 = calcDeltaR2BW( *tob1, *tob2 );
158 TRG_MSG_DEBUG("Jet1 = " << **tob1 << ", Jet2 = " << **tob2 << ", invmass2 = " << invmass2 << ", deltaR2 = " << deltaR2);
159 const int eta1 = (*tob1)->eta();
160 const int eta2 = (*tob2)->eta();
161 const unsigned int aeta1 = std::abs(eta1);
162 const unsigned int aeta2 = std::abs(eta2);
163 for(unsigned int i=0; i<numberOutputBits(); ++i) {
164 bool accept = false;
165 if( parType_t((*tob1)->Et()) <= p_MinET1[i]) continue; // ET cut
166 if( parType_t((*tob2)->Et()) <= p_MinET2[i]) continue; // ET cut
167 if(p_ApplyEtaCut &&
168 ((aeta1 < p_MinEta1 || aeta1 > p_MaxEta1 ) ||
169 (aeta2 < p_MinEta2 || aeta2 > p_MaxEta2 ) )) continue;
170 accept = invmass2 >= p_InvMassMin[i] && invmass2 <= p_InvMassMax[i] && deltaR2 >= p_DeltaRMin[i] && deltaR2 <= p_DeltaRMax[i];
171 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(i) : accept);
172 const bool fillReject = fillHistos() and not fillAccept;
173 const bool alreadyFilled = decision.bit(i);
174 if( accept ) {
175 decision.setBit(i, true);
176 output[i]->push_back( TCS::CompositeTOB(*tob1, *tob2) );
177 }
178 if(fillAccept and not alreadyFilled) {
179 fillHist2D(m_histAcceptM[i],sqrt((float)invmass2),sqrt((float)deltaR2));
180 } else if(fillReject) {
181 fillHist2D(m_histRejectM[i],sqrt((float)invmass2),sqrt((float)deltaR2));
182 }
183 TRG_MSG_DEBUG("Decision " << i << ": " << (accept?"pass":"fail") << " invmass2 = " << invmass2 << " deltaR2 = " << deltaR2 );
184 }
185 }
186 }
187 for (unsigned int i=0; i < numberOutputBits(); ++i) {
188 bool hasAmbiguousInputs = TSU::isAmbiguousTruncation(input[0], p_NumberLeading1, p_MinET1[i])
190 output[i]->setAmbiguityFlag(hasAmbiguousInputs);
191 }
192 } else {
193
194 TCS_EXCEPTION("InvariantMassInclusiveDeltaRSqrIncl2 alg must have 2 inputs, but got " << input.size());
195
196 }
198
199}
200
202TCS::InvariantMassInclusiveDeltaRSqrIncl2::process( const std::vector<TCS::TOBArray const *> & input,
203 const std::vector<TCS::TOBArray *> & output,
204 Decision & decision )
205{
206
207
208 if( input.size() == 2) {
209 for( TOBArray::const_iterator tob1 = input[0]->begin();
210 tob1 != input[0]->end() && distance(input[0]->begin(), tob1) < p_NumberLeading1;
211 ++tob1)
212 {
213 for( TCS::TOBArray::const_iterator tob2 = input[1]->begin();
214 tob2 != input[1]->end() && distance(input[1]->begin(), tob2) < p_NumberLeading2;
215 ++tob2) {
216 // Inv Mass calculation
217 unsigned int invmass2 = calcInvMass( *tob1, *tob2 );
218 // test DeltaR2Min, DeltaR2Max
219 unsigned int deltaR2 = calcDeltaR2( *tob1, *tob2 );
220 TRG_MSG_DEBUG("Jet1 = " << **tob1 << ", Jet2 = " << **tob2 << ", invmass2 = " << invmass2 << ", deltaR2 = " << deltaR2);
221 const int eta1 = (*tob1)->eta();
222 const int eta2 = (*tob2)->eta();
223 const unsigned int aeta1 = std::abs(eta1);
224 const unsigned int aeta2 = std::abs(eta2);
225 for(unsigned int i=0; i<numberOutputBits(); ++i) {
226 if( parType_t((*tob1)->Et()) <= p_MinET1[i]) continue; // ET cut
227 if( parType_t((*tob2)->Et()) <= p_MinET2[i]) continue; // ET cut
228 if(p_ApplyEtaCut &&
229 ((aeta1 < p_MinEta1 || aeta1 > p_MaxEta1 ) ||
230 (aeta2 < p_MinEta2 || aeta2 > p_MaxEta2 ) )) continue;
231 bool accept = invmass2 >= p_InvMassMin[i] && invmass2 <= p_InvMassMax[i] && deltaR2 >= p_DeltaRMin[i] && deltaR2 <= p_DeltaRMax[i];
232 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(i) : accept);
233 const bool fillReject = fillHistos() and not fillAccept;
234 const bool alreadyFilled = decision.bit(i);
235 if( accept ) {
236 decision.setBit(i, true);
237 output[i]->push_back( TCS::CompositeTOB(*tob1, *tob2) );
238 }
239 if(fillAccept and not alreadyFilled) {
240 fillHist2D(m_histAcceptM[i],sqrt((float)invmass2),sqrt((float)deltaR2));
241 } else if(fillReject) {
242 fillHist2D(m_histRejectM[i],sqrt((float)invmass2),sqrt((float)deltaR2));
243 }
244 TRG_MSG_DEBUG("Decision " << i << ": " << (accept?"pass":"fail") << " invmass2 = " << invmass2 << " deltaR2 = " << deltaR2 );
245 }
246 }
247 }
248 } else {
249 TCS_EXCEPTION("InvariantMassInclusiveDeltaRSqrIncl2 alg must have 2 inputs, but got " << input.size());
250 }
252}
#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_histAcceptM
Definition DecisionAlg.h:75
void setNumberOutputBits(unsigned int numberOutputBits)
Definition DecisionAlg.h:40
DecisionAlg(const std::string &name)
Definition DecisionAlg.h:25
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.