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
38
39
40using namespace RooStats;
41using namespace RooFit;
42
43////////////////////////////////////////////////////////////////////////////////
44/// Constructor with the name of the config file to interpret and the
45/// verbosity flag. The extension for the config files is assumed to
46/// be ".rs".
47
48HLFactory::HLFactory(const char *name, const char *fileName, bool isVerbose)
49 : TNamed(name, name), fVerbose(isVerbose), fOwnWs(true)
50{
51 TString wsName(name);
52 wsName += "_ws";
53 fWs = new RooWorkspace(wsName, true);
54
58
59 // Start the parsing
60 fReadFile(fileName);
61}
62
63////////////////////////////////////////////////////////////////////////////////
64/// Constructor without a card but with an external workspace.
65
66HLFactory::HLFactory(const char *name, RooWorkspace *externalWs, bool isVerbose)
67 : TNamed(name, name), fVerbose(isVerbose), fWs(externalWs)
68{
72}
73
74////////////////////////////////////////////////////////////////////////////////
75
76HLFactory::HLFactory() : TNamed("hlfactory", "hlfactory"), fWs(new RooWorkspace("hlfactory_ws", true)), fOwnWs(true)
77{
81}
82
83////////////////////////////////////////////////////////////////////////////////
84/// destructor
85
87 if (fComboSigBkgPdf!=nullptr)
88 delete fComboSigBkgPdf;
89 if (fComboBkgPdf!=nullptr)
90 delete fComboBkgPdf;
91 if (fComboDataset!=nullptr)
92 delete fComboDataset;
93 if (fComboCat!=nullptr)
94 delete fComboCat;
95
96 if (fOwnWs)
97 delete fWs;
98}
99
100////////////////////////////////////////////////////////////////////////////////
101/// Add a channel to the combination. The channel can be specified as:
102/// - A signal plus background pdf
103/// - A background only pdf
104/// - A dataset
105/// Once the combination of the pdfs is done, no more channels should be
106/// added.
107
108int HLFactory::AddChannel(const char* label,
109 const char* SigBkgPdfName,
110 const char* BkgPdfName,
111 const char* DatasetName){
112 if (fCombinationDone){
113 std::cerr << "Cannot add anymore channels. "
114 << "Combination already carried out.\n";
115 return -1;
116 }
117
118 if (SigBkgPdfName!=nullptr){
119 if (fWs->pdf(SigBkgPdfName)==nullptr){
120 std::cerr << "Pdf " << SigBkgPdfName << " not found in workspace!\n";
121 return -1;
122 }
123 TObjString* name = new TObjString(SigBkgPdfName);
125 }
126
127 if (BkgPdfName!=nullptr){
128 if (fWs->pdf(BkgPdfName)==nullptr){
129 std::cerr << "Pdf " << BkgPdfName << " not found in workspace!\n";
130 return -1;
131 }
132 TObjString* name = new TObjString(BkgPdfName);
134 }
135
136 if (DatasetName!=nullptr){
137 if (fWs->data(DatasetName)==nullptr){
138 std::cerr << "Dataset " << DatasetName << " not found in workspace!\n";
139 return -1;
140 }
141 TObjString* name = new TObjString(DatasetName);
143 }
144
145 if (label!=nullptr){
146 TObjString* name = new TObjString(label);
148 }
149 return 0;
150
151}
152
153////////////////////////////////////////////////////////////////////////////////
154/// Return the combination of the signal plus background channels.
155/// The factory owns the object.
156
158 if (fSigBkgPdfNames.GetSize()==0)
159 return nullptr;
160
161 if (fComboSigBkgPdf!=nullptr)
162 return fComboSigBkgPdf;
163
165 return nullptr;
166
167 if (fSigBkgPdfNames.GetSize()==1){
169 return fComboSigBkgPdf;
170 }
171
172 if (!fCombinationDone)
174
175 RooArgList pdfs("pdfs");
176
177 for(auto * ostring : static_range_cast<TObjString*>(fSigBkgPdfNames)) {
178 pdfs.add( *(fWs->pdf(ostring->String().Data())) );
179 }
180
181 std::string name(GetName());
182 name+="_sigbkg";
183
184 std::string title(GetName());
185 title+="_sigbkg";
186
188 new RooSimultaneous(name.c_str(),
189 title.c_str(),
190 pdfs,
191 *fComboCat);
192
193 return fComboSigBkgPdf;
194
195}
196
197////////////////////////////////////////////////////////////////////////////////
198/// Return the combination of the background only channels.
199/// If no background channel is specified a nullptr pointer is returned.
200/// The factory owns the object.
201
203 if (fBkgPdfNames.GetSize()==0)
204 return nullptr;
205
206 if (fComboBkgPdf!=nullptr)
207 return fComboBkgPdf;
208
210 return nullptr;
211
212 if (fBkgPdfNames.GetSize()==1){
213 fComboBkgPdf=fWs->pdf(static_cast<TObjString*>(fBkgPdfNames.First())->String().Data());
214 return fComboBkgPdf;
215 }
216
217 if (!fCombinationDone)
219
220 RooArgList pdfs("pdfs");
221
222 for(auto * ostring : static_range_cast<TObjString*>(fBkgPdfNames)) {
223 pdfs.add( *fWs->pdf(ostring->String().Data()) );
224 }
225
227 name+="_bkg";
228
229 TString title(GetName());
230 title+="_bkg";
231
234 title,
235 pdfs,
236 *fComboCat);
237
238 return fComboBkgPdf;
239
240}
241
242////////////////////////////////////////////////////////////////////////////////
243/// Return the combination of the datasets.
244/// If no dataset is specified a nullptr pointer is returned.
245/// The factory owns the object.
246
248 if (fDatasetsNames.GetSize()==0)
249 return nullptr;
250
251 if (fComboDataset!=nullptr)
252 return fComboDataset;
253
255 return nullptr;
256
257 if (fDatasetsNames.GetSize()==1){
258 fComboDataset=static_cast<RooDataSet*>(fWs->data(static_cast<TObjString*>(fDatasetsNames.First())->String().Data()));
259 return fComboDataset;
260 }
261
262 if (!fCombinationDone)
264
265
266 auto it = fDatasetsNames.begin();
267 TObjString* ostring;
268 ostring = static_cast<TObjString*>(*it);
269 ++it;
270 fComboDataset = static_cast<RooDataSet*>(fWs->data(ostring->String().Data())) ;
271 if (!fComboDataset) return nullptr;
273 TString dataname(GetName());
274 fComboDataset = new RooDataSet(*fComboDataset,dataname+"_TotData");
275 int catindex=0;
276 fComboCat->setIndex(catindex);
278 for(; it != fDatasetsNames.end() ; ++it) {
279 ostring = static_cast<TObjString*>(*it);
280 catindex++;
281 RooDataSet * data = static_cast<RooDataSet*>(fWs->data(ostring->String().Data()));
282 if (!data) return nullptr;
283 RooDataSet* dummy = new RooDataSet(*data,"");
284 fComboCat->setIndex(catindex);
285 fComboCat->Print();
286 dummy->addColumn(*fComboCat);
287 fComboDataset->append(*dummy);
288 delete dummy;
289 }
290
291 return fComboDataset;
292
293}
294
295////////////////////////////////////////////////////////////////////////////////
296/// Return the category.
297/// The factory owns the object.
298
300 if (fComboCat!=nullptr)
301 return fComboCat;
302
304 return nullptr;
305
306 if (!fCombinationDone)
308
309 return fComboCat;
310
311 }
312
313////////////////////////////////////////////////////////////////////////////////
314/// Process an additional configuration file
315
317 return fReadFile(filename,false);
318}
319
320////////////////////////////////////////////////////////////////////////////////
321/// Parses the configuration file. The objects can be specified following
322/// the rules of the RooFactoryWSTool, plus some more flexibility.
323///
324/// The official format for the datacards is ".rs".
325///
326/// All the instructions end with a ";" (like in C++).
327///
328/// Carriage returns and white lines are irrelevant but advised since they
329/// improve readability (like in C++).
330///
331/// The `(Roo)ClassName::objname(description)` can be replaced with the more
332/// "pythonic" `objname = (Roo)ClassName(description)`.
333///
334/// The comments can be specified with a "//" if on a single line or with
335/// "multiple lines" in C/C++ like comments.
336///
337/// The `"#include path/to/file.rs"` statement triggers the inclusion of a
338/// configuration fragment.
339///
340/// The `"import myobject:myworkspace:myrootfile"` will add to the Workspace
341/// the object myobject located in myworkspace recorded in myrootfile.
342/// Alternatively, one could choose the `"import myobject:myrootfile"` in case
343/// no Workspace is present.
344///
345/// The `"echo"` statement prompts a message on screen.
346
347int HLFactory::fReadFile(const char*fileName, bool is_included){
348 // Check the deepness of the inclusion
349 if (is_included) {
351 } else {
352 fInclusionLevel = 0;
353 }
354
355 const int maxDeepness=50;
356 if (fInclusionLevel>maxDeepness){
357 TString warning("The inclusion stack is deeper than ");
358 warning+=maxDeepness;
359 warning+=". Is this a recursive inclusion?";
360 Warning("fReadFile", "%s", warning.Data());
361 }
362
363
364 // open the config file and go through it
365 std::ifstream ifile(fileName);
366
367 if(ifile.fail()){
368 TString error("File ");
369 error+=fileName;
370 error+=" could not be opened.";
371 Error("fReadFile", "%s", error.Data());
372 return -1;
373 }
374
375 TString ifileContent("");
376 ifileContent.ReadFile(ifile);
377 ifile.close();
378
379 // Tokenise the file using the "\n" char and parse it line by line to strip
380 // the comments.
381 TString ifileContentStripped("");
382
383 std::unique_ptr<TObjArray> lines_array{ifileContent.Tokenize("\n")};
384
385 bool in_comment=false;
386
387 // Start iteration on lines array
388 for(TObject * line_o : *lines_array) {
389 TString line = (static_cast<TObjString*>(line_o))->GetString();
390
391 // Are we in a multiline comment?
392 if (in_comment) {
393 if (line.EndsWith("*/")){
394 in_comment=false;
395 if (fVerbose) Info("fReadFile","Out of multiline comment ...");
396
397 continue;
398 }
399 }
400
401 // Was line a single line comment?
402
403 if ((line.BeginsWith("/*") && line.EndsWith("*/")) ||
404 line.BeginsWith("//")){
405 if (fVerbose) Info("fReadFile","In single line comment ...");
406 continue;
407 }
408
409 // Did a multiline comment just begin?
410 if (line.BeginsWith("/*")){
411 in_comment=true;
412 if (fVerbose) Info("fReadFile","In multiline comment ...");
413 continue;
414 }
415
416 ifileContentStripped+=line+"\n";
417 }
418
419 // Now proceed with the parsing of the stripped file
420
421 lines_array.reset(ifileContentStripped.Tokenize(";"));
422 in_comment=false;
423
424 const int nNeutrals=2;
425 TString neutrals[nNeutrals]={"\t"," "};
426
427 for(TObject * line_o : *lines_array) {
428
429 TString line = (static_cast<TObjString*>(line_o))->GetString();
430
431 // Strip spaces at the beginning and the end of the line
432 line.Strip(TString::kBoth,' ');
433
434 // Put the single statement in one single line
435 line.ReplaceAll("\n","");
436
437 // Do we have an echo statement? "A la RooFit"
438 if (line.BeginsWith("echo")){
439 line = line(5,line.Length()-1);
440 if (fVerbose)
441 std::cout << "Echoing line " << line.Data() << std::endl;
442 std::cout << "[" << GetName() << "] echo: "
443 << line.Data() << std::endl;
444 continue;
445 }
446
447 // Spaces and tabs at this point are not needed.
448 for (int i=0;i<nNeutrals;++i)
449 line.ReplaceAll(neutrals[i],"");
450
451
452 if (fVerbose) Info("fReadFile","Reading --> %s <--", line.Data());
453
454 // Was line a white space?
455 if (line == ""){
456 if (fVerbose) Info("fReadFile", "%s", "Empty line: skipping ...");
457 continue;
458 }
459
460 // Do we have an include statement?
461 // We treat this recursively.
462 if (line.BeginsWith("#include")){
463 line.ReplaceAll("#include","");
464 if (fVerbose) Info("fReadFile","Reading included file...");
465 fReadFile(line,true);
466 continue;
467 }
468
469 // We parse the line
470 if (fVerbose) Info("fReadFile","Parsing the line...");
472 }
473
474 return 0;
475}
476
477
478////////////////////////////////////////////////////////////////////////////////
479/// Builds the category necessary for the mutidimensional models. Its name
480/// will be `<HLFactory name>_category` and the types are specified by the
481/// model labels.
482
484 fCombinationDone=true;
485
487 name+="_category";
488
489 TString title(GetName());
490 title+="_category";
491
492 fComboCat=new RooCategory(name,title);
493
494 for (auto * ostring : static_range_cast<TObjString*>(fLabelsNames)) {
495 fComboCat->defineType(ostring->String());
496 }
497
498 }
499
500////////////////////////////////////////////////////////////////////////////////
501/// Check the number of entries in each list. If not the same and the list
502/// is not empty prompt an error.
503
508 return true;
509 } else {
510 std::cerr << "The number of datasets and models added as channels "
511 << " is not the same!\n";
512 return false;
513 }
514 }
515
516////////////////////////////////////////////////////////////////////////////////
517/// Parse a single line and puts the content in the RooWorkSpace
518
520 if (fVerbose) Info("fParseLine", "Parsing line: %s", line.Data());
521
522 TString new_line("");
523
524 const int nequals = line.CountChar('=');
525
526 // Build with the factory a var or cat, or pipe the command directly.
527
528 if (line.Contains("::") || // It is a ordinary statement
529 nequals==0 || //it is a RooRealVar or cat with 0,1,2,3.. indexes
530 (line.Contains("[") &&
531 line.Contains("]") &&
532 nequals>0 && // It is a cat like "tag[B0=1,B0bar=-1]"
533 ! line.Contains("(") &&
534 ! line.Contains(")"))) {
535 fWs->factory(line.Data());
536 return 0;
537 }
538
539 // Transform the line o_name = o_class(o_descr) in o_class::o_name(o_descr)
540 if (nequals==1 ||
541 (nequals > 1 && line.Contains("SIMUL"))){
542
543 // Divide the line in 3 components: o_name,o_class and o_descr
544 // assuming that o_name=o_class(o_descr)
545 const int equal_index=line.First('=');
546 const int par_index=line.First('(');
547 TString o_name(line(0,equal_index));
548 TString o_class(line(equal_index+1,par_index-equal_index-1));
549 TString o_descr(line(par_index+1,line.Length()-par_index-2));
550
551 if (fVerbose) Info("fParseLine", "o_name=%s o_class=%s o_descr=%s",
552 o_name.Data(), o_class.Data(), o_descr.Data());
553
554 // Now two cases either we wanna produce an object or import something
555 // under a new name.
556 if (o_class =="import"){// import a generic TObject into the WS
557 // Now see if we have a workspace or not, according to the number of
558 // entries in the description..
559
560 TObjArray* descr_array = o_descr.Tokenize(",");
561
562 const int n_descr_parts=descr_array->GetEntries();
563
564 if (n_descr_parts<2 || n_descr_parts>3)
565 Error("fParseLine","Import wrong syntax: cannot process %s", o_descr.Data());
566
567 TString obj_name (static_cast<TObjString*>(descr_array->At(n_descr_parts-1))->GetString());
568 TString ws_name("");
569 TString rootfile_name (static_cast<TObjString*>(descr_array->At(0))->GetString());
570
571 std::unique_ptr<TFile> ifile{TFile::Open(rootfile_name)};
572 if (ifile==nullptr)
573 return 1;
574
575 if (n_descr_parts==3){// in presence of a Ws
576 o_descr.ReplaceAll(",",":");
577 fWs->import(o_descr);
578 }
579 else if(n_descr_parts==2){ // in presence of an object in rootfile
580 if (fVerbose) {
581 Info("fParseLine", "Importing %s from %s under the name of %s", obj_name.Data(), rootfile_name.Data(),
582 o_name.Data());
583 }
584 TObject* the_obj=ifile->Get(obj_name);
585 fWs->import(*the_obj,o_name);
586 }
587 return 0;
588 } // end of import block
589
590 new_line=o_class+"::"+o_name+"("+o_descr+")";
591
592 if (fVerbose){
593 std::cout << "DEBUG: line: " << line.Data() << std::endl;
594 std::cout << "DEBUG: new_line: " << new_line.Data() << std::endl;
595 }
596
597 fWs->factory(new_line.Data());
598
599 return 0;
600 }
601
602 else { // In case we do not know what to do we pipe it..
603 fWs->factory(line.Data());
604 }
605
606 return 0;
607
608}
#define ClassImp(name)
Definition Rtypes.h:382
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:263
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:225
Abstract interface for all probability density functions.
Definition RooAbsPdf.h:40
RooArgList is a container object that can hold multiple RooAbsArg objects.
Definition RooArgList.h:22
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.
Container class to hold unbinned data.
Definition RooDataSet.h:33
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.
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:96
RooWorkspace * fWs
The RooWorkspace containing the models and variables.
Definition HLFactory.h:102
TList fBkgPdfNames
List of channels names to combine for the background pdfs.
Definition HLFactory.h:97
int fInclusionLevel
Keep trace of the inclusion deepness.
Definition HLFactory.h:101
RooAbsPdf * fComboBkgPdf
The background model combination.
Definition HLFactory.h:92
TList fLabelsNames
List of channels names to combine for the datasets.
Definition HLFactory.h:99
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:76
RooCategory * fComboCat
The category of the combination.
Definition HLFactory.h:91
RooDataSet * fComboDataset
The datasets combination.
Definition HLFactory.h:94
TList fDatasetsNames
List of channels names to combine for the datasets.
Definition HLFactory.h:98
RooAbsPdf * GetTotBkgPdf()
Get the combined background pdf.
RooAbsPdf * fComboSigBkgPdf
The signal plus background model combination.
Definition HLFactory.h:93
bool fNamesListsConsistent()
Check the length of the lists.
bool fCombinationDone
Flag to keep trace of the status of the combination.
Definition HLFactory.h:95
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:103
~HLFactory() override
Default Destructor.
Definition HLFactory.cxx:86
void fCreateCategory()
Create the category for the combinations.
bool fVerbose
The verbosity flag.
Definition HLFactory.h:100
int fReadFile(const char *fileName, bool is_included=false)
Read the actual cfg file.
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={}, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}, const RooCmdArg &arg6={}, const RooCmdArg &arg7={}, const RooCmdArg &arg8={}, const RooCmdArg &arg9={})
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:4089
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:657
TObject * At(Int_t idx) const override
Returns the object at position idx. Returns 0 if idx is out of range.
Definition TList.cxx:355
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:991
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition TObject.cxx:1005
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Definition TObject.cxx:979
Basic string class.
Definition TString.h:139
const char * Data() const
Definition TString.h:376
TString & ReplaceAll(const TString &s1, const TString &s2)
Definition TString.h:704
@ kBoth
Definition TString.h:276
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
Definition TString.cxx:2264
std::istream & ReadFile(std::istream &str)
Replace string with the contents of strm, stopping at an EOF.
Definition Stringio.cxx:29
TLine * line
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...
Definition JSONIO.h:26
Namespace for the RooStats classes.
Definition Asimov.h:19