27 defineParameter(
"InputWidth1", 9);
28 defineParameter(
"InputWidth2", 9);
29 defineParameter(
"MaxTob1", 0);
30 defineParameter(
"MaxTob2", 0);
31 defineParameter(
"NumResultBits", 6);
32 defineParameter(
"MinMSqr", 0, 0);
33 defineParameter(
"MaxMSqr", 999, 0);
34 defineParameter(
"MinMSqr", 0, 1);
35 defineParameter(
"MaxMSqr", 999, 1);
36 defineParameter(
"MinMSqr", 0, 2);
37 defineParameter(
"MaxMSqr", 999, 2);
38 defineParameter(
"MinMSqr", 0, 3);
39 defineParameter(
"MaxMSqr", 999, 3);
40 defineParameter(
"MinMSqr", 0, 4);
41 defineParameter(
"MaxMSqr", 999, 4);
42 defineParameter(
"MinMSqr", 0, 5);
43 defineParameter(
"MaxMSqr", 999, 5);
44 defineParameter(
"MinET1",0,0);
45 defineParameter(
"MinET2",0,0);
46 defineParameter(
"MinET1",0,1);
47 defineParameter(
"MinET2",0,1);
48 defineParameter(
"MinET1",0,2);
49 defineParameter(
"MinET2",0,2);
50 defineParameter(
"MinET1",0,3);
51 defineParameter(
"MinET2",0,3);
52 defineParameter(
"MinET1",0,4);
53 defineParameter(
"MinET2",0,4);
54 defineParameter(
"MinET1",0,5);
55 defineParameter(
"MinET2",0,5);
56 defineParameter(
"ApplyEtaCut", 0);
57 defineParameter(
"MinEta1", 0);
58 defineParameter(
"MaxEta1", 31);
59 defineParameter(
"MinEta2", 0);
60 defineParameter(
"MaxEta2", 31);
61 defineParameter(
"MinDeltaPhi", 0, 0);
62 defineParameter(
"MaxDeltaPhi", 31, 0);
63 defineParameter(
"MinDeltaPhi", 0, 1);
64 defineParameter(
"MaxDeltaPhi", 31, 1);
65 defineParameter(
"MinDeltaPhi", 0, 2);
66 defineParameter(
"MaxDeltaPhi", 31, 2);
67 defineParameter(
"MinDeltaPhi", 0, 3);
68 defineParameter(
"MaxDeltaPhi", 31, 3);
69 defineParameter(
"MinDeltaPhi", 0, 4);
70 defineParameter(
"MaxDeltaPhi", 31, 4);
71 defineParameter(
"MinDeltaPhi", 0, 5);
72 defineParameter(
"MaxDeltaPhi", 31, 5);
74 setNumberOutputBits(6);
82 p_NumberLeading1 = parameter(
"InputWidth1").value();
83 p_NumberLeading2 = parameter(
"InputWidth2").value();
84 if(parameter(
"MaxTob1").
value() > 0) p_NumberLeading1 = parameter(
"MaxTob1").value();
85 if(parameter(
"MaxTob2").
value() > 0) p_NumberLeading2 = parameter(
"MaxTob2").value();
87 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
88 p_InvMassMin[
i] = parameter(
"MinMSqr",
i).value();
89 p_InvMassMax[
i] = parameter(
"MaxMSqr",
i).value();
90 p_DeltaPhiMin[
i] = parameter(
"MinDeltaPhi",
i).value();
91 p_DeltaPhiMax[
i] = parameter(
"MaxDeltaPhi",
i).value();
92 p_MinET1[
i] = parameter(
"MinET1",
i).value();
93 p_MinET2[
i] = parameter(
"MinET2",
i).value();
98 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
107 p_ApplyEtaCut = parameter(
"ApplyEtaCut").value();
108 p_MinEta1 = parameter(
"MinEta1" ).value();
109 p_MaxEta1 = parameter(
"MaxEta1" ).value();
110 p_MinEta2 = parameter(
"MinEta2" ).value();
111 p_MaxEta2 = parameter(
"MaxEta2" ).value();
121 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
122 std::string hname_accept =
"hInvariantMassDeltaPhiInclusive2Charge_accept_bit"+
std::to_string(
static_cast<int>(
i));
123 std::string hname_reject =
"hInvariantMassDeltaPhiInclusive2Charge_reject_bit"+
std::to_string(
static_cast<int>(
i));
125 bookHist(m_histAcceptM, hname_accept,
"INVM vs DPHI", 100, std::sqrt(p_InvMassMin[
i]), std::sqrt(p_InvMassMax[
i]), 100, p_DeltaPhiMin[
i], p_DeltaPhiMax[
i]);
126 bookHist(m_histRejectM, hname_reject,
"INVM vs DPHI", 100, std::sqrt(p_InvMassMin[
i]), std::sqrt(p_InvMassMax[
i]), 100, p_DeltaPhiMin[
i], p_DeltaPhiMax[
i]);
128 bookHist(m_histAcceptEta1Eta2, hname_accept,
"ETA vs ETA", 100, p_MinEta1, p_MaxEta1, 100, p_MinEta2, p_MaxEta2);
129 bookHist(m_histRejectEta1Eta2, hname_reject,
"ETA vs ETA", 100, p_MinEta1, p_MaxEta1, 100, p_MinEta2, p_MaxEta2);
138 const std::vector<TCS::TOBArray *> & output,
142 if( input.size() == 2) {
144 tob1 != input[0]->end() &&
distance(input[0]->
begin(), tob1) < p_NumberLeading1;
150 tob2 != input[1]->end() &&
distance(input[1]->
begin(), tob2) < p_NumberLeading2;
153 unsigned int invmass2 = calcInvMassBW( *tob1, *tob2 );
155 unsigned int deltaPhi = calcDeltaPhiBW( *tob1, *tob2 );
156 const int eta1 = (*tob1)->eta();
157 const int eta2 = (*tob2)->eta();
158 const unsigned int aeta1 = std::abs(
eta1);
159 const unsigned int aeta2 = std::abs(
eta2);
161 int charge1 = (*tob1)->charge();
162 int charge2 = (*tob2)->charge();
163 int totalCharge = charge1 + charge2;
164 bool acceptCharge =
true;
165 if ( std::abs(totalCharge) == 2 ) { acceptCharge =
false; }
166 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
168 if(
static_cast<parType_t>((*tob1)->Et()) <= p_MinET1[
i])
continue;
169 if(
static_cast<parType_t>((*tob2)->Et()) <= p_MinET2[
i])
continue;
171 ((aeta1 < p_MinEta1 || aeta1 > p_MaxEta1 ) ||
172 (aeta2 < p_MinEta2 || aeta2 > p_MaxEta2 ) ))
continue;
173 accept = invmass2 >= p_InvMassMin[
i] && invmass2 <= p_InvMassMax[i] && deltaPhi >= p_DeltaPhiMin[
i] &&
deltaPhi <= p_DeltaPhiMax[
i] && acceptCharge;
174 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(
i) :
accept);
175 const bool fillReject = fillHistos() and not fillAccept;
176 const bool alreadyFilled = decision.
bit(
i);
181 if(fillAccept and not alreadyFilled) {
182 fillHist2D(m_histAcceptM[
i],std::sqrt(
static_cast<float>(invmass2)),
static_cast<float>(
deltaPhi));
183 fillHist2D(m_histAcceptEta1Eta2[
i],
eta1,
eta2);
184 }
else if(fillReject) {
185 fillHist2D(m_histRejectM[
i],std::sqrt(
static_cast<float>(invmass2)),
static_cast<float>(
deltaPhi));
186 fillHist2D(m_histRejectEta1Eta2[
i],
eta1,
eta2);
188 TRG_MSG_DEBUG(
"Decision " <<
i <<
": " << (
accept?
"pass":
"fail") <<
" invmass2 = " << invmass2);
192 for (
unsigned int i=0;
i < numberOutputBits(); ++
i) {
195 output[
i]->setAmbiguityFlag(hasAmbiguousInputs);
199 TCS_EXCEPTION(
"InvariantMassDeltaPhiInclusive2Charge alg must have 2 inputs, but got " << input.size());
208 const std::vector<TCS::TOBArray *> & output,
213 if( input.size() == 2) {
215 tob1 != input[0]->end() &&
distance(input[0]->
begin(), tob1) < p_NumberLeading1;
219 tob2 != input[1]->end() &&
distance(input[1]->
begin(), tob2) < p_NumberLeading2;
222 unsigned int invmass2 = calcInvMass( *tob1, *tob2 );
224 unsigned int deltaPhi = calcDeltaPhi( *tob1, *tob2 );
225 const int eta1 = (*tob1)->eta();
226 const int eta2 = (*tob2)->eta();
227 const unsigned int aeta1 = std::abs(
eta1);
228 const unsigned int aeta2 = std::abs(
eta2);
230 int charge1 = (*tob1)->charge();
231 int charge2 = (*tob2)->charge();
232 int totalCharge = charge1 + charge2;
233 bool acceptCharge =
true;
234 if ( std::abs(totalCharge) == 2 ) { acceptCharge =
true; }
235 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
236 if(
static_cast<parType_t>((*tob1)->Et()) <= p_MinET1[
i])
continue;
237 if(
static_cast<parType_t>((*tob2)->Et()) <= p_MinET2[
i])
continue;
239 ((aeta1 < p_MinEta1 || aeta1 > p_MaxEta1 ) ||
240 (aeta2 < p_MinEta2 || aeta2 > p_MaxEta2 ) ))
continue;
241 bool accept = invmass2 >= p_InvMassMin[
i] && invmass2 <= p_InvMassMax[i] && deltaPhi >= p_DeltaPhiMin[
i] &&
deltaPhi <= p_DeltaPhiMax[
i] && acceptCharge;
242 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(
i) :
accept);
243 const bool fillReject = fillHistos() and not fillAccept;
244 const bool alreadyFilled = decision.
bit(
i);
249 if(fillAccept and not alreadyFilled) {
250 fillHist2D(m_histAcceptM[
i],std::sqrt(
static_cast<float>(invmass2)),
static_cast<float>(
deltaPhi));
251 fillHist2D(m_histAcceptEta1Eta2[
i],
eta1,
eta2);
252 }
else if(fillReject) {
253 fillHist2D(m_histRejectM[
i],std::sqrt(
static_cast<float>(invmass2)),
static_cast<float>(
deltaPhi));
254 fillHist2D(m_histRejectEta1Eta2[
i],
eta1,
eta2);
256 TRG_MSG_DEBUG(
"Decision " <<
i <<
": " << (
accept ?
"pass":
"fail") <<
" invmass2 = " << invmass2);
261 TCS_EXCEPTION(
"InvariantMassDeltaPhiInclusive2Charge alg must have 2 inputs, but got " << input.size());