31 defineParameter(
"InputWidth", 1);
32 defineParameter(
"MaxTob", 0);
33 defineParameter(
"NumResultBits", 4);
34 defineParameter(
"Delay", 1);
35 setNumberOutputBits(4);
37 for (
unsigned int i=0;
i<numberOutputBits();
i++){
39 defineParameter(
"deltaAbsMin", 0,
i);
40 defineParameter(
"asymFactor", 0,
i);
41 defineParameter(
"asymOffset", 0,
i);
42 defineParameter(
"maxTeProduct", 0,
i);
46 defineParameter(
"MinSidejTE",0);
47 defineParameter(
"MaxSidejTE",999);
58 for (
unsigned int i=0;
i<numberOutputBits();
i++){
59 p_deltaAbsMin[
i] = parameter(
"deltaAbsMin",
i).value();
60 p_asymFactor[
i] = parameter(
"asymFactor",
i).value();
61 p_asymOffset[
i] = parameter(
"asymOffset",
i).value();
62 p_maxTeProduct[
i] = parameter(
"maxTeProduct",
i).value();
66 p_MinSidejTE = parameter(
"MinSidejTE").value();
67 p_MaxSidejTE = parameter(
"MaxSidejTE").value();
72 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
73 std::string hname_accept =
"hTeAsymmetry_accept_bit"+
std::to_string((
int)
i);
74 std::string hname_reject =
"hTeAsymmetry_reject_bit"+
std::to_string((
int)
i);
75 bookHist(m_histAccept, hname_accept,
"jTE SideA vs jTE SideC", 100, p_MinSidejTE, p_MaxSidejTE, 100, p_MinSidejTE, p_MaxSidejTE);
76 bookHist(m_histReject, hname_reject,
"jTE SideA vs jTE SideC", 100, p_MinSidejTE, p_MaxSidejTE, 100, p_MinSidejTE, p_MaxSidejTE);
85 const std::vector<TCS::TOBArray *> & output,
88 if(input.size() == 1) {
90 if (input[0]->
size()!=1) {
91 TCS_EXCEPTION(
"TeAsymmetry alg needs input list with a single jTE TOB, got " << input[0]->
size());
95 jte != input[0]->end();
99 for(
unsigned int i=0;
i<numberOutputBits(); ++
i) {
104 long long jteSideA = (*jte)->sumEtSideA();
105 long long jteSideC = (*jte)->sumEtSideC();
109 bool condition_1 = abs(jteSideA - jteSideC) > p_deltaAbsMin[
i];
112 bool condition_2 = abs(jteSideA - jteSideC) > p_asymFactor[
i]*((*jte)->sumEt() + p_asymOffset[
i]);
114 bool condition_3 = jteSideA * jteSideC < p_maxTeProduct[
i];
118 accept = condition_1 && condition_2 && condition_3;
121 const bool fillAccept = fillHistos() and (fillHistosBasedOnHardware() ? getDecisionHardwareBit(
i) :
accept);
122 const bool fillReject = fillHistos() and not fillAccept;
123 const bool alreadyFilled = decision.
bit(
i);
125 TRG_MSG_DEBUG(
"Decision " <<
i <<
": " << (
accept?
"pass":
"fail") <<
" jTE_A = " << (*jte)->sumEtSideA() <<
" , jTE_C = " << (*jte)->sumEtSideC());
131 if(fillAccept and not alreadyFilled) {
132 fillHist2D(m_histAccept[
i], jteSideA, jteSideC);
133 }
else if(fillReject) {
134 fillHist2D(m_histReject[
i], jteSideA, jteSideC);
140 TCS_EXCEPTION(
"TeAsymmetry alg must have 1 input, but got " << input.size());
146 const std::vector<TCS::TOBArray *> & output,
149 return processBitCorrect(input, output, decision);