CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_4_5_patch3/src/RecoTauTag/RecoTau/plugins/CaloRecoTauDiscriminationAgainstElectron.cc

Go to the documentation of this file.
00001 #include "RecoTauTag/RecoTau/interface/TauDiscriminationProducerBase.h"
00002 
00003 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00004 #include "RecoTauTag/TauTagTools/interface/TauTagTools.h"
00005 
00006 /* class CaloRecoTauDiscriminationAgainstElectron
00007  * created : Feb 17 2008,
00008  * revised : ,
00009  * contributors : Konstantinos Petridis, Sebastien Greder, 
00010  *                Maiko Takahashi, Alexandre Nikitenko (Imperial College, London), 
00011  *                Evan Friis (UC Davis)
00012  */
00013 
00014 using namespace reco;
00015 
00016 class CaloRecoTauDiscriminationAgainstElectron : public  CaloTauDiscriminationProducerBase {
00017    public:
00018       explicit CaloRecoTauDiscriminationAgainstElectron(const edm::ParameterSet& iConfig):CaloTauDiscriminationProducerBase(iConfig){   
00019          CaloTauProducer_                            = iConfig.getParameter<edm::InputTag>("CaloTauProducer");
00020          leadTrack_HCAL3x3hitsEtSumOverPt_minvalue_  = iConfig.getParameter<double>("leadTrack_HCAL3x3hitsEtSumOverPt_minvalue");  
00021          ApplyCut_maxleadTrackHCAL3x3hottesthitDEta_ = iConfig.getParameter<bool>("ApplyCut_maxleadTrackHCAL3x3hottesthitDEta");
00022          maxleadTrackHCAL3x3hottesthitDEta_          = iConfig.getParameter<double>("maxleadTrackHCAL3x3hottesthitDEta");
00023          ApplyCut_leadTrackavoidsECALcrack_          = iConfig.getParameter<bool>("ApplyCut_leadTrackavoidsECALcrack");
00024       }
00025       ~CaloRecoTauDiscriminationAgainstElectron(){} 
00026       double discriminate(const CaloTauRef& theCaloTauRef);
00027       void beginEvent(const edm::Event& event, const edm::EventSetup& eventSetup);
00028    private:  
00029       edm::ESHandle<MagneticField> theMagneticField;
00030       edm::InputTag CaloTauProducer_;
00031       double leadTrack_HCAL3x3hitsEtSumOverPt_minvalue_;   
00032       bool ApplyCut_maxleadTrackHCAL3x3hottesthitDEta_;
00033       double maxleadTrackHCAL3x3hottesthitDEta_;
00034       bool ApplyCut_leadTrackavoidsECALcrack_;
00035 };
00036 
00037 void CaloRecoTauDiscriminationAgainstElectron::beginEvent(const edm::Event& event, const edm::EventSetup& eventSetup)
00038 {
00039    if (ApplyCut_leadTrackavoidsECALcrack_)
00040    {
00041       // get the magnetic field, if we need it
00042       eventSetup.get<IdealMagneticFieldRecord>().get(theMagneticField);
00043    }
00044 }
00045 
00046 
00047 double CaloRecoTauDiscriminationAgainstElectron::discriminate(const CaloTauRef& theCaloTauRef)
00048 {
00049    if (ApplyCut_maxleadTrackHCAL3x3hottesthitDEta_){
00050       // optional selection : ask for small |deta| between direction of propag. leading Track - ECAL inner surf. contact point and direction of highest Et hit among HCAL hits inside a 3x3 calo. tower matrix centered on direction of propag. leading Track - ECAL inner surf. contact point
00051       if (std::isnan((*theCaloTauRef).leadTrackHCAL3x3hottesthitDEta()) || (*theCaloTauRef).leadTrackHCAL3x3hottesthitDEta()>maxleadTrackHCAL3x3hottesthitDEta_) return 0.;
00052    }
00053    if (ApplyCut_leadTrackavoidsECALcrack_){
00054       // optional selection : ask that leading track - ECAL inner surface contact point does not fall inside any ECAL eta crack 
00055       math::XYZPoint thepropagleadTrackECALSurfContactPoint = TauTagTools::propagTrackECALSurfContactPoint(theMagneticField.product(),(*theCaloTauRef).leadTrack());
00056       if(thepropagleadTrackECALSurfContactPoint.R()==0. ||
00057             fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalA().second || 
00058             (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalB().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalB().second) ||
00059             (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalC().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalC().second) ||
00060             (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalD().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalD().second) ||
00061             (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalE().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalE().second))
00062       {
00063          return 0.;
00064       }     
00065    }
00066    if (std::isnan((*theCaloTauRef).leadTrackHCAL3x3hitsEtSum()))
00067    {
00068       return 0.;
00069    } else
00070    {
00071       if ((*theCaloTauRef).leadTrackHCAL3x3hitsEtSum()/(*theCaloTauRef).leadTrack()->pt()<=leadTrack_HCAL3x3hitsEtSumOverPt_minvalue_) return 0.;
00072       else return 1.;
00073    }
00074 }
00075 
00076    /*
00077 void CaloRecoTauDiscriminationAgainstElectron::produce(edm::Event& iEvent,const edm::EventSetup& iEventSetup){
00078   edm::Handle<CaloTauCollection> theCaloTauCollection;
00079   iEvent.getByLabel(CaloTauProducer_,theCaloTauCollection);
00080 
00081   // fill the AssociationVector object
00082   auto_ptr<CaloTauDiscriminator> theCaloTauDiscriminatorAgainstElectron(new CaloTauDiscriminator(CaloTauRefProd(theCaloTauCollection)));
00083 
00084   for(size_t iCaloTau=0;iCaloTau<theCaloTauCollection->size();++iCaloTau) {
00085     CaloTauRef theCaloTauRef(theCaloTauCollection,iCaloTau);
00086     if (!(*theCaloTauRef).leadTrack()){
00087       theCaloTauDiscriminatorAgainstElectron->setValue(iCaloTau,0);
00088       continue;
00089     }
00090     if (ApplyCut_maxleadTrackHCAL3x3hottesthitDEta_){
00091       // optional selection : ask for small |deta| between direction of propag. leading Track - ECAL inner surf. contact point and direction of highest Et hit among HCAL hits inside a 3x3 calo. tower matrix centered on direction of propag. leading Track - ECAL inner surf. contact point
00092       if (std::isnan((*theCaloTauRef).leadTrackHCAL3x3hottesthitDEta()) || (*theCaloTauRef).leadTrackHCAL3x3hottesthitDEta()>maxleadTrackHCAL3x3hottesthitDEta_){
00093         theCaloTauDiscriminatorAgainstElectron->setValue(iCaloTau,0);
00094         continue;
00095       }
00096     }
00097     if (ApplyCut_leadTrackavoidsECALcrack_){
00098       // optional selection : ask that leading track - ECAL inner surface contact point does not fall inside any ECAL eta crack 
00099       edm::ESHandle<MagneticField> theMagneticField;
00100       iEventSetup.get<IdealMagneticFieldRecord>().get(theMagneticField);
00101       math::XYZPoint thepropagleadTrackECALSurfContactPoint=TauTagTools::propagTrackECALSurfContactPoint(theMagneticField.product(),(*theCaloTauRef).leadTrack());
00102       if(thepropagleadTrackECALSurfContactPoint.R()==0. ||
00103          fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalA().second || 
00104          (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalB().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalB().second) ||
00105          (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalC().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalC().second) ||
00106          (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalD().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalD().second) ||
00107          (fabs(thepropagleadTrackECALSurfContactPoint.eta())>ECALBounds::crack_absEtaIntervalE().first && fabs(thepropagleadTrackECALSurfContactPoint.eta())<ECALBounds::crack_absEtaIntervalE().second)
00108          ){
00109         theCaloTauDiscriminatorAgainstElectron->setValue(iCaloTau,0);
00110         continue;
00111       }     
00112     }
00113     if (std::isnan((*theCaloTauRef).leadTrackHCAL3x3hitsEtSum())){
00114       theCaloTauDiscriminatorAgainstElectron->setValue(iCaloTau,0);
00115     }else{
00116       if ((*theCaloTauRef).leadTrackHCAL3x3hitsEtSum()/(*theCaloTauRef).leadTrack()->pt()<=leadTrack_HCAL3x3hitsEtSumOverPt_minvalue_) theCaloTauDiscriminatorAgainstElectron->setValue(iCaloTau,0);
00117       else theCaloTauDiscriminatorAgainstElectron->setValue(iCaloTau,1);
00118     }
00119   }
00120    
00121   iEvent.put(theCaloTauDiscriminatorAgainstElectron);
00122 }
00123 */
00124 DEFINE_FWK_MODULE(CaloRecoTauDiscriminationAgainstElectron);