00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "RooFit.h"
00032
00033 #include "RooMultiBinomial.h"
00034 #include "RooStreamParser.h"
00035 #include "RooArgList.h"
00036 #include "RooAbsCategory.h"
00037 #include "RooMsgService.h"
00038 #include <string>
00039 #include <vector>
00040
00041 using namespace std ;
00042
00043 ClassImp(RooMultiBinomial)
00044 ;
00045
00046
00047
00048 RooMultiBinomial::RooMultiBinomial(const char *name, const char *title,
00049 const RooArgList& effFuncList,
00050 const RooArgList& catList,
00051 Bool_t ignoreNonVisible) :
00052 RooAbsReal(name,title),
00053 _catList("catList","list of cats", this),
00054 _effFuncList("effFuncList","list of eff funcs",this),
00055 _ignoreNonVisible(ignoreNonVisible)
00056 {
00057
00058
00059
00060
00061 _catList.add(catList);
00062 _effFuncList.add(effFuncList);
00063
00064 if (_catList.getSize() != effFuncList.getSize()) {
00065 coutE(InputArguments) << "RooMultiBinomial::ctor(" << GetName() << ") ERROR: Wrong input, should have equal number of categories and efficiencies." << endl;
00066 throw string("RooMultiBinomial::ctor() ERROR: Wrong input, should have equal number of categories and efficiencies") ;
00067 }
00068
00069 }
00070
00071
00072
00073
00074 RooMultiBinomial::RooMultiBinomial(const RooMultiBinomial& other, const char* name) :
00075 RooAbsReal(other, name),
00076 _catList("catList",this,other._catList),
00077 _effFuncList("effFuncList",this,other._effFuncList),
00078 _ignoreNonVisible(other._ignoreNonVisible)
00079 {
00080
00081 }
00082
00083
00084
00085
00086 RooMultiBinomial::~RooMultiBinomial()
00087 {
00088
00089 }
00090
00091
00092
00093
00094 Double_t RooMultiBinomial::evaluate() const
00095 {
00096
00097
00098
00099 Int_t effFuncListSize = _effFuncList.getSize();
00100
00101
00102
00103 vector<Double_t> effFuncVal(effFuncListSize);
00104 for (int i=0; i<effFuncListSize; ++i) {
00105 effFuncVal[i] = ((RooAbsReal&)_effFuncList[i]).getVal() ;
00106 }
00107
00108
00109
00110 for (int i=0; i<effFuncListSize; ++i) {
00111 if (effFuncVal[i]>1) {
00112 coutW(Eval) << "WARNING: Efficency >1 (equal to " << effFuncVal[i]
00113 << " ), for i = " << i << "...TRUNCATED" << endl;
00114 effFuncVal[i] = 1.0 ;
00115 } else if (effFuncVal[i]<0) {
00116 effFuncVal[i] = 0.0 ;
00117 coutW(Eval) << "WARNING: Efficency <0 (equal to " << effFuncVal[i]
00118 << " ), for i = " << i << "...TRUNCATED" << endl;
00119 }
00120 }
00121
00122 vector<Double_t> effValue(effFuncListSize);
00123 Bool_t notVisible = true;
00124
00125
00126
00127 for (int i=0; i<effFuncListSize; ++i) {
00128 if ( ((RooAbsCategory&)_catList[i]).getIndex() == 1) {
00129
00130 effValue[i] = effFuncVal[i] ;
00131 notVisible = false;
00132 } else if ( ((RooAbsCategory&)_catList[i]).getIndex() == 0){
00133
00134 effValue[i] = 1 - effFuncVal[i] ;
00135 } else {
00136 coutW(Eval) << "WARNING: WRONG CATEGORY NAMES GIVEN!, label = " << ((RooAbsCategory&)_catList[i]).getIndex() << endl;
00137 effValue[i] = 0;
00138 }
00139 }
00140
00141 Double_t _effVal = 1.;
00142
00143
00144
00145
00146 for (int i=0; i<effFuncListSize; ++i) {
00147 _effVal=_effVal*effValue[i];
00148 if (notVisible && _ignoreNonVisible){
00149 _effVal=0;
00150 }
00151 }
00152
00153 return _effVal;
00154
00155 }
00156
00157
00158