42 ClassImp(RooMultiBinomial);
49 RooMultiBinomial::RooMultiBinomial(
const char *name,
const char *title,
50 const RooArgList& effFuncList,
51 const RooArgList& catList,
52 Bool_t ignoreNonVisible) :
53 RooAbsReal(name,title),
54 _catList(
"catList",
"list of cats", this),
55 _effFuncList(
"effFuncList",
"list of eff funcs",this),
56 _ignoreNonVisible(ignoreNonVisible)
58 _catList.add(catList);
59 _effFuncList.add(effFuncList);
61 if (_catList.getSize() != effFuncList.getSize()) {
62 coutE(InputArguments) <<
"RooMultiBinomial::ctor(" << GetName() <<
") ERROR: Wrong input, should have equal number of categories and efficiencies." << endl;
63 throw string(
"RooMultiBinomial::ctor() ERROR: Wrong input, should have equal number of categories and efficiencies") ;
71 RooMultiBinomial::RooMultiBinomial(
const RooMultiBinomial& other,
const char* name) :
72 RooAbsReal(other, name),
73 _catList(
"catList",this,other._catList),
74 _effFuncList(
"effFuncList",this,other._effFuncList),
75 _ignoreNonVisible(other._ignoreNonVisible)
82 RooMultiBinomial::~RooMultiBinomial()
90 Double_t RooMultiBinomial::evaluate()
const
92 Int_t effFuncListSize = _effFuncList.getSize();
96 vector<Double_t> effFuncVal(effFuncListSize);
97 for (
int i=0; i<effFuncListSize; ++i) {
98 effFuncVal[i] = ((RooAbsReal&)_effFuncList[i]).getVal() ;
103 for (
int i=0; i<effFuncListSize; ++i) {
104 if (effFuncVal[i]>1) {
105 coutW(Eval) <<
"WARNING: Efficiency >1 (equal to " << effFuncVal[i]
106 <<
" ), for i = " << i <<
"...TRUNCATED" << endl;
107 effFuncVal[i] = 1.0 ;
108 }
else if (effFuncVal[i]<0) {
109 effFuncVal[i] = 0.0 ;
110 coutW(Eval) <<
"WARNING: Efficiency <0 (equal to " << effFuncVal[i]
111 <<
" ), for i = " << i <<
"...TRUNCATED" << endl;
115 vector<Double_t> effValue(effFuncListSize);
116 Bool_t notVisible =
true;
120 for (
int i=0; i<effFuncListSize; ++i) {
121 if ( ((RooAbsCategory&)_catList[i]).getIndex() == 1) {
123 effValue[i] = effFuncVal[i] ;
125 }
else if ( ((RooAbsCategory&)_catList[i]).getIndex() == 0){
127 effValue[i] = 1 - effFuncVal[i] ;
129 coutW(Eval) <<
"WARNING: WRONG CATEGORY NAMES GIVEN!, label = " << ((RooAbsCategory&)_catList[i]).getIndex() << endl;
134 Double_t _effVal = 1.;
139 for (
int i=0; i<effFuncListSize; ++i) {
140 _effVal=_effVal*effValue[i];
141 if (notVisible && _ignoreNonVisible){