61 ClassImp(RooParametricStepFunction);
66 RooParametricStepFunction::RooParametricStepFunction(
const char* name,
const char* title,
67 RooAbsReal& x,
const RooArgList& coefList, TArrayD& limits, Int_t nBins) :
68 RooAbsPdf(name, title),
69 _x(
"x",
"Dependent", this, x),
70 _coefList(
"coefList",
"List of coefficients",this),
73 _coefIter = _coefList.createIterator() ;
77 cout <<
"RooParametricStepFunction::ctor(" << GetName()
78 <<
") WARNING: nBins must be >=0, setting value to 0" << endl ;
82 TIterator* coefIter = coefList.createIterator() ;
84 while((coef = (RooAbsArg*)coefIter->Next())) {
85 if (!dynamic_cast<RooAbsReal*>(coef)) {
86 cout <<
"RooParametricStepFunction::ctor(" << GetName() <<
") ERROR: coefficient " << coef->GetName()
87 <<
" is not of type RooAbsReal" << endl ;
90 _coefList.add(*coef) ;
102 RooParametricStepFunction::RooParametricStepFunction(
const RooParametricStepFunction& other,
const char* name) :
103 RooAbsPdf(other, name),
104 _x(
"x", this, other._x),
105 _coefList(
"coefList",this,other._coefList),
108 _coefIter = _coefList.createIterator();
109 (other._limits).Copy(_limits);
115 RooParametricStepFunction::~RooParametricStepFunction()
124 Int_t RooParametricStepFunction::getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars,
const char* )
const
126 if (matchArgs(allVars, analVars, _x))
return 1;
132 Double_t RooParametricStepFunction::analyticalIntegral(Int_t code,
const char* rangeName)
const
142 Double_t xmin = _x.min(rangeName) ;
143 Double_t xmax = _x.max(rangeName) ;
147 for (i=1 ; i<=_nBins ; i++) {
148 Double_t binVal = (i<_nBins) ? (static_cast<RooRealVar*>(_coefList.at(i-1))->getVal()) : lastBinValue() ;
149 if (_limits[i-1]>=xmin && _limits[i]<=xmax) {
151 sum += (_limits[i]-_limits[i-1])*binVal ;
152 }
else if (_limits[i-1]<xmin && _limits[i]>xmax) {
154 sum += (xmax-xmin)*binVal ;
157 }
else if (_limits[i-1]<xmin && _limits[i]<=xmax && _limits[i]>xmin) {
159 sum += (_limits[i]-xmin)*binVal ;
160 }
else if (_limits[i-1]>=xmin && _limits[i]>xmax && _limits[i-1]<xmax) {
161 sum += (xmax-_limits[i-1])*binVal ;
173 Double_t RooParametricStepFunction::lastBinValue()
const
176 Double_t binSize(0.);
177 for (Int_t j=1;j<_nBins;j++){
178 RooRealVar* tmp = (RooRealVar*) _coefList.at(j-1);
179 binSize = _limits[j] - _limits[j-1];
180 sum = sum + tmp->getVal()*binSize;
182 binSize = _limits[_nBins] - _limits[_nBins-1];
183 return (1.0 - sum)/binSize;
188 Double_t RooParametricStepFunction::evaluate()
const
191 if (_x >= _limits[0] && _x < _limits[_nBins]){
193 for (Int_t i=1;i<=_nBins;i++){
194 if (_x < _limits[i]){
198 RooRealVar* tmp = (RooRealVar*) _coefList.at(i-1);
199 value = tmp->getVal();
204 Double_t binSize(0.);
205 for (Int_t j=1;j<_nBins;j++){
206 RooRealVar* tmp = (RooRealVar*) _coefList.at(j-1);
207 binSize = _limits[j] - _limits[j-1];
208 sum = sum + tmp->getVal()*binSize;
210 binSize = _limits[_nBins] - _limits[_nBins-1];
211 value = (1.0 - sum)/binSize;
228 Int_t RooParametricStepFunction::getnBins(){
234 Double_t* RooParametricStepFunction::getLimits(){
235 Double_t* limoutput = _limits.GetArray();