26 #define LOG cout << "TCS::InvariantMassInclusive2: "
74 p_NumberLeading1 = parameter(
"InputWidth1").value();
75 p_NumberLeading2 = parameter(
"InputWidth2").value();
76 if(parameter(
"MaxTob1").
value() > 0) p_NumberLeading1 = parameter(
"MaxTob1").value();
77 if(parameter(
"MaxTob2").
value() > 0) p_NumberLeading2 = parameter(
"MaxTob2").value();
79 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
80 p_InvMassMin[
i] = parameter(
"MinMSqr",
i).value();
81 p_InvMassMax[
i] = parameter(
"MaxMSqr",
i).value();
83 p_MinET1[
i] = parameter(
"MinET1",
i).value();
84 p_MinET2[
i] = parameter(
"MinET2",
i).value();
88 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
95 p_ApplyEtaCut = parameter(
"ApplyEtaCut").value();
96 p_MinEta1 = parameter(
"MinEta1" ).value();
97 p_MaxEta1 = parameter(
"MaxEta1" ).value();
98 p_MinEta2 = parameter(
"MinEta2" ).value();
99 p_MaxEta2 = parameter(
"MaxEta2" ).value();
109 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
110 std::string hname_accept =
"hInvariantMassInclusive2_accept_bit"+
std::to_string((
int)
i);
111 std::string hname_reject =
"hInvariantMassInclusive2_reject_bit"+
std::to_string((
int)
i);
113 bookHist(m_histAcceptM, hname_accept,
"INVM", 100, sqrt(p_InvMassMin[
i]), sqrt(p_InvMassMax[
i]));
114 bookHist(m_histRejectM, hname_reject,
"INVM", 100, sqrt(p_InvMassMin[
i]), sqrt(p_InvMassMax[
i]));
116 bookHist(m_histAcceptEta1Eta2, hname_accept,
"ETA vs ETA", 100, p_MinEta1, p_MaxEta1, 100, p_MinEta2, p_MaxEta2);
117 bookHist(m_histRejectEta1Eta2, hname_reject,
"ETA vs ETA", 100, p_MinEta1, p_MaxEta1, 100, p_MinEta2, p_MaxEta2);
127 const std::vector<TCS::TOBArray *> & output,
131 if( input.size() == 2) {
133 tob1 != input[0]->end() &&
distance(input[0]->
begin(), tob1) < p_NumberLeading1;
136 if (p_NumberLeading1 < input[0]->
size()) {
138 if ((*tob1)->Et() == (*tob1_plus1)->Et() &&
distance(input[0]->
begin(), tob1) == p_NumberLeading1 - 1) {
139 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
140 output[
i]->setAmbiguityFlag(
true);
145 tob2 != input[1]->end() &&
distance(input[1]->
begin(), tob2) < p_NumberLeading2;
148 unsigned int invmass2 = calcInvMassBW( *tob1, *tob2 );
149 const int eta1 = (*tob1)->eta();
150 const int eta2 = (*tob2)->eta();
151 const unsigned int aeta1 = std::abs(
eta1);
152 const unsigned int aeta2 = std::abs(
eta2);
153 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
155 if(
parType_t((*tob1)->Et()) <= p_MinET1[
i])
continue;
156 if(
parType_t((*tob2)->Et()) <= p_MinET2[
i])
continue;
158 ((aeta1 < p_MinEta1 || aeta1 > p_MaxEta1 ) ||
159 (aeta2 < p_MinEta2 || aeta2 > p_MaxEta2 ) ))
continue;
160 accept = invmass2 >= p_InvMassMin[
i] && invmass2 <= p_InvMassMax[
i];
161 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(
i) :
accept);
162 const bool fillReject = fillHistos() and not fillAccept;
163 const bool alreadyFilled = decision.
bit(
i);
168 if(fillAccept and not alreadyFilled) {
169 fillHist1D(m_histAcceptM[
i],sqrt((
float)invmass2));
170 fillHist2D(m_histAcceptEta1Eta2[
i],
eta1,
eta2);
171 }
else if(fillReject) {
172 fillHist1D(m_histRejectM[
i],sqrt((
float)invmass2));
173 fillHist2D(m_histRejectEta1Eta2[
i],
eta1,
eta2);
175 TRG_MSG_DEBUG(
"Decision " <<
i <<
": " << (
accept?
"pass":
"fail") <<
" invmass2 = " << invmass2);
179 for (
unsigned int i=0;
i < numberOutputBits(); ++
i) {
182 output[
i]->setAmbiguityFlag(hasAmbiguousInputs);
186 TCS_EXCEPTION(
"InvariantMassInclusive2 alg must have 2 inputs, but got " << input.size());
195 const std::vector<TCS::TOBArray *> & output,
200 if( input.size() == 2) {
202 tob1 != input[0]->end() &&
distance(input[0]->
begin(), tob1) < p_NumberLeading1;
205 if (p_NumberLeading1 < input[0]->
size()) {
207 if ((*tob1)->Et() == (*tob1_plus1)->Et() &&
distance(input[0]->
begin(), tob1) == p_NumberLeading1 - 1) {
208 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
209 output[
i]->setAmbiguityFlag(
true);
214 tob2 != input[1]->end() &&
distance(input[1]->
begin(), tob2) < p_NumberLeading2;
217 unsigned int invmass2 = calcInvMass( *tob1, *tob2 );
218 const int eta1 = (*tob1)->eta();
219 const int eta2 = (*tob2)->eta();
220 const unsigned int aeta1 = std::abs(
eta1);
221 const unsigned int aeta2 = std::abs(
eta2);
222 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
223 if(
parType_t((*tob1)->Et()) <= p_MinET1[
i])
continue;
224 if(
parType_t((*tob2)->Et()) <= p_MinET2[
i])
continue;
226 ((aeta1 < p_MinEta1 || aeta1 > p_MaxEta1 ) ||
227 (aeta2 < p_MinEta2 || aeta2 > p_MaxEta2 ) ))
continue;
228 bool accept = invmass2 >= p_InvMassMin[
i] && invmass2 <= p_InvMassMax[
i];
229 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(
i) :
accept);
230 const bool fillReject = fillHistos() and not fillAccept;
231 const bool alreadyFilled = decision.
bit(
i);
236 if(fillAccept and not alreadyFilled) {
237 fillHist1D(m_histAcceptM[
i],sqrt((
float)invmass2));
238 fillHist2D(m_histAcceptEta1Eta2[
i],
eta1,
eta2);
239 }
else if(fillReject) {
240 fillHist1D(m_histRejectM[
i],sqrt((
float)invmass2));
241 fillHist2D(m_histRejectEta1Eta2[
i],
eta1,
eta2);
243 TRG_MSG_DEBUG(
"Decision " <<
i <<
": " << (
accept ?
"pass":
"fail") <<
" invmass2 = " << invmass2);
248 TCS_EXCEPTION(
"InvariantMassInclusive2 alg must have 2 inputs, but got " << input.size());