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
00032
00033
00034
00035 #include "RooFit.h"
00036
00037 #include <math.h>
00038 #include <stdlib.h>
00039 #include <string.h>
00040 #include <ctype.h>
00041 #include "Riostream.h"
00042 #include "TObjString.h"
00043 #include "TTree.h"
00044 #include "TH1.h"
00045 #include "TH2.h"
00046 #include "TH3.h"
00047 #include "RooAbsRealLValue.h"
00048 #include "RooStreamParser.h"
00049 #include "RooRandom.h"
00050 #include "RooPlot.h"
00051 #include "RooArgList.h"
00052 #include "RooAbsBinning.h"
00053 #include "RooBinning.h"
00054 #include "RooUniformBinning.h"
00055 #include "RooCmdConfig.h"
00056 #include "RooTreeData.h"
00057 #include "RooRealVar.h"
00058 #include "RooMsgService.h"
00059
00060
00061
00062 ClassImp(RooAbsRealLValue)
00063
00064
00065 RooAbsRealLValue::RooAbsRealLValue(const char *name, const char *title, const char *unit) :
00066 RooAbsReal(name, title, 0, 0, unit)
00067 {
00068
00069 }
00070
00071
00072
00073
00074 RooAbsRealLValue::RooAbsRealLValue(const RooAbsRealLValue& other, const char* name) :
00075 RooAbsReal(other,name), RooAbsLValue(other)
00076 {
00077
00078 }
00079
00080
00081
00082 RooAbsRealLValue::~RooAbsRealLValue()
00083 {
00084
00085 }
00086
00087
00088
00089
00090 Bool_t RooAbsRealLValue::inRange(Double_t value, const char* rangeName, Double_t* clippedValPtr) const
00091 {
00092
00093
00094
00095
00096 Double_t clippedValue(value);
00097 Bool_t isInRange(kTRUE) ;
00098
00099
00100 if(hasMax() && value > (getMax(rangeName)+1e-6)) {
00101 if (clippedValPtr) {
00102
00103
00104 }
00105 clippedValue = getMax(rangeName);
00106 isInRange = kFALSE ;
00107 }
00108
00109 if(hasMin() && value < getMin(rangeName)-1e-6) {
00110 if (clippedValPtr) {
00111
00112
00113 }
00114 clippedValue = getMin(rangeName);
00115 isInRange = kFALSE ;
00116 }
00117
00118 if (clippedValPtr) *clippedValPtr=clippedValue ;
00119 return isInRange ;
00120 }
00121
00122
00123
00124
00125 Bool_t RooAbsRealLValue::isValidReal(Double_t value, Bool_t verbose) const
00126 {
00127
00128
00129 if (!inRange(value,0)) {
00130 if (verbose)
00131 coutI(InputArguments) << "RooRealVar::isValid(" << GetName() << "): value " << value
00132 << " out of range (" << getMin() << " - " << getMax() << ")" << endl ;
00133 return kFALSE ;
00134 }
00135 return kTRUE ;
00136 }
00137
00138
00139
00140
00141 Bool_t RooAbsRealLValue::readFromStream(istream& , Bool_t , Bool_t )
00142 {
00143
00144
00145 return kTRUE ;
00146 }
00147
00148
00149
00150
00151 void RooAbsRealLValue::writeToStream(ostream& , Bool_t ) const
00152 {
00153
00154 }
00155
00156
00157
00158
00159 RooAbsArg& RooAbsRealLValue::operator=(Double_t newValue)
00160 {
00161
00162
00163 Double_t clipValue ;
00164
00165 inRange(newValue,0,&clipValue) ;
00166 setVal(clipValue) ;
00167
00168 return *this ;
00169 }
00170
00171
00172
00173 RooAbsArg& RooAbsRealLValue::operator=(const RooAbsReal& arg)
00174 {
00175
00176 return operator=(arg.getVal()) ;
00177 }
00178
00179
00180
00181
00182 RooPlot* RooAbsRealLValue::frame(const RooCmdArg& arg1, const RooCmdArg& arg2, const RooCmdArg& arg3, const RooCmdArg& arg4,
00183 const RooCmdArg& arg5, const RooCmdArg& arg6, const RooCmdArg& arg7, const RooCmdArg& arg8) const
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 {
00204 RooLinkedList cmdList ;
00205 cmdList.Add(const_cast<RooCmdArg*>(&arg1)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg2)) ;
00206 cmdList.Add(const_cast<RooCmdArg*>(&arg3)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg4)) ;
00207 cmdList.Add(const_cast<RooCmdArg*>(&arg5)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg6)) ;
00208 cmdList.Add(const_cast<RooCmdArg*>(&arg7)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg8)) ;
00209
00210 return frame(cmdList) ;
00211 }
00212
00213
00214
00215
00216 RooPlot* RooAbsRealLValue::frame(const RooLinkedList& cmdList) const
00217 {
00218
00219
00220
00221 RooCmdConfig pc(Form("RooAbsRealLValue::frame(%s)",GetName())) ;
00222 pc.defineDouble("min","Range",0,getMin()) ;
00223 pc.defineDouble("max","Range",1,getMax()) ;
00224 pc.defineInt("nbins","Bins",0,getBins()) ;
00225 pc.defineString("rangeName","RangeWithName",0,"") ;
00226 pc.defineString("name","Name",0,"") ;
00227 pc.defineString("title","Title",0,"") ;
00228 pc.defineMutex("Range","RangeWithName","AutoRange") ;
00229 pc.defineObject("rangeData","AutoRange",0,0) ;
00230 pc.defineDouble("rangeMargin","AutoRange",0,0.1) ;
00231 pc.defineInt("rangeSym","AutoRange",0,0) ;
00232
00233
00234 pc.process(cmdList) ;
00235 if (!pc.ok(kTRUE)) {
00236 return 0 ;
00237 }
00238
00239
00240 Double_t xmin,xmax ;
00241 if (pc.hasProcessed("Range")) {
00242 xmin = pc.getDouble("min") ;
00243 xmax = pc.getDouble("max") ;
00244 if (xmin==xmax) {
00245 xmin = getMin() ;
00246 xmax = getMax() ;
00247 }
00248 } else if (pc.hasProcessed("RangeWithName")) {
00249 const char* rangeName=pc.getString("rangeName",0,kTRUE) ;
00250 xmin = getMin(rangeName) ;
00251 xmax = getMax(rangeName) ;
00252 } else if (pc.hasProcessed("AutoRange")) {
00253 RooTreeData* rangeData = static_cast<RooTreeData*>(pc.getObject("rangeData")) ;
00254 rangeData->getRange((RooRealVar&)*this,xmin,xmax) ;
00255 if (pc.getInt("rangeSym")==0) {
00256
00257 Double_t margin = pc.getDouble("rangeMargin")*(xmax-xmin) ;
00258 xmin -= margin ;
00259 xmax += margin ;
00260 if (xmin<getMin()) xmin = getMin() ;
00261 if (xmin>getMax()) xmax = getMax() ;
00262 } else {
00263
00264
00265 Double_t dmean = rangeData->moment((RooRealVar&)*this,1) ;
00266 Double_t ddelta = ((xmax-dmean)>(dmean-xmin)?(xmax-dmean):(dmean-xmin))*(1+pc.getDouble("rangeMargin")) ;
00267 xmin = dmean-ddelta ;
00268 xmax = dmean+ddelta ;
00269 if (xmin<getMin()) xmin = getMin() ;
00270 if (xmin>getMax()) xmax = getMax() ;
00271 }
00272 } else {
00273 xmin = getMin() ;
00274 xmax = getMax() ;
00275 }
00276
00277 Int_t nbins = pc.getInt("nbins") ;
00278 const char* name = pc.getString("name",0,kTRUE) ;
00279 const char* title = pc.getString("title",0,kTRUE) ;
00280
00281 RooPlot* theFrame = new RooPlot(*this,xmin,xmax,nbins) ;
00282
00283 if (name) {
00284 theFrame->SetName(name) ;
00285 }
00286 if (title) {
00287 theFrame->SetTitle(title) ;
00288 }
00289
00290 return theFrame ;
00291 }
00292
00293
00294
00295
00296 RooPlot *RooAbsRealLValue::frame(Double_t xlo, Double_t xhi, Int_t nbins) const
00297 {
00298
00299
00300
00301
00302
00303 return new RooPlot(*this,xlo,xhi,nbins);
00304 }
00305
00306
00307
00308
00309 RooPlot *RooAbsRealLValue::frame(Double_t xlo, Double_t xhi) const
00310 {
00311
00312
00313
00314
00315
00316 return new RooPlot(*this,xlo,xhi,getBins());
00317 }
00318
00319
00320
00321
00322 RooPlot *RooAbsRealLValue::frame(Int_t nbins) const
00323 {
00324
00325
00326
00327
00328
00329
00330
00331
00332 if (getMin()==getMax()) {
00333 coutE(InputArguments) << "RooAbsRealLValue::frame(" << GetName() << ") ERROR: empty fit range, must specify plot range" << endl ;
00334 return 0 ;
00335 }
00336 if (RooNumber::isInfinite(getMin())||RooNumber::isInfinite(getMax())) {
00337 coutE(InputArguments) << "RooAbsRealLValue::frame(" << GetName() << ") ERROR: open ended fit range, must specify plot range" << endl ;
00338 return 0 ;
00339 }
00340
00341 return new RooPlot(*this,getMin(),getMax(),nbins);
00342 }
00343
00344
00345
00346
00347 RooPlot *RooAbsRealLValue::frame() const
00348 {
00349
00350
00351
00352
00353
00354
00355
00356
00357 if (getMin()==getMax()) {
00358 coutE(InputArguments) << "RooAbsRealLValue::frame(" << GetName() << ") ERROR: empty fit range, must specify plot range" << endl ;
00359 return 0 ;
00360 }
00361 if (RooNumber::isInfinite(getMin())||RooNumber::isInfinite(getMax())) {
00362 coutE(InputArguments) << "RooAbsRealLValue::frame(" << GetName() << ") ERROR: open ended fit range, must specify plot range" << endl ;
00363 return 0 ;
00364 }
00365
00366 return new RooPlot(*this,getMin(),getMax(),getBins());
00367 }
00368
00369
00370
00371
00372 void RooAbsRealLValue::copyCache(const RooAbsArg* source, Bool_t )
00373 {
00374
00375
00376 RooAbsReal::copyCache(source) ;
00377 setVal(_value) ;
00378 }
00379
00380
00381
00382 void RooAbsRealLValue::printMultiline(ostream& os, Int_t contents, Bool_t verbose, TString indent) const
00383 {
00384
00385
00386 RooAbsReal::printMultiline(os,contents,verbose,indent);
00387 os << indent << "--- RooAbsRealLValue ---" << endl;
00388 TString unit(_unit);
00389 if(!unit.IsNull()) unit.Prepend(' ');
00390 os << indent << " Fit range is [ ";
00391 if(hasMin()) {
00392 os << getMin() << unit << " , ";
00393 }
00394 else {
00395 os << "-INF , ";
00396 }
00397 if(hasMax()) {
00398 os << getMax() << unit << " ]" << endl;
00399 }
00400 else {
00401 os << "+INF ]" << endl;
00402 }
00403 }
00404
00405
00406
00407
00408 void RooAbsRealLValue::randomize(const char* rangeName)
00409 {
00410
00411
00412
00413 if(hasMin(rangeName) && hasMax(rangeName)) {
00414 Double_t range= getMax(rangeName)-getMin(rangeName);
00415 setVal(getMin(rangeName) + RooRandom::uniform()*range);
00416 }
00417 else {
00418 coutE(Generation) << fName << "::" << ClassName() << ":randomize: fails with unbounded fit range" << endl;
00419 }
00420 }
00421
00422
00423
00424
00425 void RooAbsRealLValue::setBin(Int_t ibin, const char* rangeName)
00426 {
00427
00428
00429
00430
00431 if (ibin<0 || ibin>=numBins(rangeName)) {
00432 coutE(InputArguments) << "RooAbsRealLValue::setBin(" << GetName() << ") ERROR: bin index " << ibin
00433 << " is out of range (0," << getBins(rangeName)-1 << ")" << endl ;
00434 return ;
00435 }
00436
00437
00438 setVal(getBinning(rangeName).binCenter(ibin)) ;
00439 }
00440
00441
00442
00443
00444
00445
00446 void RooAbsRealLValue::setBin(Int_t ibin, const RooAbsBinning& binning)
00447 {
00448
00449
00450
00451 setVal(binning.binCenter(ibin)) ;
00452 }
00453
00454
00455
00456
00457
00458
00459 void RooAbsRealLValue::randomize(const RooAbsBinning& binning)
00460 {
00461
00462
00463
00464 Double_t range= binning.highBound() - binning.lowBound() ;
00465 setVal(binning.lowBound() + RooRandom::uniform()*range);
00466 }
00467
00468
00469
00470
00471
00472
00473 void RooAbsRealLValue::setBinFast(Int_t ibin, const RooAbsBinning& binning)
00474 {
00475
00476
00477
00478
00479 setValFast(binning.binCenter(ibin)) ;
00480 }
00481
00482
00483
00484
00485 Bool_t RooAbsRealLValue::fitRangeOKForPlotting() const
00486 {
00487
00488
00489 return (hasMin() && hasMax() && (getMin()!=getMax())) ;
00490 }
00491
00492
00493
00494
00495 Bool_t RooAbsRealLValue::inRange(const char* name) const
00496 {
00497
00498
00499 return (getVal() >= getMin(name) && getVal() <= getMax(name)) ;
00500 }
00501
00502
00503
00504
00505 TH1* RooAbsRealLValue::createHistogram(const char *name, const RooCmdArg& arg1, const RooCmdArg& arg2,
00506 const RooCmdArg& arg3, const RooCmdArg& arg4, const RooCmdArg& arg5,
00507 const RooCmdArg& arg6, const RooCmdArg& arg7, const RooCmdArg& arg8) const
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528 {
00529 RooLinkedList l ;
00530 l.Add((TObject*)&arg1) ; l.Add((TObject*)&arg2) ;
00531 l.Add((TObject*)&arg3) ; l.Add((TObject*)&arg4) ;
00532 l.Add((TObject*)&arg5) ; l.Add((TObject*)&arg6) ;
00533 l.Add((TObject*)&arg7) ; l.Add((TObject*)&arg8) ;
00534
00535 return createHistogram(name,l) ;
00536 }
00537
00538
00539
00540
00541 TH1* RooAbsRealLValue::createHistogram(const char *name, const RooLinkedList& cmdList) const
00542 {
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552 RooCmdConfig pc(Form("RooAbsRealLValue::createHistogram(%s)",GetName())) ;
00553
00554 pc.defineObject("xbinning","Binning",0,0) ;
00555 pc.defineString("xbinningName","BinningName",0,"") ;
00556 pc.defineInt("nxbins","BinningSpec",0) ;
00557 pc.defineDouble("xlo","BinningSpec",0,0) ;
00558 pc.defineDouble("xhi","BinningSpec",1,0) ;
00559
00560 pc.defineObject("yvar","YVar",0,0) ;
00561 pc.defineObject("ybinning","YVar::Binning",0,0) ;
00562 pc.defineString("ybinningName","YVar::BinningName",0,"") ;
00563 pc.defineInt("nybins","YVar::BinningSpec",0) ;
00564 pc.defineDouble("ylo","YVar::BinningSpec",0,0) ;
00565 pc.defineDouble("yhi","YVar::BinningSpec",1,0) ;
00566
00567 pc.defineObject("zvar","ZVar",0,0) ;
00568 pc.defineObject("zbinning","ZVar::Binning",0,0) ;
00569 pc.defineString("zbinningName","ZVar::BinningName",0,"") ;
00570 pc.defineInt("nzbins","ZVar::BinningSpec",0) ;
00571 pc.defineDouble("zlo","ZVar::BinningSpec",0,0) ;
00572 pc.defineDouble("zhi","ZVar::BinningSpec",1,0) ;
00573
00574 pc.defineString("axisLabel","AxisLabel",0,"Events") ;
00575
00576 pc.defineDependency("ZVar","YVar") ;
00577
00578
00579 pc.process(cmdList) ;
00580 if (!pc.ok(kTRUE)) {
00581 return 0 ;
00582 }
00583
00584
00585 const char* axisLabel = pc.getString("axisLabel") ;
00586 const RooAbsBinning* binning[3] ;
00587 Bool_t ownBinning[3] = { kFALSE, kFALSE, kFALSE } ;
00588 RooArgList vars ;
00589
00590
00591 vars.add(*this) ;
00592 if (pc.hasProcessed("Binning")) {
00593 binning[0] = static_cast<RooAbsBinning*>(pc.getObject("xbinning")) ;
00594 } else if (pc.hasProcessed("BinningName")) {
00595 binning[0] = &getBinning(pc.getString("xbinningName",0,kTRUE)) ;
00596 } else if (pc.hasProcessed("BinningSpec")) {
00597 Double_t xlo = pc.getDouble("xlo") ;
00598 Double_t xhi = pc.getDouble("xhi") ;
00599 binning[0] = new RooUniformBinning((xlo==xhi)?getMin():xlo,(xlo==xhi)?getMax():xhi,pc.getInt("nxbins")) ;
00600 ownBinning[0] = kTRUE ;
00601 } else {
00602 binning[0] = &getBinning() ;
00603 }
00604
00605 if (pc.hasProcessed("YVar")) {
00606 RooAbsRealLValue& yvar = *static_cast<RooAbsRealLValue*>(pc.getObject("yvar")) ;
00607 vars.add(yvar) ;
00608 if (pc.hasProcessed("YVar::Binning")) {
00609 binning[1] = static_cast<RooAbsBinning*>(pc.getObject("ybinning")) ;
00610 } else if (pc.hasProcessed("YVar::BinningName")) {
00611 binning[1] = &yvar.getBinning(pc.getString("ybinningName",0,kTRUE)) ;
00612 } else if (pc.hasProcessed("YVar::BinningSpec")) {
00613 Double_t ylo = pc.getDouble("ylo") ;
00614 Double_t yhi = pc.getDouble("yhi") ;
00615 binning[1] = new RooUniformBinning((ylo==yhi)?yvar.getMin():ylo,(ylo==yhi)?yvar.getMax():yhi,pc.getInt("nybins")) ;
00616 ownBinning[1] = kTRUE ;
00617 } else {
00618 binning[1] = &yvar.getBinning() ;
00619 }
00620 }
00621
00622 if (pc.hasProcessed("ZVar")) {
00623 RooAbsRealLValue& zvar = *static_cast<RooAbsRealLValue*>(pc.getObject("zvar")) ;
00624 vars.add(zvar) ;
00625 if (pc.hasProcessed("ZVar::Binning")) {
00626 binning[2] = static_cast<RooAbsBinning*>(pc.getObject("zbinning")) ;
00627 } else if (pc.hasProcessed("ZVar::BinningName")) {
00628 binning[2] = &zvar.getBinning(pc.getString("zbinningName",0,kTRUE)) ;
00629 } else if (pc.hasProcessed("ZVar::BinningSpec")) {
00630 Double_t zlo = pc.getDouble("zlo") ;
00631 Double_t zhi = pc.getDouble("zhi") ;
00632 binning[2] = new RooUniformBinning((zlo==zhi)?zvar.getMin():zlo,(zlo==zhi)?zvar.getMax():zhi,pc.getInt("nzbins")) ;
00633 ownBinning[2] = kTRUE ;
00634 } else {
00635 binning[2] = &zvar.getBinning() ;
00636 }
00637 }
00638
00639
00640 TH1* ret = createHistogram(name, vars, axisLabel, binning) ;
00641
00642 if (ownBinning[0]) delete binning[0] ;
00643 if (ownBinning[1]) delete binning[1] ;
00644 if (ownBinning[2]) delete binning[2] ;
00645
00646 return ret ;
00647 }
00648
00649
00650
00651
00652 TH1F *RooAbsRealLValue::createHistogram(const char *name, const char *yAxisLabel) const
00653 {
00654
00655
00656
00657
00658
00659
00660
00661 if (!fitRangeOKForPlotting()) {
00662 coutE(InputArguments) << "RooAbsRealLValue::createHistogram(" << GetName()
00663 << ") ERROR: fit range empty or open ended, must explicitly specify range" << endl ;
00664 return 0 ;
00665 }
00666
00667 RooArgList list(*this) ;
00668 Double_t xlo = getMin() ;
00669 Double_t xhi = getMax() ;
00670 Int_t nbins = getBins() ;
00671
00672
00673 return (TH1F*)createHistogram(name, list, yAxisLabel, &xlo, &xhi, &nbins);
00674 }
00675
00676
00677
00678
00679 TH1F *RooAbsRealLValue::createHistogram(const char *name, const char *yAxisLabel, Double_t xlo, Double_t xhi, Int_t nBins) const
00680 {
00681
00682
00683
00684
00685
00686
00687 RooArgList list(*this) ;
00688
00689
00690 return (TH1F*)createHistogram(name, list, yAxisLabel, &xlo, &xhi, &nBins);
00691 }
00692
00693
00694
00695
00696 TH1F *RooAbsRealLValue::createHistogram(const char *name, const char *yAxisLabel, const RooAbsBinning& bins) const
00697 {
00698
00699
00700 RooArgList list(*this) ;
00701 const RooAbsBinning* pbins = &bins ;
00702
00703
00704 return (TH1F*)createHistogram(name, list, yAxisLabel, &pbins);
00705 }
00706
00707
00708
00709
00710 TH2F *RooAbsRealLValue::createHistogram(const char *name, const RooAbsRealLValue &yvar, const char *zAxisLabel,
00711 Double_t* xlo, Double_t* xhi, Int_t* nBins) const
00712 {
00713
00714
00715
00716
00717
00718
00719 if ((!xlo && xhi) || (xlo && !xhi)) {
00720 coutE(InputArguments) << "RooAbsRealLValue::createHistogram(" << GetName()
00721 << ") ERROR must specify either no range, or both limits" << endl ;
00722 return 0 ;
00723 }
00724
00725 Double_t xlo_fit[2] ;
00726 Double_t xhi_fit[2] ;
00727 Int_t nbins_fit[2] ;
00728
00729 Double_t *xlo2 = xlo;
00730 Double_t *xhi2 = xhi;
00731 Int_t *nBins2 = nBins;
00732
00733 if (!xlo2) {
00734
00735 if (!fitRangeOKForPlotting()) {
00736 coutE(InputArguments) << "RooAbsRealLValue::createHistogram(" << GetName()
00737 << ") ERROR: fit range empty or open ended, must explicitly specify range" << endl ;
00738 return 0 ;
00739 }
00740 if (!yvar.fitRangeOKForPlotting()) {
00741 coutE(InputArguments) << "RooAbsRealLValue::createHistogram(" << GetName()
00742 << ") ERROR: fit range of " << yvar.GetName() << " empty or open ended, must explicitly specify range" << endl ;
00743 return 0 ;
00744 }
00745
00746 xlo_fit[0] = getMin() ;
00747 xhi_fit[0] = getMax() ;
00748
00749 xlo_fit[1] = yvar.getMin() ;
00750 xhi_fit[1] = yvar.getMax() ;
00751
00752 xlo2 = xlo_fit ;
00753 xhi2 = xhi_fit ;
00754 }
00755
00756 if (!nBins2) {
00757 nbins_fit[0] = getBins() ;
00758 nbins_fit[1] = yvar.getBins() ;
00759 nBins2 = nbins_fit ;
00760 }
00761
00762
00763 RooArgList list(*this,yvar) ;
00764
00765 return (TH2F*)createHistogram(name, list, zAxisLabel, xlo2, xhi2, nBins2);
00766 }
00767
00768
00769
00770
00771 TH2F *RooAbsRealLValue::createHistogram(const char *name, const RooAbsRealLValue &yvar,
00772 const char *zAxisLabel, const RooAbsBinning** bins) const
00773 {
00774
00775
00776
00777 RooArgList list(*this,yvar) ;
00778 return (TH2F*)createHistogram(name, list, zAxisLabel, bins);
00779 }
00780
00781
00782
00783
00784 TH3F *RooAbsRealLValue::createHistogram(const char *name, const RooAbsRealLValue &yvar, const RooAbsRealLValue &zvar,
00785 const char *tAxisLabel, Double_t* xlo, Double_t* xhi, Int_t* nBins) const
00786 {
00787
00788
00789
00790
00791
00792
00793 if ((!xlo && xhi) || (xlo && !xhi)) {
00794 coutE(InputArguments) << "RooAbsRealLValue::createHistogram(" << GetName()
00795 << ") ERROR must specify either no range, or both limits" << endl ;
00796 return 0 ;
00797 }
00798
00799 Double_t xlo_fit[3] ;
00800 Double_t xhi_fit[3] ;
00801 Int_t nbins_fit[3] ;
00802
00803 Double_t *xlo2 = xlo;
00804 Double_t *xhi2 = xhi;
00805 Int_t* nBins2 = nBins;
00806 if (!xlo2) {
00807
00808 if (!fitRangeOKForPlotting()) {
00809 coutE(InputArguments) << "RooAbsRealLValue::createHistogram(" << GetName()
00810 << ") ERROR: fit range empty or open ended, must explicitly specify range" << endl ;
00811 return 0 ;
00812 }
00813 if (!yvar.fitRangeOKForPlotting()) {
00814 coutE(InputArguments) << "RooAbsRealLValue::createHistogram(" << GetName()
00815 << ") ERROR: fit range of " << yvar.GetName() << " empty or open ended, must explicitly specify range" << endl ;
00816 return 0 ;
00817 }
00818 if (!zvar.fitRangeOKForPlotting()) {
00819 coutE(InputArguments) << "RooAbsRealLValue::createHistogram(" << GetName()
00820 << ") ERROR: fit range of " << zvar.GetName() << " empty or open ended, must explicitly specify range" << endl ;
00821 return 0 ;
00822 }
00823
00824 xlo_fit[0] = getMin() ;
00825 xhi_fit[0] = getMax() ;
00826
00827 xlo_fit[1] = yvar.getMin() ;
00828 xhi_fit[1] = yvar.getMax() ;
00829
00830 xlo_fit[2] = zvar.getMin() ;
00831 xhi_fit[2] = zvar.getMax() ;
00832
00833 xlo2 = xlo_fit ;
00834 xhi2 = xhi_fit ;
00835 }
00836
00837 if (!nBins2) {
00838 nbins_fit[0] = getBins() ;
00839 nbins_fit[1] = yvar.getBins() ;
00840 nbins_fit[2] = zvar.getBins() ;
00841 nBins2 = nbins_fit ;
00842 }
00843
00844 RooArgList list(*this,yvar,zvar) ;
00845 return (TH3F*)createHistogram(name, list, tAxisLabel, xlo2, xhi2, nBins2);
00846 }
00847
00848
00849 TH3F *RooAbsRealLValue::createHistogram(const char *name, const RooAbsRealLValue &yvar, const RooAbsRealLValue &zvar,
00850 const char* tAxisLabel, const RooAbsBinning** bins) const
00851 {
00852
00853
00854
00855 RooArgList list(*this,yvar,zvar) ;
00856 return (TH3F*)createHistogram(name, list, tAxisLabel, bins);
00857 }
00858
00859
00860
00861
00862
00863 TH1 *RooAbsRealLValue::createHistogram(const char *name, RooArgList &vars, const char *tAxisLabel,
00864 Double_t* xlo, Double_t* xhi, Int_t* nBins)
00865 {
00866
00867
00868
00869
00870
00871 const RooAbsBinning* bin[3] ;
00872 Int_t ndim = vars.getSize() ;
00873 bin[0] = new RooUniformBinning(xlo[0],xhi[0],nBins[0]) ;
00874 bin[1] = (ndim>1) ? new RooUniformBinning(xlo[1],xhi[1],nBins[1]) : 0 ;
00875 bin[2] = (ndim>2) ? new RooUniformBinning(xlo[2],xhi[2],nBins[2]) : 0 ;
00876
00877 TH1* ret = createHistogram(name,vars,tAxisLabel,bin) ;
00878
00879 if (bin[0]) delete bin[0] ;
00880 if (bin[1]) delete bin[1] ;
00881 if (bin[2]) delete bin[2] ;
00882 return ret ;
00883 }
00884
00885
00886
00887
00888 TH1 *RooAbsRealLValue::createHistogram(const char *name, RooArgList &vars, const char *tAxisLabel, const RooAbsBinning** bins)
00889 {
00890
00891
00892
00893
00894
00895
00896
00897 Int_t dim= vars.getSize();
00898 if(dim < 1 || dim > 3) {
00899 oocoutE((TObject*)0,InputArguments) << "RooAbsReal::createHistogram: dimension not supported: " << dim << endl;
00900 return 0;
00901 }
00902
00903
00904 TString histName(name);
00905 histName.Append("_");
00906 const RooAbsRealLValue *xyz[3];
00907
00908 Int_t index;
00909 for(index= 0; index < dim; index++) {
00910 const RooAbsArg *arg= vars.at(index);
00911 xyz[index]= dynamic_cast<const RooAbsRealLValue*>(arg);
00912 if(!xyz[index]) {
00913 oocoutE((TObject*)0,InputArguments) << "RooAbsRealLValue::createHistogram: variable is not real lvalue: " << arg->GetName() << endl;
00914 return 0;
00915 }
00916 histName.Append("_");
00917 histName.Append(arg->GetName());
00918 }
00919 TString histTitle(histName);
00920 histTitle.Prepend("Histogram of ");
00921
00922
00923 TH1 *histogram = 0;
00924 switch(dim) {
00925 case 1:
00926 if (bins[0]->isUniform()) {
00927 histogram= new TH1F(histName.Data(), histTitle.Data(),
00928 bins[0]->numBins(),bins[0]->lowBound(),bins[0]->highBound());
00929 } else {
00930 histogram= new TH1F(histName.Data(), histTitle.Data(),
00931 bins[0]->numBins(),bins[0]->array());
00932 }
00933 break;
00934 case 2:
00935 if (bins[0]->isUniform() && bins[1]->isUniform()) {
00936 histogram= new TH2F(histName.Data(), histTitle.Data(),
00937 bins[0]->numBins(),bins[0]->lowBound(),bins[0]->highBound(),
00938 bins[1]->numBins(),bins[1]->lowBound(),bins[1]->highBound());
00939 } else {
00940 histogram= new TH2F(histName.Data(), histTitle.Data(),
00941 bins[0]->numBins(),bins[0]->array(),
00942 bins[1]->numBins(),bins[1]->array());
00943 }
00944 break;
00945 case 3:
00946 if (bins[0]->isUniform() && bins[1]->isUniform() && bins[2]->isUniform()) {
00947 histogram= new TH3F(histName.Data(), histTitle.Data(),
00948 bins[0]->numBins(),bins[0]->lowBound(),bins[0]->highBound(),
00949 bins[1]->numBins(),bins[1]->lowBound(),bins[1]->highBound(),
00950 bins[2]->numBins(),bins[2]->lowBound(),bins[2]->highBound()) ;
00951 } else {
00952 histogram= new TH3F(histName.Data(), histTitle.Data(),
00953 bins[0]->numBins(),bins[0]->array(),
00954 bins[1]->numBins(),bins[1]->array(),
00955 bins[2]->numBins(),bins[2]->array()) ;
00956 }
00957 break;
00958 }
00959 if(!histogram) {
00960 oocoutE((TObject*)0,InputArguments) << "RooAbsReal::createHistogram: unable to create a new histogram" << endl;
00961 return 0;
00962 }
00963
00964
00965 for(index= 0; index < dim; index++) {
00966 TString axisTitle(xyz[index]->getTitle(kTRUE));
00967 switch(index) {
00968 case 0:
00969 histogram->SetXTitle(axisTitle.Data());
00970 break;
00971 case 1:
00972 histogram->SetYTitle(axisTitle.Data());
00973 break;
00974 case 2:
00975 histogram->SetZTitle(axisTitle.Data());
00976 break;
00977 default:
00978 assert(0);
00979 break;
00980 }
00981 }
00982
00983
00984 if((0 != tAxisLabel) && (0 != strlen(tAxisLabel))) {
00985 TString axisTitle(tAxisLabel);
00986 axisTitle.Append(" / ( ");
00987 for(Int_t index2= 0; index2 < dim; index2++) {
00988 Double_t delta= bins[index2]->averageBinWidth() ;
00989 if(index2 > 0) axisTitle.Append(" x ");
00990 axisTitle.Append(Form("%g",delta));
00991 if(strlen(xyz[index2]->getUnit())) {
00992 axisTitle.Append(" ");
00993 axisTitle.Append(xyz[index2]->getUnit());
00994 }
00995 }
00996 axisTitle.Append(" )");
00997 switch(dim) {
00998 case 1:
00999 histogram->SetYTitle(axisTitle.Data());
01000 break;
01001 case 2:
01002 histogram->SetZTitle(axisTitle.Data());
01003 break;
01004 case 3:
01005
01006 break;
01007 default:
01008 assert(0);
01009 break;
01010 }
01011 }
01012
01013 return histogram;
01014 }
01015
01016
01017 Bool_t RooAbsRealLValue::isJacobianOK(const RooArgSet&) const
01018 {
01019
01020
01021
01022
01023 return kTRUE ;
01024 }