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 #include "RooFit.h"
00030
00031 #include "RooParamBinning.h"
00032 #include "RooParamBinning.h"
00033 #include "RooMsgService.h"
00034
00035 #include "Riostream.h"
00036
00037
00038 ClassImp(RooParamBinning)
00039 ;
00040
00041
00042
00043 RooParamBinning::RooParamBinning(const char* name) :
00044 RooAbsBinning(name), _xlo(0), _xhi(0), _nbins(100), _binw(0), _lp(0), _owner(0)
00045 {
00046
00047
00048 _array = 0 ;
00049 }
00050
00051
00052
00053 RooParamBinning::RooParamBinning(RooAbsReal& xloIn, RooAbsReal& xhiIn, Int_t nBins, const char* name) :
00054 RooAbsBinning(name),
00055 _array(0),
00056 _xlo(&xloIn),
00057 _xhi(&xhiIn),
00058 _nbins(nBins),
00059 _binw(0),
00060 _lp(0),
00061 _owner(0)
00062 {
00063
00064
00065 }
00066
00067
00068
00069
00070 RooParamBinning::~RooParamBinning()
00071 {
00072
00073
00074 if (_array) delete[] _array ;
00075 if (_lp) delete _lp ;
00076 }
00077
00078
00079
00080
00081 RooParamBinning::RooParamBinning(const RooParamBinning& other, const char* name) :
00082 RooAbsBinning(name), _binw(0), _owner(0)
00083 {
00084
00085
00086
00087 _array = 0 ;
00088
00089 if (other._lp) {
00090
00091 _xlo = (RooAbsReal*) other._lp->at(0) ;
00092 _xhi = (RooAbsReal*) other._lp->at(1) ;
00093
00094 } else {
00095
00096
00097
00098 _xlo = other._xlo ;
00099 _xhi = other._xhi ;
00100 }
00101
00102 _nbins = other._nbins ;
00103 _lp = 0 ;
00104
00105
00106 }
00107
00108
00109
00110
00111 void RooParamBinning::insertHook(RooAbsRealLValue& owner) const
00112 {
00113
00114
00115
00116
00117
00118 _owner = &owner ;
00119
00120
00121
00122 if (_lp) {
00123
00124 _xlo = xlo() ;
00125 _xhi = xhi() ;
00126 delete _lp ;
00127 }
00128
00129
00130
00131 _lp = new RooListProxy(Form("range::%s",GetName()),"lp",&owner,kFALSE,kTRUE) ;
00132 _lp->add(*_xlo) ;
00133 _lp->add(*_xhi) ;
00134 _xlo = 0 ;
00135 _xhi = 0 ;
00136
00137
00138 }
00139
00140
00141
00142 void RooParamBinning::removeHook(RooAbsRealLValue& ) const
00143 {
00144
00145
00146
00147
00148 _owner = 0 ;
00149
00150
00151 if (_lp) {
00152 _xlo = xlo() ;
00153 _xhi = xhi() ;
00154 delete _lp ;
00155 _lp = 0 ;
00156 }
00157 }
00158
00159
00160
00161
00162 void RooParamBinning::setRange(Double_t newxlo, Double_t newxhi)
00163 {
00164
00165
00166
00167 if (newxlo>newxhi) {
00168 coutE(InputArguments) << "RooParamBinning::setRange: ERROR low bound > high bound" << endl ;
00169 return ;
00170 }
00171
00172 RooAbsRealLValue* xlolv = dynamic_cast<RooAbsRealLValue*>(xlo()) ;
00173 if (xlolv) {
00174 xlolv->setVal(newxlo) ;
00175 } else {
00176 coutW(InputArguments) << "RooParamBinning::setRange: WARNING lower bound not represented by lvalue, cannot set lower bound value through setRange()" << endl ;
00177 }
00178
00179 RooAbsRealLValue* xhilv = dynamic_cast<RooAbsRealLValue*>(xhi()) ;
00180 if (xhilv) {
00181 xhilv->setVal(newxhi) ;
00182 } else {
00183 coutW(InputArguments) << "RooParamBinning::setRange: WARNING upper bound not represented by lvalue, cannot set upper bound value through setRange()" << endl ;
00184 }
00185
00186 }
00187
00188
00189
00190
00191 Int_t RooParamBinning::binNumber(Double_t x) const
00192 {
00193
00194
00195 if (x >= xhi()->getVal()) return _nbins-1 ;
00196 if (x < xlo()->getVal()) return 0 ;
00197
00198 return Int_t((x - xlo()->getVal())/averageBinWidth()) ;
00199 }
00200
00201
00202
00203
00204 Double_t RooParamBinning::binCenter(Int_t i) const
00205 {
00206
00207
00208 if (i<0 || i>=_nbins) {
00209 coutE(InputArguments) << "RooParamBinning::binCenter ERROR: bin index " << i
00210 << " is out of range (0," << _nbins-1 << ")" << endl ;
00211 return 0 ;
00212 }
00213
00214 return xlo()->getVal() + (i + 0.5)*averageBinWidth() ;
00215 }
00216
00217
00218
00219
00220
00221 Double_t RooParamBinning::binWidth(Int_t ) const
00222 {
00223
00224
00225 return (xhi()->getVal()-xlo()->getVal())/_nbins ;
00226 }
00227
00228
00229
00230
00231 Double_t RooParamBinning::binLow(Int_t i) const
00232 {
00233
00234
00235 if (i<0 || i>=_nbins) {
00236 coutE(InputArguments) << "RooParamBinning::binLow ERROR: bin index " << i
00237 << " is out of range (0," << _nbins-1 << ")" << endl ;
00238 return 0 ;
00239 }
00240
00241 return xlo()->getVal() + i*binWidth(i) ;
00242 }
00243
00244
00245
00246
00247 Double_t RooParamBinning::binHigh(Int_t i) const
00248 {
00249
00250
00251 if (i<0 || i>=_nbins) {
00252 coutE(InputArguments) << "RooParamBinning::fitBinHigh ERROR: bin index " << i
00253 << " is out of range (0," << _nbins-1 << ")" << endl ;
00254 return 0 ;
00255 }
00256
00257 return xlo()->getVal() + (i + 1)*binWidth(i) ;
00258 }
00259
00260
00261
00262
00263 Double_t* RooParamBinning::array() const
00264 {
00265
00266
00267 if (_array) delete[] _array ;
00268 _array = new Double_t[_nbins+1] ;
00269
00270 Int_t i ;
00271 for (i=0 ; i<=_nbins ; i++) {
00272 _array[i] = xlo()->getVal() + i*binWidth(i) ;
00273 }
00274 return _array ;
00275 }
00276
00277
00278
00279
00280 void RooParamBinning::printMultiline(ostream &os, Int_t , Bool_t , TString indent) const
00281 {
00282
00283 os << indent << "_xlo = " << _xlo << endl ;
00284 os << indent << "_xhi = " << _xhi << endl ;
00285 if (_lp) {
00286 os << indent << "xlo() = " << xlo() << endl ;
00287 os << indent << "xhi() = " << xhi() << endl ;
00288 }
00289 if (xlo()) {
00290 xlo()->Print("t") ;
00291 }
00292 if (xhi()) {
00293 xhi()->Print("t") ;
00294 }
00295 }
00296
00297