Go to the documentation of this file.00001
00002
00003
00004
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
00089 if( (*thePFTauRef).leadPFChargedHadrCand().isNull() )
00090 {
00091 return 0.;
00092 } else
00093 {
00094
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);