CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/RecoMuon/MuonIsolation/src/IsolatorByNominalEfficiency.cc

Go to the documentation of this file.
00001 #include "RecoMuon/MuonIsolation/interface/IsolatorByNominalEfficiency.h"
00002 #include "RecoMuon/MuonIsolation/src/NominalEfficiencyThresholds.h"
00003 #include "DataFormats/RecoCandidate/interface/IsoDeposit.h"
00004 #include "FWCore/ParameterSet/interface/FileInPath.h"
00005 
00006 using namespace muonisolation;
00007 using namespace std;
00008 
00009 double IsolatorByNominalEfficiency::ConeSizes::size(int i) const
00010 { if (i >= 0 && i< DIM) return cone_dr[i]; else return 0.; }
00011 
00012 int IsolatorByNominalEfficiency::ConeSizes::index(float dr) const
00013 {
00014  for(int i=DIM; i>=1; i--) if (cone_dr[i-1] < dr) return i;
00015  return 0;
00016 }
00017 
00018 float IsolatorByNominalEfficiency::ConeSizes::cone_dr[]=
00019 { 0.001, 0.02, 0.045, 0.09, 0.13, 0.17, 0.20, 0.24, 0.28, 0.32, 0.38, 0.45, 0.5, 0.6, 0.7};
00020 
00021 IsolatorByNominalEfficiency::IsolatorByNominalEfficiency(const string & thrFile, 
00022     const vector<string> & ceff, const vector<double>& weights) : theWeights(weights){
00023   thresholds        = new NominalEfficiencyThresholds(findPath(thrFile));
00024   coneForEfficiency = cones(ceff);
00025   theDepThresholds = std::vector<double>(weights.size(), -1e12);
00026 }
00027 
00028 IsolatorByNominalEfficiency::
00029 IsolatorByNominalEfficiency(const string & thrFile, const vector<string> & ceff, 
00030                             const vector<double>& weights, const vector<double>& thresh
00031                             ) : theWeights(weights), theDepThresholds(thresh){
00032   thresholds        = new NominalEfficiencyThresholds(findPath(thrFile));
00033   coneForEfficiency = cones(ceff);
00034 }
00035 
00036 IsolatorByNominalEfficiency::~IsolatorByNominalEfficiency()
00037 {
00038   delete thresholds;
00039 }
00040 
00041 IsolatorByNominalEfficiency::mapNomEff_Cone
00042     IsolatorByNominalEfficiency::cones(const vector<string>& usrVec) {
00043   mapNomEff_Cone result;
00044   for (vector<string>::const_iterator is = usrVec.begin();
00045          is != usrVec.end(); is++) {
00046     char * evp = 0;
00047     int  cone = strtol( (*is).c_str(), &evp, 10);
00048     float effic = strtod(evp+1, &evp);
00049     result.insert(make_pair(effic,cone));
00050   }
00051   return result;
00052 }
00053 
00054 string IsolatorByNominalEfficiency::findPath(const string&  fileName)
00055 {
00056   // FIXME
00057   edm::FileInPath f(fileName);
00058   return f.fullPath();
00059 }
00060 
00061 MuIsoBaseIsolator::Result
00062 IsolatorByNominalEfficiency::result(DepositContainer deposits) const{
00063 
00064   if (deposits.size()==0) {
00065     cout << "IsolatorByNominalEfficiency: no deposit" << endl;
00066     return Result(resultType()); //FIXME
00067   }
00068 
00069   // To determine the threshold, the direction of the cone of the first
00070   // set of deposits is used.
00071   // For algorithms where different cone axis definitions are used
00072   // for different types deposits (eg. HCAL and ECAL deposits for
00073   // calorimeter isolation), the first one is used to determine the threshold
00074   // value!
00075   float theEta = deposits.back().dep->eta();
00076 
00077   // Try descending efficiency values to find the point where the candidate
00078   // becomes non isolated
00079 
00080   float nominalEfficiency = 1.;
00081   const float deltaeff=0.005;
00082   const float mineff=deltaeff;
00083   for (float eff=.995; eff>mineff; eff-=deltaeff) {
00084     int cone = bestConeForEfficiencyIndex(eff);
00085     float coneSize = theConesInfo.size(cone);
00086     NominalEfficiencyThresholds::ThresholdLocation location = {theEta,cone};
00087     float thres  = thresholds->thresholdValueForEfficiency(location, eff);
00088     float sumDep = weightedSum(deposits,coneSize);
00089 //      cout << "   Eff=" << eff
00090 //         << " eta=" << theEta
00091 //         << " cone=" << cone
00092 //         << " dR=" << coneSize
00093 //         << " thres=" << thres
00094 //         << " deposit=" << sumDep
00095 //         << " isolated=" << (sumDep < thres)
00096 //         << endl;
00097     if (sumDep > thres) break;
00098     nominalEfficiency = eff;
00099   }
00100   Result res(resultType());
00101   res.valFloat = nominalEfficiency;
00102   return res;
00103 }
00104 
00105 int IsolatorByNominalEfficiency::bestConeForEfficiencyIndex(float eff_thr) const
00106 {
00107 
00108   //FIXME use upper_bound
00109   int best_cone;
00110   if (coneForEfficiency.size() != 0) {
00111     best_cone = (--(coneForEfficiency.end()))->second;
00112   } else return 0;
00113 
00114    mapNomEff_Cone::const_reverse_iterator it;
00115   for (it = coneForEfficiency.rbegin();
00116        it != coneForEfficiency.rend(); it++) {
00117     if (eff_thr <= (*it).first) best_cone = (*it).second;
00118   }
00119   return best_cone;
00120 }
00121 
00122 
00123 double IsolatorByNominalEfficiency::weightedSum(const DepositContainer& deposits,
00124                                     float dRcone) const {
00125   double sumDep=0;
00126 
00127   assert(deposits.size()==theWeights.size());
00128 
00129   vector<double>::const_iterator w = theWeights.begin();
00130   vector<double>::const_iterator dThresh = theDepThresholds.begin();
00131   for (DepositContainer::const_iterator dep = deposits.begin();
00132        dep != deposits.end(); dep++) {
00133     if (dep->vetos != 0){
00134       sumDep += dep->dep->depositAndCountWithin(dRcone, *dep->vetos, *dThresh).first * (*w);
00135     } else {
00136       sumDep += dep->dep->depositAndCountWithin(dRcone, Vetos(), *dThresh).first * (*w);
00137     }
00138     if (sumDep <0.) sumDep = 0.;
00139     w++;
00140     dThresh++;
00141   }
00142   return sumDep;
00143 }
00144 
00145 Cuts IsolatorByNominalEfficiency::cuts(float nominalEfficiency) const
00146 {
00147   vector<double>  etaBounds = thresholds->bins();
00148   vector<double>  coneSizes;
00149   vector<double>  cutvalues;
00150   for (vector<double>::const_iterator it=etaBounds.begin(),itEnd=etaBounds.end();it < itEnd;++it){
00151     float eta = (*it);
00152     int icone = bestConeForEfficiencyIndex(nominalEfficiency);
00153     coneSizes.push_back( theConesInfo.size(icone));
00154     NominalEfficiencyThresholds::ThresholdLocation location = {eta-1.e-3f, icone};
00155     cutvalues.push_back( thresholds->thresholdValueForEfficiency(location, nominalEfficiency));
00156   }
00157   return Cuts(etaBounds,coneSizes,cutvalues);
00158 }