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);
83 setNumberOutputBits(6);
91 p_NumberLeading = parameter(
"InputWidth").value();
92 if(parameter(
"MaxTob").
value() > 0) p_NumberLeading = parameter(
"MaxTob").value();
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();
106 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
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();
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);
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]);
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);
148 const std::vector<TCS::TOBArray *> & output,
152 if( input.size() == 1) {
154 tob1 != input[0]->end() &&
distance(input[0]->
begin(), tob1) < p_NumberLeading;
158 if (p_NumberLeading < input[0]->
size()) {
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);
167 tob2 != input[0]->end() &&
distance(input[0]->
begin(), tob2) < p_NumberLeading;
169 j++;
if(j==
k)
continue;
172 unsigned int invmass2 = calcInvMassBW( *tob1, *tob2 );
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) {
183 if(
parType_t((*tob1)->Et()) <= p_MinET1[
i])
continue;
184 if(
parType_t((*tob2)->Et()) <= p_MinET2[
i])
continue;
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);
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);
203 TRG_MSG_DEBUG(
"Decision " <<
i <<
": " << (
accept?
"pass":
"fail") <<
" invmass2 = " << invmass2);
207 for (
unsigned int i=0;
i < numberOutputBits(); ++
i) {
210 output[
i]->setAmbiguityFlag(hasAmbiguousInputs);
214 TCS_EXCEPTION(
"InvariantMassDeltaPhiSumEtInclusive1 alg must have 1 inputs, but got " << input.size());
223 const std::vector<TCS::TOBArray *> & output,
228 if( input.size() == 1) {
231 tob1 != input[0]->end() &&
distance(input[0]->
begin(), tob1) < p_NumberLeading;
235 if (p_NumberLeading < input[0]->
size()) {
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);
244 tob2 != input[0]->end() &&
distance(input[0]->
begin(), tob2) < p_NumberLeading;
246 j++;
if (j==
k)
continue;
248 unsigned int invmass2 = calcInvMass( *tob1, *tob2 );
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) {
259 if(
parType_t((*tob1)->Et()) <= p_MinET1[
i])
continue;
260 if(
parType_t((*tob2)->Et()) <= p_MinET2[
i])
continue;
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);
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);
279 TRG_MSG_DEBUG(
"Decision " <<
i <<
": " << (
accept ?
"pass":
"fail") <<
" invmass2 = " << invmass2);
284 TCS_EXCEPTION(
"InvariantMassDeltaPhiSumEtInclusive1 alg must have 1 inputs, but got " << input.size());