RooStudyPackage.cxx

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * Project: RooFit                                                           *
00003  * Package: RooFitCore                                                       *
00004  * @(#)root/roofitcore:$Id: RooStudyPackage.cxx 30333 2009-09-21 15:39:17Z wouter $
00005  * Authors:                                                                  *
00006  *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
00007  *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
00008  *                                                                           *
00009  * Copyright (c) 2000-2005, Regents of the University of California          *
00010  *                          and Stanford University. All rights reserved.    *
00011  *                                                                           *
00012  * Redistribution and use in source and binary forms,                        *
00013  * with or without modification, are permitted according to the terms        *
00014  * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
00015  *****************************************************************************/
00016 
00017 //////////////////////////////////////////////////////////////////////////////
00018 //
00019 // BEGIN_HTML
00020 // RooStudyPackage is a utility class to manage studies that consist of
00021 // repeated applications of generate-and-fit operations on a workspace
00022 //
00023 // END_HTML
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   // Make iterator over copy of studies attached to workspace
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   // Run the requested number of experiments
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   // Finalize all studies
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   // Choose random seed for this process
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   // Read in study package
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   // Initialize random seed
00195   Int_t seqno = pkg->initRandom() ;
00196   cout << "RooStudyPackage::processFile() Initial random seed for this run is " << seqno << endl ;
00197 
00198   // Run study
00199   pkg->driver(nexp) ;
00200 
00201   // Save result
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 }

Generated on Tue Jul 5 15:07:35 2011 for ROOT_528-00b_version by  doxygen 1.5.1