Go to the documentation of this file.00001 #include "RecoMuon/MuonIsolation/interface/IsolatorByDeposit.h"
00002
00003 using std::vector;
00004 using reco::IsoDeposit;
00005 using namespace muonisolation;
00006
00007 IsolatorByDeposit::IsolatorByDeposit(float conesize, const vector<double>& weights)
00008 : theConeSizeFunction(0), theConeSize(conesize), theWeights(weights)
00009 {
00010 theDepThresholds = std::vector<double>(weights.size(), -1e12);
00011 }
00012
00013 IsolatorByDeposit::IsolatorByDeposit(const ConeSizeFunction * conesize, const vector<double>& weights)
00014 : theConeSizeFunction(conesize), theConeSize(0.), theWeights(weights)
00015 {
00016 theDepThresholds = std::vector<double>(weights.size(), -1e12);
00017 }
00018
00019 IsolatorByDeposit::IsolatorByDeposit(float conesize, const vector<double>& weights, const vector<double>& dThresh)
00020 : theConeSizeFunction(0), theConeSize(conesize), theWeights(weights),
00021 theDepThresholds(dThresh)
00022 { }
00023
00024 IsolatorByDeposit::IsolatorByDeposit(const ConeSizeFunction * conesize,
00025 const vector<double>& weights, const vector<double>& dThresh)
00026 : theConeSizeFunction(conesize), theConeSize(0.), theWeights(weights),
00027 theDepThresholds(dThresh)
00028 { }
00029
00030 MuIsoBaseIsolator::Result IsolatorByDeposit::result(DepositContainer deposits) const{
00031 if (deposits.empty()) return Result(resultType());
00032
00033
00034
00035
00036
00037
00038
00039 float eta = deposits.front().dep->eta();
00040 float pt = deposits.front().dep->candEnergy();
00041 float dr= coneSize(eta,pt);
00042 float sumDep = weightedSum(deposits,dr);
00043
00044
00045 Result res(resultType());
00046 res.valFloat = sumDep;
00047 return res;
00048 }
00049
00050 double
00051 IsolatorByDeposit::weightedSum(const DepositContainer& deposits,
00052 float dRcone) const {
00053 double sumDep=0;
00054
00055 assert(deposits.size()==theWeights.size());
00056
00057 vector<double>::const_iterator w = theWeights.begin();
00058 vector<double>::const_iterator dThresh = theDepThresholds.begin();
00059
00060 typedef DepositContainer::const_iterator DI;
00061 for (DI dep = deposits.begin(), depEnd = deposits.end(); dep != depEnd; ++dep) {
00062 if (dep->vetos != 0){
00063 sumDep += dep->dep->depositAndCountWithin(dRcone, *dep->vetos, (*dThresh)).first * (*w);
00064 } else {
00065 sumDep += dep->dep->depositAndCountWithin(dRcone, Vetos(), (*dThresh)).first * (*w);
00066 }
00067
00068 w++;
00069 dThresh++;
00070 }
00071 return sumDep;
00072 }