71 static std::map<RooAbsData*,int> _dcc ;
73 RooAbsData::StorageType RooAbsData::defaultStorageType=RooAbsData::Vector ;
77 void RooAbsData::setDefaultStorageType(RooAbsData::StorageType s)
79 if (RooAbsData::Composite == s) {
80 cout <<
"Composite storage is not a valid *default* storage type." << endl;
82 defaultStorageType = s;
88 RooAbsData::StorageType RooAbsData::getDefaultStorageType( )
90 return defaultStorageType;
95 void RooAbsData::claimVars(RooAbsData* data)
104 Bool_t RooAbsData::releaseVars(RooAbsData* data)
111 return (_dcc[data]==0) ;
117 RooAbsData::RooAbsData()
121 storageType = defaultStorageType;
123 RooTrace::create(
this) ;
130 RooAbsData::RooAbsData(
const char *name,
const char *title,
const RooArgSet& vars, RooAbsDataStore* dstore) :
131 TNamed(name,title), _vars(
"Dataset Variables"), _cachedVars(
"Cached Variables"), _dstore(dstore)
133 if (dynamic_cast<RooTreeDataStore *>(dstore)) {
134 storageType = RooAbsData::Tree;
135 }
else if (dynamic_cast<RooVectorDataStore *>(dstore)) {
136 storageType = RooAbsData::Vector;
138 storageType = RooAbsData::Composite;
144 TIterator *iter = vars.createIterator();
146 while ((0 != (var = (RooAbsArg *)iter->Next()))) {
147 if (!var->isFundamental()) {
148 coutE(InputArguments) <<
"RooAbsDataStore::initialize(" << GetName()
149 <<
"): Data set cannot contain non-fundamental types, ignoring " << var->GetName()
152 _vars.addClone(*var);
158 iter = _vars.createIterator();
159 while ((0 != (var = (RooAbsArg *)iter->Next()))) {
160 var->attachDataSet(*
this);
164 RooTrace::create(
this);
170 RooAbsData::RooAbsData(
const RooAbsData& other,
const char* newname) :
171 TNamed(newname?newname:other.GetName(),other.GetTitle()),
172 RooPrintable(other), _vars(),
173 _cachedVars(
"Cached Variables")
177 _vars.addClone(other._vars) ;
180 for (
const auto var : _vars) {
181 var->attachDataSet(*
this) ;
185 if (other._ownedComponents.size()>0) {
189 map<string,RooAbsDataStore*> smap ;
190 for (
auto& itero : other._ownedComponents) {
191 RooAbsData* dclone = (RooAbsData*) itero.second->Clone();
192 _ownedComponents[itero.first] = dclone;
193 smap[itero.first] = dclone->store();
196 RooCategory* idx = (RooCategory*) _vars.find(*((RooCompositeDataStore*)other.store())->index()) ;
197 _dstore =
new RooCompositeDataStore(newname?newname:other.GetName(),other.GetTitle(),_vars,*idx,smap) ;
198 storageType = RooAbsData::Composite;
203 _dstore = other._dstore->clone(_vars,newname?newname:other.GetName()) ;
204 storageType = other.storageType;
207 RooTrace::create(
this) ;
210 RooAbsData& RooAbsData::operator=(
const RooAbsData& other) {
211 TNamed::operator=(other);
212 RooPrintable::operator=(other);
216 _vars.addClone(other._vars);
219 for (
const auto var : _vars) {
220 var->attachDataSet(*
this) ;
224 if (other._ownedComponents.size()>0) {
228 map<string,RooAbsDataStore*> smap ;
229 for (
auto& itero : other._ownedComponents) {
230 RooAbsData* dclone = (RooAbsData*) itero.second->Clone();
231 _ownedComponents[itero.first] = dclone;
232 smap[itero.first] = dclone->store();
235 RooCategory* idx = (RooCategory*) _vars.find(*((RooCompositeDataStore*)other.store())->index()) ;
236 _dstore =
new RooCompositeDataStore(GetName(), GetTitle(), _vars, *idx, smap);
237 storageType = RooAbsData::Composite;
242 _dstore = other._dstore->clone(_vars);
243 storageType = other.storageType;
252 RooAbsData::~RooAbsData()
254 if (releaseVars(
this)) {
257 _vars.releaseOwnership() ;
264 for(map<std::string,RooAbsData*>::iterator iter = _ownedComponents.begin() ; iter!= _ownedComponents.end() ; ++iter) {
265 delete iter->second ;
268 RooTrace::destroy(
this) ;
274 void RooAbsData::convertToVectorStore()
276 if (storageType == RooAbsData::Tree) {
277 RooVectorDataStore *newStore =
new RooVectorDataStore(*(RooTreeDataStore *)_dstore, _vars, GetName());
280 storageType = RooAbsData::Vector;
286 Bool_t RooAbsData::changeObservableName(
const char* from,
const char* to)
288 Bool_t ret = _dstore->changeObservableName(from,to) ;
290 RooAbsArg* tmp = _vars.find(from) ;
299 void RooAbsData::fill()
306 Int_t RooAbsData::numEntries()
const
308 return nullptr != _dstore ? _dstore->numEntries() : 0;
313 void RooAbsData::reset()
320 const RooArgSet* RooAbsData::get(Int_t index)
const
323 return _dstore->get(index) ;
329 void RooAbsData::cacheArgs(
const RooAbsArg* cacheOwner, RooArgSet& varSet,
const RooArgSet* nset, Bool_t skipZeroWeights)
331 _dstore->cacheArgs(cacheOwner,varSet,nset,skipZeroWeights) ;
337 void RooAbsData::resetCache()
339 _dstore->resetCache() ;
340 _cachedVars.removeAll() ;
346 void RooAbsData::attachCache(
const RooAbsArg* newOwner,
const RooArgSet& cachedVars)
348 _dstore->attachCache(newOwner, cachedVars) ;
353 void RooAbsData::setArgStatus(
const RooArgSet& set, Bool_t active)
355 _dstore->setArgStatus(set,active) ;
361 void RooAbsData::setDirtyProp(Bool_t flag)
363 _dstore->setDirtyProp(flag) ;
381 RooAbsData* RooAbsData::reduce(
const RooCmdArg& arg1,
const RooCmdArg& arg2,
const RooCmdArg& arg3,
const RooCmdArg& arg4,
382 const RooCmdArg& arg5,
const RooCmdArg& arg6,
const RooCmdArg& arg7,
const RooCmdArg& arg8)
385 RooCmdConfig pc(Form(
"RooAbsData::reduce(%s)",GetName())) ;
386 pc.defineString(
"name",
"Name",0,
"") ;
387 pc.defineString(
"title",
"Title",0,
"") ;
388 pc.defineString(
"cutRange",
"CutRange",0,
"") ;
389 pc.defineString(
"cutSpec",
"CutSpec",0,
"") ;
390 pc.defineObject(
"cutVar",
"CutVar",0,0) ;
391 pc.defineInt(
"evtStart",
"EventRange",0,0) ;
392 pc.defineInt(
"evtStop",
"EventRange",1,2000000000) ;
393 pc.defineObject(
"varSel",
"SelectVars",0,0) ;
394 pc.defineMutex(
"CutVar",
"CutSpec") ;
397 pc.process(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ;
403 const char* cutRange = pc.getString(
"cutRange",0,kTRUE) ;
404 const char* cutSpec = pc.getString(
"cutSpec",0,kTRUE) ;
405 RooFormulaVar* cutVar =
static_cast<RooFormulaVar*
>(pc.getObject(
"cutVar",0)) ;
406 Int_t nStart = pc.getInt(
"evtStart",0) ;
407 Int_t nStop = pc.getInt(
"evtStop",2000000000) ;
408 RooArgSet* varSet =
static_cast<RooArgSet*
>(pc.getObject(
"varSel")) ;
409 const char* name = pc.getString(
"name",0,kTRUE) ;
410 const char* title = pc.getString(
"title",0,kTRUE) ;
413 RooArgSet varSubset ;
415 varSubset.add(*varSet) ;
416 TIterator* iter = varSubset.createIterator() ;
418 while((arg=(RooAbsArg*)iter->Next())) {
419 if (!_vars.find(arg->GetName())) {
420 coutW(InputArguments) <<
"RooAbsData::reduce(" << GetName() <<
") WARNING: variable "
421 << arg->GetName() <<
" not in dataset, ignored" << endl ;
422 varSubset.remove(*arg) ;
427 varSubset.add(*
get()) ;
430 RooAbsData* ret = 0 ;
433 RooFormulaVar cutVarTmp(cutSpec,cutSpec,*
get()) ;
434 ret = reduceEng(varSubset,&cutVarTmp,cutRange,nStart,nStop,kFALSE) ;
438 ret = reduceEng(varSubset,cutVar,cutRange,nStart,nStop,kFALSE) ;
442 ret = reduceEng(varSubset,0,cutRange,nStart,nStop,kFALSE) ;
452 ret->SetTitle(title) ;
464 RooAbsData* RooAbsData::reduce(
const char* cut)
466 RooFormulaVar cutVar(cut,cut,*
get()) ;
467 return reduceEng(*
get(),&cutVar,0,0,2000000000,kFALSE) ;
475 RooAbsData* RooAbsData::reduce(
const RooFormulaVar& cutVar)
477 return reduceEng(*
get(),&cutVar,0,0,2000000000,kFALSE) ;
488 RooAbsData* RooAbsData::reduce(
const RooArgSet& varSubset,
const char* cut)
491 RooArgSet varSubset2(varSubset) ;
492 for (
const auto arg : varSubset) {
493 if (!_vars.find(arg->GetName())) {
494 coutW(InputArguments) <<
"RooAbsData::reduce(" << GetName() <<
") WARNING: variable "
495 << arg->GetName() <<
" not in dataset, ignored" << endl ;
496 varSubset2.remove(*arg) ;
500 if (cut && strlen(cut)>0) {
501 RooFormulaVar cutVar(cut, cut, *
get(),
false);
502 return reduceEng(varSubset2,&cutVar,0,0,2000000000,kFALSE) ;
504 return reduceEng(varSubset2,0,0,0,2000000000,kFALSE) ;
514 RooAbsData* RooAbsData::reduce(
const RooArgSet& varSubset,
const RooFormulaVar& cutVar)
517 RooArgSet varSubset2(varSubset) ;
518 TIterator* iter = varSubset.createIterator() ;
520 while((arg=(RooAbsArg*)iter->Next())) {
521 if (!_vars.find(arg->GetName())) {
522 coutW(InputArguments) <<
"RooAbsData::reduce(" << GetName() <<
") WARNING: variable "
523 << arg->GetName() <<
" not in dataset, ignored" << endl ;
524 varSubset2.remove(*arg) ;
529 return reduceEng(varSubset2,&cutVar,0,0,2000000000,kFALSE) ;
535 Double_t RooAbsData::weightError(ErrorType)
const
543 void RooAbsData::weightError(Double_t& lo, Double_t& hi, ErrorType)
const
549 RooPlot* RooAbsData::plotOn(RooPlot* frame,
const RooCmdArg& arg1,
const RooCmdArg& arg2,
550 const RooCmdArg& arg3,
const RooCmdArg& arg4,
const RooCmdArg& arg5,
551 const RooCmdArg& arg6,
const RooCmdArg& arg7,
const RooCmdArg& arg8)
const
554 l.Add((TObject*)&arg1) ; l.Add((TObject*)&arg2) ;
555 l.Add((TObject*)&arg3) ; l.Add((TObject*)&arg4) ;
556 l.Add((TObject*)&arg5) ; l.Add((TObject*)&arg6) ;
557 l.Add((TObject*)&arg7) ; l.Add((TObject*)&arg8) ;
558 return plotOn(frame,l) ;
569 TH1 *RooAbsData::createHistogram(
const char* varNameList, Int_t xbins, Int_t ybins, Int_t zbins)
const
573 strlcpy(buf,varNameList,1024) ;
574 char* varName = strtok(buf,
",:") ;
576 RooRealVar* xvar = (RooRealVar*)
get()->find(varName) ;
578 coutE(InputArguments) <<
"RooAbsData::createHistogram(" << GetName() <<
") ERROR: dataset does not contain an observable named " << varName << endl ;
581 varName = strtok(0,
",") ;
582 RooRealVar* yvar = varName ? (RooRealVar*)
get()->find(varName) : 0 ;
583 if (varName && !yvar) {
584 coutE(InputArguments) <<
"RooAbsData::createHistogram(" << GetName() <<
") ERROR: dataset does not contain an observable named " << varName << endl ;
587 varName = strtok(0,
",") ;
588 RooRealVar* zvar = varName ? (RooRealVar*)
get()->find(varName) : 0 ;
589 if (varName && !zvar) {
590 coutE(InputArguments) <<
"RooAbsData::createHistogram(" << GetName() <<
") ERROR: dataset does not contain an observable named " << varName << endl ;
596 RooLinkedList argList ;
597 if (xbins<=0 || !xvar->hasMax() || !xvar->hasMin() ) {
598 argList.Add(RooFit::AutoBinning(xbins==0?xvar->numBins():abs(xbins)).Clone()) ;
600 argList.Add(RooFit::Binning(xbins).Clone()) ;
604 if (ybins<=0 || !yvar->hasMax() || !yvar->hasMin() ) {
605 argList.Add(RooFit::YVar(*yvar,RooFit::AutoBinning(ybins==0?yvar->numBins():abs(ybins))).Clone()) ;
607 argList.Add(RooFit::YVar(*yvar,RooFit::Binning(ybins)).Clone()) ;
612 if (zbins<=0 || !zvar->hasMax() || !zvar->hasMin() ) {
613 argList.Add(RooFit::ZVar(*zvar,RooFit::AutoBinning(zbins==0?zvar->numBins():abs(zbins))).Clone()) ;
615 argList.Add(RooFit::ZVar(*zvar,RooFit::Binning(zbins)).Clone()) ;
622 TH1* result = createHistogram(GetName(),*xvar,argList) ;
631 TH1 *RooAbsData::createHistogram(
const char *name,
const RooAbsRealLValue& xvar,
632 const RooCmdArg& arg1,
const RooCmdArg& arg2,
const RooCmdArg& arg3,
const RooCmdArg& arg4,
633 const RooCmdArg& arg5,
const RooCmdArg& arg6,
const RooCmdArg& arg7,
const RooCmdArg& arg8)
const
636 l.Add((TObject*)&arg1) ; l.Add((TObject*)&arg2) ;
637 l.Add((TObject*)&arg3) ; l.Add((TObject*)&arg4) ;
638 l.Add((TObject*)&arg5) ; l.Add((TObject*)&arg6) ;
639 l.Add((TObject*)&arg7) ; l.Add((TObject*)&arg8) ;
641 return createHistogram(name,xvar,l) ;
671 TH1 *RooAbsData::createHistogram(
const char *name,
const RooAbsRealLValue& xvar,
const RooLinkedList& argListIn)
const
673 RooLinkedList argList(argListIn) ;
676 RooCmdConfig pc(Form(
"RooAbsData::createHistogram(%s)",GetName())) ;
677 pc.defineString(
"cutRange",
"CutRange",0,
"",kTRUE) ;
678 pc.defineString(
"cutString",
"CutSpec",0,
"") ;
679 pc.defineObject(
"yvar",
"YVar",0,0) ;
680 pc.defineObject(
"zvar",
"ZVar",0,0) ;
681 pc.allowUndefined() ;
684 pc.process(argList) ;
689 const char* cutSpec = pc.getString(
"cutString",0,kTRUE) ;
690 const char* cutRange = pc.getString(
"cutRange",0,kTRUE) ;
692 RooArgList vars(xvar) ;
693 RooAbsArg* yvar =
static_cast<RooAbsArg*
>(pc.getObject(
"yvar")) ;
697 RooAbsArg* zvar =
static_cast<RooAbsArg*
>(pc.getObject(
"zvar")) ;
702 pc.stripCmdList(argList,
"CutRange,CutSpec") ;
705 RooLinkedList ownedCmds ;
706 RooCmdArg* autoRD = (RooCmdArg*) argList.find(
"AutoRangeData") ;
709 getRange((RooRealVar&)xvar,xmin,xmax,autoRD->getDouble(0),autoRD->getInt(0)) ;
710 RooCmdArg* bincmd = (RooCmdArg*) RooFit::Binning(autoRD->getInt(1),xmin,xmax).Clone() ;
711 ownedCmds.Add(bincmd) ;
712 argList.Replace(autoRD,bincmd) ;
716 RooCmdArg* autoRDY = (RooCmdArg*) ((RooCmdArg*)argList.find(
"YVar"))->subArgs().find(
"AutoRangeData") ;
719 getRange((RooRealVar&)(*yvar),ymin,ymax,autoRDY->getDouble(0),autoRDY->getInt(0)) ;
720 RooCmdArg* bincmd = (RooCmdArg*) RooFit::Binning(autoRDY->getInt(1),ymin,ymax).Clone() ;
722 ((RooCmdArg*)argList.find(
"YVar"))->subArgs().Replace(autoRDY,bincmd) ;
728 RooCmdArg* autoRDZ = (RooCmdArg*) ((RooCmdArg*)argList.find(
"ZVar"))->subArgs().find(
"AutoRangeData") ;
731 getRange((RooRealVar&)(*zvar),zmin,zmax,autoRDZ->getDouble(0),autoRDZ->getInt(0)) ;
732 RooCmdArg* bincmd = (RooCmdArg*) RooFit::Binning(autoRDZ->getInt(1),zmin,zmax).Clone() ;
734 ((RooCmdArg*)argList.find(
"ZVar"))->subArgs().Replace(autoRDZ,bincmd) ;
740 TH1* histo = xvar.createHistogram(name,argList) ;
741 fillHistogram(histo,vars,cutSpec,cutRange) ;
751 Roo1DTable* RooAbsData::table(
const RooArgSet& catSet,
const char* cuts,
const char* opts)
const
755 string prodName(
"(") ;
756 TIterator* iter = catSet.createIterator() ;
758 while((arg=(RooAbsArg*)iter->Next())) {
759 if (dynamic_cast<RooAbsCategory*>(arg)) {
760 RooAbsCategory* varsArg =
dynamic_cast<RooAbsCategory*
>(_vars.find(arg->GetName())) ;
761 if (varsArg != 0) catSet2.add(*varsArg) ;
762 else catSet2.add(*arg) ;
763 if (prodName.length()>1) {
766 prodName += arg->GetName() ;
768 coutW(InputArguments) <<
"RooAbsData::table(" << GetName() <<
") non-RooAbsCategory input argument " << arg->GetName() <<
" ignored" << endl ;
774 RooMultiCategory tmp(prodName.c_str(),prodName.c_str(),catSet2) ;
775 return table(tmp,cuts,opts) ;
781 void RooAbsData::printName(ostream& os)
const
789 void RooAbsData::printTitle(ostream& os)
const
797 void RooAbsData::printClassName(ostream& os)
const
799 os << IsA()->GetName() ;
804 void RooAbsData::printMultiline(ostream& os, Int_t contents, Bool_t verbose, TString indent)
const
806 _dstore->printMultiline(os,contents,verbose,indent) ;
812 Int_t RooAbsData::defaultPrintContents(Option_t* )
const
814 return kName|kClassName|kArgs|kValue ;
826 Double_t RooAbsData::standMoment(RooRealVar &var, Double_t order,
const char* cutSpec,
const char* cutRange)
const
829 if (order==1)
return 0 ;
830 if (order==2)
return 1 ;
832 return moment(var,order,cutSpec,cutRange) / TMath::Power(sigma(var,cutSpec,cutRange),order) ;
845 Double_t RooAbsData::moment(RooRealVar &var, Double_t order,
const char* cutSpec,
const char* cutRange)
const
847 Double_t offset = order>1 ? moment(var,1,cutSpec,cutRange) : 0 ;
848 return moment(var,order,offset,cutSpec,cutRange) ;
858 Double_t RooAbsData::moment(RooRealVar &var, Double_t order, Double_t offset,
const char* cutSpec,
const char* cutRange)
const
861 RooRealVar *varPtr= (RooRealVar*) _vars.find(var.GetName());
863 coutE(InputArguments) <<
"RooDataSet::moment(" << GetName() <<
") ERROR: unknown variable: " << var.GetName() << endl ;
868 if (!dynamic_cast<RooRealVar*>(varPtr)) {
869 coutE(InputArguments) <<
"RooDataSet::moment(" << GetName() <<
") ERROR: variable " << var.GetName() <<
" is not of type RooRealVar" << endl ;
874 if(sumEntries(cutSpec, cutRange) == 0.) {
875 coutE(InputArguments) <<
"RooDataSet::moment(" << GetName() <<
") WARNING: empty dataset" << endl ;
880 std::unique_ptr<RooFormula> select;
882 select.reset(
new RooFormula(
"select",cutSpec,*
get()));
888 const RooArgSet* vars ;
889 for(Int_t index= 0; index < numEntries(); index++) {
891 if (select && select->eval()==0)
continue ;
892 if (cutRange && vars->allInRange(cutRange))
continue ;
894 sum+= weight() * TMath::Power(varPtr->getVal() - offset,order);
896 return sum/sumEntries(cutSpec, cutRange);
902 RooRealVar* RooAbsData::dataRealVar(
const char* methodname, RooRealVar& extVar)
const
905 RooRealVar *xdata = (RooRealVar*) _vars.find(extVar.GetName());
907 coutE(InputArguments) <<
"RooDataSet::" << methodname <<
"(" << GetName() <<
") ERROR: variable : " << extVar.GetName() <<
" is not in data" << endl ;
911 if (!dynamic_cast<RooRealVar*>(xdata)) {
912 coutE(InputArguments) <<
"RooDataSet::" << methodname <<
"(" << GetName() <<
") ERROR: variable : " << extVar.GetName() <<
" is not of type RooRealVar in data" << endl ;
921 Double_t RooAbsData::corrcov(RooRealVar &x,RooRealVar &y,
const char* cutSpec,
const char* cutRange, Bool_t corr)
const
924 RooRealVar *xdata = dataRealVar(corr?
"correlation":
"covariance",x) ;
925 RooRealVar *ydata = dataRealVar(corr?
"correlation":
"covariance",y) ;
926 if (!xdata||!ydata)
return 0 ;
929 if(sumEntries(cutSpec, cutRange) == 0.) {
930 coutW(InputArguments) <<
"RooDataSet::" << (corr?
"correlation":
"covariance") <<
"(" << GetName() <<
") WARNING: empty dataset, returning zero" << endl ;
935 RooFormula* select = cutSpec ?
new RooFormula(
"select",cutSpec,*
get()) : 0 ;
938 Double_t xysum(0),xsum(0),ysum(0),x2sum(0),y2sum(0);
939 const RooArgSet* vars ;
940 for(Int_t index= 0; index < numEntries(); index++) {
942 if (select && select->eval()==0)
continue ;
943 if (cutRange && vars->allInRange(cutRange))
continue ;
945 xysum += weight()*xdata->getVal()*ydata->getVal() ;
946 xsum += weight()*xdata->getVal() ;
947 ysum += weight()*ydata->getVal() ;
949 x2sum += weight()*xdata->getVal()*xdata->getVal() ;
950 y2sum += weight()*ydata->getVal()*ydata->getVal() ;
955 xysum/=sumEntries(cutSpec, cutRange) ;
956 xsum/=sumEntries(cutSpec, cutRange) ;
957 ysum/=sumEntries(cutSpec, cutRange) ;
959 x2sum/=sumEntries(cutSpec, cutRange) ;
960 y2sum/=sumEntries(cutSpec, cutRange) ;
964 if (select)
delete select ;
968 return (xysum-xsum*ysum)/(sqrt(x2sum-(xsum*xsum))*sqrt(y2sum-(ysum*ysum))) ;
970 return (xysum-xsum*ysum);
977 TMatrixDSym* RooAbsData::corrcovMatrix(
const RooArgList& vars,
const char* cutSpec,
const char* cutRange, Bool_t corr)
const
980 TIterator* iter = vars.createIterator() ;
982 while((var=(RooRealVar*)iter->Next())) {
983 RooRealVar* datavar = dataRealVar(
"covarianceMatrix",*var) ;
988 varList.add(*datavar) ;
994 if(sumEntries(cutSpec, cutRange) == 0.) {
995 coutW(InputArguments) <<
"RooDataSet::covariance(" << GetName() <<
") WARNING: empty dataset, returning zero" << endl ;
1000 RooFormula* select = cutSpec ?
new RooFormula(
"select",cutSpec,*
get()) : 0 ;
1002 iter = varList.createIterator() ;
1003 TIterator* iter2 = varList.createIterator() ;
1005 TMatrixDSym xysum(varList.getSize()) ;
1006 vector<double> xsum(varList.getSize()) ;
1007 vector<double> x2sum(varList.getSize()) ;
1010 for(Int_t index= 0; index < numEntries(); index++) {
1011 const RooArgSet* dvars =
get(index) ;
1012 if (select && select->eval()==0)
continue ;
1013 if (cutRange && dvars->allInRange(cutRange))
continue ;
1015 RooRealVar* varx, *vary ;
1018 while((varx=(RooRealVar*)iter->Next())) {
1019 xsum[ix] += weight()*varx->getVal() ;
1021 x2sum[ix] += weight()*varx->getVal()*varx->getVal() ;
1024 *iter2=*iter ; iy=ix ;
1027 xysum(ix,iy) += weight()*varx->getVal()*vary->getVal() ;
1028 xysum(iy,ix) = xysum(ix,iy) ;
1030 vary=(RooRealVar*)iter2->Next() ;
1038 for (Int_t ix=0 ; ix<varList.getSize() ; ix++) {
1039 xsum[ix] /= sumEntries(cutSpec, cutRange) ;
1041 x2sum[ix] /= sumEntries(cutSpec, cutRange) ;
1043 for (Int_t iy=0 ; iy<varList.getSize() ; iy++) {
1044 xysum(ix,iy) /= sumEntries(cutSpec, cutRange) ;
1049 TMatrixDSym* C =
new TMatrixDSym(varList.getSize()) ;
1050 for (Int_t ix=0 ; ix<varList.getSize() ; ix++) {
1051 for (Int_t iy=0 ; iy<varList.getSize() ; iy++) {
1052 (*C)(ix,iy) = xysum(ix,iy)-xsum[ix]*xsum[iy] ;
1054 (*C)(ix,iy) /= sqrt((x2sum[ix]-(xsum[ix]*xsum[ix]))*(x2sum[iy]-(xsum[iy]*xsum[iy]))) ;
1059 if (select)
delete select ;
1073 RooRealVar* RooAbsData::meanVar(RooRealVar &var,
const char* cutSpec,
const char* cutRange)
const
1079 TString name(var.GetName()),title(
"Mean of ") ;
1080 name.Append(
"Mean");
1081 title.Append(var.GetTitle());
1082 RooRealVar *meanv=
new RooRealVar(name,title,0) ;
1083 meanv->setConstant(kFALSE) ;
1086 TString label(
"<") ;
1087 label.Append(var.getPlotLabel());
1089 meanv->setPlotLabel(label.Data());
1092 Double_t meanVal=moment(var,1,0,cutSpec,cutRange) ;
1093 Double_t N(sumEntries(cutSpec,cutRange)) ;
1095 Double_t rmsVal= sqrt(moment(var,2,meanVal,cutSpec,cutRange)*N/(N-1));
1096 meanv->setVal(meanVal) ;
1097 meanv->setError(N > 0 ? rmsVal/sqrt(N) : 0);
1109 RooRealVar* RooAbsData::rmsVar(RooRealVar &var,
const char* cutSpec,
const char* cutRange)
const
1115 TString name(var.GetName()),title(
"RMS of ") ;
1117 title.Append(var.GetTitle());
1118 RooRealVar *rms=
new RooRealVar(name,title,0) ;
1119 rms->setConstant(kFALSE) ;
1122 TString label(var.getPlotLabel());
1123 label.Append(
"_{RMS}");
1124 rms->setPlotLabel(label);
1127 Double_t meanVal(moment(var,1,0,cutSpec,cutRange)) ;
1128 Double_t N(sumEntries(cutSpec, cutRange));
1129 Double_t rmsVal= sqrt(moment(var,2,meanVal,cutSpec,cutRange)*N/(N-1));
1130 rms->setVal(rmsVal) ;
1131 rms->setError(rmsVal/sqrt(2*N));
1166 RooPlot* RooAbsData::statOn(RooPlot* frame,
const RooCmdArg& arg1,
const RooCmdArg& arg2,
1167 const RooCmdArg& arg3,
const RooCmdArg& arg4,
const RooCmdArg& arg5,
1168 const RooCmdArg& arg6,
const RooCmdArg& arg7,
const RooCmdArg& arg8)
1171 RooLinkedList cmdList;
1172 cmdList.Add(const_cast<RooCmdArg*>(&arg1)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg2)) ;
1173 cmdList.Add(const_cast<RooCmdArg*>(&arg3)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg4)) ;
1174 cmdList.Add(const_cast<RooCmdArg*>(&arg5)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg6)) ;
1175 cmdList.Add(const_cast<RooCmdArg*>(&arg7)) ; cmdList.Add(const_cast<RooCmdArg*>(&arg8)) ;
1178 RooCmdConfig pc(Form(
"RooTreeData::statOn(%s)",GetName())) ;
1179 pc.defineString(
"what",
"What",0,
"MNR") ;
1180 pc.defineString(
"label",
"Label",0,
"") ;
1181 pc.defineDouble(
"xmin",
"Layout",0,0.65) ;
1182 pc.defineDouble(
"xmax",
"Layout",1,0.99) ;
1183 pc.defineInt(
"ymaxi",
"Layout",0,Int_t(0.95*10000)) ;
1184 pc.defineString(
"formatStr",
"Format",0,
"NELU") ;
1185 pc.defineInt(
"sigDigit",
"Format",0,2) ;
1186 pc.defineInt(
"dummy",
"FormatArgs",0,0) ;
1187 pc.defineString(
"cutRange",
"CutRange",0,
"",kTRUE) ;
1188 pc.defineString(
"cutString",
"CutSpec",0,
"") ;
1189 pc.defineMutex(
"Format",
"FormatArgs") ;
1192 pc.process(cmdList) ;
1193 if (!pc.ok(kTRUE)) {
1197 const char* label = pc.getString(
"label") ;
1198 Double_t xmin = pc.getDouble(
"xmin") ;
1199 Double_t xmax = pc.getDouble(
"xmax") ;
1200 Double_t ymax = pc.getInt(
"ymaxi") / 10000. ;
1201 const char* formatStr = pc.getString(
"formatStr") ;
1202 Int_t sigDigit = pc.getInt(
"sigDigit") ;
1203 const char* what = pc.getString(
"what") ;
1205 const char* cutSpec = pc.getString(
"cutString",0,kTRUE) ;
1206 const char* cutRange = pc.getString(
"cutRange",0,kTRUE) ;
1208 if (pc.hasProcessed(
"FormatArgs")) {
1209 RooCmdArg* formatCmd =
static_cast<RooCmdArg*
>(cmdList.FindObject(
"FormatArgs")) ;
1210 return statOn(frame,what,label,0,0,xmin,xmax,ymax,cutSpec,cutRange,formatCmd) ;
1212 return statOn(frame,what,label,sigDigit,formatStr,xmin,xmax,ymax,cutSpec,cutRange) ;
1219 RooPlot* RooAbsData::statOn(RooPlot* frame,
const char* what,
const char *label, Int_t sigDigits,
1220 Option_t *options, Double_t xmin, Double_t xmax, Double_t ymax,
1221 const char* cutSpec,
const char* cutRange,
const RooCmdArg* formatCmd)
1223 Bool_t showLabel= (label != 0 && strlen(label) > 0);
1225 TString whatStr(what) ;
1227 Bool_t showN = whatStr.Contains(
"N") ;
1228 Bool_t showR = whatStr.Contains(
"R") ;
1229 Bool_t showM = whatStr.Contains(
"M") ;
1236 Double_t dy(0.06), ymin(ymax-nPar*dy);
1237 if(showLabel) ymin-= dy;
1240 TPaveText *box=
new TPaveText(xmin,ymax,xmax,ymin,
"BRNDC");
1242 box->SetName(Form(
"%s_statBox",GetName())) ;
1243 box->SetFillColor(0);
1244 box->SetBorderSize(1);
1245 box->SetTextAlign(12);
1246 box->SetTextSize(0.04F);
1247 box->SetFillStyle(1001);
1250 RooRealVar N(
"N",
"Number of Events",sumEntries(cutSpec,cutRange));
1251 N.setPlotLabel(
"Entries") ;
1252 RooRealVar *meanv= meanVar(*(RooRealVar*)frame->getPlotVar(),cutSpec,cutRange);
1253 meanv->setPlotLabel(
"Mean") ;
1254 RooRealVar *rms= rmsVar(*(RooRealVar*)frame->getPlotVar(),cutSpec,cutRange);
1255 rms->setPlotLabel(
"RMS") ;
1256 TString *rmsText, *meanText, *NText ;
1258 rmsText= rms->format(sigDigits,options);
1259 meanText= meanv->format(sigDigits,options);
1260 NText= N.format(sigDigits,options);
1262 rmsText= rms->format(*formatCmd);
1263 meanText= meanv->format(*formatCmd);
1264 NText= N.format(*formatCmd);
1266 if (showR) box->AddText(rmsText->Data());
1267 if (showM) box->AddText(meanText->Data());
1268 if (showN) box->AddText(NText->Data());
1278 if(showLabel) box->AddText(label);
1280 frame->addObject(box) ;
1290 TH1 *RooAbsData::fillHistogram(TH1 *hist,
const RooArgList &plotVars,
const char *cuts,
const char* cutRange)
const
1294 coutE(InputArguments) << ClassName() <<
"::" << GetName() <<
":fillHistogram: no valid histogram to fill" << endl;
1299 Int_t hdim= hist->GetDimension();
1300 if(hdim != plotVars.getSize()) {
1301 coutE(InputArguments) << ClassName() <<
"::" << GetName() <<
":fillHistogram: plotVars has the wrong dimension" << endl;
1308 RooArgSet plotClones,localVars;
1309 for(Int_t index= 0; index < plotVars.getSize(); index++) {
1310 const RooAbsArg *var= plotVars.at(index);
1311 const RooAbsReal *realVar=
dynamic_cast<const RooAbsReal*
>(var);
1313 coutE(InputArguments) << ClassName() <<
"::" << GetName() <<
":fillHistogram: cannot plot variable \"" << var->GetName()
1314 <<
"\" of type " << var->ClassName() << endl;
1317 RooAbsArg *found= _vars.find(realVar->GetName());
1319 RooAbsArg *clone= plotClones.addClone(*realVar,kTRUE);
1321 if(!clone->dependsOn(_vars)) {
1322 coutE(InputArguments) << ClassName() <<
"::" << GetName()
1323 <<
":fillHistogram: Data does not contain the variable '" << realVar->GetName() <<
"'." << endl;
1327 clone->recursiveRedirectServers(_vars);
1329 localVars.add(*clone);
1332 localVars.add(*found);
1337 std::unique_ptr<RooFormula> select;
1338 if (cuts !=
nullptr && strlen(cuts) > 0) {
1339 select.reset(
new RooFormula(cuts, cuts, _vars,
false));
1340 if (!select || !select->ok()) {
1341 coutE(InputArguments) << ClassName() <<
"::" << GetName() <<
":fillHistogram: invalid cuts \"" << cuts <<
"\"" << endl;
1347 const RooAbsReal *xvar = 0;
1348 const RooAbsReal *yvar = 0;
1349 const RooAbsReal *zvar = 0;
1352 zvar=
dynamic_cast<RooAbsReal*
>(localVars.find(plotVars.at(2)->GetName()));
1356 yvar=
dynamic_cast<RooAbsReal*
>(localVars.find(plotVars.at(1)->GetName()));
1360 xvar=
dynamic_cast<RooAbsReal*
>(localVars.find(plotVars.at(0)->GetName()));
1364 coutE(InputArguments) << ClassName() <<
"::" << GetName() <<
":fillHistogram: cannot fill histogram with "
1365 << hdim <<
" dimensions" << endl;
1370 vector<string> cutVec ;
1371 if (cutRange && strlen(cutRange)>0) {
1372 if (strchr(cutRange,
',')==0) {
1373 cutVec.push_back(cutRange) ;
1375 const size_t bufSize = strlen(cutRange)+1;
1376 char* buf =
new char[bufSize] ;
1377 strlcpy(buf,cutRange,bufSize) ;
1378 const char* oneRange = strtok(buf,
",") ;
1380 cutVec.push_back(oneRange) ;
1381 oneRange = strtok(0,
",") ;
1388 if (hist->GetSumw2()->fN==0) {
1391 Int_t nevent= numEntries() ;
1392 for(Int_t i=0; i < nevent; ++i) {
1399 if (select && select->eval()==0) {
1405 Bool_t selectByRange = kTRUE ;
1407 for (
const auto arg : _vars) {
1408 Bool_t selectThisArg = kFALSE ;
1410 for (icut=0 ; icut<cutVec.size() ; icut++) {
1411 if (arg->inRange(cutVec[icut].c_str())) {
1412 selectThisArg = kTRUE ;
1416 if (!selectThisArg) {
1417 selectByRange = kFALSE ;
1423 if (!selectByRange) {
1431 bin= hist->FindBin(xvar->getVal());
1432 hist->Fill(xvar->getVal(),weight()) ;
1435 bin= hist->FindBin(xvar->getVal(),yvar->getVal());
1436 static_cast<TH2*
>(hist)->Fill(xvar->getVal(),yvar->getVal(),weight()) ;
1439 bin= hist->FindBin(xvar->getVal(),yvar->getVal(),zvar->getVal());
1440 static_cast<TH3*
>(hist)->Fill(xvar->getVal(),yvar->getVal(),zvar->getVal(),weight()) ;
1448 Double_t error2 = TMath::Power(hist->GetBinError(bin),2)-TMath::Power(weight(),2) ;
1449 Double_t we = weightError(RooAbsData::SumW2) ;
1450 if (we==0) we = weight() ;
1451 error2 += TMath::Power(we,2) ;
1463 hist->SetBinError(bin,sqrt(error2)) ;
1480 TList* RooAbsData::split(
const RooAbsCategory& splitCat, Bool_t createEmptyDataSets)
const
1483 if (!splitCat.dependsOn(*
get())) {
1484 coutE(InputArguments) <<
"RooTreeData::split(" << GetName() <<
") ERROR category " << splitCat.GetName()
1485 <<
" doesn't depend on any variable in this dataset" << endl ;
1490 RooAbsCategory* cloneCat =0;
1491 RooArgSet* cloneSet = 0;
1492 if (splitCat.isDerived()) {
1493 cloneSet = (RooArgSet*) RooArgSet(splitCat).snapshot(kTRUE) ;
1495 coutE(InputArguments) <<
"RooTreeData::split(" << GetName() <<
") Couldn't deep-clone splitting category, abort." << endl ;
1498 cloneCat = (RooAbsCategory*) cloneSet->find(splitCat.GetName()) ;
1499 cloneCat->attachDataSet(*
this) ;
1501 cloneCat =
dynamic_cast<RooAbsCategory*
>(
get()->find(splitCat.GetName())) ;
1503 coutE(InputArguments) <<
"RooTreeData::split(" << GetName() <<
") ERROR category " << splitCat.GetName()
1504 <<
" is fundamental and does not appear in this dataset" << endl ;
1511 TList* dsetList =
new TList ;
1514 RooArgSet subsetVars(*
get()) ;
1515 if (splitCat.isDerived()) {
1516 RooArgSet* vars = splitCat.getVariables() ;
1517 subsetVars.remove(*vars,kTRUE,kTRUE) ;
1520 subsetVars.remove(splitCat,kTRUE,kTRUE) ;
1525 Bool_t addWV(kFALSE) ;
1526 RooRealVar newweight(
"weight",
"weight",-1e9,1e9) ;
1527 if (isWeighted() && !IsA()->InheritsFrom(RooDataHist::Class())) {
1528 subsetVars.add(newweight) ;
1533 if (createEmptyDataSets) {
1534 TIterator* stateIter = cloneCat->typeIterator() ;
1536 while ((state=(RooCatType*)stateIter->Next())) {
1537 RooAbsData* subset = emptyClone(state->GetName(),state->GetName(),&subsetVars,(addWV?
"weight":0)) ;
1538 dsetList->Add((RooAbsArg*)subset) ;
1545 const bool propWeightSquared = isWeighted();
1546 for (Int_t i = 0; i < numEntries(); ++i) {
1547 const RooArgSet* row =
get(i);
1548 RooAbsData* subset = (RooAbsData*) dsetList->FindObject(cloneCat->getLabel());
1550 subset = emptyClone(cloneCat->getLabel(),cloneCat->getLabel(),&subsetVars,(addWV?
"weight":0));
1551 dsetList->Add((RooAbsArg*)subset);
1553 if (!propWeightSquared) {
1554 subset->add(*row, weight());
1556 subset->add(*row, weight(), weightSquared());
1619 RooPlot* RooAbsData::plotOn(RooPlot* frame,
const RooLinkedList& argList)
const
1624 RooCmdConfig pc(Form(
"RooTreeData::plotOn(%s)",GetName())) ;
1625 pc.defineString(
"drawOption",
"DrawOption",0,
"P") ;
1626 pc.defineString(
"cutRange",
"CutRange",0,
"",kTRUE) ;
1627 pc.defineString(
"cutString",
"CutSpec",0,
"") ;
1628 pc.defineString(
"histName",
"Name",0,
"") ;
1629 pc.defineObject(
"cutVar",
"CutVar",0) ;
1630 pc.defineObject(
"binning",
"Binning",0) ;
1631 pc.defineString(
"binningName",
"BinningName",0,
"") ;
1632 pc.defineInt(
"nbins",
"BinningSpec",0,100) ;
1633 pc.defineDouble(
"xlo",
"BinningSpec",0,0) ;
1634 pc.defineDouble(
"xhi",
"BinningSpec",1,1) ;
1635 pc.defineObject(
"asymCat",
"Asymmetry",0) ;
1636 pc.defineObject(
"effCat",
"Efficiency",0) ;
1637 pc.defineInt(
"lineColor",
"LineColor",0,-999) ;
1638 pc.defineInt(
"lineStyle",
"LineStyle",0,-999) ;
1639 pc.defineInt(
"lineWidth",
"LineWidth",0,-999) ;
1640 pc.defineInt(
"markerColor",
"MarkerColor",0,-999) ;
1641 pc.defineInt(
"markerStyle",
"MarkerStyle",0,-999) ;
1642 pc.defineDouble(
"markerSize",
"MarkerSize",0,-999) ;
1643 pc.defineInt(
"fillColor",
"FillColor",0,-999) ;
1644 pc.defineInt(
"fillStyle",
"FillStyle",0,-999) ;
1645 pc.defineInt(
"errorType",
"DataError",0,(Int_t)RooAbsData::Auto) ;
1646 pc.defineInt(
"histInvisible",
"Invisible",0,0) ;
1647 pc.defineInt(
"refreshFrameNorm",
"RefreshNorm",0,1) ;
1648 pc.defineString(
"addToHistName",
"AddTo",0,
"") ;
1649 pc.defineDouble(
"addToWgtSelf",
"AddTo",0,1.) ;
1650 pc.defineDouble(
"addToWgtOther",
"AddTo",1,1.) ;
1651 pc.defineDouble(
"xErrorSize",
"XErrorSize",0,1.) ;
1652 pc.defineDouble(
"scaleFactor",
"Rescale",0,1.) ;
1653 pc.defineMutex(
"DataError",
"Asymmetry",
"Efficiency") ;
1654 pc.defineMutex(
"Binning",
"BinningName",
"BinningSpec") ;
1657 pc.process(argList) ;
1658 if (!pc.ok(kTRUE)) {
1665 o.drawOptions = pc.getString(
"drawOption") ;
1666 o.cuts = pc.getString(
"cutString") ;
1667 if (pc.hasProcessed(
"Binning")) {
1668 o.bins = (RooAbsBinning*) pc.getObject(
"binning") ;
1669 }
else if (pc.hasProcessed(
"BinningName")) {
1670 o.bins = &frame->getPlotVar()->getBinning(pc.getString(
"binningName")) ;
1671 }
else if (pc.hasProcessed(
"BinningSpec")) {
1672 Double_t xlo = pc.getDouble(
"xlo") ;
1673 Double_t xhi = pc.getDouble(
"xhi") ;
1674 o.bins =
new RooUniformBinning((xlo==xhi)?frame->getPlotVar()->getMin():xlo,
1675 (xlo==xhi)?frame->getPlotVar()->getMax():xhi,pc.getInt(
"nbins")) ;
1677 const RooAbsCategoryLValue* asymCat = (
const RooAbsCategoryLValue*) pc.getObject(
"asymCat") ;
1678 const RooAbsCategoryLValue* effCat = (
const RooAbsCategoryLValue*) pc.getObject(
"effCat") ;
1679 o.etype = (RooAbsData::ErrorType) pc.getInt(
"errorType") ;
1680 o.histInvisible = pc.getInt(
"histInvisible") ;
1681 o.xErrorSize = pc.getDouble(
"xErrorSize") ;
1682 o.cutRange = pc.getString(
"cutRange",0,kTRUE) ;
1683 o.histName = pc.getString(
"histName",0,kTRUE) ;
1684 o.addToHistName = pc.getString(
"addToHistName",0,kTRUE) ;
1685 o.addToWgtSelf = pc.getDouble(
"addToWgtSelf") ;
1686 o.addToWgtOther = pc.getDouble(
"addToWgtOther") ;
1687 o.refreshFrameNorm = pc.getInt(
"refreshFrameNorm") ;
1688 o.scaleFactor = pc.getDouble(
"scaleFactor") ;
1691 if (o.etype == Auto) {
1692 o.etype = isNonPoissonWeighted() ? SumW2 : Poisson ;
1693 if (o.etype == SumW2) {
1694 coutI(InputArguments) <<
"RooAbsData::plotOn(" << GetName()
1695 <<
") INFO: dataset has non-integer weights, auto-selecting SumW2 errors instead of Poisson errors" << endl ;
1699 if (o.addToHistName && !frame->findObject(o.addToHistName,RooHist::Class())) {
1700 coutE(InputArguments) <<
"RooAbsData::plotOn(" << GetName() <<
") cannot find existing histogram " << o.addToHistName
1701 <<
" to add to in RooPlot" << endl ;
1706 if (!asymCat && !effCat) {
1707 ret = plotOn(frame,o) ;
1708 }
else if (asymCat) {
1709 ret = plotAsymOn(frame,*asymCat,o) ;
1711 ret = plotEffOn(frame,*effCat,o) ;
1714 Int_t lineColor = pc.getInt(
"lineColor") ;
1715 Int_t lineStyle = pc.getInt(
"lineStyle") ;
1716 Int_t lineWidth = pc.getInt(
"lineWidth") ;
1717 Int_t markerColor = pc.getInt(
"markerColor") ;
1718 Int_t markerStyle = pc.getInt(
"markerStyle") ;
1719 Size_t markerSize = pc.getDouble(
"markerSize") ;
1720 Int_t fillColor = pc.getInt(
"fillColor") ;
1721 Int_t fillStyle = pc.getInt(
"fillStyle") ;
1722 if (lineColor!=-999) ret->getAttLine()->SetLineColor(lineColor) ;
1723 if (lineStyle!=-999) ret->getAttLine()->SetLineStyle(lineStyle) ;
1724 if (lineWidth!=-999) ret->getAttLine()->SetLineWidth(lineWidth) ;
1725 if (markerColor!=-999) ret->getAttMarker()->SetMarkerColor(markerColor) ;
1726 if (markerStyle!=-999) ret->getAttMarker()->SetMarkerStyle(markerStyle) ;
1727 if (markerSize!=-999) ret->getAttMarker()->SetMarkerSize(markerSize) ;
1728 if (fillColor!=-999) ret->getAttFill()->SetFillColor(fillColor) ;
1729 if (fillStyle!=-999) ret->getAttFill()->SetFillStyle(fillStyle) ;
1731 if (pc.hasProcessed(
"BinningSpec")) {
1750 RooPlot *RooAbsData::plotOn(RooPlot *frame, PlotOpt o)
const
1753 coutE(Plotting) << ClassName() <<
"::" << GetName() <<
":plotOn: frame is null" << endl;
1756 RooAbsRealLValue *var= (RooAbsRealLValue*) frame->getPlotVar();
1758 coutE(Plotting) << ClassName() <<
"::" << GetName()
1759 <<
":plotOn: frame does not specify a plot variable" << endl;
1764 TString histName(GetName());
1765 histName.Append(
"_plot");
1768 hist=
static_cast<TH1F*
>(var->createHistogram(histName.Data(), RooFit::AxisLabel(
"Events"), RooFit::Binning(*o.bins))) ;
1770 hist= var->createHistogram(histName.Data(),
"Events",
1771 frame->GetXaxis()->GetXmin(), frame->GetXaxis()->GetXmax(), frame->GetNbinsX());
1777 if(0 == fillHistogram(hist,RooArgList(*var),o.cuts,o.cutRange)) {
1778 coutE(Plotting) << ClassName() <<
"::" << GetName()
1779 <<
":plotOn: fillHistogram() failed" << endl;
1785 Double_t nomBinWidth ;
1786 if (frame->getFitRangeNEvt()==0 && o.bins) {
1787 nomBinWidth = o.bins->averageBinWidth() ;
1789 nomBinWidth = o.bins ? frame->getFitRangeBinW() : 0 ;
1793 RooHist *graph=
new RooHist(*hist,nomBinWidth,1,o.etype,o.xErrorSize,o.correctForBinWidth,o.scaleFactor);
1795 coutE(Plotting) << ClassName() <<
"::" << GetName()
1796 <<
":plotOn: unable to create a RooHist object" << endl;
1803 RooAbsRealLValue* dataVar = (RooAbsRealLValue*) _vars.find(var->GetName()) ;
1804 Double_t nEnt(sumEntries()) ;
1805 if (dataVar->getMin()<var->getMin() || dataVar->getMax()>var->getMax()) {
1806 RooAbsData* tmp = ((RooAbsData*)
this)->reduce(*var) ;
1807 nEnt = tmp->sumEntries() ;
1812 if ((o.cuts && strlen(o.cuts)) || o.cutRange) {
1813 coutI(Plotting) <<
"RooTreeData::plotOn: plotting " << hist->GetSum() <<
" events out of " << nEnt <<
" total events" << endl ;
1814 graph->setRawEntries(nEnt) ;
1818 if (o.addToHistName) {
1819 RooHist* otherGraph =
static_cast<RooHist*
>(frame->findObject(o.addToHistName,RooHist::Class())) ;
1821 if (!graph->hasIdenticalBinning(*otherGraph)) {
1822 coutE(Plotting) <<
"RooTreeData::plotOn: ERROR Histogram to be added to, '" << o.addToHistName <<
"',has different binning" << endl ;
1827 RooHist* sumGraph =
new RooHist(*graph,*otherGraph,o.addToWgtSelf,o.addToWgtOther,o.etype) ;
1834 graph->SetName(o.histName) ;
1836 TString hname(Form(
"h_%s",GetName())) ;
1837 if (o.cutRange && strlen(o.cutRange)>0) {
1838 hname.Append(Form(
"_CutRange[%s]",o.cutRange)) ;
1840 if (o.cuts && strlen(o.cuts)>0) {
1841 hname.Append(Form(
"_Cut[%s]",o.cuts)) ;
1843 graph->SetName(hname.Data()) ;
1847 frame->updateNormVars(_vars);
1851 frame->addPlotable(graph,o.drawOptions,o.histInvisible,o.refreshFrameNorm);
1875 RooPlot* RooAbsData::plotAsymOn(RooPlot* frame,
const RooAbsCategoryLValue& asymCat, PlotOpt o)
const
1878 coutE(Plotting) << ClassName() <<
"::" << GetName() <<
":plotAsymOn: frame is null" << endl;
1881 RooAbsRealLValue *var= (RooAbsRealLValue*) frame->getPlotVar();
1883 coutE(Plotting) << ClassName() <<
"::" << GetName()
1884 <<
":plotAsymOn: frame does not specify a plot variable" << endl;
1889 TString hist1Name(GetName()),hist2Name(GetName());
1890 hist1Name.Append(
"_plot1");
1891 TH1F *hist1, *hist2 ;
1892 hist2Name.Append(
"_plot2");
1895 hist1= var->createHistogram(hist1Name.Data(),
"Events", *o.bins) ;
1896 hist2= var->createHistogram(hist2Name.Data(),
"Events", *o.bins) ;
1898 hist1= var->createHistogram(hist1Name.Data(),
"Events",
1899 frame->GetXaxis()->GetXmin(), frame->GetXaxis()->GetXmax(),
1900 frame->GetNbinsX());
1901 hist2= var->createHistogram(hist2Name.Data(),
"Events",
1902 frame->GetXaxis()->GetXmin(), frame->GetXaxis()->GetXmax(),
1903 frame->GetNbinsX());
1906 assert(0 != hist1 && 0 != hist2);
1908 TString cuts1,cuts2 ;
1909 if (o.cuts && strlen(o.cuts)) {
1910 cuts1 = Form(
"(%s)&&(%s>0)",o.cuts,asymCat.GetName());
1911 cuts2 = Form(
"(%s)&&(%s<0)",o.cuts,asymCat.GetName());
1913 cuts1 = Form(
"(%s>0)",asymCat.GetName());
1914 cuts2 = Form(
"(%s<0)",asymCat.GetName());
1917 if(0 == fillHistogram(hist1,RooArgList(*var),cuts1.Data(),o.cutRange) ||
1918 0 == fillHistogram(hist2,RooArgList(*var),cuts2.Data(),o.cutRange)) {
1919 coutE(Plotting) << ClassName() <<
"::" << GetName()
1920 <<
":plotAsymOn: createHistogram() failed" << endl;
1925 RooHist *graph=
new RooHist(*hist1,*hist2,0,1,o.etype,o.xErrorSize,kFALSE,o.scaleFactor);
1926 graph->setYAxisLabel(Form(
"Asymmetry in %s",asymCat.GetName())) ;
1929 frame->updateNormVars(_vars);
1933 graph->SetName(o.histName) ;
1935 TString hname(Form(
"h_%s_Asym[%s]",GetName(),asymCat.GetName())) ;
1936 if (o.cutRange && strlen(o.cutRange)>0) {
1937 hname.Append(Form(
"_CutRange[%s]",o.cutRange)) ;
1939 if (o.cuts && strlen(o.cuts)>0) {
1940 hname.Append(Form(
"_Cut[%s]",o.cuts)) ;
1942 graph->SetName(hname.Data()) ;
1946 frame->addPlotable(graph,o.drawOptions,o.histInvisible,o.refreshFrameNorm);
1969 RooPlot* RooAbsData::plotEffOn(RooPlot* frame,
const RooAbsCategoryLValue& effCat, PlotOpt o)
const
1972 coutE(Plotting) << ClassName() <<
"::" << GetName() <<
":plotEffOn: frame is null" << endl;
1975 RooAbsRealLValue *var= (RooAbsRealLValue*) frame->getPlotVar();
1977 coutE(Plotting) << ClassName() <<
"::" << GetName()
1978 <<
":plotEffOn: frame does not specify a plot variable" << endl;
1983 TString hist1Name(GetName()),hist2Name(GetName());
1984 hist1Name.Append(
"_plot1");
1985 TH1F *hist1, *hist2 ;
1986 hist2Name.Append(
"_plot2");
1989 hist1= var->createHistogram(hist1Name.Data(),
"Events", *o.bins) ;
1990 hist2= var->createHistogram(hist2Name.Data(),
"Events", *o.bins) ;
1992 hist1= var->createHistogram(hist1Name.Data(),
"Events",
1993 frame->GetXaxis()->GetXmin(), frame->GetXaxis()->GetXmax(),
1994 frame->GetNbinsX());
1995 hist2= var->createHistogram(hist2Name.Data(),
"Events",
1996 frame->GetXaxis()->GetXmin(), frame->GetXaxis()->GetXmax(),
1997 frame->GetNbinsX());
2000 assert(0 != hist1 && 0 != hist2);
2002 TString cuts1,cuts2 ;
2003 if (o.cuts && strlen(o.cuts)) {
2004 cuts1 = Form(
"(%s)&&(%s==1)",o.cuts,effCat.GetName());
2005 cuts2 = Form(
"(%s)&&(%s==0)",o.cuts,effCat.GetName());
2007 cuts1 = Form(
"(%s==1)",effCat.GetName());
2008 cuts2 = Form(
"(%s==0)",effCat.GetName());
2011 if(0 == fillHistogram(hist1,RooArgList(*var),cuts1.Data(),o.cutRange) ||
2012 0 == fillHistogram(hist2,RooArgList(*var),cuts2.Data(),o.cutRange)) {
2013 coutE(Plotting) << ClassName() <<
"::" << GetName()
2014 <<
":plotEffOn: createHistogram() failed" << endl;
2019 RooHist *graph=
new RooHist(*hist1,*hist2,0,1,o.etype,o.xErrorSize,kTRUE);
2020 graph->setYAxisLabel(Form(
"Efficiency of %s=%s",effCat.GetName(),effCat.lookupType(1)->GetName())) ;
2023 frame->updateNormVars(_vars);
2027 graph->SetName(o.histName) ;
2029 TString hname(Form(
"h_%s_Eff[%s]",GetName(),effCat.GetName())) ;
2030 if (o.cutRange && strlen(o.cutRange)>0) {
2031 hname.Append(Form(
"_CutRange[%s]",o.cutRange)) ;
2033 if (o.cuts && strlen(o.cuts)>0) {
2034 hname.Append(Form(
"_Cut[%s]",o.cuts)) ;
2036 graph->SetName(hname.Data()) ;
2040 frame->addPlotable(graph,o.drawOptions,o.histInvisible,o.refreshFrameNorm);
2058 Roo1DTable* RooAbsData::table(
const RooAbsCategory& cat,
const char* cuts,
const char* )
const
2061 RooAbsCategory* tableVar = (RooAbsCategory*) _vars.find(cat.GetName()) ;
2062 RooArgSet *tableSet = 0;
2063 Bool_t ownPlotVar(kFALSE) ;
2065 if (!cat.dependsOn(_vars)) {
2066 coutE(Plotting) <<
"RooTreeData::Table(" << GetName() <<
"): Argument " << cat.GetName()
2067 <<
" is not in dataset and is also not dependent on data set" << endl ;
2072 tableSet = (RooArgSet*) RooArgSet(cat).snapshot(kTRUE) ;
2074 coutE(Plotting) <<
"RooTreeData::table(" << GetName() <<
") Couldn't deep-clone table category, abort." << endl ;
2077 tableVar = (RooAbsCategory*) tableSet->find(cat.GetName()) ;
2078 ownPlotVar = kTRUE ;
2081 tableVar->recursiveRedirectServers(_vars) ;
2084 TString tableName(GetName()) ;
2085 if (cuts && strlen(cuts)) {
2086 tableName.Append(
"(") ;
2087 tableName.Append(cuts) ;
2088 tableName.Append(
")") ;
2090 Roo1DTable* table2 = tableVar->createTable(tableName) ;
2093 RooFormulaVar* cutVar = 0;
2094 if (cuts && strlen(cuts)) {
2095 cutVar =
new RooFormulaVar(
"cutVar",cuts,_vars) ;
2099 Int_t nevent= numEntries() ;
2100 for(Int_t i=0; i < nevent; ++i) {
2103 if (cutVar && cutVar->getVal()==0)
continue ;
2105 table2->fill(*tableVar,weight()) ;
2108 if (ownPlotVar)
delete tableSet ;
2109 if (cutVar)
delete cutVar ;
2119 Bool_t RooAbsData::getRange(RooRealVar& var, Double_t& lowest, Double_t& highest, Double_t marginFrac, Bool_t symMode)
const
2122 RooRealVar *varPtr= (RooRealVar*) _vars.find(var.GetName());
2124 coutE(InputArguments) <<
"RooDataSet::getRange(" << GetName() <<
") ERROR: unknown variable: " << var.GetName() << endl ;
2129 if (!dynamic_cast<RooRealVar*>(varPtr)) {
2130 coutE(InputArguments) <<
"RooDataSet::getRange(" << GetName() <<
") ERROR: variable " << var.GetName() <<
" is not of type RooRealVar" << endl ;
2135 if(sumEntries() == 0.) {
2136 coutE(InputArguments) <<
"RooDataSet::getRange(" << GetName() <<
") WARNING: empty dataset" << endl ;
2141 lowest = RooNumber::infinity() ;
2142 highest = -RooNumber::infinity() ;
2143 for (Int_t i=0 ; i<numEntries() ; i++) {
2145 if (varPtr->getVal()<lowest) {
2146 lowest = varPtr->getVal() ;
2148 if (varPtr->getVal()>highest) {
2149 highest = varPtr->getVal() ;
2154 if (symMode==kFALSE) {
2156 Double_t margin = marginFrac*(highest-lowest) ;
2159 if (lowest<var.getMin()) lowest = var.getMin() ;
2160 if (highest>var.getMax()) highest = var.getMax() ;
2164 Double_t mom1 = moment(var,1) ;
2165 Double_t delta = ((highest-mom1)>(mom1-lowest)?(highest-mom1):(mom1-lowest))*(1+marginFrac) ;
2166 lowest = mom1-delta ;
2167 highest = mom1+delta ;
2168 if (lowest<var.getMin()) lowest = var.getMin() ;
2169 if (highest>var.getMax()) highest = var.getMax() ;
2183 void RooAbsData::optimizeReadingWithCaching(RooAbsArg& arg,
const RooArgSet& cacheList,
const RooArgSet& keepObsList)
2185 RooArgSet pruneSet ;
2188 pruneSet.add(*
get()) ;
2189 RooArgSet* usedObs = arg.getObservables(*
this) ;
2190 pruneSet.remove(*usedObs,kTRUE,kTRUE) ;
2193 TIterator* vIter =
get()->createIterator() ;
2195 while ((var=(RooAbsArg*) vIter->Next())) {
2196 if (allClientsCached(var,cacheList)) {
2197 pruneSet.add(*var) ;
2203 if (pruneSet.getSize()!=0) {
2208 TIterator* uIter = usedObs->createIterator() ;
2210 while((obs=(RooAbsArg*)uIter->Next())) {
2211 RooRealVar* rrv =
dynamic_cast<RooRealVar*
>(obs) ;
2212 if (rrv && !rrv->getBinning().isShareable()) {
2214 RooAbsReal* loFunc = rrv->getBinning().lowBoundFunc() ;
2215 RooAbsReal* hiFunc = rrv->getBinning().highBoundFunc() ;
2217 loFunc->leafNodeServerList(&depObs,0,kTRUE) ;
2220 hiFunc->leafNodeServerList(&depObs,0,kTRUE) ;
2222 if (depObs.getSize()>0) {
2223 pruneSet.remove(depObs,kTRUE,kTRUE) ;
2232 pruneSet.remove(keepObsList,kTRUE,kTRUE) ;
2234 if (pruneSet.getSize()!=0) {
2237 cxcoutI(Optimization) <<
"RooTreeData::optimizeReadingForTestStatistic(" << GetName() <<
"): Observables " << pruneSet
2238 <<
" in dataset are either not used at all, orserving exclusively p.d.f nodes that are now cached, disabling reading of these observables for TTree" << endl ;
2239 setArgStatus(pruneSet,kFALSE) ;
2250 Bool_t RooAbsData::allClientsCached(RooAbsArg* var,
const RooArgSet& cacheList)
2252 Bool_t ret(kTRUE), anyClient(kFALSE) ;
2254 for (
const auto client : var->valueClients()) {
2256 if (!cacheList.find(client->GetName())) {
2258 ret &= allClientsCached(client,cacheList) ;
2262 return anyClient?ret:kFALSE ;
2267 void RooAbsData::attachBuffers(
const RooArgSet& extObs)
2269 _dstore->attachBuffers(extObs) ;
2274 void RooAbsData::resetBuffers()
2276 _dstore->resetBuffers() ;
2281 Bool_t RooAbsData::canSplitFast()
const
2283 if (_ownedComponents.size()>0) {
2291 RooAbsData* RooAbsData::getSimData(
const char* name)
2293 map<string,RooAbsData*>::iterator i = _ownedComponents.find(name) ;
2294 if (i==_ownedComponents.end())
return 0 ;
2300 void RooAbsData::addOwnedComponent(
const char* idxlabel, RooAbsData& data)
2302 _ownedComponents[idxlabel]= &data ;
2308 void RooAbsData::Streamer(TBuffer &R__b)
2310 if (R__b.IsReading()) {
2311 R__b.ReadClassBuffer(RooAbsData::Class(),
this);
2314 if (defaultStorageType==RooAbsData::Vector) {
2315 convertToVectorStore() ;
2319 R__b.WriteClassBuffer(RooAbsData::Class(),
this);
2325 void RooAbsData::checkInit()
const
2327 _dstore->checkInit() ;
2333 void RooAbsData::Draw(Option_t* option)
2335 if (_dstore) _dstore->Draw(option) ;
2340 Bool_t RooAbsData::hasFilledCache()
const
2342 return _dstore->hasFilledCache() ;
2350 const TTree *RooAbsData::tree()
const
2352 if (storageType == RooAbsData::Tree) {
2353 return _dstore->tree();
2355 coutW(InputArguments) <<
"RooAbsData::tree(" << GetName() <<
") WARNING: is not of StorageType::Tree. "
2356 <<
"Use GetClonedTree() instead or convert to tree storage." << endl;
2357 return (TTree *)
nullptr;
2365 TTree *RooAbsData::GetClonedTree()
const
2367 if (storageType == RooAbsData::Tree) {
2368 auto tmp =
const_cast<TTree *
>(_dstore->tree());
2369 return tmp->CloneTree();
2371 RooTreeDataStore buffer(GetName(), GetTitle(), *
get(), *_dstore);
2372 return buffer.tree().CloneTree();
2379 void RooAbsData::convertToTreeStore()
2381 if (storageType != RooAbsData::Tree) {
2382 RooTreeDataStore *newStore =
new RooTreeDataStore(GetName(), GetTitle(), _vars, *_dstore);
2385 storageType = RooAbsData::Tree;
2393 void RooAbsData::RecursiveRemove(TObject *obj)
2395 for(
auto &iter : _ownedComponents) {
2396 if (iter.second == obj) {
2397 iter.second =
nullptr;