CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch12/src/RecoTauTag/RecoTau/plugins/PFRecoTauDiscriminationAgainstElectron.cc

Go to the documentation of this file.
00001 /* class PFRecoTauDiscriminationAgainstElectron
00002  * created : May 02 2008,
00003  * revised : ,
00004  * Authorss : Chi Nhan Nguyen (Texas A&M)
00005  */
00006 
00007 #include "RecoTauTag/RecoTau/interface/TauDiscriminationProducerBase.h"
00008 #include "DataFormats/TrackReco/interface/Track.h"
00009 
00010 using namespace reco;
00011 
00012 class PFRecoTauDiscriminationAgainstElectron : public PFTauDiscriminationProducerBase  {
00013    public:
00014       explicit PFRecoTauDiscriminationAgainstElectron(const edm::ParameterSet& iConfig):PFTauDiscriminationProducerBase(iConfig) {   
00015 
00016          emFraction_maxValue_              = iConfig.getParameter<double>("EmFraction_maxValue");
00017          applyCut_emFraction_              = iConfig.getParameter<bool>("ApplyCut_EmFraction");
00018          hcalTotOverPLead_minValue_        = iConfig.getParameter<double>("HcalTotOverPLead_minValue");
00019          applyCut_hcalTotOverPLead_        = iConfig.getParameter<bool>("ApplyCut_HcalTotOverPLead");
00020          hcalMaxOverPLead_minValue_        = iConfig.getParameter<double>("HcalMaxOverPLead_minValue");
00021          applyCut_hcalMaxOverPLead_        = iConfig.getParameter<bool>("ApplyCut_HcalMaxOverPLead");
00022          hcal3x3OverPLead_minValue_        = iConfig.getParameter<double>("Hcal3x3OverPLead_minValue");
00023 
00024          applyCut_hcal3x3OverPLead_        = iConfig.getParameter<bool>("ApplyCut_Hcal3x3OverPLead");
00025          EOverPLead_minValue_              = iConfig.getParameter<double>("EOverPLead_minValue");
00026          EOverPLead_maxValue_              = iConfig.getParameter<double>("EOverPLead_maxValue");
00027          applyCut_EOverPLead_              = iConfig.getParameter<bool>("ApplyCut_EOverPLead");
00028          bremsRecoveryEOverPLead_minValue_ = iConfig.getParameter<double>("BremsRecoveryEOverPLead_minValue");
00029          bremsRecoveryEOverPLead_maxValue_ = iConfig.getParameter<double>("BremsRecoveryEOverPLead_maxValue");
00030 
00031          applyCut_bremsRecoveryEOverPLead_ = iConfig.getParameter<bool>("ApplyCut_BremsRecoveryEOverPLead");
00032 
00033          applyCut_electronPreID_           = iConfig.getParameter<bool>("ApplyCut_ElectronPreID");
00034 
00035          applyCut_electronPreID_2D_        = iConfig.getParameter<bool>("ApplyCut_ElectronPreID_2D");
00036 
00037          elecPreID0_EOverPLead_maxValue_   = iConfig.getParameter<double>("ElecPreID0_EOverPLead_maxValue");
00038          elecPreID0_HOverPLead_minValue_   = iConfig.getParameter<double>("ElecPreID0_HOverPLead_minValue");
00039          elecPreID1_EOverPLead_maxValue_   = iConfig.getParameter<double>("ElecPreID1_EOverPLead_maxValue");
00040          elecPreID1_HOverPLead_minValue_   = iConfig.getParameter<double>("ElecPreID1_HOverPLead_minValue");
00041 
00042 
00043          applyCut_PFElectronMVA_           = iConfig.getParameter<bool>("ApplyCut_PFElectronMVA");
00044          pfelectronMVA_maxValue_           = iConfig.getParameter<double>("PFElectronMVA_maxValue");
00045 
00046          applyCut_ecalCrack_               = iConfig.getParameter<bool>("ApplyCut_EcalCrackCut");
00047       }
00048 
00049       double discriminate(const PFTauRef& pfTau);
00050 
00051       ~PFRecoTauDiscriminationAgainstElectron(){} 
00052 
00053    private:
00054       bool isInEcalCrack(double) const; 
00055       edm::InputTag PFTauProducer_;
00056       bool applyCut_emFraction_;
00057       double emFraction_maxValue_;   
00058       bool applyCut_hcalTotOverPLead_;
00059       double hcalTotOverPLead_minValue_;   
00060       bool applyCut_hcalMaxOverPLead_;
00061       double hcalMaxOverPLead_minValue_;   
00062       bool applyCut_hcal3x3OverPLead_;
00063       double hcal3x3OverPLead_minValue_;   
00064 
00065       bool applyCut_EOverPLead_;
00066       double EOverPLead_minValue_;   
00067       double EOverPLead_maxValue_;   
00068       bool applyCut_bremsRecoveryEOverPLead_;
00069       double bremsRecoveryEOverPLead_minValue_;   
00070       double bremsRecoveryEOverPLead_maxValue_;   
00071 
00072       bool applyCut_electronPreID_;
00073 
00074       bool applyCut_electronPreID_2D_;
00075       double elecPreID0_EOverPLead_maxValue_;
00076       double elecPreID0_HOverPLead_minValue_;
00077       double elecPreID1_EOverPLead_maxValue_;
00078       double elecPreID1_HOverPLead_minValue_;
00079 
00080       bool applyCut_PFElectronMVA_;
00081       double pfelectronMVA_maxValue_; 
00082       bool applyCut_ecalCrack_;
00083 
00084 };
00085 
00086 double PFRecoTauDiscriminationAgainstElectron::discriminate(const PFTauRef& thePFTauRef)
00087 {
00088     // ensure tau has at least one charged object
00089     if( (*thePFTauRef).leadPFChargedHadrCand().isNull() )
00090     {
00091        return 0.;
00092     } else 
00093     { 
00094        // Check if track goes to Ecal crack
00095        TrackRef myleadTk;
00096        myleadTk=(*thePFTauRef).leadPFChargedHadrCand()->trackRef();
00097        math::XYZPointF myleadTkEcalPos = (*thePFTauRef).leadPFChargedHadrCand()->positionAtECALEntrance();
00098 
00099        if(myleadTk.isNonnull())
00100        { 
00101           if (applyCut_ecalCrack_ && isInEcalCrack(myleadTkEcalPos.eta())) 
00102           {
00103              return 0.;
00104           }
00105        }
00106     }
00107     
00108     bool decision = false;
00109     bool emfPass = true, htotPass = true, hmaxPass = true; 
00110     bool h3x3Pass = true, estripPass = true, erecovPass = true;
00111     bool epreidPass = true, epreid2DPass = true;
00112     bool mvaPass = true;
00113 
00114     if (applyCut_emFraction_) {
00115       if ((*thePFTauRef).emFraction() > emFraction_maxValue_) {
00116         emfPass = false;
00117       }
00118     }
00119     if (applyCut_hcalTotOverPLead_) {
00120       if ((*thePFTauRef).hcalTotOverPLead() < hcalTotOverPLead_minValue_) {
00121         htotPass = false;
00122       }
00123     }
00124     if (applyCut_hcalMaxOverPLead_) {
00125       if ((*thePFTauRef).hcalMaxOverPLead() < hcalMaxOverPLead_minValue_) {
00126         hmaxPass = false;
00127       }
00128     }
00129     if (applyCut_hcal3x3OverPLead_) {
00130       if ((*thePFTauRef).hcal3x3OverPLead() < hcal3x3OverPLead_minValue_) {
00131         h3x3Pass = false;
00132       }
00133     }
00134     if (applyCut_EOverPLead_) {
00135       if ((*thePFTauRef).ecalStripSumEOverPLead() > EOverPLead_minValue_ &&
00136           (*thePFTauRef).ecalStripSumEOverPLead() < EOverPLead_maxValue_) {
00137         estripPass = false;
00138       } else {
00139         estripPass = true;
00140       }
00141     }
00142     if (applyCut_bremsRecoveryEOverPLead_) {
00143       if ((*thePFTauRef).bremsRecoveryEOverPLead() > bremsRecoveryEOverPLead_minValue_ &&
00144           (*thePFTauRef).bremsRecoveryEOverPLead() < bremsRecoveryEOverPLead_maxValue_) {
00145         erecovPass = false;
00146       } else {
00147         erecovPass = true;
00148       } 
00149     }
00150     if (applyCut_electronPreID_) {
00151       if ((*thePFTauRef).electronPreIDDecision()) {
00152         epreidPass = false;
00153       }  else {
00154         epreidPass = true;
00155       }
00156     }
00157       
00158     if (applyCut_electronPreID_2D_) {
00159       if (
00160           ((*thePFTauRef).electronPreIDDecision() &&
00161            ((*thePFTauRef).ecalStripSumEOverPLead() < elecPreID1_EOverPLead_maxValue_ ||
00162             (*thePFTauRef).hcal3x3OverPLead() > elecPreID1_HOverPLead_minValue_))
00163           ||
00164           (!(*thePFTauRef).electronPreIDDecision() &&
00165            ((*thePFTauRef).ecalStripSumEOverPLead() < elecPreID0_EOverPLead_maxValue_ ||
00166             (*thePFTauRef).hcal3x3OverPLead() > elecPreID0_HOverPLead_minValue_))
00167           ){
00168         epreid2DPass = true;
00169       }  else {
00170         epreid2DPass = false;
00171       }
00172     }
00173 
00174     if (applyCut_PFElectronMVA_) {
00175       if ((*thePFTauRef).electronPreIDOutput()>pfelectronMVA_maxValue_) {
00176         mvaPass = false;
00177       }  
00178     }
00179 
00180     decision = emfPass && htotPass && hmaxPass && 
00181       h3x3Pass && estripPass && erecovPass && epreidPass && epreid2DPass && mvaPass;
00182 
00183     return (decision ? 1. : 0.);
00184 }
00185 
00186 bool
00187 PFRecoTauDiscriminationAgainstElectron::isInEcalCrack(double eta) const
00188 {  
00189   eta = fabs(eta);
00190   return (eta < 0.018 || 
00191           (eta>0.423 && eta<0.461) ||
00192           (eta>0.770 && eta<0.806) ||
00193           (eta>1.127 && eta<1.163) ||
00194           (eta>1.460 && eta<1.558));
00195 }
00196 
00197 DEFINE_FWK_MODULE(PFRecoTauDiscriminationAgainstElectron);