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 #include "RooFit.h"
00028 #include "Riostream.h"
00029
00030 #include "RooAbsStudy.h"
00031 #include "RooMsgService.h"
00032 #include "RooDataSet.h"
00033 #include "TList.h"
00034 #include "TClass.h"
00035
00036 using namespace std ;
00037
00038 ClassImp(RooAbsStudy)
00039 ;
00040
00041
00042
00043 RooAbsStudy::RooAbsStudy(const char* name, const char* title) : TNamed(name,title), _storeDetails(0), _summaryData(0), _detailData(0), _ownDetailData(kTRUE)
00044 {
00045
00046 }
00047
00048
00049
00050
00051 RooAbsStudy::RooAbsStudy(const RooAbsStudy& other) : TNamed(other), _storeDetails(other._storeDetails), _summaryData(other._summaryData),
00052 _detailData(0), _ownDetailData(other._ownDetailData)
00053 {
00054
00055 }
00056
00057
00058
00059
00060 RooAbsStudy::~RooAbsStudy()
00061 {
00062
00063 if (_summaryData) delete _summaryData ;
00064 if (_ownDetailData && _detailData) {
00065 _detailData->Delete() ;
00066 delete _detailData ;
00067 }
00068 }
00069
00070
00071
00072
00073
00074 void RooAbsStudy::registerSummaryOutput(const RooArgSet& allVars, const RooArgSet& varsWithError, const RooArgSet& varsWithAsymError)
00075 {
00076 if (_summaryData) {
00077 coutW(ObjectHandling) << "RooAbsStudy::registerSummaryOutput(" << GetName() << ") WARNING summary output already registered" << endl ;
00078 return ;
00079 }
00080
00081 string name = Form("%s_summary_data",GetName()) ;
00082 string title = Form("%s Summary Data",GetTitle()) ;
00083 _summaryData = new RooDataSet(name.c_str(),title.c_str(),allVars,RooFit::StoreError(varsWithError),RooFit::StoreAsymError(varsWithAsymError)) ;
00084 }
00085
00086
00087
00088 void RooAbsStudy::storeSummaryOutput(const RooArgSet& vars)
00089 {
00090 if (!_summaryData) {
00091 coutE(ObjectHandling) << "RooAbsStudy::storeSummaryOutput(" << GetName() << ") ERROR: no summary output data configuration registered" << endl ;
00092 return ;
00093 }
00094 _summaryData->add(vars) ;
00095 }
00096
00097
00098
00099
00100 void RooAbsStudy::storeDetailedOutput(TNamed& object)
00101 {
00102 if (_storeDetails) {
00103
00104 if (!_detailData) {
00105 _detailData = new RooLinkedList ;
00106 _detailData->SetName(Form("%s_detailed_data",GetName())) ;
00107
00108 }
00109
00110 object.SetName(Form("%s_detailed_data_%d",GetName(),_detailData->GetSize())) ;
00111
00112 _detailData->Add(&object) ;
00113 } else {
00114 delete &object ;
00115 }
00116 }
00117
00118
00119
00120
00121 void RooAbsStudy::aggregateSummaryOutput(TList* chunkList)
00122 {
00123 if (!chunkList) return ;
00124
00125 TIterator* iter = chunkList->MakeIterator() ;
00126 TObject* obj ;
00127 while((obj=iter->Next())) {
00128
00129
00130
00131 RooDataSet* data = dynamic_cast<RooDataSet*>(obj) ;
00132 if (data) {
00133 if (TString(data->GetName()).BeginsWith(Form("%s_summary_data",GetName()))) {
00134
00135 if (!_summaryData) {
00136 _summaryData = (RooDataSet*) data->Clone(Form("%s_summary_data",GetName())) ;
00137 } else {
00138 _summaryData->append(*data) ;
00139 }
00140 }
00141 }
00142
00143 RooLinkedList* dlist = dynamic_cast<RooLinkedList*>(obj) ;
00144 if (dlist) {
00145 if (TString(dlist->GetName()).BeginsWith(Form("%s_detailed_data",GetName()))) {
00146
00147 TIterator* diter = dlist->MakeIterator() ;
00148 TNamed* dobj ;
00149 while((dobj=(TNamed*)diter->Next())) {
00150 storeDetailedOutput(*dobj) ;
00151 }
00152 delete diter ;
00153 }
00154 }
00155 }
00156 }