CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch9/src/DQMOffline/Trigger/src/EgHLTOffEgSel.cc

Go to the documentation of this file.
00001 #include "DQMOffline/Trigger/interface/EgHLTOffEgSel.h"
00002 
00003 #include "DQMOffline/Trigger/interface/EgHLTEgCutCodes.h"
00004 #include "DQMOffline/Trigger/interface/EgHLTOffEle.h"
00005 #include "DQMOffline/Trigger/interface/EgHLTOffPho.h"
00006 
00007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00008 
00009 using namespace egHLT;
00010 
00011 void OffEgSel::setup(const edm::ParameterSet& iConfig)
00012 { 
00013   ebCutValues_.setup(iConfig.getParameter<edm::ParameterSet>("barrel"));
00014   eeCutValues_.setup(iConfig.getParameter<edm::ParameterSet>("endcap"));
00015 }
00016 
00017 
00018 int OffEgSel::getCutCode(const OffEle& ele,int cutMask)const
00019 {
00020   if(fabs(ele.detEta())<1.5) return getCutCode(ele,ebCutValues_,cutMask);
00021   else return getCutCode(ele,eeCutValues_,cutMask);
00022 }
00023 
00024 int OffEgSel::getCutCode(const OffEle& ele,const EgCutValues& cuts,int cutMask)
00025 { 
00026   int cutCode = 0x0;
00027   //kinematic cuts
00028   if(ele.et()< cuts.minEt) cutCode |= EgCutCodes::ET;
00029   if(fabs(ele.etaSC())< cuts.minEta || fabs(ele.etaSC())>cuts.maxEta) cutCode |= EgCutCodes::DETETA;
00030   if(ele.isGap()) cutCode |= EgCutCodes::CRACK;
00031   //track cuts
00032   if(fabs(ele.dEtaIn()) > cuts.maxDEtaIn ) cutCode |=EgCutCodes::DETAIN;
00033   if(fabs(ele.dPhiIn()) > cuts.maxDPhiIn ) cutCode |=EgCutCodes::DPHIIN;
00034   if(ele.invEInvP() > cuts.maxInvEInvP) cutCode |= EgCutCodes::INVEINVP;
00035   //supercluster cuts
00036   if(ele.hOverE()> cuts.maxHadem && ele.hOverE()*ele.caloEnergy()>cuts.maxHadEnergy) cutCode |= EgCutCodes::HADEM;
00037   if(ele.sigmaIEtaIEta()>cuts.maxSigmaIEtaIEta) cutCode |= EgCutCodes::SIGMAIETAIETA;
00038   if(ele.sigmaEtaEta()>cuts.maxSigmaEtaEta) cutCode |= EgCutCodes::SIGMAETAETA;
00039   if(ele.r9()<cuts.minR9) cutCode |= EgCutCodes::R9;
00040   
00041   //std isolation cuts
00042   if(ele.isolEm()>( cuts.isolEmConstTerm + cuts.isolEmGradTerm*(ele.et()<cuts.isolEmGradStart ? 0. : (ele.et()-cuts.isolEmGradStart)))) cutCode |=EgCutCodes::ISOLEM;
00043   if(ele.isolHad()> (cuts.isolHadConstTerm + cuts.isolHadGradTerm*(ele.et()<cuts.isolHadGradStart ? 0. : (ele.et()-cuts.isolHadGradStart)))) cutCode |=EgCutCodes::ISOLHAD;
00044   if(ele.isolPtTrks() > (cuts.isolPtTrksConstTerm + cuts.isolPtTrksGradTerm*(ele.et()<cuts.isolPtTrksGradStart ? 0. : (ele.et()-cuts.isolPtTrksGradStart))))cutCode |=EgCutCodes::ISOLPTTRKS; 
00045   //ele Nr trks not defined, assume it passes
00046   //hlt isolation cuts
00047   if(ele.et()<=0.){//even it if et<=0, we give it a shot at passing isolation. Note this should be an impossible case
00048     if(ele.hltIsolTrksEle() > cuts.maxHLTIsolTrksEle) cutCode |=EgCutCodes::HLTISOLTRKSELE;
00049     if(ele.hltIsolTrksPho() > cuts.maxHLTIsolTrksPho) cutCode |=EgCutCodes::HLTISOLTRKSPHO;
00050     if(ele.hltIsolHad() > cuts.maxHLTIsolHad) cutCode |=EgCutCodes::HLTISOLHAD;
00051     if(ele.hltIsolEm() > cuts.maxHLTIsolEm) cutCode |=EgCutCodes::HLTISOLEM;
00052   }else{ 
00053     if(ele.hltIsolTrksEle() > cuts.maxHLTIsolTrksEle && ele.hltIsolTrksEle()/ele.et() > cuts.maxHLTIsolTrksEleOverPt &&
00054        ele.hltIsolTrksEle()/ele.et()/ele.et() > cuts.maxHLTIsolTrksEleOverPt2 ) cutCode |=EgCutCodes::HLTISOLTRKSELE;
00055     if(ele.hltIsolTrksPho() > cuts.maxHLTIsolTrksPho && ele.hltIsolTrksPho()/ele.et() > cuts.maxHLTIsolTrksPhoOverPt &&
00056        ele.hltIsolTrksPho()/ele.et()/ele.et() > cuts.maxHLTIsolTrksPhoOverPt2 ) cutCode |=EgCutCodes::HLTISOLTRKSPHO;
00057     if(ele.hltIsolHad() > cuts.maxHLTIsolHad && ele.hltIsolHad()/ele.et() > cuts.maxHLTIsolHadOverEt &&
00058        ele.hltIsolHad()/ele.et()/ele.et() > cuts.maxHLTIsolHadOverEt2) cutCode |=EgCutCodes::HLTISOLHAD;
00059     if(ele.hltIsolEm() > cuts.maxHLTIsolEm && ele.hltIsolEm()/ele.et() > cuts.maxHLTIsolEmOverEt &&
00060        ele.hltIsolEm()/ele.et()/ele.et() > cuts.maxHLTIsolEmOverEt2) cutCode |=EgCutCodes::HLTISOLEM;
00061   }
00062  
00063  
00064   //cuts on CTF track, HLT tracking doesnt handle poor quaility tracks
00065   if(ele.validCTFTrack()){
00066     if(!(ele.ctfTrkOuterRadius() >= cuts.minCTFTrkOuterRadius && //note I'm NOTing the result of the AND
00067          ele.ctfTrkInnerRadius() <= cuts.maxCTFTrkInnerRadius &&
00068          
00069          ele.ctfTrkHitsFound() >= cuts.minNrCTFTrkHits && 
00070          ele.ctfTrkHitsLost() <= cuts.maxNrCTFTrkHitsLost)) cutCode |=EgCutCodes::CTFTRACK; //the next line can also set this bit
00071     if(cuts.requirePixelHitsIfOuterInOuter){
00072       DetId innerDetId(ele.ctfTrack()->extra()->innerDetId());
00073       DetId outerDetId(ele.ctfTrack()->extra()->outerDetId());
00074     
00075       if(outerDetId.subdetId()>=5 && innerDetId.subdetId()>=3) cutCode |=EgCutCodes::CTFTRACK; //1,2 = pixel, 3,4,5,6 sistrip
00076     }
00077     // std::cout <<"eta "<<ele.detEta()<<" max inner "<<cuts.maxCTFTrkInnerRadius<<" inner "<<ele.ctfTrkInnerRadius()<<std::endl;
00078   }else cutCode |=EgCutCodes::CTFTRACK;
00079 
00080   if(fabs(ele.hltDEtaIn()) > cuts.maxHLTDEtaIn) cutCode |=EgCutCodes::HLTDETAIN;
00081   if(fabs(ele.hltDPhiIn()) > cuts.maxHLTDPhiIn) cutCode |=EgCutCodes::HLTDPHIIN;
00082   if(fabs(ele.hltInvEInvP()) > cuts.maxHLTInvEInvP) cutCode |=EgCutCodes::HLTINVEINVP;
00083 
00084   return (cutCode & cuts.cutMask & cutMask);
00085 }
00086 
00087 int OffEgSel::getCutCode(const OffPho& pho,int cutMask)const
00088 {
00089   if(fabs(pho.detEta())<1.5) return getCutCode(pho,ebCutValues_,cutMask);
00090   else return getCutCode(pho,eeCutValues_,cutMask);
00091 }
00092 
00093 //photons automatically fail any track cut
00094 int OffEgSel::getCutCode(const OffPho& pho,const EgCutValues& cuts,int cutMask)
00095 { 
00096   int cutCode = 0x0;
00097   //kinematic cuts
00098   if(pho.et()< cuts.minEt) cutCode |= EgCutCodes::ET;
00099   if(fabs(pho.etaSC())< cuts.minEta || fabs(pho.etaSC())>cuts.maxEta) cutCode |= EgCutCodes::DETETA;
00100   if(pho.isGap()) cutCode |= EgCutCodes::CRACK;
00101   //track cuts (all fail)
00102   cutCode |=EgCutCodes::DETAIN;
00103   cutCode |=EgCutCodes::DPHIIN;
00104   cutCode |=EgCutCodes::INVEINVP;
00105   //supercluster cuts
00106   if(pho.hOverE()> cuts.maxHadem && pho.hOverE()*pho.energy()>cuts.maxHadEnergy) cutCode |= EgCutCodes::HADEM;
00107   if(pho.sigmaIEtaIEta()>cuts.maxSigmaIEtaIEta) cutCode |= EgCutCodes::SIGMAIETAIETA; 
00108   if(pho.sigmaEtaEta()>cuts.maxSigmaEtaEta) cutCode |= EgCutCodes::SIGMAETAETA; 
00109   if(pho.r9()<cuts.minR9) cutCode |= EgCutCodes::R9;
00110   //std isolation cuts
00111   if(pho.isolEm()>( cuts.isolEmConstTerm + cuts.isolEmGradTerm*(pho.et()<cuts.isolEmGradStart ? 0. : (pho.et()-cuts.isolEmGradStart)))) cutCode |=EgCutCodes::ISOLEM;
00112   if(pho.isolHad()> (cuts.isolHadConstTerm + cuts.isolHadGradTerm*(pho.et()<cuts.isolHadGradStart ? 0. : (pho.et()-cuts.isolHadGradStart)))) cutCode |=EgCutCodes::ISOLHAD;
00113   if(pho.isolPtTrks() > (cuts.isolPtTrksConstTerm + cuts.isolPtTrksGradTerm*(pho.et()<cuts.isolPtTrksGradStart ? 0. : (pho.et()-cuts.isolPtTrksGradStart))))cutCode |=EgCutCodes::ISOLPTTRKS;
00114   if(pho.isolNrTrks() > cuts.isolNrTrksConstTerm) cutCode |=EgCutCodes::ISOLNRTRKS;
00115 
00116   //hlt isolation cuts
00117   cutCode |=EgCutCodes::HLTISOLTRKSELE; //automatically fails ele track isolation
00118   if(pho.et()<=0.){ //even it if et<=0, we give it a shot at passing isolation. Note this should be an impossible case
00119     if(pho.hltIsolTrks() > cuts.maxHLTIsolTrksPho) cutCode |=EgCutCodes::HLTISOLTRKSPHO;
00120     if(pho.hltIsolHad() > cuts.maxHLTIsolHad) cutCode |=EgCutCodes::HLTISOLHAD;
00121     if(pho.hltIsolEm() > cuts.maxHLTIsolEm) cutCode |=EgCutCodes::HLTISOLEM;
00122   }else{ 
00123     if(pho.hltIsolTrks() > cuts.maxHLTIsolTrksPho && pho.hltIsolTrks()/pho.et() > cuts.maxHLTIsolTrksPhoOverPt &&
00124        pho.hltIsolTrks()/pho.et()/pho.et() > cuts.maxHLTIsolTrksPhoOverPt2 ) cutCode |=EgCutCodes::HLTISOLTRKSPHO;
00125     if(pho.hltIsolHad() > cuts.maxHLTIsolHad && pho.hltIsolHad()/pho.et() > cuts.maxHLTIsolHadOverEt &&
00126        pho.hltIsolHad()/pho.et()/pho.et() > cuts.maxHLTIsolHadOverEt2) cutCode |=EgCutCodes::HLTISOLHAD;
00127     if(pho.hltIsolEm() > cuts.maxHLTIsolEm && pho.hltIsolEm()/pho.et() > cuts.maxHLTIsolEmOverEt &&
00128        pho.hltIsolEm()/pho.et()/pho.et() > cuts.maxHLTIsolEmOverEt2) cutCode |=EgCutCodes::HLTISOLEM;
00129   }
00130 
00131   //track cuts, photon will automatically fail them (for now)
00132   cutCode |=EgCutCodes::CTFTRACK;
00133   cutCode |=EgCutCodes::HLTDETAIN;
00134   cutCode |=EgCutCodes::HLTDPHIIN;
00135   cutCode |=EgCutCodes::HLTINVEINVP;
00136   
00137   return (cutCode & cuts.cutMask & cutMask) ;
00138 }