Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
HLFactory.cxx
Go to the documentation of this file.
1// @(#)root/roostats:$Id$
2// Author: Danilo Piparo 25/08/2009
3
4
5/*************************************************************************
6 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers. *
7 * All rights reserved. *
8 * *
9 * For the licensing terms see $ROOTSYS/LICENSE. *
10 * For the list of contributors see $ROOTSYS/README/CREDITS. *
11 *************************************************************************/
12
13////////////////////////////////////////////////////////////////////////////////
14
15
16#include <iostream>
17#include <fstream>
18
19#include "RooStats/HLFactory.h"
20#include "TFile.h"
21#include "TObject.h"
22#include "TObjArray.h"
23#include "TObjString.h"
24
25#include "RooSimultaneous.h"
26
27/** \class RooStats::HLFactory
28 \ingroup Roostats
29
30HLFactory is an High Level model Factory allows you to
31describe your models in a configuration file
32(_datacards_) acting as an interface with the RooFactoryWSTool.
33Moreover it provides tools for the combination of models and datasets.
34
35*/
36
37using namespace std;
38
40
41
42using namespace RooStats;
43using namespace RooFit;
44
45////////////////////////////////////////////////////////////////////////////////
46/// Constructor with the name of the config file to interpret and the
47/// verbosity flag. The extension for the config files is assumed to
48/// be ".rs".
49
51 const char *fileName,
52 bool isVerbose):
54 fComboCat(0),
55 fComboBkgPdf(0),
56 fComboSigBkgPdf(0),
57 fComboDataset(0),
58 fCombinationDone(false),
59 fVerbose(isVerbose),
60 fInclusionLevel(0),
61 fOwnWs(true){
62 TString wsName(name);
63 wsName+="_ws";
64 fWs = new RooWorkspace(wsName,true);
65
69
70 // Start the parsing
71 fReadFile(fileName);
72}
73
74////////////////////////////////////////////////////////////////////////////////
75/// Constructor without a card but with an external workspace.
76
78 RooWorkspace* externalWs,
79 bool isVerbose):
81 fComboCat(0),
82 fComboBkgPdf(0),
83 fComboSigBkgPdf(0),
84 fComboDataset(0),
85 fCombinationDone(false),
86 fVerbose(isVerbose),
87 fInclusionLevel(0),
88 fOwnWs(false){
89 fWs=externalWs;
93
94}
95
96////////////////////////////////////////////////////////////////////////////////
97
99 TNamed("hlfactory","hlfactory"),
100 fComboCat(0),
101 fComboBkgPdf(0),
102 fComboSigBkgPdf(0),
103 fComboDataset(0),
104 fCombinationDone(false),
105 fVerbose(false),
106 fInclusionLevel(0),
107 fOwnWs(true){
108 fWs = new RooWorkspace("hlfactory_ws",true);
109
113
114 }
115
116////////////////////////////////////////////////////////////////////////////////
117/// destructor
118
120 if (fComboSigBkgPdf!=nullptr)
121 delete fComboSigBkgPdf;
122 if (fComboBkgPdf!=nullptr)
123 delete fComboBkgPdf;
124 if (fComboDataset!=nullptr)
125 delete fComboDataset;
126 if (fComboCat!=nullptr)
127 delete fComboCat;
128
129 if (fOwnWs)
130 delete fWs;
131}
132
133////////////////////////////////////////////////////////////////////////////////
134/// Add a channel to the combination. The channel can be specified as:
135/// - A signal plus background pdf
136/// - A background only pdf
137/// - A dataset
138/// Once the combination of the pdfs is done, no more channels should be
139/// added.
140
141int HLFactory::AddChannel(const char* label,
142 const char* SigBkgPdfName,
143 const char* BkgPdfName,
144 const char* DatasetName){
145 if (fCombinationDone){
146 std::cerr << "Cannot add anymore channels. "
147 << "Combination already carried out.\n";
148 return -1;
149 }
150
151 if (SigBkgPdfName!=0){
152 if (fWs->pdf(SigBkgPdfName)==nullptr){
153 std::cerr << "Pdf " << SigBkgPdfName << " not found in workspace!\n";
154 return -1;
155 }
156 TObjString* name = new TObjString(SigBkgPdfName);
158 }
159
160 if (BkgPdfName!=0){
161 if (fWs->pdf(BkgPdfName)==nullptr){
162 std::cerr << "Pdf " << BkgPdfName << " not found in workspace!\n";
163 return -1;
164 }
165 TObjString* name = new TObjString(BkgPdfName);
167 }
168
169 if (DatasetName!=0){
170 if (fWs->data(DatasetName)==nullptr){
171 std::cerr << "Dataset " << DatasetName << " not found in workspace!\n";
172 return -1;
173 }
174 TObjString* name = new TObjString(DatasetName);
176 }
177
178 if (label!=0){
179 TObjString* name = new TObjString(label);
181 }
182 return 0;
183
184}
185
186////////////////////////////////////////////////////////////////////////////////
187/// Return the combination of the signal plus background channels.
188/// The factory owns the object.
189
191 if (fSigBkgPdfNames.GetSize()==0)
192 return 0;
193
194 if (fComboSigBkgPdf!=nullptr)
195 return fComboSigBkgPdf;
196
198 return nullptr;
199
200 if (fSigBkgPdfNames.GetSize()==1){
201 TString name(((TObjString*)fSigBkgPdfNames.At(0))->String());
203 return fComboSigBkgPdf;
204 }
205
206 if (!fCombinationDone)
208
209 RooArgList pdfs("pdfs");
210
211 for(auto * ostring : static_range_cast<TObjString*>(fSigBkgPdfNames)) {
212 pdfs.add( *(fWs->pdf(ostring->String())) );
213 }
214
216 name+="_sigbkg";
217
218 TString title(GetName());
219 title+="_sigbkg";
220
223 title,
224 pdfs,
225 *fComboCat);
226
227 return fComboSigBkgPdf;
228
229}
230
231////////////////////////////////////////////////////////////////////////////////
232/// Return the combination of the background only channels.
233/// If no background channel is specified a nullptr pointer is returned.
234/// The factory owns the object.
235
237 if (fBkgPdfNames.GetSize()==0)
238 return 0;
239
240 if (fComboBkgPdf!=nullptr)
241 return fComboBkgPdf;
242
244 return nullptr;
245
246 if (fBkgPdfNames.GetSize()==1){
248 return fComboBkgPdf;
249 }
250
251 if (!fCombinationDone)
253
254 RooArgList pdfs("pdfs");
255
256 for(auto * ostring : static_range_cast<TObjString*>(fBkgPdfNames)) {
257 pdfs.add( *(fWs->pdf(ostring->String())) );
258 }
259
261 name+="_bkg";
262
263 TString title(GetName());
264 title+="_bkg";
265
268 title,
269 pdfs,
270 *fComboCat);
271
272 return fComboBkgPdf;
273
274}
275
276////////////////////////////////////////////////////////////////////////////////
277/// Return the combination of the datasets.
278/// If no dataset is specified a nullptr pointer is returned.
279/// The factory owns the object.
280
282 if (fDatasetsNames.GetSize()==0)
283 return 0;
284
285 if (fComboDataset!=nullptr)
286 return fComboDataset;
287
289 return nullptr;
290
291 if (fDatasetsNames.GetSize()==1){
293 return fComboDataset;
294 }
295
296 if (!fCombinationDone)
298
299
300 auto it = fDatasetsNames.begin();
301 TObjString* ostring;
302 ostring = static_cast<TObjString*>(*it);
303 ++it;
304 fComboDataset = (RooDataSet*) fWs->data(ostring->String()) ;
305 if (!fComboDataset) return nullptr;
307 TString dataname(GetName());
308 fComboDataset = new RooDataSet(*fComboDataset,dataname+"_TotData");
309 int catindex=0;
310 fComboCat->setIndex(catindex);
312 for(; it != fDatasetsNames.end() ; ++it) {
313 ostring = static_cast<TObjString*>(*it);
314 catindex++;
315 RooDataSet * data = (RooDataSet*)fWs->data(ostring->String());
316 if (!data) return nullptr;
317 RooDataSet* dummy = new RooDataSet(*data,"");
318 fComboCat->setIndex(catindex);
319 fComboCat->Print();
320 dummy->addColumn(*fComboCat);
321 fComboDataset->append(*dummy);
322 delete dummy;
323 }
324
325 return fComboDataset;
326
327}
328
329////////////////////////////////////////////////////////////////////////////////
330/// Return the category.
331/// The factory owns the object.
332
334 if (fComboCat!=nullptr)
335 return fComboCat;
336
338 return nullptr;
339
340 if (!fCombinationDone)
342
343 return fComboCat;
344
345 }
346
347////////////////////////////////////////////////////////////////////////////////
348/// Process an additional configuration file
349
351 return fReadFile(filename,0);
352}
353
354////////////////////////////////////////////////////////////////////////////////
355/// Parses the configuration file. The objects can be specified following
356/// the rules of the RooFactoryWSTool, plus some more flexibility.
357///
358/// The official format for the datacards is ".rs".
359///
360/// All the instructions end with a ";" (like in C++).
361///
362/// Carriage returns and white lines are irrelevant but advised since they
363/// improve readability (like in C++).
364///
365/// The `(Roo)ClassName::objname(description)` can be replaced with the more
366/// "pythonic" `objname = (Roo)ClassName(description)`.
367///
368/// The comments can be specified with a "//" if on a single line or with
369/// "multiple lines" in C/C++ like comments.
370///
371/// The `"#include path/to/file.rs"` statement triggers the inclusion of a
372/// configuration fragment.
373///
374/// The `"import myobject:myworkspace:myrootfile"` will add to the Workspace
375/// the object myobject located in myworkspace recorded in myrootfile.
376/// Alternatively, one could choose the `"import myobject:myrootfile"` in case
377/// no Workspace is present.
378///
379/// The `"echo"` statement prompts a message on screen.
380
381int HLFactory::fReadFile(const char*fileName, bool is_included){
382 // Check the deepness of the inclusion
383 if (is_included)
385 else
387
388 const int maxDeepness=50;
389 if (fInclusionLevel>maxDeepness){
390 TString warning("The inclusion stack is deeper than ");
391 warning+=maxDeepness;
392 warning+=". Is this a recursive inclusion?";
393 Warning("fReadFile", "%s", warning.Data());
394 }
395
396
397 // open the config file and go through it
398 std::ifstream ifile(fileName);
399
400 if(ifile.fail()){
401 TString error("File ");
402 error+=fileName;
403 error+=" could not be opened.";
404 Error("fReadFile", "%s", error.Data());
405 return -1;
406 }
407
408 TString ifileContent("");
409 ifileContent.ReadFile(ifile);
410 ifile.close();
411
412 // Tokenise the file using the "\n" char and parse it line by line to strip
413 // the comments.
414 TString ifileContentStripped("");
415
416 std::unique_ptr<TObjArray> lines_array{ifileContent.Tokenize("\n")};
417
418 bool in_comment=false;
419
420 // Start iteration on lines array
421 for(TObject * line_o : *lines_array) {
422 TString line = (static_cast<TObjString*>(line_o))->GetString();
423
424 // Are we in a multiline comment?
425 if (in_comment)
426 if (line.EndsWith("*/")){
427 in_comment=false;
428 if (fVerbose) Info("fReadFile","Out of multiline comment ...");
429
430 continue;
431 }
432
433 // Was line a single line comment?
434
435 if ((line.BeginsWith("/*") && line.EndsWith("*/")) ||
436 line.BeginsWith("//")){
437 if (fVerbose) Info("fReadFile","In single line comment ...");
438 continue;
439 }
440
441 // Did a multiline comment just begin?
442 if (line.BeginsWith("/*")){
443 in_comment=true;
444 if (fVerbose) Info("fReadFile","In multiline comment ...");
445 continue;
446 }
447
448 ifileContentStripped+=line+"\n";
449 }
450
451 // Now proceed with the parsing of the stripped file
452
453 lines_array.reset(ifileContentStripped.Tokenize(";"));
454 in_comment=false;
455
456 const int nNeutrals=2;
457 TString neutrals[nNeutrals]={"\t"," "};
458
459 for(TObject * line_o : *lines_array) {
460
461 TString line = (static_cast<TObjString*>(line_o))->GetString();
462
463 // Strip spaces at the beginning and the end of the line
464 line.Strip(TString::kBoth,' ');
465
466 // Put the single statement in one single line
467 line.ReplaceAll("\n","");
468
469 // Do we have an echo statement? "A la RooFit"
470 if (line.BeginsWith("echo")){
471 line = line(5,line.Length()-1);
472 if (fVerbose)
473 std::cout << "Echoing line " << line.Data() << std::endl;
474 std::cout << "[" << GetName() << "] echo: "
475 << line.Data() << std::endl;
476 continue;
477 }
478
479 // Spaces and tabs at this point are not needed.
480 for (int i=0;i<nNeutrals;++i)
481 line.ReplaceAll(neutrals[i],"");
482
483
484 if (fVerbose) Info("fReadFile","Reading --> %s <--", line.Data());
485
486 // Was line a white space?
487 if (line == ""){
488 if (fVerbose) Info("fReadFile", "%s", "Empty line: skipping ...");
489 continue;
490 }
491
492 // Do we have an include statement?
493 // We treat this recursively.
494 if (line.BeginsWith("#include")){
495 line.ReplaceAll("#include","");
496 if (fVerbose) Info("fReadFile","Reading included file...");
497 fReadFile(line,true);
498 continue;
499 }
500
501 // We parse the line
502 if (fVerbose) Info("fReadFile","Parsing the line...");
504 }
505
506 return 0;
507}
508
509
510////////////////////////////////////////////////////////////////////////////////
511/// Builds the category necessary for the mutidimensional models. Its name
512/// will be `<HLFactory name>_category` and the types are specified by the
513/// model labels.
514
516 fCombinationDone=true;
517
519 name+="_category";
520
521 TString title(GetName());
522 title+="_category";
523
524 fComboCat=new RooCategory(name,title);
525
526 for (auto * ostring : static_range_cast<TObjString*>(fLabelsNames)) {
527 fComboCat->defineType(ostring->String());
528 }
529
530 }
531
532////////////////////////////////////////////////////////////////////////////////
533/// Check the number of entries in each list. If not the same and the list
534/// is not empty prompt an error.
535
540 return true;
541 else{
542 std::cerr << "The number of datasets and models added as channels "
543 << " is not the same!\n";
544 return false;
545 }
546 }
547
548////////////////////////////////////////////////////////////////////////////////
549/// Parse a single line and puts the content in the RooWorkSpace
550
552 if (fVerbose) Info("fParseLine", "Parsing line: %s", line.Data());
553
554 TString new_line("");
555
556 const int nequals = line.CountChar('=');
557
558 // Build with the factory a var or cat, or pipe the command directly.
559
560 if (line.Contains("::") || // It is a ordinary statement
561 nequals==0 || //it is a RooRealVar or cat with 0,1,2,3.. indexes
562 (line.Contains("[") &&
563 line.Contains("]") &&
564 nequals>0 && // It is a cat like "tag[B0=1,B0bar=-1]"
565 ! line.Contains("(") &&
566 ! line.Contains(")"))) {
567 fWs->factory(line);
568 return 0;
569 }
570
571 // Transform the line o_name = o_class(o_descr) in o_class::o_name(o_descr)
572 if (nequals==1 ||
573 (nequals > 1 && line.Contains("SIMUL"))){
574
575 // Divide the line in 3 components: o_name,o_class and o_descr
576 // assuming that o_name=o_class(o_descr)
577 const int equal_index=line.First('=');
578 const int par_index=line.First('(');
579 TString o_name(line(0,equal_index));
580 TString o_class(line(equal_index+1,par_index-equal_index-1));
581 TString o_descr(line(par_index+1,line.Length()-par_index-2));
582
583 if (fVerbose) Info("fParseLine", "o_name=%s o_class=%s o_descr=%s",
584 o_name.Data(), o_class.Data(), o_descr.Data());
585
586 // Now two cases either we wanna produce an object or import something
587 // under a new name.
588 if (o_class =="import"){// import a generic TObject into the WS
589 // Now see if we have a workspace or not, according to the number of
590 // entries in the description..
591
592 TObjArray* descr_array = o_descr.Tokenize(",");
593
594 const int n_descr_parts=descr_array->GetEntries();
595
596 if (n_descr_parts<2 || n_descr_parts>3)
597 Error("fParseLine","Import wrong syntax: cannot process %s", o_descr.Data());
598
599 TString obj_name (static_cast<TObjString*>(descr_array->At(n_descr_parts-1))->GetString());
600 TString ws_name("");
601 TString rootfile_name (static_cast<TObjString*>(descr_array->At(0))->GetString());
602
603 std::unique_ptr<TFile> ifile{TFile::Open(rootfile_name)};
604 if (ifile==0)
605 return 1;
606
607 if (n_descr_parts==3){// in presence of a Ws
608 o_descr.ReplaceAll(",",":");
609 fWs->import(o_descr);
610 }
611 else if(n_descr_parts==2){ // in presence of an object in rootfile
612 if (fVerbose)
613 Info("fParseLine","Importing %s from %s under the name of %s",
614 obj_name.Data(), rootfile_name.Data(), o_name.Data());
615 TObject* the_obj=ifile->Get(obj_name);
616 fWs->import(*the_obj,o_name);
617 }
618 return 0;
619 } // end of import block
620
621 new_line=o_class+"::"+o_name+"("+o_descr+")";
622
623 if (fVerbose){
624 std::cout << "DEBUG: line: " << line.Data() << std::endl;
625 std::cout << "DEBUG: new_line: " << new_line.Data() << std::endl;
626 }
627
628 fWs->factory(new_line);
629
630 return 0;
631 }
632
633 else { // In case we do not know what to do we pipe it..
634 fWs->factory(line);
635 }
636
637 return 0;
638
639}
#define ClassImp(name)
Definition Rtypes.h:377
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
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 filename
char name[80]
Definition TGX11.cxx:110
void Print(Option_t *options=nullptr) const override
Print the object to the defaultPrintStream().
Definition RooAbsArg.h:318
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
void Print(Option_t *options=nullptr) const override
This method must be overridden when a class wants to print itself.
Definition RooAbsData.h:236
RooArgList is a container object that can hold multiple RooAbsArg objects.
Definition RooArgList.h:22
RooCategory is an object to represent discrete states.
Definition RooCategory.h:28
bool setIndex(Int_t index, bool printError=true) override
Set value by specifying the index code of the desired state.
bool defineType(const std::string &label)
Define a state with given name.
RooDataSet is a container class to hold unbinned data.
Definition RooDataSet.h:57
virtual RooAbsArg * addColumn(RooAbsArg &var, bool adjustRange=true)
Add a column with the values of the given (function) argument to this dataset.
void append(RooDataSet &data)
Add all data points of given data set to this data set.
RooSimultaneous facilitates simultaneous fitting of multiple PDFs to subsets of a given dataset.
HLFactory is an High Level model Factory allows you to describe your models in a configuration file (...
Definition HLFactory.h:29
TList fSigBkgPdfNames
List of channels names to combine for the signal plus background pdfs.
Definition HLFactory.h:101
RooWorkspace * fWs
The RooWorkspace containing the models and variables.
Definition HLFactory.h:119
TList fBkgPdfNames
List of channels names to combine for the background pdfs.
Definition HLFactory.h:104
int fInclusionLevel
Keep trace of the inclusion deepness.
Definition HLFactory.h:116
RooAbsPdf * fComboBkgPdf
The background model combination.
Definition HLFactory.h:83
TList fLabelsNames
List of channels names to combine for the datasets.
Definition HLFactory.h:110
RooDataSet * GetTotDataSet()
Get the combined dataset.
int fParseLine(TString &line)
Parse a single line an puts the content in the RooWorkSpace.
HLFactory()
Default Constructor.
Definition HLFactory.cxx:98
RooCategory * fComboCat
The category of the combination.
Definition HLFactory.h:80
RooDataSet * fComboDataset
The datasets combination.
Definition HLFactory.h:89
TList fDatasetsNames
List of channels names to combine for the datasets.
Definition HLFactory.h:107
RooAbsPdf * GetTotBkgPdf()
Get the combined background pdf.
RooAbsPdf * fComboSigBkgPdf
The signal plus background model combination.
Definition HLFactory.h:86
bool fNamesListsConsistent()
Check the length of the lists.
bool fCombinationDone
Flag to keep trace of the status of the combination.
Definition HLFactory.h:92
RooAbsPdf * GetTotSigBkgPdf()
Get the combined signal plus background pdf.
int AddChannel(const char *label, const char *SigBkgPdfName, const char *BkgPdfName=nullptr, const char *datasetName=nullptr)
Add channel for the combination.
int ProcessCard(const char *filename)
Process a configuration file.
RooCategory * GetTotCategory()
Get the combined dataset.
bool fOwnWs
Owns workspace.
Definition HLFactory.h:122
~HLFactory() override
Default Destructor.
void fCreateCategory()
Create the category for the combinations.
bool fVerbose
The verbosity flag.
Definition HLFactory.h:113
int fReadFile(const char *fileName, bool is_included=false)
Read the actual cfg file.
The RooWorkspace is a persistable container for RooFit projects.
RooAbsPdf * pdf(RooStringView name) const
Retrieve p.d.f (RooAbsPdf) with given name. A null pointer is returned if not found.
bool import(const RooAbsArg &arg, const RooCmdArg &arg1=RooCmdArg(), const RooCmdArg &arg2=RooCmdArg(), const RooCmdArg &arg3=RooCmdArg(), const RooCmdArg &arg4=RooCmdArg(), const RooCmdArg &arg5=RooCmdArg(), const RooCmdArg &arg6=RooCmdArg(), const RooCmdArg &arg7=RooCmdArg(), const RooCmdArg &arg8=RooCmdArg(), const RooCmdArg &arg9=RooCmdArg())
Import a RooAbsArg object, e.g.
RooFactoryWSTool & factory()
Return instance to factory tool.
RooAbsData * data(RooStringView name) const
Retrieve dataset (binned or unbinned) with given name. A null pointer is returned if not found.
TIter end() const
TIter begin() const
virtual Int_t GetEntries() const
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
Definition TFile.cxx:4053
void Add(TObject *obj) override
Definition TList.h:81
TObject * First() const override
Return the first object in the list. Returns 0 when list is empty.
Definition TList.cxx:659
TObject * At(Int_t idx) const override
Returns the object at position idx. Returns 0 if idx is out of range.
Definition TList.cxx:357
The TNamed class is the base class for all named ROOT classes.
Definition TNamed.h:29
const char * GetName() const override
Returns name of object.
Definition TNamed.h:47
An array of TObjects.
Definition TObjArray.h:31
Int_t GetEntries() const override
Return the number of objects in array (i.e.
TObject * At(Int_t idx) const override
Definition TObjArray.h:164
Collectable string class.
Definition TObjString.h:28
const TString & GetString() const
Definition TObjString.h:46
TString & String()
Definition TObjString.h:48
Mother of all ROOT objects.
Definition TObject.h:41
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition TObject.cxx:956
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition TObject.cxx:970
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Definition TObject.cxx:944
Basic string class.
Definition TString.h:139
const char * Data() const
Definition TString.h:380
TString & ReplaceAll(const TString &s1, const TString &s2)
Definition TString.h:704
@ kBoth
Definition TString.h:278
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Definition TString.cxx:2242
std::istream & ReadFile(std::istream &str)
Replace string with the contents of strm, stopping at an EOF.
Definition Stringio.cxx:28
TLine * line
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...
Definition Common.h:18
Namespace for the RooStats classes.
Definition Asimov.h:19