32 defineParameter(
"InputWidth1", 6);
33 defineParameter(
"InputWidth2", 6);
34 defineParameter(
"MaxTob1", 0);
35 defineParameter(
"MaxTob2", 0);
36 defineParameter(
"NumResultBits", 6);
37 setNumberOutputBits(6);
39 for (
unsigned int i=0;
i<numberOutputBits();
i++){
41 defineParameter(
"MinMSqr", 0,
i);
42 defineParameter(
"MaxMSqr", 999,
i);
43 defineParameter(
"MinET1a", 0,
i);
44 defineParameter(
"MinET1b", 0,
i);
45 defineParameter(
"MinET2", 0,
i);
46 defineParameter(
"DisambDRSqrMin", 0,
i);
57 p_NumberLeading1a = parameter(
"InputWidth1").value();
58 p_NumberLeading1b = parameter(
"InputWidth1").value();
59 p_NumberLeading2 = parameter(
"InputWidth2").value();
60 if(parameter(
"MaxTob1").
value() > 0) {
61 p_NumberLeading1a = parameter(
"MaxTob1").value();
62 p_NumberLeading1b = parameter(
"MaxTob1").value();
64 if(parameter(
"MaxTob2").
value() > 0) {
65 p_NumberLeading2 = parameter(
"MaxTob2").value();
72 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
73 p_InvMassMin[
i] = parameter(
"MinMSqr",
i).value();
74 p_InvMassMax[
i] = parameter(
"MaxMSqr",
i).value();
76 p_MinET1a[
i] = parameter(
"MinET1a",
i).value();
77 p_MinET1b[
i] = parameter(
"MinET1b",
i).value();
78 p_MinET2[
i] = parameter(
"MinET2",
i).value();
80 p_DisambDR[
i] = parameter(
"DisambDRSqrMin",
i).value();
83 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
96 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
97 std::string hname_accept =
"hInvariantMassInclusive1Disambiguation2_accept_bit"+
std::to_string((
int)
i);
98 std::string hname_reject =
"hInvariantMassInclusive1Disambiguation2_reject_bit"+
std::to_string((
int)
i);
100 bookHist(m_histAccept, hname_accept,
"INVM", 100, sqrt(p_InvMassMin[
i]), sqrt(p_InvMassMax[
i]));
101 bookHist(m_histReject, hname_reject,
"INVM", 100, sqrt(p_InvMassMin[
i]), sqrt(p_InvMassMax[
i]));
111 const std::vector<TCS::TOBArray *> & output,
115 if(input.size() == 2) {
118 tob1a != input[0]->end() &&
distance( input[0]->
begin(), tob1a) < p_NumberLeading1a;
123 tob1b != input[0]->end() &&
distance( input[0]->
begin(), tob1b) < p_NumberLeading1b;
127 unsigned int invmass2 = calcInvMassBW( *tob1a, *tob1b );
128 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
135 bool passInvM = invmass2 >= p_InvMassMin[
i] && invmass2 <= p_InvMassMax[
i];
138 tob2 != input[1]->end() &&
distance( input[1]->
begin(), tob2) < p_NumberLeading2;
141 if(
parType_t((*tob2)->Et()) <= p_MinET2[
i])
continue;
143 unsigned int deltaR2a = calcDeltaR2BW( *tob1a, *tob2 );
144 unsigned int deltaR2b = calcDeltaR2BW( *tob1b, *tob2 );
146 accept = passInvM && deltaR2a > p_DisambDR[
i] && deltaR2b > p_DisambDR[
i];
147 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(
i) :
accept);
148 const bool fillReject = fillHistos() and not fillAccept;
149 const bool alreadyFilled = decision.
bit(
i);
154 if(fillAccept and not alreadyFilled) {
155 fillHist1D(m_histAccept[
i],sqrt((
float)invmass2));
156 }
else if(fillReject) {
157 fillHist1D(m_histReject[
i],sqrt((
float)invmass2));
159 TRG_MSG_DEBUG(
"Decision " <<
i <<
": " << (
accept?
"pass":
"fail") <<
" invmass2 = " << invmass2);
164 for (
unsigned int i=0;
i < numberOutputBits(); ++
i) {
168 output[
i]->setAmbiguityFlag(hasAmbiguousInputs);
172 TCS_EXCEPTION(
"InvariantMassInclusive1Disambiguation2 alg must have 2 inputs, but got " << input.size());
182 const std::vector<TCS::TOBArray *> & output,
186 if(input.size() == 2) {
189 tob1a != input[0]->end() &&
distance( input[0]->
begin(), tob1a) < p_NumberLeading1a;
194 tob1b != input[0]->end() &&
distance( input[0]->
begin(), tob1b) < p_NumberLeading1b;
198 unsigned int invmass2 = calcInvMass( *tob1a, *tob1b );
200 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
208 bool passInvM = invmass2 >= p_InvMassMin[
i] && invmass2 <= p_InvMassMax[
i];
211 tob2 != input[1]->end() &&
distance( input[1]->
begin(), tob2) < p_NumberLeading2;
214 if(
parType_t((*tob2)->Et()) <= p_MinET2[
i])
continue;
216 unsigned int deltaR2a = calcDeltaR2( *tob1a, *tob2 );
217 unsigned int deltaR2b = calcDeltaR2( *tob1b, *tob2 );
219 accept = passInvM && deltaR2a > p_DisambDR[
i] && deltaR2b > p_DisambDR[
i];
220 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(
i) :
accept);
221 const bool fillReject = fillHistos() and not fillAccept;
222 const bool alreadyFilled = decision.
bit(
i);
227 if(fillAccept and not alreadyFilled) {
228 fillHist1D(m_histAccept[
i],sqrt((
float)invmass2));
229 }
else if(fillReject) {
230 fillHist1D(m_histReject[
i],sqrt((
float)invmass2));
232 TRG_MSG_DEBUG(
"Decision " <<
i <<
": " << (
accept?
"pass":
"fail") <<
" invmass2 = " << invmass2);
239 TCS_EXCEPTION(
"InvariantMassInclusive1Disambiguation2 alg must have either 2 inputs, but got " << input.size());