00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "RooFit.h"
00014
00015 #include "Riostream.h"
00016 #include "Riostream.h"
00017 #include <math.h>
00018
00019 #include "RooJeffreysPrior.h"
00020 #include "RooAbsReal.h"
00021 #include "RooAbsPdf.h"
00022 #include "RooErrorHandler.h"
00023 #include "RooArgSet.h"
00024 #include "RooMsgService.h"
00025 #include "RooFitResult.h"
00026 #include "TMatrixDSym.h"
00027 #include "RooDataHist.h"
00028 #include "RooFitResult.h"
00029 #include "RooNumIntConfig.h"
00030 #include "RooRealVar.h"
00031
00032 ClassImp(RooJeffreysPrior)
00033 ;
00034
00035 using namespace RooFit;
00036
00037
00038 RooJeffreysPrior::RooJeffreysPrior(const char* name, const char* title,
00039 RooAbsPdf& nominal,
00040 const RooArgList& paramSet,
00041 const RooArgList& obsSet) :
00042 RooAbsPdf(name, title),
00043 _nominal("nominal","nominal",this,nominal,kFALSE,kFALSE),
00044 _obsSet("!obsSet","obs-side variation",this,kFALSE,kFALSE),
00045 _paramSet("!paramSet","high-side variation",this)
00046 {
00047
00048 _obsIter = _obsSet.createIterator() ;
00049 _paramIter = _paramSet.createIterator() ;
00050
00051
00052 TIterator* inputIter1 = obsSet.createIterator() ;
00053 RooAbsArg* comp ;
00054 while((comp = (RooAbsArg*)inputIter1->Next())) {
00055 if (!dynamic_cast<RooAbsReal*>(comp)) {
00056 coutE(InputArguments) << "RooJeffreysPrior::ctor(" << GetName() << ") ERROR: component " << comp->GetName()
00057 << " in first list is not of type RooAbsReal" << endl ;
00058 RooErrorHandler::softAbort() ;
00059 }
00060 _obsSet.add(*comp) ;
00061
00062
00063
00064 }
00065 delete inputIter1 ;
00066
00067
00068
00069 TIterator* inputIter3 = paramSet.createIterator() ;
00070 while((comp = (RooAbsArg*)inputIter3->Next())) {
00071 if (!dynamic_cast<RooAbsReal*>(comp)) {
00072 coutE(InputArguments) << "RooJeffreysPrior::ctor(" << GetName() << ") ERROR: component " << comp->GetName()
00073 << " in first list is not of type RooAbsReal" << endl ;
00074 RooErrorHandler::softAbort() ;
00075 }
00076 _paramSet.add(*comp) ;
00077
00078
00079
00080 }
00081 delete inputIter3 ;
00082
00083
00084
00085 if(paramSet.getSize()==1)
00086 this->specialIntegratorConfig(kTRUE)->method1D().setLabel("RooAdaptiveGaussKronrodIntegrator1D") ;
00087
00088 }
00089
00090
00091
00092
00093 RooJeffreysPrior::RooJeffreysPrior(const RooJeffreysPrior& other, const char* name) :
00094 RooAbsPdf(other, name),
00095 _nominal("!nominal",this,other._nominal),
00096 _obsSet("!obsSet",this,other._obsSet),
00097 _paramSet("!paramSet",this,other._paramSet)
00098 {
00099
00100 _obsIter = _obsSet.createIterator() ;
00101 _paramIter = _paramSet.createIterator() ;
00102
00103
00104 }
00105
00106
00107 RooJeffreysPrior::RooJeffreysPrior()
00108 {
00109
00110 _obsIter = NULL;
00111 _paramIter = NULL;
00112
00113 }
00114
00115
00116
00117
00118 RooJeffreysPrior::~RooJeffreysPrior()
00119 {
00120
00121
00122 if (_obsIter) delete _obsIter ;
00123 if (_paramIter) delete _paramIter ;
00124 }
00125
00126
00127
00128
00129
00130 Double_t RooJeffreysPrior::evaluate() const
00131 {
00132
00133 RooFit::MsgLevel msglevel = RooMsgService::instance().globalKillBelow();
00134 RooMsgService::instance().setGlobalKillBelow(RooFit::WARNING);
00135
00136
00137
00138 *(_nominal.arg().getVariables()) = _paramSet;
00139
00140
00141
00142
00143
00144
00145 RooDataHist* data = ((RooAbsPdf&)(_nominal.arg())).generateBinned(_obsSet,ExpectedData());
00146
00147
00148 RooFitResult* res = ((RooAbsPdf&)(_nominal.arg())).fitTo(*data, Save(),PrintLevel(-1),Minos(kFALSE),SumW2Error(kFALSE));
00149 TMatrixDSym cov = res->covarianceMatrix();
00150 cov.Invert();
00151 double ret = sqrt(cov.Determinant());
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167 delete data;
00168 delete res;
00169 RooMsgService::instance().setGlobalKillBelow(msglevel);
00170
00171
00172
00173 return ret;
00174
00175 }
00176
00177
00178 Int_t RooJeffreysPrior::getAnalyticalIntegral(RooArgSet& , RooArgSet& , const char* ) const
00179 {
00180
00181
00182
00183 return 0 ;
00184 }
00185
00186
00187
00188
00189 Double_t RooJeffreysPrior::analyticalIntegral(Int_t code, const char* ) const
00190 {
00191 assert(code==1 );
00192
00193 return 1.;
00194 }
00195
00196