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 #include "RooStats/SamplingDistribution.h"
00027 #include "RooNumber.h"
00028 #include "math.h"
00029 #include <algorithm>
00030 #include <iostream>
00031 using namespace std ;
00032
00033
00034 ClassImp(RooStats::SamplingDistribution)
00035
00036 using namespace RooStats;
00037
00038
00039 SamplingDistribution::SamplingDistribution( const char *name, const char *title,
00040 std::vector<Double_t>& samplingDist, const char * varName) :
00041 TNamed(name,title)
00042 {
00043
00044 fSamplingDist = samplingDist;
00045
00046
00047
00048
00049 fSampleWeights.resize(fSamplingDist.size(),1.0) ;
00050
00051 fVarName = varName;
00052 }
00053
00054
00055 SamplingDistribution::SamplingDistribution( const char *name, const char *title,
00056 std::vector<Double_t>& samplingDist, std::vector<Double_t>& sampleWeights, const char * varName) :
00057 TNamed(name,title)
00058 {
00059
00060 fSamplingDist = samplingDist;
00061 fSampleWeights = sampleWeights;
00062
00063
00064
00065 fVarName = varName;
00066 }
00067
00068
00069 SamplingDistribution::SamplingDistribution( const char *name, const char *title, const char * varName) :
00070 TNamed(name,title)
00071 {
00072
00073 fVarName = varName;
00074 }
00075
00076
00077 SamplingDistribution::SamplingDistribution(
00078 const char *name,
00079 const char *title,
00080 RooDataSet& dataSet,
00081 const char * varName
00082 ) : TNamed(name, title) {
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 fVarName = varName;
00095 if(fVarName.Length() == 0) {
00096
00097 fVarName = dataSet.get()->first()->GetName();
00098 }
00099
00100 for(Int_t i=0; i < dataSet.numEntries(); i++) {
00101 fSamplingDist.push_back(dataSet.get(i)->getRealValue(fVarName));
00102 fSampleWeights.push_back(dataSet.weight());
00103 }
00104 }
00105
00106
00107
00108 SamplingDistribution::SamplingDistribution( ) :
00109 TNamed("SamplingDistribution_DefaultName","SamplingDistribution")
00110 {
00111
00112 }
00113
00114
00115 SamplingDistribution::~SamplingDistribution()
00116 {
00117
00118
00119 fSamplingDist.clear();
00120 fSampleWeights.clear();
00121 }
00122
00123
00124
00125 void SamplingDistribution::Add(const SamplingDistribution* other)
00126 {
00127
00128
00129
00130
00131 if(!other) return;
00132
00133 std::vector<double> newSamplingDist = other->fSamplingDist;
00134 std::vector<double> newSampleWeights = other->fSampleWeights;
00135
00136
00137
00138
00139
00140 fSamplingDist.reserve(fSamplingDist.size()+newSamplingDist.size());
00141 fSampleWeights.reserve(fSampleWeights.size()+newSampleWeights.size());
00142
00143
00144 for(unsigned int i=0; i<newSamplingDist.size(); ++i){
00145 fSamplingDist.push_back(newSamplingDist[i]);
00146 fSampleWeights.push_back(newSampleWeights[i]);
00147 }
00148
00149
00150 if(GetVarName().Length() == 0 && other->GetVarName().Length() > 0)
00151 fVarName = other->GetVarName();
00152
00153 if(strlen(GetName()) == 0 && strlen(other->GetName()) > 0)
00154 SetName(other->GetName());
00155 if(strlen(GetTitle()) == 0 && strlen(other->GetTitle()) > 0)
00156 SetTitle(other->GetTitle());
00157
00158 }
00159
00160
00161
00162
00163 Double_t SamplingDistribution::Integral(Double_t low, Double_t high, Bool_t normalize, Bool_t lowClosed, Bool_t highClosed) const
00164 {
00165
00166
00167
00168 Double_t sum = 0;
00169 for(unsigned int i=0; i<fSamplingDist.size(); i++) {
00170 double value = fSamplingDist[i];
00171
00172 if((lowClosed ? value >= low : value > low) &&
00173 (highClosed ? value <= high : value < high))
00174 {
00175 sum += fSampleWeights[i];
00176 }
00177 }
00178
00179 if(normalize) {
00180 Double_t norm = 0;
00181 for(unsigned int i=0; i<fSamplingDist.size(); i++) {
00182 norm += fSampleWeights[i];
00183 }
00184 sum /= norm;
00185 }
00186
00187 return sum;
00188 }
00189
00190
00191 Double_t SamplingDistribution::CDF(Double_t x) const {
00192
00193 return Integral(-RooNumber::infinity(), x, kTRUE, kTRUE, kTRUE);
00194 }
00195
00196
00197
00198
00199 Double_t SamplingDistribution::InverseCDF(Double_t pvalue)
00200 {
00201
00202
00203 Double_t dummy=0;
00204 return InverseCDF(pvalue,0,dummy);
00205 }
00206
00207 Double_t SamplingDistribution::InverseCDF(Double_t pvalue,
00208 Double_t sigmaVariation,
00209 Double_t& inverseWithVariation)
00210 {
00211
00212
00213
00214 std::sort(fSamplingDist.begin(), fSamplingDist.end());
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 int nominal = (unsigned int) (pvalue*fSamplingDist.size());
00230
00231 if(nominal <= 0) {
00232 inverseWithVariation = -1.*RooNumber::infinity();
00233 return -1.*RooNumber::infinity();
00234 }
00235 else if(nominal >= (Int_t)fSamplingDist.size()-1 ) {
00236 inverseWithVariation = RooNumber::infinity();
00237 return RooNumber::infinity();
00238 }
00239 else if(pvalue < 0.5){
00240 int delta = (int)(sigmaVariation*sqrt(1.0*nominal));
00241 int variation = nominal+delta;
00242
00243 if(variation>=(Int_t)fSamplingDist.size()-1)
00244 inverseWithVariation = RooNumber::infinity();
00245 else if(variation<=0)
00246 inverseWithVariation = -1.*RooNumber::infinity();
00247 else
00248 inverseWithVariation = fSamplingDist[ variation ];
00249
00250 return fSamplingDist[nominal];
00251 }
00252 else if(pvalue >= 0.5){
00253 int delta = (int)(sigmaVariation*sqrt(1.0*fSamplingDist.size()- nominal));
00254 int variation = nominal+delta;
00255
00256
00257 if(variation>=(Int_t)fSamplingDist.size()-1)
00258 inverseWithVariation = RooNumber::infinity();
00259
00260 else if(variation<=0)
00261 inverseWithVariation = -1.*RooNumber::infinity();
00262 else
00263 inverseWithVariation = fSamplingDist[ variation+1 ];
00264
00265
00266
00267
00268
00269
00270
00271
00272 return fSamplingDist[nominal+1];
00273 }
00274 else{
00275 std::cout << "problem in SamplingDistribution::InverseCDF" << std::endl;
00276 }
00277 inverseWithVariation = RooNumber::infinity();
00278 return RooNumber::infinity();
00279
00280 }
00281
00282
00283
00284 Double_t SamplingDistribution::InverseCDFInterpolate(Double_t pvalue)
00285 {
00286
00287
00288
00289 std::sort(fSamplingDist.begin(), fSamplingDist.end());
00290
00291
00292 int nominal = (unsigned int) (pvalue*fSamplingDist.size());
00293
00294 if(nominal <= 0) {
00295 return -1.*RooNumber::infinity();
00296 }
00297 if(nominal >= (Int_t)fSamplingDist.size()-1 ) {
00298 return RooNumber::infinity();
00299 }
00300 Double_t upperX = fSamplingDist[nominal+1];
00301 Double_t upperY = ((Double_t) (nominal+1))/fSamplingDist.size();
00302 Double_t lowerX = fSamplingDist[nominal];
00303 Double_t lowerY = ((Double_t) nominal)/fSamplingDist.size();
00304
00305
00306
00307 return (upperX-lowerX)/(upperY-lowerY)*(pvalue-lowerY)+lowerX;
00308
00309 }