00001 #include "RecoTauTag/HLTProducers/interface/L2TauNarrowConeIsolationProducer.h"
00002 #include "RecoTauTag/HLTProducers/interface/L2TauIsolationAlgs.h"
00003 #include "RecoTauTag/HLTProducers/interface/L2TauSimpleClustering.h"
00004 #include "Geometry/Records/interface/CaloGeometryRecord.h"
00005
00006 using namespace reco;
00007
00008 L2TauNarrowConeIsolationProducer::L2TauNarrowConeIsolationProducer(const edm::ParameterSet& iConfig):
00009 l2CaloJets_(iConfig.getParameter<edm::InputTag>("L2TauJetCollection")),
00010 EBRecHits_(iConfig.getParameter<edm::InputTag>("EBRecHits")),
00011 EERecHits_(iConfig.getParameter<edm::InputTag>("EERecHits")),
00012 CaloTowers_(iConfig.getParameter<edm::InputTag>("CaloTowers")),
00013 associationRadius_(iConfig.getParameter<double>("associationRadius")),
00014 crystalThresholdE_(iConfig.getParameter<double>("crystalThresholdEE")),
00015 crystalThresholdB_(iConfig.getParameter<double>("crystalThresholdEB")),
00016 towerThreshold_(iConfig.getParameter<double>("towerThreshold"))
00017 {
00018
00019
00020 edm::ParameterSet ECALIsolParams = iConfig.getParameter<edm::ParameterSet>("ECALIsolation") ;
00021 ECALIsolation_innerCone_ = ECALIsolParams.getParameter<double>( "innerCone" );
00022 ECALIsolation_outerCone_ = ECALIsolParams.getParameter<double>( "outerCone" );
00023 ECALIsolation_run_ = ECALIsolParams.getParameter<bool>( "runAlgorithm" );
00024
00025
00026 edm::ParameterSet ECALClusterParams = iConfig.getParameter<edm::ParameterSet>("ECALClustering") ;
00027 ECALClustering_run_ = ECALClusterParams.getParameter<bool>( "runAlgorithm" );
00028 ECALClustering_clusterRadius_ = ECALClusterParams.getParameter<double>( "clusterRadius" );
00029
00030
00031 edm::ParameterSet TowerIsolParams = iConfig.getParameter<edm::ParameterSet>("TowerIsolation") ;
00032 TowerIsolation_innerCone_ = TowerIsolParams.getParameter<double>( "innerCone" );
00033 TowerIsolation_outerCone_ = TowerIsolParams.getParameter<double>( "outerCone" );
00034 TowerIsolation_run_ = TowerIsolParams.getParameter<bool>( "runAlgorithm" );
00035
00036
00037
00038 produces<L2TauInfoAssociation>();
00039
00040 }
00041
00042
00043 L2TauNarrowConeIsolationProducer::~L2TauNarrowConeIsolationProducer()
00044 {
00045
00046
00047 }
00048
00049
00050
00051 void
00052 L2TauNarrowConeIsolationProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00053 {
00054
00055
00056 edm::Handle<CaloJetCollection> l2CaloJets;
00057 iEvent.getByLabel(l2CaloJets_ ,l2CaloJets);
00058
00059
00060 std::auto_ptr<L2TauInfoAssociation> l2InfoAssoc( new L2TauInfoAssociation);
00061
00062
00063 if(l2CaloJets->size()>0)
00064 {
00065 CaloJetCollection::const_iterator jcStart = l2CaloJets->begin();
00066
00067 for(CaloJetCollection::const_iterator jc = jcStart ;jc!=l2CaloJets->end();++jc)
00068 {
00069
00070 L2TauIsolationAlgs alg;
00071
00072
00073 L2TauIsolationInfo info;
00074
00075
00076 math::PtEtaPhiELorentzVectorCollection hitsECAL = getECALHits(*jc,iEvent,iSetup);
00077 math::PtEtaPhiELorentzVectorCollection hitsHCAL = getHCALHits(*jc,iEvent);
00078
00079
00080
00081
00082 if(ECALIsolation_run_)
00083 {
00084 info.setEcalIsolEt( alg.isolatedEt(hitsECAL , jc->p4().Vect(), ECALIsolation_innerCone_,ECALIsolation_outerCone_) );
00085 if(hitsECAL.size()>0)
00086 info.setSeedEcalHitEt(hitsECAL[0].pt());
00087 }
00088
00089
00090 if(ECALClustering_run_)
00091 {
00092
00093 L2TauSimpleClustering clustering(ECALClustering_clusterRadius_);
00094 math::PtEtaPhiELorentzVectorCollection clusters = clustering.clusterize(hitsECAL);
00095 info.setEcalClusterShape(alg.clusterShape(clusters,jc->p4().Vect(),0,0.5) );
00096 info.setNEcalHits(clusters.size());
00097 }
00098
00099
00100 if(TowerIsolation_run_)
00101 {
00102 info.setHcalIsolEt( alg.isolatedEt(hitsHCAL , jc->p4().Vect(), TowerIsolation_innerCone_,TowerIsolation_outerCone_) );
00103 if(hitsHCAL.size()>0)
00104 info.setSeedHcalHitEt(hitsHCAL[0].pt());
00105 }
00106
00107
00108 edm::Ref<CaloJetCollection> jcRef(l2CaloJets,jc-jcStart);
00109 l2InfoAssoc->insert(jcRef, info);
00110 }
00111
00112 }
00113
00114 iEvent.put(l2InfoAssoc);
00115 }
00116
00117
00118 void
00119 L2TauNarrowConeIsolationProducer::beginJob()
00120 {
00121 }
00122
00123
00124 void
00125 L2TauNarrowConeIsolationProducer::endJob() {
00126 }
00127
00128
00129
00130 math::PtEtaPhiELorentzVectorCollection
00131 L2TauNarrowConeIsolationProducer::getHCALHits(const CaloJet& jet,const edm::Event& iEvent)
00132 {
00133 edm::Handle<CaloTowerCollection> towers;
00134 math::PtEtaPhiELorentzVectorCollection towers2;
00135
00136 if(iEvent.getByLabel(CaloTowers_,towers))
00137 for(size_t i=0;i<towers->size();++i)
00138 {
00139 math::PtEtaPhiELorentzVector tower((*towers)[i].et(),(*towers)[i].eta(),(*towers)[i].phi(),(*towers)[i].energy());
00140 if(ROOT::Math::VectorUtil::DeltaR(tower,jet.p4()) <associationRadius_)
00141 {
00142 if(tower.energy()>towerThreshold_)
00143 towers2.push_back(tower);
00144
00145 }
00146
00147 }
00148
00149 std::sort(towers2.begin(),towers2.end(),comparePt);
00150
00151 return towers2;
00152 }
00153
00154
00155 math::PtEtaPhiELorentzVectorCollection
00156 L2TauNarrowConeIsolationProducer::getECALHits(const CaloJet& jet,const edm::Event& iEvent,const edm::EventSetup& iSetup)
00157 {
00158
00159 edm::ESHandle<CaloGeometry> geometry;
00160 iSetup.get<CaloGeometryRecord>().get(geometry);
00161
00162
00163 const CaloSubdetectorGeometry* EB = geometry->getSubdetectorGeometry(DetId::Ecal,EcalBarrel);
00164 const CaloSubdetectorGeometry* EE = geometry->getSubdetectorGeometry(DetId::Ecal,EcalEndcap);
00165
00166
00167 edm::Handle<EBRecHitCollection> EBRecHits;
00168 edm::Handle<EERecHitCollection> EERecHits;
00169
00170
00171 math::PtEtaPhiELorentzVectorCollection jetRecHits;
00172
00173
00174 if(iEvent.getByLabel( EBRecHits_, EBRecHits))
00175 for(EBRecHitCollection::const_iterator hit = EBRecHits->begin();hit!=EBRecHits->end();++hit)
00176 {
00177
00178 const CaloCellGeometry* this_cell = EB->getGeometry(hit->detid());
00179 GlobalPoint posi = this_cell->getPosition();
00180 double energy = hit->energy();
00181 double eta = posi.eta();
00182 double phi = posi.phi();
00183 double theta = posi.theta();
00184 if(theta > M_PI) theta = 2 * M_PI- theta;
00185 double et = energy * sin(theta);
00186 math::PtEtaPhiELorentzVector p(et, eta, phi, energy);
00187 if(ROOT::Math::VectorUtil::DeltaR(p,jet.p4()) <associationRadius_)
00188 if(p.energy()>crystalThresholdB_)
00189 jetRecHits.push_back(p);
00190 }
00191
00192 if(iEvent.getByLabel( EERecHits_, EERecHits))
00193 for(EERecHitCollection::const_iterator hit = EERecHits->begin();hit!=EERecHits->end();++hit)
00194 {
00195
00196 const CaloCellGeometry* this_cell = EE->getGeometry(hit->detid());
00197 GlobalPoint posi = this_cell->getPosition();
00198 double energy = hit->energy();
00199 double eta = posi.eta();
00200 double phi = posi.phi();
00201 double theta = posi.theta();
00202 if(theta > M_PI) theta = 2 * M_PI- theta;
00203 double et = energy * sin(theta);
00204 math::PtEtaPhiELorentzVector p(et, eta, phi, energy);
00205 if(ROOT::Math::VectorUtil::DeltaR(p,jet.p4()) < associationRadius_)
00206 if(p.energy()>crystalThresholdE_)
00207 jetRecHits.push_back(p);
00208 }
00209
00210
00211 std::sort(jetRecHits.begin(),jetRecHits.end(),comparePt);
00212
00213 return jetRecHits;
00214 }
00215
00216
00217