31 ClassImp(RooHistConstraint);
39 RooHistConstraint::RooHistConstraint(
const char *name,
const char *title,
40 const RooArgSet& phfSet, Int_t threshold) :
41 RooAbsPdf(name,title),
42 _gamma(
"gamma",
"gamma",this),
43 _nominal(
"nominal",
"nominal",this),
53 if (phfSet.getSize()==1) {
55 RooParamHistFunc* phf =
dynamic_cast<RooParamHistFunc*
>(phfSet.first()) ;
58 coutE(InputArguments) <<
"RooHistConstraint::ctor(" << GetName()
59 <<
") ERROR: input object must be a RooParamHistFunc" << endl ;
60 throw std::string(
"RooHistConstraint::ctor ERROR incongruent input arguments") ;
65 for (Int_t i=0 ; i<phf->_dh.numEntries() ; i++) {
67 if (phf->_dh.weight()<threshold && phf->_dh.weight() != 0.) {
68 const char* vname = Form(
"%s_nominal_bin_%i",GetName(),i) ;
69 RooRealVar* var =
new RooRealVar(vname,vname,0,1.E30) ;
70 var->setVal(phf->_dh.weight()) ;
71 var->setConstant(
true);
75 RooRealVar* gam = (RooRealVar*) phf->_p.at(i) ;
76 if (var->getVal()>0) {
77 gam->setConstant(
false);
83 addOwnedComponents(allVars) ;
91 vector<RooParamHistFunc*> phvec ;
94 for (
const auto arg : phfSet) {
96 RooParamHistFunc* phfComp =
dynamic_cast<RooParamHistFunc*
>(arg) ;
98 phvec.push_back(phfComp) ;
100 nbins = phfComp->_p.getSize() ;
101 bin0_name = phfComp->_p.at(0)->GetName() ;
102 gammaSet.add(phfComp->_p) ;
104 if (phfComp->_p.getSize()!=nbins) {
105 coutE(InputArguments) <<
"RooHistConstraint::ctor(" << GetName()
106 <<
") ERROR: incongruent input arguments: all input RooParamHistFuncs should have same #bins" << endl ;
107 throw std::string(
"RooHistConstraint::ctor ERROR incongruent input arguments") ;
109 if (bin0_name != phfComp->_p.at(0)->GetName()) {
110 coutE(InputArguments) <<
"RooHistConstraint::ctor(" << GetName()
111 <<
") ERROR: incongruent input arguments: all input RooParamHistFuncs should have the same bin parameters.\n"
112 <<
"Previously found " << bin0_name <<
", now found " << phfComp->_p.at(0)->GetName() <<
".\n"
113 <<
"Check that the right RooParamHistFuncs have been passed to this RooHistConstraint." << std::endl;
114 throw std::string(
"RooHistConstraint::ctor ERROR incongruent input arguments") ;
119 coutW(InputArguments) <<
"RooHistConstraint::ctor(" << GetName()
120 <<
") WARNING: ignoring input argument " << arg->GetName() <<
" which is not of type RooParamHistFunc" << endl;
124 _gamma.add(gammaSet) ;
128 for (Int_t i=0 ; i<nbins ; i++) {
131 for (
const auto phfunc : phvec) {
132 sumVal += phfunc->getNominal(i);
135 if (sumVal<threshold && sumVal != 0.) {
137 const char* vname = Form(
"%s_nominal_bin_%i",GetName(),i) ;
138 RooRealVar* var =
new RooRealVar(vname,vname,0,1000) ;
140 Double_t sumVal2(0) ;
141 for (vector<RooParamHistFunc*>::iterator iter = phvec.begin() ; iter != phvec.end() ; ++iter) {
142 sumVal2 += (*iter)->getNominal(i) ;
144 var->setVal(sumVal2) ;
145 var->setConstant(kTRUE) ;
147 vname = Form(
"%s_nominal_error_bin_%i",GetName(),i) ;
148 RooRealVar* vare =
new RooRealVar(vname,vname,0,1000) ;
150 Double_t sumErr2(0) ;
151 for (vector<RooParamHistFunc*>::iterator iter = phvec.begin() ; iter != phvec.end() ; ++iter) {
152 sumErr2 += pow((*iter)->getNominalError(i),2) ;
154 vare->setVal(sqrt(sumErr2)) ;
155 vare->setConstant(kTRUE) ;
157 allVars.add(RooArgSet(*var,*vare)) ;
161 ((RooRealVar*)_gamma.at(i))->setConstant(kFALSE) ;
165 addOwnedComponents(allVars) ;
170 RooHistConstraint::RooHistConstraint(
const RooHistConstraint& other,
const char* name) :
171 RooAbsPdf(other,name),
172 _gamma(
"gamma",this,other._gamma),
173 _nominal(
"nominal",this,other._nominal),
174 _relParam(other._relParam)
180 Double_t RooHistConstraint::evaluate()
const
184 for (
unsigned int i=0; i < _nominal.size(); ++i) {
185 const auto& gamma =
static_cast<const RooAbsReal&
>(_gamma[i]);
186 const auto& nominal =
static_cast<const RooAbsReal&
>(_nominal[i]);
188 double gamVal = gamma.getVal();
190 gamVal *= nominal.getVal();
192 const double pois = TMath::Poisson(nominal.getVal(),gamVal);
201 Double_t RooHistConstraint::getLogVal(
const RooArgSet* )
const
204 for (
unsigned int i=0; i < _nominal.size(); ++i) {
205 const auto& gamma =
static_cast<const RooAbsReal&
>(_gamma[i]);
206 const auto& nominal =
static_cast<const RooAbsReal&
>(_nominal[i]);
207 double gam = gamma.getVal();
208 Int_t nom = (Int_t) nominal.getVal();
214 const double logPoisson = nom * log(gam) - gam - std::lgamma(nom+1);
217 cerr <<
"ERROR in RooHistConstraint: gam=0 and nom>0" << endl ;