Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RooTreeDataStore.cxx
Go to the documentation of this file.
1/*****************************************************************************
2 * Project: RooFit *
3 * Package: RooFitCore *
4 * @(#)root/roofitcore:$Id$
5 * Authors: *
6 * WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu *
7 * DK, David Kirkby, UC Irvine, dkirkby@uci.edu *
8 * *
9 * Copyright (c) 2000-2005, Regents of the University of California *
10 * and Stanford University. All rights reserved. *
11 * *
12 * Redistribution and use in source and binary forms, *
13 * with or without modification, are permitted according to the terms *
14 * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
15 *****************************************************************************/
16
17/**
18\file RooTreeDataStore.cxx
19\class RooTreeDataStore
20\ingroup Roofitcore
21
22RooTreeDataStore is a TTree-backed data storage. When a file is opened before
23creating the data storage, the storage will be file-backed. This reduces memory
24pressure because it allows storing the data in the file and reading it on demand.
25For a completely memory-backed storage, which is faster than the file-backed storage,
26RooVectorDataStore can be used.
27
28With tree-backed storage, the tree can be found in the file with the name
29`RooTreeDataStore_name_title` for a dataset created as
30`RooDataSet("name", "title", ...)`.
31
32\note A file needs to be opened **before** creating the data storage to enable file-backed
33storage.
34```
35TFile outputFile("filename.root", "RECREATE");
36RooAbsData::setDefaultStorageType(RooAbsData::Tree);
37RooDataSet mydata(...);
38```
39
40One can also change between TTree- and std::vector-backed storage using
41RooAbsData::convertToTreeStore() and
42RooAbsData::convertToVectorStore().
43**/
44
45#include "RooTreeDataStore.h"
46
47#include "RooMsgService.h"
48#include "RooFormulaVar.h"
49#include "RooRealVar.h"
50#include "RooHistError.h"
51
52#include "ROOT/StringUtils.hxx"
53
54#include "TTree.h"
55#include "TFile.h"
56#include "TChain.h"
57#include "TDirectory.h"
58#include "TBuffer.h"
59#include "TBranch.h"
60#include "TROOT.h"
61
62#include <iomanip>
63using namespace std ;
64
66
67
69
70
71
72////////////////////////////////////////////////////////////////////////////////
73
75
76
77
78////////////////////////////////////////////////////////////////////////////////
79/// Constructor to facilitate reading of legacy RooDataSets
80
81RooTreeDataStore::RooTreeDataStore(TTree* t, const RooArgSet& vars, const char* wgtVarName) :
82 RooAbsDataStore("blah","blah",varsNoWeight(vars,wgtVarName)),
83 _tree(t),
84 _defCtor(true),
85 _varsww(vars),
86 _wgtVar(weightVar(vars,wgtVarName))
87{
88}
89
90
91
92
93////////////////////////////////////////////////////////////////////////////////
94
95RooTreeDataStore::RooTreeDataStore(RooStringView name, RooStringView title, const RooArgSet& vars, const char* wgtVarName) :
96 RooAbsDataStore(name,title,varsNoWeight(vars,wgtVarName)),
97 _varsww(vars),
98 _wgtVar(weightVar(vars,wgtVarName))
99{
100 initialize() ;
101}
102
103
104////////////////////////////////////////////////////////////////////////////////
105
106RooTreeDataStore::RooTreeDataStore(RooStringView name, RooStringView title, const RooArgSet& vars, TTree& t, const char* selExpr, const char* wgtVarName) :
107 RooAbsDataStore(name,title,varsNoWeight(vars,wgtVarName)),
108 _varsww(vars),
109 _wgtVar(weightVar(vars,wgtVarName))
110{
111 initialize() ;
112
113 if (selExpr && *selExpr) {
114 // Create a RooFormulaVar cut from given cut expression
115 RooFormulaVar select(selExpr, selExpr, _vars, /*checkVariables=*/false);
116 loadValues(&t,&select);
117 } else {
118 loadValues(&t);
119 }
120}
121
122
123////////////////////////////////////////////////////////////////////////////////
124
125RooTreeDataStore::RooTreeDataStore(RooStringView name, RooStringView title, const RooArgSet& vars, const RooAbsDataStore& ads, const char* selExpr, const char* wgtVarName) :
126 RooAbsDataStore(name,title,varsNoWeight(vars,wgtVarName)),
127 _varsww(vars),
128 _wgtVar(weightVar(vars,wgtVarName))
129{
130 initialize() ;
131
132 if (selExpr && *selExpr) {
133 // Create a RooFormulaVar cut from given cut expression
134 RooFormulaVar select(selExpr, selExpr, _vars, /*checkVariables=*/false);
135 loadValues(&ads,&select);
136 } else {
137 loadValues(&ads);
138 }
139}
140
141
142
143
144////////////////////////////////////////////////////////////////////////////////
145
147 const RooArgSet& vars, const RooFormulaVar* cutVar, const char* cutRange,
148 Int_t nStart, Int_t nStop, const char* wgtVarName) :
149 RooAbsDataStore(name,title,varsNoWeight(vars,wgtVarName)), _defCtor(false),
150 _varsww(vars),
151 _wgtVar(weightVar(vars,wgtVarName))
152{
153 // WVE NEED TO ADJUST THIS FOR WEIGHTS
154
155 // Protected constructor for internal use only
156 _tree = 0 ;
157 _cacheTree = 0 ;
158 createTree(makeTreeName(), title);
159
160 // Deep clone cutVar and attach clone to this dataset
161 std::unique_ptr<RooFormulaVar> cloneVar;
162 if (cutVar) {
163 cloneVar.reset(static_cast<RooFormulaVar*>(cutVar->cloneTree()));
164 cloneVar->attachDataStore(tds) ;
165 }
166
167 // Constructor from existing data set with list of variables that preserves the cache
168 initialize();
169
171
172 // WVE copy values of cached variables here!!!
174 _cacheOwner = 0 ;
175
176 loadValues(&tds,cloneVar.get(),cutRange,nStart,nStop);
177}
178
179
180std::unique_ptr<RooAbsDataStore> RooTreeDataStore::reduce(RooStringView name, RooStringView title,
181 const RooArgSet& vars, const RooFormulaVar* cutVar, const char* cutRange,
182 std::size_t nStart, std::size_t nStop) {
183 RooArgSet tmp(vars) ;
184 if(_wgtVar && !tmp.contains(*_wgtVar)) {
185 tmp.add(*_wgtVar) ;
186 }
187 const char* wgtVarName = _wgtVar ? _wgtVar->GetName() : nullptr;
188 return std::make_unique<RooTreeDataStore>(name, title, *this, tmp, cutVar, cutRange, nStart, nStop, wgtVarName);
189}
190
191
192////////////////////////////////////////////////////////////////////////////////
193/// Utility function for constructors
194/// Return RooArgSet that is copy of allVars minus variable matching wgtName if specified
195
196RooArgSet RooTreeDataStore::varsNoWeight(const RooArgSet& allVars, const char* wgtName)
197{
198 RooArgSet ret(allVars) ;
199 if(wgtName) {
200 RooAbsArg* wgt = allVars.find(wgtName) ;
201 if (wgt) {
202 ret.remove(*wgt,true,true) ;
203 }
204 }
205 return ret ;
206}
207
208
209
210////////////////////////////////////////////////////////////////////////////////
211/// Utility function for constructors
212/// Return pointer to weight variable if it is defined
213
214RooRealVar* RooTreeDataStore::weightVar(const RooArgSet& allVars, const char* wgtName)
215{
216 if(wgtName) {
217 RooRealVar* wgt = dynamic_cast<RooRealVar*>(allVars.find(wgtName)) ;
218 return wgt ;
219 }
220 return 0 ;
221}
222
223
224
225
226////////////////////////////////////////////////////////////////////////////////
227/// Initialize cache of dataset: attach variables of cache ArgSet
228/// to the corresponding TTree branches
229
230void RooTreeDataStore::attachCache(const RooAbsArg* newOwner, const RooArgSet& cachedVarsIn)
231{
232 // iterate over the cache variables for this dataset
234 for (RooAbsArg * var : cachedVarsIn) {
235 var->attachToTree(*_cacheTree,_defTreeBufSize) ;
236 _cachedVars.add(*var) ;
237 }
238 _cacheOwner = newOwner ;
239
240}
241
242
243
244
245
246
247////////////////////////////////////////////////////////////////////////////////
248
249RooTreeDataStore::RooTreeDataStore(const RooTreeDataStore& other, const char* newname) :
250 RooAbsDataStore(other,newname),
251 _varsww(other._varsww),
252 _wgtVar(other._wgtVar),
253 _extWgtArray(other._extWgtArray),
254 _extWgtErrLoArray(other._extWgtErrLoArray),
255 _extWgtErrHiArray(other._extWgtErrHiArray),
256 _extSumW2Array(other._extSumW2Array),
257 _curWgt(other._curWgt),
258 _curWgtErrLo(other._curWgtErrLo),
259 _curWgtErrHi(other._curWgtErrHi),
260 _curWgtErr(other._curWgtErr)
261{
262 initialize() ;
263 loadValues(&other) ;
264}
265
266
267////////////////////////////////////////////////////////////////////////////////
268
269RooTreeDataStore::RooTreeDataStore(const RooTreeDataStore& other, const RooArgSet& vars, const char* newname) :
270 RooAbsDataStore(other,varsNoWeight(vars,other._wgtVar?other._wgtVar->GetName():0),newname),
271 _varsww(vars),
272 _wgtVar(other._wgtVar?weightVar(vars,other._wgtVar->GetName()):0),
273 _extWgtArray(other._extWgtArray),
274 _extWgtErrLoArray(other._extWgtErrLoArray),
275 _extWgtErrHiArray(other._extWgtErrHiArray),
276 _extSumW2Array(other._extSumW2Array),
277 _curWgt(other._curWgt),
278 _curWgtErrLo(other._curWgtErrLo),
279 _curWgtErrHi(other._curWgtErrHi),
280 _curWgtErr(other._curWgtErr)
281{
282 initialize() ;
283 loadValues(&other) ;
284}
285
286
287
288
289////////////////////////////////////////////////////////////////////////////////
290/// Destructor
291
293{
294 if (_tree) {
295 delete _tree ;
296 }
297 if (_cacheTree) {
298 delete _cacheTree ;
299 }
300}
301
302
303
304////////////////////////////////////////////////////////////////////////////////
305/// One-time initialization common to all constructor forms. Attach
306/// variables of internal ArgSet to the corresponding TTree branches
307
309{
310 // Recreate (empty) cache tree
312
313 // Attach each variable to the dataset
314 for (auto var : _varsww) {
315 var->attachToTree(*_tree,_defTreeBufSize) ;
316 }
317}
318
319
320
321
322
323////////////////////////////////////////////////////////////////////////////////
324/// Create TTree object that lives in memory, independent of current
325/// location of gDirectory
326
328{
329 if (!_tree) {
330 _tree = new TTree(name,title);
333 _tree->SetDirectory(nullptr);
334 }
335
336 TString pwd(gDirectory->GetPath()) ;
337 TString memDir(gROOT->GetName()) ;
338 memDir.Append(":/") ;
339 bool notInMemNow= (pwd!=memDir) ;
340
341 // cout << "RooTreeData::createTree pwd=" << pwd << " memDir=" << memDir << " notInMemNow = " << (notInMemNow?"T":"F") << endl ;
342
343 if (notInMemNow) {
344 gDirectory->cd(memDir) ;
345 }
346
347 if (!_cacheTree) {
348 _cacheTree = new TTree(TString{static_cast<const char*>(name)} + "_cacheTree", TString{static_cast<const char*>(title)});
350 gDirectory->RecursiveRemove(_cacheTree) ;
351 }
352
353 if (notInMemNow) {
354 gDirectory->cd(pwd) ;
355 }
356
357}
358
359
360
361
362////////////////////////////////////////////////////////////////////////////////
363/// Load values from tree 't' into this data collection, optionally
364/// selecting events using the RooFormulaVar 'select'.
365///
366/// The source tree 't' is cloned to not disturb its branch
367/// structure when retrieving information from it.
368void RooTreeDataStore::loadValues(const TTree *t, const RooFormulaVar* select, const char* /*rangeName*/, Int_t /*nStart*/, Int_t /*nStop*/)
369{
370 // Make our local copy of the tree, so we can safely loop through it.
371 // We need a custom deleter, because if we don't deregister the Tree from the directory
372 // of the original, it tears it down at destruction time!
373 auto deleter = [](TTree* tree){tree->SetDirectory(nullptr); delete tree;};
374 std::unique_ptr<TTree, decltype(deleter)> tClone(static_cast<TTree*>(t->Clone()), deleter);
375 tClone->SetDirectory(t->GetDirectory());
376
377 // Clone list of variables
378 std::unique_ptr<RooArgSet> sourceArgSet( _varsww.snapshot(false) );
379
380 // Check that we have the branches:
381 bool missingBranches = false;
382 for (const auto var : *sourceArgSet) {
383 if (!tClone->GetBranch(var->GetName())) {
384 missingBranches = true;
385 coutE(InputArguments) << "Didn't find a branch in Tree '" << tClone->GetName() << "' to read variable '"
386 << var->GetName() << "' from."
387 << "\n\tNote: Name the RooFit variable the same as the branch." << std::endl;
388 }
389 }
390 if (missingBranches) {
391 coutE(InputArguments) << "Cannot import data from TTree '" << tClone->GetName()
392 << "' because some branches are missing !" << std::endl;
393 return;
394 }
395
396 // Attach args in cloned list to cloned source tree
397 for (const auto sourceArg : *sourceArgSet) {
398 sourceArg->attachToTree(*tClone,_defTreeBufSize) ;
399 }
400
401 // Redirect formula servers to sourceArgSet
402 std::unique_ptr<RooFormulaVar> selectClone;
403 if (select) {
404 selectClone.reset( static_cast<RooFormulaVar*>(select->cloneTree()) );
405 selectClone->recursiveRedirectServers(*sourceArgSet) ;
406 selectClone->setOperMode(RooAbsArg::ADirty,true) ;
407 }
408
409 // Loop over events in source tree
410 Int_t numInvalid(0) ;
411 const Long64_t nevent = tClone->GetEntries();
412 for(Long64_t i=0; i < nevent; ++i) {
413 const auto entryNumber = tClone->GetEntryNumber(i);
414 if (entryNumber<0) break;
415 tClone->GetEntry(entryNumber,1);
416
417 // Copy from source to destination
418 bool allOK(true) ;
419 for (unsigned int j=0; j < sourceArgSet->size(); ++j) {
420 auto destArg = _varsww[j];
421 const auto sourceArg = (*sourceArgSet)[j];
422
423 destArg->copyCache(sourceArg) ;
424 sourceArg->copyCache(destArg) ;
425 if (!destArg->isValid()) {
426 numInvalid++ ;
427 allOK=false ;
428 if (numInvalid < 5) {
429 auto& log = coutI(DataHandling);
430 log << "RooTreeDataStore::loadValues(" << GetName() << ") Skipping event #" << i << " because " << destArg->GetName()
431 << " cannot accommodate the value ";
432 if(sourceArg->isCategory()) {
433 log << static_cast<RooAbsCategory*>(sourceArg)->getCurrentIndex();
434 } else {
435 log << static_cast<RooAbsReal*>(sourceArg)->getVal();
436 }
437 log << std::endl;
438 } else if (numInvalid == 5) {
439 coutI(DataHandling) << "RooTreeDataStore::loadValues(" << GetName() << ") Skipping ..." << std::endl;
440 }
441 break ;
442 }
443 }
444
445 // Does this event pass the cuts?
446 if (!allOK || (selectClone && selectClone->getVal()==0)) {
447 continue ;
448 }
449
450 fill() ;
451 }
452
453 if (numInvalid>0) {
454 coutW(DataHandling) << "RooTreeDataStore::loadValues(" << GetName() << ") Ignored " << numInvalid << " out-of-range events" << endl ;
455 }
456
457 SetTitle(t->GetTitle());
458}
459
460
461
462
463
464
465////////////////////////////////////////////////////////////////////////////////
466/// Load values from dataset 't' into this data collection, optionally
467/// selecting events using 'select' RooFormulaVar
468///
469
471 const char* rangeName, std::size_t nStart, std::size_t nStop)
472{
473 // Redirect formula servers to source data row
474 std::unique_ptr<RooFormulaVar> selectClone;
475 if (select) {
476 selectClone.reset( static_cast<RooFormulaVar*>(select->cloneTree()) );
477 selectClone->recursiveRedirectServers(*ads->get()) ;
478 selectClone->setOperMode(RooAbsArg::ADirty,true) ;
479 }
480
481 // Force RDS internal initialization
482 ads->get(0) ;
483
484 // Loop over events in source tree
485 const auto numEntr = static_cast<std::size_t>(ads->numEntries());
486 std::size_t nevent = nStop < numEntr ? nStop : numEntr;
487
488 auto TDS = dynamic_cast<const RooTreeDataStore*>(ads) ;
489 if (TDS) {
490 const_cast<RooTreeDataStore*>(TDS)->resetBuffers();
491 }
492
493 std::vector<std::string> ranges;
494 if (rangeName) {
495 ranges = ROOT::Split(rangeName, ",");
496 }
497
498 for (auto i=nStart; i < nevent ; ++i) {
499 ads->get(i) ;
500
501 // Does this event pass the cuts?
502 if (selectClone && selectClone->getVal()==0) {
503 continue ;
504 }
505
506
507 if (TDS) {
508 _varsww.assignValueOnly(TDS->_varsww) ;
509 } else {
510 _varsww.assignValueOnly(*ads->get()) ;
511 }
512
513 // Check that all copied values are valid
514 bool allValid = true;
515 for (const auto arg : _varsww) {
516 allValid = arg->isValid() && (ranges.empty() || std::any_of(ranges.begin(), ranges.end(),
517 [arg](const std::string& range){return arg->inRange(range.c_str());}) );
518 if (!allValid)
519 break ;
520 }
521
522 if (!allValid) {
523 continue ;
524 }
525
526 _cachedVars.assign(((RooTreeDataStore*)ads)->_cachedVars) ;
527 fill() ;
528 }
529
530 if (TDS) {
531 const_cast<RooTreeDataStore*>(TDS)->restoreAlternateBuffers();
532 }
533
534 SetTitle(ads->GetTitle());
535}
536
537
538////////////////////////////////////////////////////////////////////////////////
539/// Interface function to TTree::Fill
540
542{
543 return _tree->Fill() ;
544}
545
546
547
548////////////////////////////////////////////////////////////////////////////////
549/// Load the n-th data point (n='index') in memory
550/// and return a pointer to the internal RooArgSet
551/// holding its coordinates.
552
554{
555 checkInit() ;
556
557 Int_t ret = ((RooTreeDataStore*)this)->GetEntry(index, 1) ;
558
559 if(!ret) return 0;
560
561 if (_doDirtyProp) {
562 // Raise all dirty flags
563 for (auto var : _vars) {
564 var->setValueDirty(); // This triggers recalculation of all clients
565 }
566
567 for (auto var : _cachedVars) {
568 var->setValueDirty(); // This triggers recalculation of all clients, but doesn't recalculate self
569 var->clearValueDirty();
570 }
571 }
572
573 // Update current weight cache
574 if (_extWgtArray) {
575
576 // If external array is specified use that
581
582 } else if (_wgtVar) {
583
584 // Otherwise look for weight variable
585 _curWgt = _wgtVar->getVal() ;
589
590 } else {
591
592 // Otherwise return 1
593 _curWgt=1.0 ;
594 _curWgtErrLo = 0 ;
595 _curWgtErrHi = 0 ;
596 _curWgtErr = 0 ;
597
598 }
599
600 return &_vars;
601}
602
603
604////////////////////////////////////////////////////////////////////////////////
605/// Return the weight of the n-th data point (n='index') in memory
606
608{
609 return _curWgt ;
610}
611
612
613////////////////////////////////////////////////////////////////////////////////
614
616{
617 if (_extWgtArray) {
618
619 // We have a weight array, use that info
620
621 // Return symmetric error on current bin calculated either from Poisson statistics or from SumOfWeights
622 double lo = 0, hi =0;
623 weightError(lo,hi,etype) ;
624 return (lo+hi)/2 ;
625
626 } else if (_wgtVar) {
627
628 // We have a weight variable, use that info
629 if (_wgtVar->hasAsymError()) {
630 return ( _wgtVar->getAsymErrorHi() - _wgtVar->getAsymErrorLo() ) / 2 ;
631 } else {
632 return _wgtVar->getError() ;
633 }
634
635 } else {
636
637 // We have no weights
638 return 0 ;
639
640 }
641}
642
643
644
645////////////////////////////////////////////////////////////////////////////////
646
647void RooTreeDataStore::weightError(double& lo, double& hi, RooAbsData::ErrorType etype) const
648{
649 if (_extWgtArray) {
650
651 // We have a weight array, use that info
652 switch (etype) {
653
654 case RooAbsData::Auto:
655 throw string(Form("RooDataHist::weightError(%s) error type Auto not allowed here",GetName())) ;
656 break ;
657
659 throw string(Form("RooDataHist::weightError(%s) error type Expected not allowed here",GetName())) ;
660 break ;
661
663 // Weight may be preset or precalculated
664 if (_curWgtErrLo>=0) {
665 lo = _curWgtErrLo ;
666 hi = _curWgtErrHi ;
667 return ;
668 }
669
670 // Otherwise Calculate poisson errors
671 double ym,yp ;
673 lo = weight()-ym ;
674 hi = yp-weight() ;
675 return ;
676
678 lo = _curWgtErr ;
679 hi = _curWgtErr ;
680 return ;
681
682 case RooAbsData::None:
683 lo = 0 ;
684 hi = 0 ;
685 return ;
686 }
687
688 } else if (_wgtVar) {
689
690 // We have a weight variable, use that info
691 if (_wgtVar->hasAsymError()) {
693 lo = _wgtVar->getAsymErrorLo() ;
694 } else {
695 hi = _wgtVar->getError() ;
696 lo = _wgtVar->getError() ;
697 }
698
699 } else {
700
701 // We are unweighted
702 lo=0 ;
703 hi=0 ;
704
705 }
706}
707
708
709////////////////////////////////////////////////////////////////////////////////
710/// Change name of internal observable named 'from' into 'to'
711
712bool RooTreeDataStore::changeObservableName(const char* from, const char* to)
713{
714 // Find observable to be changed
715 RooAbsArg* var = _vars.find(from) ;
716
717 // Check that we found it
718 if (!var) {
719 coutE(InputArguments) << "RooTreeDataStore::changeObservableName(" << GetName() << " no observable " << from << " in this dataset" << endl ;
720 return true ;
721 }
722
723 // Process name change
724 TString oldBranchName = var->cleanBranchName() ;
725 var->SetName(to) ;
726
727 // Change the branch name as well
728 if (_tree->GetBranch(oldBranchName.Data())) {
729
730 // Simple case varName = branchName
731 _tree->GetBranch(oldBranchName.Data())->SetName(var->cleanBranchName().Data()) ;
732
733 // Process any error branch if existing
734 if (_tree->GetBranch(Form("%s_err",oldBranchName.Data()))) {
735 _tree->GetBranch(Form("%s_err",oldBranchName.Data()))->SetName(Form("%s_err",var->cleanBranchName().Data())) ;
736 }
737 if (_tree->GetBranch(Form("%s_aerr_lo",oldBranchName.Data()))) {
738 _tree->GetBranch(Form("%s_aerr_lo",oldBranchName.Data()))->SetName(Form("%s_aerr_lo",var->cleanBranchName().Data())) ;
739 }
740 if (_tree->GetBranch(Form("%s_aerr_hi",oldBranchName.Data()))) {
741 _tree->GetBranch(Form("%s_aerr_hi",oldBranchName.Data()))->SetName(Form("%s_aerr_hi",var->cleanBranchName().Data())) ;
742 }
743
744 } else {
745
746 // Native category case branchNames = varName_idx and varName_lbl
747 if (_tree->GetBranch(Form("%s_idx",oldBranchName.Data()))) {
748 _tree->GetBranch(Form("%s_idx",oldBranchName.Data()))->SetName(Form("%s_idx",var->cleanBranchName().Data())) ;
749 }
750 if (_tree->GetBranch(Form("%s_lbl",oldBranchName.Data()))) {
751 _tree->GetBranch(Form("%s_lbl",oldBranchName.Data()))->SetName(Form("%s_lb",var->cleanBranchName().Data())) ;
752 }
753
754 }
755
756 return false ;
757}
758
759
760
761////////////////////////////////////////////////////////////////////////////////
762/// Add a new column to the data set which holds the pre-calculated values
763/// of 'newVar'. This operation is only meaningful if 'newVar' is a derived
764/// value.
765///
766/// The return value points to the added element holding 'newVar's value
767/// in the data collection. The element is always the corresponding fundamental
768/// type of 'newVar' (e.g. a RooRealVar if 'newVar' is a RooFormulaVar)
769///
770/// Note: This function is explicitly NOT intended as a speed optimization
771/// opportunity for the user. Components of complex PDFs that can be
772/// precalculated with the dataset are automatically identified as such
773/// and will be precalculated when fitting to a dataset
774///
775/// By forcibly precalculating functions with non-trivial Jacobians,
776/// or functions of multiple variables occurring in the data set,
777/// using addColumn(), you may alter the outcome of the fit.
778///
779/// Only in cases where such a modification of fit behaviour is intentional,
780/// this function should be used.
781
783{
784 checkInit() ;
785
786 // Create a fundamental object of the right type to hold newVar values
787 RooAbsArg* valHolder= newVar.createFundamental();
788 // Sanity check that the holder really is fundamental
789 if(!valHolder->isFundamental()) {
790 coutE(InputArguments) << GetName() << "::addColumn: holder argument is not fundamental: \""
791 << valHolder->GetName() << "\"" << endl;
792 return 0;
793 }
794
795 // WVE need to reset TTRee buffers to original datamembers here
796 resetBuffers() ;
797
798 // Clone variable and attach to cloned tree
799 RooAbsArg* newVarClone = newVar.cloneTree() ;
800 newVarClone->recursiveRedirectServers(_vars,false) ;
801
802 // Attach value place holder to this tree
803 ((RooAbsArg*)valHolder)->attachToTree(*_tree,_defTreeBufSize) ;
804 _vars.add(*valHolder) ;
805 _varsww.add(*valHolder) ;
806
807
808 // Fill values of placeholder
809 for (int i=0 ; i<GetEntries() ; i++) {
810 get(i) ;
811
812 newVarClone->syncCache(&_vars) ;
813 valHolder->copyCache(newVarClone) ;
814 valHolder->fillTreeBranch(*_tree) ;
815 }
816
817 // WVE need to restore TTRee buffers to previous values here
819
820 if (adjustRange) {
821// // Set range of valHolder to (just) bracket all values stored in the dataset
822// double vlo,vhi ;
823// RooRealVar* rrvVal = dynamic_cast<RooRealVar*>(valHolder) ;
824// if (rrvVal) {
825// getRange(*rrvVal,vlo,vhi,0.05) ;
826// rrvVal->setRange(vlo,vhi) ;
827// }
828 }
829
830
831
832 delete newVarClone ;
833 return valHolder ;
834}
835
836
837////////////////////////////////////////////////////////////////////////////////
838/// Merge columns of supplied data set(s) with this data set. All
839/// data sets must have equal number of entries. In case of
840/// duplicate columns the column of the last dataset in the list
841/// prevails
842
843RooAbsDataStore* RooTreeDataStore::merge(const RooArgSet& allVars, list<RooAbsDataStore*> dstoreList)
844{
845 RooTreeDataStore* mergedStore = new RooTreeDataStore("merged","merged",allVars) ;
846
847 Int_t nevt = dstoreList.front()->numEntries() ;
848 for (int i=0 ; i<nevt ; i++) {
849
850 // Cope data from self
851 mergedStore->_vars.assign(*get(i)) ;
852
853 // Copy variables from merge sets
854 for (list<RooAbsDataStore*>::iterator iter = dstoreList.begin() ; iter!=dstoreList.end() ; ++iter) {
855 const RooArgSet* partSet = (*iter)->get(i) ;
856 mergedStore->_vars.assign(*partSet) ;
857 }
858
859 mergedStore->fill() ;
860 }
861 return mergedStore ;
862}
863
864
865
866
867
868////////////////////////////////////////////////////////////////////////////////
869
871{
872 Int_t nevt = other.numEntries() ;
873 for (int i=0 ; i<nevt ; i++) {
874 _vars.assign(*other.get(i)) ;
875 if (_wgtVar) {
876 _wgtVar->setVal(other.weight()) ;
877 }
878
879 fill() ;
880 }
881}
882
883
884////////////////////////////////////////////////////////////////////////////////
885
887{
888 if (_wgtVar) {
889
890 double sum(0), carry(0);
891 Int_t nevt = numEntries() ;
892 for (int i=0 ; i<nevt ; i++) {
893 get(i) ;
894 // Kahan's algorithm for summing to avoid loss of precision
895 double y = _wgtVar->getVal() - carry;
896 double t = sum + y;
897 carry = (t - sum) - y;
898 sum = t;
899 }
900 return sum ;
901
902 } else if (_extWgtArray) {
903
904 double sum(0) , carry(0);
905 Int_t nevt = numEntries() ;
906 for (int i=0 ; i<nevt ; i++) {
907 // Kahan's algorithm for summing to avoid loss of precision
908 double y = _extWgtArray[i] - carry;
909 double t = sum + y;
910 carry = (t - sum) - y;
911 sum = t;
912 }
913 return sum ;
914
915 } else {
916
917 return numEntries() ;
918
919 }
920}
921
922
923
924
925////////////////////////////////////////////////////////////////////////////////
926
928{
929 return _tree->GetEntries() ;
930}
931
932
933
934////////////////////////////////////////////////////////////////////////////////
935
937{
938 Reset() ;
939}
940
941
942
943////////////////////////////////////////////////////////////////////////////////
944/// Cache given RooAbsArgs with this tree: The tree is
945/// given direct write access of the args internal cache
946/// the args values is pre-calculated for all data points
947/// in this data collection. Upon a get() call, the
948/// internal cache of 'newVar' will be loaded with the
949/// precalculated value and it's dirty flag will be cleared.
950
951void RooTreeDataStore::cacheArgs(const RooAbsArg* owner, RooArgSet& newVarSet, const RooArgSet* nset, bool /*skipZeroWeights*/)
952{
953 checkInit() ;
954
955 _cacheOwner = owner ;
956
957 std::unique_ptr<RooArgSet> constExprVarSet{static_cast<RooArgSet*>(newVarSet.selectByAttrib("ConstantExpression",true))};
958
959 bool doTreeFill = (_cachedVars.empty()) ;
960
961 for (RooAbsArg * arg : *constExprVarSet) {
962 // Attach original newVar to this tree
963 arg->attachToTree(*_cacheTree,_defTreeBufSize) ;
964 //arg->recursiveRedirectServers(_vars) ;
965 _cachedVars.add(*arg) ;
966 }
967
968 // WVE need to reset TTRee buffers to original datamembers here
969 //resetBuffers() ;
970
971 // Refill regular and cached variables of current tree from clone
972 for (int i=0 ; i<GetEntries() ; i++) {
973 get(i) ;
974
975 // Evaluate the cached variables and store the results
976 for (RooAbsArg * arg : *constExprVarSet) {
977 arg->setValueDirty() ;
978 arg->syncCache(nset) ;
979 if (!doTreeFill) {
980 arg->fillTreeBranch(*_cacheTree) ;
981 }
982 }
983
984 if (doTreeFill) {
985 _cacheTree->Fill() ;
986 }
987 }
988
989 // WVE need to restore TTRee buffers to previous values here
990 //restoreAlternateBuffers() ;
991}
992
993
994
995
996////////////////////////////////////////////////////////////////////////////////
997/// Activate or deactivate the branch status of the TTree branch associated
998/// with the given set of dataset observables
999
1000void RooTreeDataStore::setArgStatus(const RooArgSet& set, bool active)
1001{
1002 for (RooAbsArg * arg : set) {
1003 RooAbsArg* depArg = _vars.find(arg->GetName()) ;
1004 if (!depArg) {
1005 coutE(InputArguments) << "RooTreeDataStore::setArgStatus(" << GetName()
1006 << ") dataset doesn't contain variable " << arg->GetName() << endl ;
1007 continue ;
1008 }
1009 depArg->setTreeBranchStatus(*_tree,active) ;
1010 }
1011}
1012
1013
1014
1015////////////////////////////////////////////////////////////////////////////////
1016/// Remove tree with values of cached observables
1017/// and clear list of cached observables
1018
1020{
1021 // Empty list of cached functions
1023
1024 // Delete & recreate cache tree
1025 delete _cacheTree ;
1026 _cacheTree = 0 ;
1027 createTree(makeTreeName().c_str(), GetTitle());
1028
1029 return ;
1030}
1031
1032
1033
1034
1035////////////////////////////////////////////////////////////////////////////////
1036
1038{
1040 for (const auto arg : _varsww) {
1041 RooAbsArg* extArg = extObs.find(arg->GetName()) ;
1042 if (extArg) {
1043 if (arg->getAttribute("StoreError")) {
1044 extArg->setAttribute("StoreError") ;
1045 }
1046 if (arg->getAttribute("StoreAsymError")) {
1047 extArg->setAttribute("StoreAsymError") ;
1048 }
1049 extArg->attachToTree(*_tree) ;
1050 _attachedBuffers.add(*extArg) ;
1051 }
1052 }
1053}
1054
1055
1056
1057////////////////////////////////////////////////////////////////////////////////
1058
1060{
1061 for(RooAbsArg * arg : _varsww) {
1062 arg->attachToTree(*_tree) ;
1063 }
1064}
1065
1066
1067
1068////////////////////////////////////////////////////////////////////////////////
1069
1071{
1072 for(RooAbsArg * arg : _attachedBuffers) {
1073 arg->attachToTree(*_tree) ;
1074 }
1075}
1076
1077
1078
1079////////////////////////////////////////////////////////////////////////////////
1080
1082{
1083 if (_defCtor) {
1084 const_cast<RooTreeDataStore*>(this)->initialize() ;
1085 _defCtor = false ;
1086 }
1087}
1088
1089
1090
1091
1092
1093////////////////////////////////////////////////////////////////////////////////
1094/// Interface function to TTree::GetEntries
1095
1097{
1098 return _tree->GetEntries() ;
1099}
1100
1101
1102////////////////////////////////////////////////////////////////////////////////
1103/// Interface function to TTree::Reset
1104
1106{
1107 _tree->Reset(option) ;
1108}
1109
1110
1111////////////////////////////////////////////////////////////////////////////////
1112/// Interface function to TTree::Fill
1113
1115{
1116 return _tree->Fill() ;
1117}
1118
1119
1120////////////////////////////////////////////////////////////////////////////////
1121/// Interface function to TTree::GetEntry
1122
1124{
1125 Int_t ret1 = _tree->GetEntry(entry,getall) ;
1126 if (!ret1) return 0 ;
1127 _cacheTree->GetEntry(entry,getall) ;
1128 return ret1 ;
1129}
1130
1131
1132////////////////////////////////////////////////////////////////////////////////
1133
1135{
1136 _tree->Draw(option) ;
1137}
1138
1139////////////////////////////////////////////////////////////////////////////////
1140/// Stream an object of class RooTreeDataStore.
1141
1143{
1144 if (R__b.IsReading()) {
1145 UInt_t R__s, R__c;
1146 const Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
1147
1148 R__b.ReadClassBuffer(RooTreeDataStore::Class(), this, R__v, R__s, R__c);
1149
1150 if (!_tree) {
1151 // If the tree has not been deserialised automatically, it is time to load
1152 // it now.
1153 TFile* parent = dynamic_cast<TFile*>(R__b.GetParent());
1154 assert(parent);
1155 parent->GetObject(makeTreeName().c_str(), _tree);
1156 }
1157
1158 initialize();
1159
1160 } else {
1161
1162 TTree* tmpTree = _tree;
1163 auto parent = dynamic_cast<TDirectory*>(R__b.GetParent());
1164 if (_tree && parent) {
1165 // Large trees cannot be written because of the 1Gb I/O limitation.
1166 // Here, we take the tree away from our instance, write it, and continue
1167 // to write the rest of the class normally
1168 auto tmpDir = _tree->GetDirectory();
1169
1170 _tree->SetDirectory(parent);
1171 _tree->FlushBaskets(false);
1172 parent->WriteObject(_tree, makeTreeName().c_str());
1173 _tree->SetDirectory(tmpDir);
1174 _tree = nullptr;
1175 }
1176
1178
1179 _tree = tmpTree;
1180 }
1181}
1182
1183////////////////////////////////////////////////////////////////////////////////
1184/// Generate a name for the storage tree from the name and title of this instance.
1186 std::string title = GetTitle();
1187 std::replace(title.begin(), title.end(), ' ', '_');
1188 std::replace(title.begin(), title.end(), '-', '_');
1189 return std::string("RooTreeDataStore_") + GetName() + "_" + title;
1190}
1191
1192
1193////////////////////////////////////////////////////////////////////////////////
1194/// Get the weights of the events in the range [first, first+len).
1195/// This implementation will fill a vector with every event retrieved one by one
1196/// (even if the weight is constant). Then, it returns a span.
1198
1199 if (_extWgtArray) {
1200 return {_extWgtArray + first, len};
1201 }
1202
1203 if (!_weightBuffer) {
1204 _weightBuffer = std::make_unique<std::vector<double>>();
1205 _weightBuffer->reserve(len);
1206
1207 for (std::size_t i = 0; i < GetEntries(); ++i) {
1208 _weightBuffer->push_back(weight(i));
1209 }
1210 }
1211
1212 return {_weightBuffer->data() + first, len};
1213}
#define coutI(a)
#define coutW(a)
#define coutE(a)
int Int_t
Definition RtypesCore.h:45
short Version_t
Definition RtypesCore.h:65
long long Long64_t
Definition RtypesCore.h:80
const char Option_t
Definition RtypesCore.h:66
#define ClassImp(name)
Definition Rtypes.h:377
#define gDirectory
Definition TDirectory.h:386
Option_t Option_t option
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
char name[80]
Definition TGX11.cxx:110
#define hi
#define gROOT
Definition TROOT.h:405
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Definition TString.cxx:2467
RooAbsArg is the common abstract base class for objects that represent a value and a "shape" in RooFi...
Definition RooAbsArg.h:74
virtual void copyCache(const RooAbsArg *source, bool valueOnly=false, bool setValDirty=true)=0
bool recursiveRedirectServers(const RooAbsCollection &newServerList, bool mustReplaceAll=false, bool nameChange=false, bool recurseInNewSet=true)
Recursively replace all servers with the new servers in newSet.
virtual void syncCache(const RooArgSet *nset=nullptr)=0
void SetName(const char *name) override
Set the name of the TNamed.
virtual RooAbsArg * createFundamental(const char *newname=nullptr) const =0
Create a fundamental-type object that stores our type of value.
virtual void attachToTree(TTree &t, Int_t bufSize=32000)=0
Overloadable function for derived classes to implement attachment as branch to a TTree.
virtual void setTreeBranchStatus(TTree &t, bool active)=0
virtual RooAbsArg * cloneTree(const char *newname=nullptr) const
Clone tree expression of objects.
TString cleanBranchName() const
Construct a mangled name from the actual name that is free of any math symbols that might be interpre...
void setAttribute(const Text_t *name, bool value=true)
Set (default) or clear a named boolean attribute of this object.
virtual bool isFundamental() const
Is this object a fundamental type that can be added to a dataset? Fundamental-type subclasses overrid...
Definition RooAbsArg.h:247
virtual void fillTreeBranch(TTree &t)=0
RooAbsCollection * selectByAttrib(const char *name, bool value) const
Create a subset of the current collection, consisting only of those elements with the specified attri...
virtual void removeAll()
Remove all arguments from our set, deleting them if we own them.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
Storage_t const & get() const
Const access to the underlying stl container.
RooAbsCollection & assignValueOnly(const RooAbsCollection &other, bool forceIfSizeOne=false)
Sets the value of any argument in our set that also appears in the other set.
bool contains(const RooAbsArg &var) const
Check if collection contains an argument with the same name as var.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
void assign(const RooAbsCollection &other) const
Sets the value, cache and constant attribute of any argument in our set that also appears in the othe...
RooAbsArg * find(const char *name) const
Find object with given name in list.
RooAbsDataStore is the abstract base class for data collection that use a TTree as internal storage m...
virtual const RooArgSet * get(Int_t index) const =0
bool _doDirtyProp
Switch do (de)activate dirty state propagation when loading a data point.
virtual double weight() const =0
virtual Int_t numEntries() const =0
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
Definition RooAbsReal.h:91
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition RooArgSet.h:55
RooArgSet * snapshot(bool deepCopy=true) const
Use RooAbsCollection::snapshot(), but return as RooArgSet.
Definition RooArgSet.h:178
A RooFormulaVar is a generic implementation of a real-valued object, which takes a RooArgList of serv...
static const RooHistError & instance()
Return a reference to a singleton object that is created the first time this method is called.
bool getPoissonInterval(Int_t n, double &mu1, double &mu2, double nSigma=1) const
Return a confidence interval for the expected number of events given n observed (unweighted) events.
RooRealVar represents a variable that can be changed from the outside.
Definition RooRealVar.h:40
void setVal(double value) override
Set value of variable to 'value'.
double getError() const
Definition RooRealVar.h:62
bool hasAsymError(bool allowZero=true) const
Definition RooRealVar.h:68
double getAsymErrorHi() const
Definition RooRealVar.h:67
double getAsymErrorLo() const
Definition RooRealVar.h:66
A simple container to hold a batch of data values.
Definition RooSpan.h:34
The RooStringView is a wrapper around a C-syle string that can also be constructed from a std::string...
RooTreeDataStore is a TTree-backed data storage.
void initialize()
One-time initialization common to all constructor forms.
double _curWgtErr
Weight of current event.
double weightError(RooAbsData::ErrorType etype=RooAbsData::Poisson) const override
void resetBuffers() override
double _curWgt
Buffer for weights in case a batch of values is requested.
void Draw(Option_t *option="") override
Default Draw method for all objects.
void attachCache(const RooAbsArg *newOwner, const RooArgSet &cachedVars) override
Initialize cache of dataset: attach variables of cache ArgSet to the corresponding TTree branches.
double _curWgtErrHi
Weight of current event.
static TClass * Class()
Int_t numEntries() const override
std::string makeTreeName() const
Generate a name for the storage tree from the name and title of this instance.
RooArgSet varsNoWeight(const RooArgSet &allVars, const char *wgtName=nullptr)
Utility function for constructors Return RooArgSet that is copy of allVars minus variable matching wg...
~RooTreeDataStore() override
Destructor.
void createTree(RooStringView name, RooStringView title)
Create TTree object that lives in memory, independent of current location of gDirectory.
const double * _extWgtErrHiArray
! External weight array - high error
Stat_t GetEntries() const
Interface function to TTree::GetEntries.
void attachBuffers(const RooArgSet &extObs) override
Int_t GetEntry(Int_t entry=0, Int_t getall=0)
Interface function to TTree::GetEntry.
void reset() override
RooAbsDataStore * merge(const RooArgSet &allvars, std::list< RooAbsDataStore * > dstoreList) override
Merge columns of supplied data set(s) with this data set.
static Int_t _defTreeBufSize
RooSpan< const double > getWeightBatch(std::size_t first, std::size_t len) const override
Get the weights of the events in the range [first, first+len).
RooArgSet _attachedBuffers
! Currently attached buffers (if different from _varsww)
Int_t fill() override
Interface function to TTree::Fill.
double sumEntries() const override
std::unique_ptr< RooAbsDataStore > reduce(RooStringView name, RooStringView title, const RooArgSet &vars, const RooFormulaVar *cutVar, const char *cutRange, std::size_t nStart, std::size_t nStop) override
bool _defCtor
Object owning cache contents.
RooAbsArg * addColumn(RooAbsArg &var, bool adjustRange=true) override
Add a new column to the data set which holds the pre-calculated values of 'newVar'.
double weight() const override
Return the weight of the n-th data point (n='index') in memory.
void Reset(Option_t *option=nullptr)
Interface function to TTree::Reset.
void loadValues(const TTree *t, const RooFormulaVar *select=nullptr, const char *rangeName=nullptr, Int_t nStart=0, Int_t nStop=2000000000)
Load values from tree 't' into this data collection, optionally selecting events using the RooFormula...
void append(RooAbsDataStore &other) override
const double * _extWgtErrLoArray
! External weight array - low error
void checkInit() const override
std::unique_ptr< std::vector< double > > _weightBuffer
Int_t Fill()
Interface function to TTree::Fill.
const double * _extSumW2Array
! External sum of weights array
void Streamer(TBuffer &) override
Stream an object of class RooTreeDataStore.
RooRealVar * weightVar(const RooArgSet &allVars, const char *wgtName=nullptr)
Utility function for constructors Return pointer to weight variable if it is defined.
const double * _extWgtArray
! External weight array
double _curWgtErrLo
Weight of current event.
bool changeObservableName(const char *from, const char *to) override
Change name of internal observable named 'from' into 'to'.
void resetCache() override
Remove tree with values of cached observables and clear list of cached observables.
void setArgStatus(const RooArgSet &set, bool active) override
Activate or deactivate the branch status of the TTree branch associated with the given set of dataset...
void cacheArgs(const RooAbsArg *owner, RooArgSet &varSet, const RooArgSet *nset=nullptr, bool skipZeroWeights=false) override
Cache given RooAbsArgs with this tree: The tree is given direct write access of the args internal cac...
virtual const RooArgSet * get() const
const RooAbsArg * _cacheOwner
TTree holding the cached function values.
RooArgSet _varsww
Was object constructed with default ctor?
Buffer base class used for serializing objects.
Definition TBuffer.h:43
virtual Version_t ReadVersion(UInt_t *start=nullptr, UInt_t *bcnt=nullptr, const TClass *cl=nullptr)=0
TObject * GetParent() const
Return pointer to parent of this buffer.
Definition TBuffer.cxx:262
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=nullptr)=0
Bool_t IsReading() const
Definition TBuffer.h:86
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
Describe directory structure in memory.
Definition TDirectory.h:45
void GetObject(const char *namecycle, T *&ptr)
Get an object with proper type checking.
Definition TDirectory.h:212
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
Definition TFile.h:51
TObject * Clone(const char *newname="") const override
Make a clone of an object using the Streamer facility.
Definition TNamed.cxx:74
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
Definition TNamed.cxx:164
const char * GetName() const override
Returns name of object.
Definition TNamed.h:47
const char * GetTitle() const override
Returns title of object.
Definition TNamed.h:48
virtual void SetName(const char *name)
Set the name of the TNamed.
Definition TNamed.cxx:140
void ResetBit(UInt_t f)
Definition TObject.h:200
@ kCanDelete
if object in a list can be deleted
Definition TObject.h:62
@ kMustCleanup
if object destructor must call RecursiveRemove()
Definition TObject.h:64
Basic string class.
Definition TString.h:139
const char * Data() const
Definition TString.h:380
TString & Append(const char *cs)
Definition TString.h:576
A TTree represents a columnar dataset.
Definition TTree.h:79
virtual Int_t Fill()
Fill all branches.
Definition TTree.cxx:4594
virtual TBranch * GetBranch(const char *name)
Return pointer to the branch with the given name in this tree or its friends.
Definition TTree.cxx:5285
virtual Int_t GetEntry(Long64_t entry, Int_t getall=0)
Read all branches of entry and return total number of bytes read.
Definition TTree.cxx:5629
virtual Int_t FlushBaskets(Bool_t create_cluster=true) const
Write to disk all the basket that have not yet been individually written and create an event cluster ...
Definition TTree.cxx:5120
void Draw(Option_t *opt) override
Default Draw method for all objects.
Definition TTree.h:428
virtual Long64_t CopyEntries(TTree *tree, Long64_t nentries=-1, Option_t *option="", Bool_t needCopyAddresses=false)
Copy nentries from given tree to this tree.
Definition TTree.cxx:3528
TDirectory * GetDirectory() const
Definition TTree.h:459
virtual void SetDirectory(TDirectory *dir)
Change the tree's directory.
Definition TTree.cxx:8947
virtual Long64_t GetEntries() const
Definition TTree.h:460
virtual void Reset(Option_t *option="")
Reset baskets, buffers and entries count in all branches and leaves.
Definition TTree.cxx:7994
Double_t y[n]
Definition legend1.C:17
std::vector< std::string > Split(std::string_view str, std::string_view delims, bool skipEmpty=false)
Splits a string at each character in delims.
Definition first.py:1
Definition tree.py:1
static uint64_t sum(uint64_t i)
Definition Factory.cxx:2345