00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "RooFit.h"
00029 #include "Riostream.h"
00030
00031 #include "RooStudyPackage.h"
00032 #include "RooWorkspace.h"
00033 #include "RooAbsStudy.h"
00034 #include "RooDataSet.h"
00035 #include "RooMsgService.h"
00036 #include "TProof.h"
00037 #include "TTree.h"
00038 #include "TDSet.h"
00039 #include "TFile.h"
00040 #include "TRandom.h"
00041 #include "RooRandom.h"
00042
00043 using namespace std ;
00044
00045 ClassImp(RooStudyPackage)
00046 ;
00047
00048
00049
00050
00051 RooStudyPackage::RooStudyPackage() : _ws(0)
00052 {
00053 }
00054
00055
00056
00057
00058 RooStudyPackage::RooStudyPackage(RooWorkspace& w) : _ws(&w)
00059 {
00060 }
00061
00062
00063
00064
00065 void RooStudyPackage::addStudy(RooAbsStudy& study)
00066 {
00067 cout << "RooStudyPackage(" << this << ") addStudy " << &study << endl ;
00068 _studies.push_back(&study) ;
00069 }
00070
00071
00072
00073
00074 void RooStudyPackage::driver(Int_t nExperiments)
00075 {
00076 initialize() ;
00077 run(nExperiments) ;
00078 finalize() ;
00079 }
00080
00081
00082
00083
00084 void RooStudyPackage::initialize()
00085 {
00086
00087 for (list<RooAbsStudy*>::iterator iter=_studies.begin() ; iter!=_studies.end() ; iter++) {
00088 (*iter)->attach(*_ws) ;
00089 (*iter)->initialize() ;
00090 }
00091
00092 }
00093
00094
00095
00096 void RooStudyPackage::run(Int_t nExperiments)
00097 {
00098
00099
00100 Int_t prescale = nExperiments>100 ? Int_t(nExperiments/100) : 1 ;
00101 for (Int_t i=0 ; i<nExperiments ; i++) {
00102 if (i%prescale==0) {
00103 coutP(Generation) << "RooStudyPackage::run(" << GetName() << ") processing experiment " << i << "/" << nExperiments << endl ;
00104 }
00105 runOne() ;
00106 }
00107 }
00108
00109
00110
00111
00112 void RooStudyPackage::runOne()
00113 {
00114 for (list<RooAbsStudy*>::iterator iter=_studies.begin() ; iter!=_studies.end() ; iter++) {
00115 (*iter)->execute() ;
00116 }
00117 }
00118
00119
00120
00121
00122
00123 void RooStudyPackage::finalize()
00124 {
00125
00126 for (list<RooAbsStudy*>::iterator iter=_studies.begin() ; iter!=_studies.end() ; iter++) {
00127 (*iter)->finalize() ;
00128 }
00129 }
00130
00131
00132
00133
00134
00135 void RooStudyPackage::exportData(TList* olist, Int_t seqno)
00136 {
00137 for (list<RooAbsStudy*>::iterator iter=_studies.begin() ; iter!=_studies.end() ; iter++) {
00138
00139 (*iter)->finalize() ;
00140
00141 RooDataSet* summaryData = (*iter)->summaryData() ;
00142 if (summaryData) {
00143 summaryData->SetName(Form("%s_%d",summaryData->GetName(),seqno)) ;
00144 cout << "registering summary dataset: " ; summaryData->Print() ;
00145 olist->Add(summaryData) ;
00146 }
00147
00148 RooLinkedList* detailedData = (*iter)->detailedData() ;
00149 if (detailedData && detailedData->GetSize()>0) {
00150
00151 detailedData->SetName(Form("%s_%d",detailedData->GetName(),seqno)) ;
00152 cout << "registering detailed dataset " << detailedData->IsA()->GetName() << "::"
00153 << detailedData->GetName() << " with " << detailedData->GetSize() << " elements" << endl ;
00154 TIterator* diter = detailedData->MakeIterator() ;
00155 TNamed* dobj ;
00156 while((dobj=(TNamed*)diter->Next())) {
00157 dobj->SetName(Form("%s_%d",dobj->GetName(),seqno)) ;
00158 }
00159 delete diter ;
00160 olist->Add(detailedData) ;
00161 (*iter)->releaseDetailData() ;
00162 }
00163 }
00164 }
00165
00166
00167
00168
00169 Int_t RooStudyPackage::initRandom()
00170 {
00171
00172 gRandom->SetSeed(0) ;
00173 Int_t seed = gRandom->Integer(1000000) ;
00174 RooRandom::randomGenerator()->SetSeed(seed) ;
00175 gRandom->SetSeed(seed) ;
00176
00177 return seed ;
00178 }
00179
00180
00181
00182
00183 void RooStudyPackage::processFile(const char* studyName, Int_t nexp)
00184 {
00185
00186 string name_fin = Form("study_data_%s.root",studyName) ;
00187 TFile fin(name_fin.c_str()) ;
00188 RooStudyPackage* pkg = dynamic_cast<RooStudyPackage*>(fin.Get("studypack")) ;
00189 if (!pkg) {
00190 cout << "RooStudyPackage::processFile() ERROR input file " << name_fin << " does not contain a RooStudyPackage named 'studypack'" << endl ;
00191 return ;
00192 }
00193
00194
00195 Int_t seqno = pkg->initRandom() ;
00196 cout << "RooStudyPackage::processFile() Initial random seed for this run is " << seqno << endl ;
00197
00198
00199 pkg->driver(nexp) ;
00200
00201
00202 TList res ;
00203 pkg->exportData(&res,seqno) ;
00204 TFile fout(Form("study_result_%s_%d.root",studyName,seqno),"RECREATE") ;
00205 res.Write() ;
00206 fout.Close() ;
00207 }