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(
"MinET1",0,0);
42 defineParameter(
"MinET1",0,1);
43 defineParameter(
"MinET1",0,2);
44 defineParameter(
"MinET1",0,3);
45 defineParameter(
"MinET1",0,4);
46 defineParameter(
"MinET1",0,5);
47 defineParameter(
"MinET2",0,0);
48 defineParameter(
"MinET2",0,1);
49 defineParameter(
"MinET2",0,2);
50 defineParameter(
"MinET2",0,3);
51 defineParameter(
"MinET2",0,4);
52 defineParameter(
"MinET2",0,5);
53 defineParameter(
"ApplyEtaCut", 0);
54 defineParameter(
"MinEta1", 0);
55 defineParameter(
"MaxEta1", 31);
56 defineParameter(
"MinEta2", 0);
57 defineParameter(
"MaxEta2", 31);
58 defineParameter(
"MinDeltaPhi", 0, 0);
59 defineParameter(
"MaxDeltaPhi", 31, 0);
60 defineParameter(
"MinDeltaPhi", 0, 1);
61 defineParameter(
"MaxDeltaPhi", 31, 1);
62 defineParameter(
"MinDeltaPhi", 0, 2);
63 defineParameter(
"MaxDeltaPhi", 31, 2);
64 defineParameter(
"MinDeltaPhi", 0, 3);
65 defineParameter(
"MaxDeltaPhi", 31, 3);
66 defineParameter(
"MinDeltaPhi", 0, 4);
67 defineParameter(
"MaxDeltaPhi", 31, 4);
68 defineParameter(
"MinDeltaPhi", 0, 5);
69 defineParameter(
"MaxDeltaPhi", 31, 5);
71 setNumberOutputBits(6);
79 p_NumberLeading = parameter(
"InputWidth").value();
80 if(parameter(
"MaxTob").
value() > 0) p_NumberLeading = parameter(
"MaxTob").value();
82 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
83 p_InvMassMin[
i] = parameter(
"MinMSqr",
i).value();
84 p_InvMassMax[
i] = parameter(
"MaxMSqr",
i).value();
85 p_DeltaPhiMin[
i] = parameter(
"MinDeltaPhi",
i).value();
86 p_DeltaPhiMax[
i] = parameter(
"MaxDeltaPhi",
i).value();
87 p_MinET1[
i] = parameter(
"MinET1",
i).value();
88 p_MinET2[
i] = parameter(
"MinET2",
i).value();
92 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
101 p_ApplyEtaCut = parameter(
"ApplyEtaCut").value();
102 p_MinEta1 = parameter(
"MinEta1" ).value();
103 p_MaxEta1 = parameter(
"MaxEta1" ).value();
104 p_MinEta2 = parameter(
"MinEta2" ).value();
105 p_MaxEta2 = parameter(
"MaxEta2" ).value();
115 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
116 std::string hname_accept =
"hInvariantMassDeltaPhiInclusive1_accept_bit"+
std::to_string((
int)
i);
117 std::string hname_reject =
"hInvariantMassDeltaPhiInclusive1_reject_bit"+
std::to_string((
int)
i);
119 bookHist(m_histAcceptM, hname_accept,
"INVM vs DPHI", 100, sqrt(p_InvMassMin[
i]), sqrt(p_InvMassMax[
i]), 100, p_DeltaPhiMin[
i], p_DeltaPhiMax[
i]);
120 bookHist(m_histRejectM, hname_reject,
"INVM vs DPHI", 100, sqrt(p_InvMassMin[
i]), sqrt(p_InvMassMax[
i]), 100, p_DeltaPhiMin[
i], p_DeltaPhiMax[
i]);
122 bookHist(m_histAcceptEta1Eta2, hname_accept,
"ETA vs ETA", 100, p_MinEta1, p_MaxEta1, 100, p_MinEta2, p_MaxEta2);
123 bookHist(m_histRejectEta1Eta2, hname_reject,
"ETA vs ETA", 100, p_MinEta1, p_MaxEta1, 100, p_MinEta2, p_MaxEta2);
132 const std::vector<TCS::TOBArray *> & output,
136 if( input.size() == 1) {
138 tob1 != input[0]->end() &&
distance(input[0]->
begin(), tob1) < p_NumberLeading;
142 if (p_NumberLeading < input[0]->
size()) {
144 if ((*tob1)->Et() == (*tob1_plus1)->Et() &&
distance(input[0]->
begin(), tob1) == p_NumberLeading - 1) {
145 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
146 output[
i]->setAmbiguityFlag(
true);
151 tob2 != input[0]->end() &&
distance(input[0]->
begin(), tob2) < p_NumberLeading;
153 j++;
if(j==
k)
continue;
155 unsigned int invmass2 = calcInvMassBW( *tob1, *tob2 );
157 unsigned int deltaPhi = calcDeltaPhiBW( *tob1, *tob2 );
158 const int eta1 = (*tob1)->eta();
159 const int eta2 = (*tob2)->eta();
160 const unsigned int aeta1 = std::abs(
eta1);
161 const unsigned int aeta2 = std::abs(
eta2);
162 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
164 if(
parType_t((*tob1)->Et()) <= p_MinET1[
i])
continue;
165 if(
parType_t((*tob2)->Et()) <= p_MinET2[
i])
continue;
167 ((aeta1 < p_MinEta1 || aeta1 > p_MaxEta1 ) ||
168 (aeta2 < p_MinEta2 || aeta2 > p_MaxEta2 ) ))
continue;
169 accept = invmass2 >= p_InvMassMin[
i] && invmass2 <= p_InvMassMax[i] && deltaPhi >= p_DeltaPhiMin[
i] &&
deltaPhi <= p_DeltaPhiMax[
i];
170 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(
i) :
accept);
171 const bool fillReject = fillHistos() and not fillAccept;
172 const bool alreadyFilled = decision.
bit(
i);
177 if(fillAccept and not alreadyFilled) {
178 fillHist2D(m_histAcceptM[
i],sqrt((
float)invmass2),(
float)
deltaPhi);
179 fillHist2D(m_histAcceptEta1Eta2[
i],
eta1,
eta2);
180 }
else if(fillReject) {
181 fillHist2D(m_histRejectM[
i],sqrt((
float)invmass2),(
float)
deltaPhi);
182 fillHist2D(m_histRejectEta1Eta2[
i],
eta1,
eta2);
184 TRG_MSG_DEBUG(
"Decision " <<
i <<
": " << (
accept?
"pass":
"fail") <<
" invmass2 = " << invmass2);
188 for (
unsigned int i=0;
i < numberOutputBits(); ++
i) {
191 output[
i]->setAmbiguityFlag(hasAmbiguousInputs);
195 TCS_EXCEPTION(
"InvariantMassDeltaPhiInclusive1 alg must have 1 inputs, but got " << input.size());
204 const std::vector<TCS::TOBArray *> & output,
209 if( input.size() == 1) {
212 tob1 != input[0]->end() &&
distance(input[0]->
begin(), tob1) < p_NumberLeading;
216 if (p_NumberLeading < input[0]->
size()) {
218 if ((*tob1)->Et() == (*tob1_plus1)->Et() &&
distance(input[0]->
begin(), tob1) == p_NumberLeading - 1) {
219 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
220 output[
i]->setAmbiguityFlag(
true);
225 tob2 != input[0]->end() &&
distance(input[0]->
begin(), tob2) < p_NumberLeading;
227 j++;
if (j==
k)
continue;
229 unsigned int invmass2 = calcInvMass( *tob1, *tob2 );
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;
238 if(
parType_t((*tob2)->Et()) <= p_MinET2[
i])
continue;
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);
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);
257 TRG_MSG_DEBUG(
"Decision " <<
i <<
": " << (
accept ?
"pass":
"fail") <<
" invmass2 = " << invmass2);
262 TCS_EXCEPTION(
"InvariantMassDeltaPhiInclusive1 alg must have 1 inputs, but got " << input.size());