CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_0/src/RecoEgamma/ElectronIdentification/src/LikelihoodPdfProduct.cc

Go to the documentation of this file.
00001 #include "RecoEgamma/ElectronIdentification/interface/LikelihoodPdfProduct.h"
00002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00003 #include <iostream>
00004 
00005 
00006 
00007 LikelihoodPdfProduct::LikelihoodPdfProduct(const char* name, 
00008                                            int ecalsubdet, int ptbin) 
00009 {
00010   _name=std::string(name);
00011   _ecalsubdet = ecalsubdet;
00012   _ptbin = ptbin;
00013 }
00014 
00015 
00016 
00017 LikelihoodPdfProduct::~LikelihoodPdfProduct() 
00018 {
00019   // do the delete's 
00020   std::vector<LikelihoodSpecies*>::iterator specItr;
00021   for(specItr=_specList.begin(); specItr!=_specList.end(); specItr++) {
00022     delete *specItr;
00023   }
00024 }
00025 
00026 
00027 
00028 void 
00029 LikelihoodPdfProduct::initFromDB(const ElectronLikelihoodCalibration *calibration) 
00030 {
00031   _calibration=calibration;
00032 }
00033 
00034 
00035 
00036 void 
00037 LikelihoodPdfProduct::addSpecies(const char* name, float priorWeight) 
00038 {
00039   LikelihoodSpecies* species = new LikelihoodSpecies(name,priorWeight);
00040   _specList.push_back(species);
00041 }
00042 
00043 
00044 
00045 void 
00046 LikelihoodPdfProduct::addPdf(const char* specname, 
00047                              const char* name, 
00048                              bool splitPdf) 
00049 {
00050   std::vector<LikelihoodSpecies*>::const_iterator specItr;
00051   for(specItr=_specList.begin();specItr!=_specList.end();specItr++) {
00052     LikelihoodSpecies* species = *specItr;
00053     if(strcmp(species->getName(),specname)==0) {
00054       LikelihoodPdf *pdf = new LikelihoodPdf(name,species->getName(),_ecalsubdet,_ptbin);
00055       pdf->split(species->getSplitFractions(),splitPdf);
00056       pdf->initFromDB(_calibration);
00057       species->addPdf(pdf);
00058     }
00059   }
00060 }
00061 
00062 
00063 
00064 void 
00065 LikelihoodPdfProduct::setSplitFrac(const char* specname, 
00066                                    const char* catName, float frac) {
00067   std::vector<LikelihoodSpecies*>::const_iterator specItr;
00068   for(specItr=_specList.begin();specItr!=_specList.end();specItr++) {
00069     LikelihoodSpecies* species = *specItr;
00070     if(strcmp(species->getName(),specname)==0) {
00071       species->setSplitFraction( make_pair(std::string(catName), frac) );
00072       break;
00073     }
00074   }
00075 }
00076 
00077 
00078 
00079 float 
00080 LikelihoodPdfProduct::getRatio(const char* specname, 
00081                                std::vector<float> measurements, 
00082                                std::string gsfClass) 
00083 {
00084   float sigProb=0, bkgProb=0;
00085   std::vector<LikelihoodSpecies*>::const_iterator specItr;
00086   for(specItr=_specList.begin();specItr!=_specList.end();specItr++) {
00087     LikelihoodSpecies* species = *specItr;
00088     std::map<std::string,float> splitFractions = species->getSplitFractions();
00089     std::map<std::string,float>::iterator iter = splitFractions.find(gsfClass);
00091     float splitFr= (splitFractions.size()==0) ? 1. : iter->second;
00092     if(strcmp(species->getName(),specname)==0) {
00093       sigProb=splitFr*getSpeciesProb(specname,measurements,gsfClass);
00094     }
00095     else {
00096       bkgProb+=splitFr*getSpeciesProb(species->getName(),measurements,gsfClass);
00097     } 
00098   }
00099   if(sigProb+bkgProb>0)
00100     return sigProb/(sigProb+bkgProb);
00101   else
00102     return -1.;
00103 }
00104 
00105 
00106 
00107 float 
00108 LikelihoodPdfProduct::getSpeciesProb(const char* specName, 
00109                                      std::vector<float> measurements, 
00110                                      std::string gsfClass) 
00111 {
00112   float bareProb=1.;
00113   float priorWeight=1.;
00114   std::vector<LikelihoodSpecies*>::const_iterator specItr;
00115   for(specItr=_specList.begin();specItr!=_specList.end();specItr++) {
00116     LikelihoodSpecies* species = *specItr;
00117     if(strcmp(species->getName(),specName)==0) {
00118       for(unsigned int ipdf=0; ipdf< species->getListOfPdfs().size(); ipdf++) {
00119         bareProb*=species->getListOfPdfs().at(ipdf)->getVal(measurements.at(ipdf),gsfClass);
00120       }
00121       priorWeight=species->getPrior();
00122       break;
00123     }
00124   }
00125   edm::LogInfo("LikelihoodPdfProduct") << "Species: " << specName
00126                                        << " bare probability = " << bareProb
00127                                        << " with a priori probability = " << priorWeight;
00128   return priorWeight*bareProb;
00129 }