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
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 }