Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RooStudyPackage.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 RooStudyPackage.cxx
19\class RooStudyPackage
20\ingroup Roofitcore
21
22Utility class to manage studies that consist of
23repeated applications of generate-and-fit operations on a workspace
24
25**/
26
27
28
29#include "Riostream.h"
30
31#include "RooStudyPackage.h"
32#include "RooWorkspace.h"
33#include "RooAbsStudy.h"
34#include "RooDataSet.h"
35#include "RooMsgService.h"
36#include "TFile.h"
37#include "TRandom2.h"
38#include "RooRandom.h"
39#include "TMath.h"
40#include "TEnv.h"
41
42using std::list, std::string;
43
44
45////////////////////////////////////////////////////////////////////////////////
46
50
51
52
53////////////////////////////////////////////////////////////////////////////////
54
56{
57 list<RooAbsStudy*>::const_iterator iter = other._studies.begin() ;
58 for (;iter!=other._studies.end() ; ++iter) {
59 _studies.push_back((*iter)->clone()) ;
60 }
61}
62
63
64
65////////////////////////////////////////////////////////////////////////////////
66
71
72
73
74////////////////////////////////////////////////////////////////////////////////
75
82
83
84
85////////////////////////////////////////////////////////////////////////////////
86/// Make iterator over copy of studies attached to workspace
87
89{
90 for (list<RooAbsStudy*>::iterator iter=_studies.begin() ; iter!=_studies.end() ; ++iter) {
91 (*iter)->attach(*_ws) ;
92 (*iter)->initialize() ;
93 }
94
95}
96
97
98////////////////////////////////////////////////////////////////////////////////
99
101{
102 // Run the requested number of experiments
103 Int_t prescale = nExperiments>100 ? Int_t(nExperiments/100) : 1 ;
104 for (Int_t i=0 ; i<nExperiments ; i++) {
105 if (i%prescale==0) {
106 coutP(Generation) << "RooStudyPackage::run(" << GetName() << ") processing experiment " << i << "/" << nExperiments << std::endl ;
107 }
108 runOne() ;
109 }
110}
111
112
113
114////////////////////////////////////////////////////////////////////////////////
115
117{
118 for (list<RooAbsStudy*>::iterator iter=_studies.begin() ; iter!=_studies.end() ; ++iter) {
119 (*iter)->execute() ;
120 }
121}
122
123
124
125
126////////////////////////////////////////////////////////////////////////////////
127/// Finalize all studies
128
130{
131 for (list<RooAbsStudy*>::iterator iter=_studies.begin() ; iter!=_studies.end() ; ++iter) {
132 (*iter)->finalize() ;
133 }
134}
135
136
137
138
139////////////////////////////////////////////////////////////////////////////////
140
142{
143 for (list<RooAbsStudy*>::iterator iter=_studies.begin() ; iter!=_studies.end() ; ++iter) {
144
145 (*iter)->finalize() ;
146
147 RooDataSet* summaryData = (*iter)->summaryData() ;
148 if (summaryData) {
149 summaryData->SetName(Form("%s_%d",summaryData->GetName(),seqno)) ;
150 std::cout << "registering summary dataset: " ; summaryData->Print() ;
151 olist->Add(summaryData) ;
152 }
153
154 RooLinkedList* detailedData = (*iter)->detailedData() ;
155 if (detailedData && detailedData->GetSize()>0) {
156
157 detailedData->SetName(Form("%s_%d",detailedData->GetName(),seqno)) ;
158 std::cout << "registering detailed dataset " << detailedData->ClassName() << "::"
159 << detailedData->GetName() << " with " << detailedData->GetSize() << " elements" << std::endl ;
160 for(auto dobj : static_range_cast<TNamed*>(*detailedData)) {
161 dobj->SetName(Form("%s_%d",dobj->GetName(),seqno)) ;
162 }
163 olist->Add(detailedData) ;
164 (*iter)->releaseDetailData() ;
165 }
166 }
167}
168
169
170
171////////////////////////////////////////////////////////////////////////////////
172/// Choose random seed for this process
173/// in case pass a definite seed to have it deterministic
174/// use also worker number
175
177{
178 TRandom2 random(0);
179 //gRandom->SetSeed(0) ;
180 Int_t seed = random.Integer(TMath::Limits<Int_t>::Max()) ;
181
182 // get worker number
183 TString worknumber = gEnv->GetValue("ProofServ.Ordinal","undef");
184 int iworker = -1;
185 if (worknumber != "undef")
186 iworker = int( worknumber.Atof()*10 + 0.1);
187
188 if (iworker >= 0) {
189 for (int i = 0; i <= iworker; ++i )
190 seed = random.Integer( TMath::Limits<Int_t>::Max() );
191 }
192
193 RooRandom::randomGenerator()->SetSeed(seed) ;
194 gRandom->SetSeed(seed) ;
195
196 return seed ;
197}
198
199
200
201////////////////////////////////////////////////////////////////////////////////
202/// Read in study package
203
205{
206 string name_fin = Form("study_data_%s.root",studyName) ;
207 TFile fin(name_fin.c_str()) ;
208 RooStudyPackage* pkg = dynamic_cast<RooStudyPackage*>(fin.Get("studypack")) ;
209 if (!pkg) {
210 std::cout << "RooStudyPackage::processFile() ERROR input file " << name_fin << " does not contain a RooStudyPackage named 'studypack'" << std::endl ;
211 return ;
212 }
213
214 // Initialize random seed
215 Int_t seqno = pkg->initRandom() ;
216 std::cout << "RooStudyPackage::processFile() Initial random seed for this run is " << seqno << std::endl ;
217
218 // Run study
219 pkg->driver(nexp) ;
220
221 // Save result
222 TList res ;
223 pkg->exportData(&res,seqno) ;
224 TFile fout(Form("study_result_%s_%d.root",studyName,seqno),"RECREATE") ;
225 res.Write() ;
226 fout.Close() ;
227}
#define coutP(a)
int Int_t
Definition RtypesCore.h:45
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
R__EXTERN TEnv * gEnv
Definition TEnv.h:170
R__EXTERN TRandom * gRandom
Definition TRandom.h:62
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Definition TString.cxx:2489
const_iterator begin() const
const_iterator end() const
void Print(Option_t *options=nullptr) const override
This method must be overridden when a class wants to print itself.
Definition RooAbsData.h:227
Abstract base class for RooStudyManager modules.
Definition RooAbsStudy.h:33
Container class to hold unbinned data.
Definition RooDataSet.h:34
void SetName(const char *name) override
Change the name of this dataset into the given name.
Collection class for internal use, storing a collection of RooAbsArg pointers in a doubly linked list...
Int_t GetSize() const
void SetName(const char *name)
const char * GetName() const override
Returns name of object.
static TRandom * randomGenerator()
Return a pointer to a singleton random-number generator implementation.
Definition RooRandom.cxx:47
Utility class to manage studies that consist of repeated applications of generate-and-fit operations ...
void driver(Int_t nExperiments)
Int_t initRandom()
Choose random seed for this process in case pass a definite seed to have it deterministic use also wo...
std::list< RooAbsStudy * > _studies
static void processFile(const char *infile, Int_t nexp)
Read in study package.
void addStudy(RooAbsStudy &study)
void finalize()
Finalize all studies.
void initialize()
Make iterator over copy of studies attached to workspace.
void exportData(TList *olist, Int_t seqno)
RooStudyPackage()=default
RooWorkspace * _ws
void run(Int_t nExperiments)
Persistable container for RooFit projects.
Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0) override
Write all objects in this collection.
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Definition TEnv.cxx:491
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
Definition TFile.h:131
A doubly linked list.
Definition TList.h:38
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
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Definition TObject.cxx:225
Random number generator class based on the maximally quidistributed combined Tausworthe generator by ...
Definition TRandom2.h:27
virtual void SetSeed(ULong_t seed=0)
Set the random generator seed.
Definition TRandom.cxx:615
Basic string class.
Definition TString.h:139