37 defineParameter(
"InputWidth", 3);
38 defineParameter(
"MaxTob", 0);
39 defineParameter(
"NumResultBits", 6);
40 defineParameter(
"RequireOneBarrel", 0);
41 defineParameter(
"MinMSqr", 0, 0);
42 defineParameter(
"MaxMSqr", 999, 0);
43 defineParameter(
"MinMSqr", 0, 1);
44 defineParameter(
"MaxMSqr", 999, 1);
45 defineParameter(
"MinMSqr", 0, 2);
46 defineParameter(
"MaxMSqr", 999, 2);
47 defineParameter(
"MinMSqr", 0, 3);
48 defineParameter(
"MaxMSqr", 999, 3);
49 defineParameter(
"MinMSqr", 0, 4);
50 defineParameter(
"MaxMSqr", 999, 4);
51 defineParameter(
"MinMSqr", 0, 5);
52 defineParameter(
"MaxMSqr", 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);
60 setNumberOutputBits(6);
68 if(parameter(
"MaxTob").
value() > 0) {
69 p_NumberLeading1 = parameter(
"MaxTob").value();
71 p_NumberLeading1 = parameter(
"InputWidth").value();
74 p_OneBarrel = parameter(
"RequireOneBarrel").value();
76 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
77 p_InvMassMin[
i] = parameter(
"MinMSqr",
i).value();
78 p_InvMassMax[
i] = parameter(
"MaxMSqr",
i).value();
80 p_MinET1[
i] = parameter(
"MinET1",
i).value();
84 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
93 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
94 std::string hname_accept =
"hInvariantMassThreeTOBsIncl1_accept_bit"+
std::to_string((
int)
i);
95 std::string hname_reject =
"hInvariantMassThreeTOBsIncl1_reject_bit"+
std::to_string((
int)
i);
97 bookHist(m_histAccept, hname_accept,
"INVM", 100, sqrt(p_InvMassMin[
i]), sqrt(p_InvMassMax[
i]));
98 bookHist(m_histReject, hname_reject,
"INVM", 100, sqrt(p_InvMassMin[
i]), sqrt(p_InvMassMax[
i]));
110 const std::vector<TCS::TOBArray *> & output,
114 if(input.size() == 1) {
117 tob1 != input[0]->end() &&
distance( input[0]->
begin(), tob1) < p_NumberLeading1;
123 tob2 != input[0]->end() &&
distance( input[0]->
begin(), tob2) < p_NumberLeading1;
128 tob3 != input[0]->end() &&
distance( input[0]->
begin(), tob3) < p_NumberLeading1;
132 if (p_OneBarrel &&
parType_t(abs((*tob1)->eta())) > 10 &&
parType_t(abs((*tob2)->eta())) > 10 &&
parType_t(abs((*tob3)->eta())) > 10 )
continue;
135 unsigned int invmass2_12 = calcInvMassBW( *tob1, *tob2 );
136 unsigned int invmass2_13 = calcInvMassBW( *tob1, *tob3 );
137 unsigned int invmass2_23 = calcInvMassBW( *tob2, *tob3 );
138 unsigned int invmass2 = invmass2_12 + invmass2_13 + invmass2_23;
139 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
141 if(
parType_t((*tob1)->Et()) <= p_MinET1[
i])
continue;
142 if(
parType_t((*tob2)->Et()) <= p_MinET1[
i])
continue;
143 if(
parType_t((*tob3)->Et()) <= p_MinET1[
i])
continue;
145 accept = invmass2 >= p_InvMassMin[
i] && invmass2 <= p_InvMassMax[
i];
146 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(
i) :
accept);
147 const bool fillReject = fillHistos() and not fillAccept;
148 const bool alreadyFilled = decision.
bit(
i);
150 std::vector<TCS::GenericTOB*> TOBvector;
151 TOBvector.push_back( *tob1 );
152 TOBvector.push_back( *tob2 );
153 TOBvector.push_back( *tob3 );
158 if(fillAccept and not alreadyFilled) {
159 fillHist1D(m_histAccept[
i],sqrt(invmass2));
160 }
else if(fillReject) {
161 fillHist1D(m_histReject[
i],sqrt(invmass2));
163 TRG_MSG_DEBUG(
"Decision " <<
i <<
": " << (
accept?
"pass":
"fail") <<
" invmass2 = " << invmass2);
169 for (
unsigned int i=0;
i < numberOutputBits(); ++
i) {
171 output[
i]->setAmbiguityFlag(hasAmbiguousInputs);
175 TCS_EXCEPTION(
"InvariantMassThreeTOBsIncl1 alg must have 1 input list, but got " << input.size());
185 const std::vector<TCS::TOBArray *> & output,
189 if(input.size() == 1) {
191 tob1 != input[0]->end() &&
distance( input[0]->
begin(), tob1) < p_NumberLeading1;
198 tob2 != input[0]->end() &&
distance( input[0]->
begin(), tob2) < p_NumberLeading1;
203 tob3 != input[0]->end() &&
distance( input[0]->
begin(), tob3) < p_NumberLeading1;
207 if (p_OneBarrel &&
parType_t(abs((*tob1)->eta())) > 10 &&
parType_t(abs((*tob2)->eta())) > 10 &&
parType_t(abs((*tob3)->eta())) > 10 )
continue;
211 unsigned int invmass2_12 = calcInvMass( *tob1, *tob2 );
212 unsigned int invmass2_13 = calcInvMass( *tob1, *tob3 );
213 unsigned int invmass2_23 = calcInvMass( *tob2, *tob3 );
214 unsigned int invmass2 = invmass2_12 + invmass2_13 + invmass2_23;
215 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
217 if(
parType_t((*tob1)->Et()) <= p_MinET1[
i])
continue;
218 if(
parType_t((*tob2)->Et()) <= p_MinET1[
i])
continue;
219 if(
parType_t((*tob3)->Et()) <= p_MinET1[
i])
continue;
221 accept = invmass2 >= p_InvMassMin[
i] && invmass2 <= p_InvMassMax[
i];
222 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(
i) :
accept);
223 const bool fillReject = fillHistos() and not fillAccept;
224 const bool alreadyFilled = decision.
bit(
i);
226 std::vector<TCS::GenericTOB*> TOBvector;
227 TOBvector.push_back( *tob1 );
228 TOBvector.push_back( *tob2 );
229 TOBvector.push_back( *tob3 );
234 if(fillAccept and not alreadyFilled) {
235 fillHist1D(m_histAccept[
i],sqrt(invmass2));
236 }
else if(fillReject) {
237 fillHist1D(m_histReject[
i],sqrt(invmass2));
239 TRG_MSG_DEBUG(
"Decision " <<
i <<
": " << (
accept?
"pass":
"fail") <<
" invmass2 = " << invmass2);
247 TCS_EXCEPTION(
"InvariantMassThreeTOBsIncl1 alg must have either 1 input list, but got " << input.size());