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 #include "Riostream.h"
00031
00032 #include "RooErrorVar.h"
00033 #include "RooErrorVar.h"
00034 #include "RooAbsBinning.h"
00035 #include "RooStreamParser.h"
00036 #include "RooRangeBinning.h"
00037 #include "RooMsgService.h"
00038
00039
00040
00041 ClassImp(RooErrorVar)
00042 ;
00043
00044
00045
00046
00047 RooErrorVar::RooErrorVar(const char *name, const char *title, const RooRealVar& input) :
00048 RooAbsRealLValue(name,title),
00049 _realVar("realVar","RooRealVar with error",this,(RooAbsReal&)input)
00050 {
00051
00052
00053 _binning = new RooUniformBinning(-1,1,100) ;
00054 }
00055
00056
00057
00058
00059 RooErrorVar::RooErrorVar(const RooErrorVar& other, const char* name) :
00060 RooAbsRealLValue(other,name),
00061 _realVar("realVar",this,other._realVar)
00062 {
00063 _binning = other._binning->clone() ;
00064
00065
00066
00067 TIterator* iter = other._altBinning.MakeIterator() ;
00068 RooAbsBinning* binning ;
00069 while((binning=(RooAbsBinning*)iter->Next())) {
00070 _altBinning.Add(binning->clone()) ;
00071 }
00072 delete iter ;
00073 }
00074
00075
00076
00077
00078 RooErrorVar::~RooErrorVar()
00079 {
00080
00081
00082 delete _binning ;
00083 }
00084
00085
00086
00087
00088 Double_t RooErrorVar::getVal(const RooArgSet*) const
00089 {
00090
00091
00092 return evaluate();
00093 }
00094
00095
00096
00097
00098 Bool_t RooErrorVar::hasBinning(const char* name) const
00099 {
00100
00101
00102 return _altBinning.FindObject(name) ? kTRUE : kFALSE ;
00103 }
00104
00105
00106
00107
00108 const RooAbsBinning& RooErrorVar::getBinning(const char* name, Bool_t verbose, Bool_t createOnTheFly) const
00109 {
00110
00111
00112
00113 return const_cast<RooErrorVar*>(this)->getBinning(name,verbose,createOnTheFly) ;
00114 }
00115
00116
00117
00118
00119 RooAbsBinning& RooErrorVar::getBinning(const char* name, Bool_t , Bool_t createOnTheFly)
00120 {
00121
00122
00123
00124
00125 if (name==0) {
00126 return *_binning ;
00127 }
00128
00129
00130 RooAbsBinning* binning = (RooAbsBinning*) _altBinning.FindObject(name) ;
00131 if (binning) {
00132 return *binning ;
00133 }
00134
00135
00136 if (!createOnTheFly) {
00137 return *_binning ;
00138 }
00139
00140
00141 binning = new RooRangeBinning(getMin(),getMax(),name) ;
00142 coutI(Contents) << "RooErrorVar::getBinning(" << GetName() << ") new range named '"
00143 << name << "' created with default bounds" << endl ;
00144
00145 _altBinning.Add(binning) ;
00146
00147 return *binning ;
00148 }
00149
00150
00151
00152
00153 void RooErrorVar::setBinning(const RooAbsBinning& binning, const char* name)
00154 {
00155
00156
00157 if (!name) {
00158 if (_binning) delete _binning ;
00159 _binning = binning.clone() ;
00160 } else {
00161
00162
00163 RooAbsBinning* oldBinning = (RooAbsBinning*) _altBinning.FindObject(name) ;
00164 if (oldBinning) {
00165 _altBinning.Remove(oldBinning) ;
00166 delete oldBinning ;
00167 }
00168
00169
00170 RooAbsBinning* newBinning = binning.clone() ;
00171 newBinning->SetName(name) ;
00172 newBinning->SetTitle(name) ;
00173 _altBinning.Add(newBinning) ;
00174
00175 }
00176
00177
00178 }
00179
00180
00181
00182
00183 void RooErrorVar::setMin(const char* name, Double_t value)
00184 {
00185
00186
00187
00188
00189 RooAbsBinning& binning = getBinning(name) ;
00190
00191
00192 if (value >= getMax()) {
00193 coutW(InputArguments) << "RooErrorVar::setMin(" << GetName()
00194 << "): Proposed new fit min. larger than max., setting min. to max." << endl ;
00195 binning.setMin(getMax()) ;
00196 } else {
00197 binning.setMin(value) ;
00198 }
00199
00200
00201 if (!name) {
00202 Double_t clipValue ;
00203 if (!inRange(_value,0,&clipValue)) {
00204 setVal(clipValue) ;
00205 }
00206 }
00207
00208 setShapeDirty() ;
00209 }
00210
00211
00212
00213 void RooErrorVar::setMax(const char* name, Double_t value)
00214 {
00215
00216
00217
00218
00219 RooAbsBinning& binning = getBinning(name) ;
00220
00221
00222 if (value < getMin()) {
00223 coutW(InputArguments) << "RooErrorVar::setMax(" << GetName()
00224 << "): Proposed new fit max. smaller than min., setting max. to min." << endl ;
00225 binning.setMax(getMin()) ;
00226 } else {
00227 binning.setMax(value) ;
00228 }
00229
00230
00231 if (!name) {
00232 Double_t clipValue ;
00233 if (!inRange(_value,0,&clipValue)) {
00234 setVal(clipValue) ;
00235 }
00236 }
00237
00238 setShapeDirty() ;
00239 }
00240
00241
00242
00243
00244 void RooErrorVar::setRange( const char* name, Double_t min, Double_t max)
00245 {
00246
00247
00248
00249 Bool_t exists = name ? (_altBinning.FindObject(name)?kTRUE:kFALSE) : kTRUE ;
00250
00251
00252 RooAbsBinning& binning = getBinning(name,kFALSE) ;
00253
00254
00255 if (min>max) {
00256 coutW(InputArguments) << "RooErrorVar::setRange(" << GetName()
00257 << "): Proposed new fit max. smaller than min., setting max. to min." << endl ;
00258 binning.setRange(min,min) ;
00259 } else {
00260 binning.setRange(min,max) ;
00261 }
00262
00263 if (!exists) {
00264 coutI(InputArguments) << "RooErrorVar::setRange(" << GetName()
00265 << ") new range named '" << name << "' created with bounds ["
00266 << min << "," << max << "]" << endl ;
00267 }
00268
00269 setShapeDirty() ;
00270 }
00271
00272
00273
00274
00275 Bool_t RooErrorVar::readFromStream(istream& is, Bool_t , Bool_t verbose)
00276 {
00277
00278
00279 TString token,errorPrefix("RooErrorVar::readFromStream(") ;
00280 errorPrefix.Append(GetName()) ;
00281 errorPrefix.Append(")") ;
00282 RooStreamParser parser(is,errorPrefix) ;
00283 Double_t value(0) ;
00284
00285
00286 if (parser.readDouble(value,verbose)) return kTRUE ;
00287 if (isValidReal(value,verbose)) {
00288 setVal(value) ;
00289 return kFALSE ;
00290 } else {
00291 return kTRUE ;
00292 }
00293 }
00294
00295
00296
00297
00298 void RooErrorVar::writeToStream(ostream& os, Bool_t ) const
00299 {
00300
00301
00302 os << getVal() ;
00303 }
00304
00305
00306
00307 void RooErrorVar::syncCache(const RooArgSet*)
00308 {
00309
00310
00311 _value = evaluate() ;
00312 }