00001 #include "RecoTauTag/HLTProducers/interface/L2TauModularIsolationProducer.h"
00002 #include "RecoTauTag/HLTProducers/interface/L2TauIsolationAlgs.h"
00003 #include "RecoTauTag/HLTProducers/interface/L2TauSimpleClustering.h"
00004
00005
00006 using namespace reco;
00007 using namespace edm;
00008
00009
00010 L2TauModularIsolationProducer::L2TauModularIsolationProducer(const edm::ParameterSet& iConfig):
00011 l2CaloJets_(iConfig.getParameter<edm::InputTag>("L2TauJetCollection")),
00012 EBRecHits_(iConfig.getParameter<edm::InputTag>("EBRecHits")),
00013 EERecHits_(iConfig.getParameter<edm::InputTag>("EERecHits")),
00014 caloTowers_(iConfig.getParameter<edm::InputTag>("CaloTowers")),
00015 pfClustersECAL_(iConfig.getParameter<edm::InputTag>("pfClustersECAL")),
00016 pfClustersHCAL_(iConfig.getParameter<edm::InputTag>("pfClustersHCAL")),
00017 ecalIsolationAlg_(iConfig.getParameter<std::string>("ecalIsolationAlgorithm")),
00018 hcalIsolationAlg_(iConfig.getParameter<std::string>("hcalIsolationAlgorithm")),
00019 ecalClusteringAlg_(iConfig.getParameter<std::string>("ecalClusteringAlgorithm")),
00020 hcalClusteringAlg_(iConfig.getParameter<std::string>("hcalClusteringAlgorithm")),
00021 associationRadius_(iConfig.getParameter<double>("associationRadius")),
00022 simpleClusterRadiusECAL_(iConfig.getParameter<double>("simpleClusterRadiusEcal")),
00023 simpleClusterRadiusHCAL_(iConfig.getParameter<double>("simpleClusterRadiusHcal")),
00024 innerConeECAL_(iConfig.getParameter<double>("innerConeECAL")),
00025 outerConeECAL_(iConfig.getParameter<double>("outerConeECAL")),
00026 innerConeHCAL_(iConfig.getParameter<double>("innerConeHCAL")),
00027 outerConeHCAL_(iConfig.getParameter<double>("outerConeHCAL")),
00028 crystalThresholdE_(iConfig.getParameter<double>("crystalThresholdEE")),
00029 crystalThresholdB_(iConfig.getParameter<double>("crystalThresholdEB")),
00030 towerThreshold_(iConfig.getParameter<double>("towerThreshold"))
00031
00032 {
00033
00034
00035 produces<L2TauInfoAssociation>();
00036
00037 }
00038
00039
00040 L2TauModularIsolationProducer::~L2TauModularIsolationProducer()
00041 {
00042
00043
00044 }
00045
00046
00047
00048 void
00049 L2TauModularIsolationProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00050 {
00051 edm::Handle<CaloJetCollection> l2CaloJets;
00052 iEvent.getByLabel(l2CaloJets_ ,l2CaloJets);
00053
00054
00055 std::auto_ptr<L2TauInfoAssociation> l2InfoAssoc( new L2TauInfoAssociation);
00056
00057
00058 if(l2CaloJets->size()>0)
00059 {
00060 CaloJetCollection::const_iterator jcStart = l2CaloJets->begin();
00061
00062 for(CaloJetCollection::const_iterator jc = jcStart ;jc!=l2CaloJets->end();++jc)
00063 {
00064
00065 L2TauIsolationAlgs alg;
00066
00067 L2TauIsolationInfo info;
00068
00069
00070 math::PtEtaPhiELorentzVectorCollection hitsECAL;
00071 math::PtEtaPhiELorentzVectorCollection hitsHCAL;
00072 math::PtEtaPhiELorentzVectorCollection pfClustersECAL;
00073 math::PtEtaPhiELorentzVectorCollection pfClustersHCAL;
00074
00075 if(ecalIsolationAlg_=="recHits" || ecalClusteringAlg_=="recHits" || ecalIsolationAlg_ =="simpleClusters" ||ecalClusteringAlg_ =="simpleClusters")
00076 hitsECAL =getECALHits(*jc,iEvent,iSetup);
00077
00078 if(hcalIsolationAlg_=="recHits" || hcalClusteringAlg_=="recHits" || hcalIsolationAlg_ =="simpleClusters" ||hcalClusteringAlg_ =="simpleClusters")
00079 hitsHCAL =getHCALHits(*jc,iEvent);
00080
00081 if(ecalIsolationAlg_=="particleFlow" || ecalClusteringAlg_=="particleFlow")
00082 pfClustersECAL =getPFClusters(*jc,iEvent,pfClustersECAL_);
00083
00084 if(hcalIsolationAlg_=="particleFlow" || hcalClusteringAlg_=="particleFlow")
00085 pfClustersHCAL =getPFClusters(*jc,iEvent,pfClustersHCAL_);
00086
00087
00088
00089
00090
00091 if(ecalIsolationAlg_ == "recHits")
00092 {
00093
00094 info.setEcalIsolEt( alg.isolatedEt(hitsECAL , jc->p4().Vect(), innerConeECAL_,outerConeECAL_) );
00095 }
00096 else if(ecalIsolationAlg_ == "simpleClusters")
00097 {
00098
00099 L2TauSimpleClustering clustering(simpleClusterRadiusECAL_);
00100 math::PtEtaPhiELorentzVectorCollection clusters = clustering.clusterize(hitsECAL);
00101 info.setEcalIsolEt( alg.isolatedEt(clusters , jc->p4().Vect(), innerConeECAL_,outerConeECAL_) );
00102
00103 }
00104 else if(ecalIsolationAlg_ == "particleFlow")
00105 {
00106
00107 info.setEcalIsolEt( alg.isolatedEt(pfClustersECAL , jc->p4().Vect(), innerConeECAL_,outerConeECAL_) );
00108 }
00109
00110
00111
00112 if(ecalClusteringAlg_ == "recHits")
00113 {
00114
00115 info.setEcalClusterShape(alg.clusterShape(hitsECAL,jc->p4().Vect(),0.,outerConeECAL_) );
00116 info.setNEcalHits( alg.nClustersAnnulus(hitsECAL , jc->p4().Vect(), innerConeECAL_,outerConeECAL_));
00117 if(hitsECAL.size()>0)
00118 info.setSeedEcalHitEt(hitsECAL[0].pt());
00119
00120 }
00121 else if(ecalClusteringAlg_ == "simpleClusters")
00122 {
00123
00124 L2TauSimpleClustering clustering(simpleClusterRadiusECAL_);
00125 math::PtEtaPhiELorentzVectorCollection clusters = clustering.clusterize(hitsECAL);
00126 info.setEcalClusterShape(alg.clusterShape(clusters,jc->p4().Vect(),0.,outerConeECAL_) );
00127 info.setNEcalHits( alg.nClustersAnnulus(clusters, jc->p4().Vect(), innerConeECAL_,outerConeECAL_));
00128
00129 if(clusters.size()>0)
00130 info.setSeedEcalHitEt(clusters[0].pt());
00131 }
00132 else if(ecalClusteringAlg_ == "particleFlow")
00133 {
00134
00135 info.setEcalClusterShape(alg.clusterShape(pfClustersECAL,jc->p4().Vect(),0.,outerConeECAL_) );
00136 info.setNEcalHits( alg.nClustersAnnulus(pfClustersECAL, jc->p4().Vect(), innerConeECAL_,outerConeECAL_));
00137 if(pfClustersECAL.size()>0)
00138 info.setSeedEcalHitEt(pfClustersECAL[0].pt());
00139 }
00140
00141
00142
00143
00144 if(hcalIsolationAlg_ == "recHits")
00145 {
00146
00147 info.setHcalIsolEt( alg.isolatedEt(hitsHCAL , jc->p4().Vect(), innerConeHCAL_,outerConeHCAL_) );
00148 }
00149 else if(hcalIsolationAlg_ == "simpleClusters")
00150 {
00151
00152 L2TauSimpleClustering clustering(simpleClusterRadiusHCAL_);
00153 math::PtEtaPhiELorentzVectorCollection clusters = clustering.clusterize(hitsHCAL);
00154 info.setHcalIsolEt( alg.isolatedEt(clusters , jc->p4().Vect(), innerConeHCAL_,outerConeHCAL_) );
00155
00156 }
00157 else if(hcalIsolationAlg_ == "particleFlow")
00158 {
00159
00160 info.setHcalIsolEt( alg.isolatedEt(pfClustersHCAL , jc->p4().Vect(), innerConeHCAL_,outerConeHCAL_) );
00161 }
00162
00163
00164
00165
00166
00167 if(hcalClusteringAlg_ == "recHits")
00168 {
00169
00170 info.setHcalClusterShape(alg.clusterShape(hitsHCAL,jc->p4().Vect(),0.,outerConeHCAL_) );
00171 info.setNHcalHits( alg.nClustersAnnulus(hitsHCAL, jc->p4().Vect(), innerConeHCAL_,outerConeHCAL_));
00172 if(hitsHCAL.size()>0)
00173 info.setSeedHcalHitEt(hitsHCAL[0].pt());
00174 }
00175 else if(hcalClusteringAlg_ == "simpleClusters")
00176 {
00177
00178 L2TauSimpleClustering clustering(simpleClusterRadiusHCAL_);
00179 math::PtEtaPhiELorentzVectorCollection clusters = clustering.clusterize(hitsHCAL);
00180 info.setHcalClusterShape(alg.clusterShape(clusters,jc->p4().Vect(),0.,outerConeHCAL_) );
00181 info.setNHcalHits( alg.nClustersAnnulus(clusters, jc->p4().Vect(), innerConeHCAL_,outerConeHCAL_));
00182 if(clusters.size()>0)
00183 info.setSeedHcalHitEt(clusters[0].pt());
00184 }
00185 else if(hcalClusteringAlg_ == "particleFlow")
00186 {
00187
00188 info.setHcalClusterShape(alg.clusterShape(pfClustersHCAL,jc->p4().Vect(),0.,outerConeHCAL_) );
00189 info.setNHcalHits( alg.nClustersAnnulus(pfClustersHCAL, jc->p4().Vect(), innerConeHCAL_,outerConeHCAL_));
00190 if(pfClustersHCAL.size()>0)
00191 info.setSeedHcalHitEt(pfClustersHCAL[0].pt());
00192 }
00193
00194
00195 edm::Ref<CaloJetCollection> jcRef(l2CaloJets,jc-jcStart);
00196 l2InfoAssoc->insert(jcRef, info);
00197 }
00198
00199 }
00200
00201 iEvent.put(l2InfoAssoc);
00202 }
00203
00204
00205 void
00206 L2TauModularIsolationProducer::beginJob()
00207 {
00208 }
00209
00210
00211 void
00212 L2TauModularIsolationProducer::endJob() {
00213 }
00214
00215
00216
00217
00218 math::PtEtaPhiELorentzVectorCollection
00219 L2TauModularIsolationProducer::getHCALHits(const CaloJet& jet,const edm::Event& iEvent)
00220 {
00221 edm::Handle<CaloTowerCollection> towers;
00222
00223 math::PtEtaPhiELorentzVectorCollection towers2;
00224
00225 if(iEvent.getByLabel(caloTowers_,towers))
00226 if(towers->size()>0)
00227 for(size_t i=0;i<towers->size();++i)
00228 {
00229 math::PtEtaPhiELorentzVector tower((*towers)[i].et(),(*towers)[i].eta(),(*towers)[i].phi(),(*towers)[i].energy());
00230 if(ROOT::Math::VectorUtil::DeltaR(tower,jet.p4()) <associationRadius_)
00231 {
00232 if(tower.pt()>towerThreshold_)
00233 towers2.push_back(tower);
00234 }
00235 }
00236
00237 if(towers2.size()>0)
00238 std::sort(towers2.begin(),towers2.end(),comparePt);
00239 return towers2;
00240 }
00241
00242
00243 math::PtEtaPhiELorentzVectorCollection
00244 L2TauModularIsolationProducer::getECALHits(const CaloJet& jet,const edm::Event& iEvent,const edm::EventSetup& iSetup)
00245 {
00246
00247 ESHandle<CaloGeometry> geometry;
00248 iSetup.get<CaloGeometryRecord>().get(geometry);
00249
00250
00251 const CaloSubdetectorGeometry* EB = geometry->getSubdetectorGeometry(DetId::Ecal,EcalBarrel);
00252 const CaloSubdetectorGeometry* EE = geometry->getSubdetectorGeometry(DetId::Ecal,EcalEndcap);
00253
00254
00255 edm::Handle<EBRecHitCollection> EBRecHits;
00256 edm::Handle<EERecHitCollection> EERecHits;
00257
00258
00259 math::PtEtaPhiELorentzVectorCollection jetRecHits;
00260
00261
00262 if(iEvent.getByLabel( EBRecHits_, EBRecHits))
00263 for(EBRecHitCollection::const_iterator hit = EBRecHits->begin();hit!=EBRecHits->end();++hit)
00264 {
00265
00266 const CaloCellGeometry* this_cell = EB->getGeometry(hit->detid());
00267 GlobalPoint posi = this_cell->getPosition();
00268 double energy = hit->energy();
00269 double eta = posi.eta();
00270 double phi = posi.phi();
00271 double theta = posi.theta();
00272 if(theta > M_PI) theta = 2 * M_PI- theta;
00273 double et = energy * sin(theta);
00274 math::PtEtaPhiELorentzVector p(et, eta, phi, energy);
00275 if(ROOT::Math::VectorUtil::DeltaR(p,jet.p4()) <associationRadius_)
00276 if(p.pt()>crystalThresholdB_)
00277 jetRecHits.push_back(p);
00278 }
00279
00280 if(iEvent.getByLabel( EERecHits_, EERecHits))
00281 for(EERecHitCollection::const_iterator hit = EERecHits->begin();hit!=EERecHits->end();++hit)
00282 {
00283
00284 const CaloCellGeometry* this_cell = EE->getGeometry(hit->detid());
00285 GlobalPoint posi = this_cell->getPosition();
00286 double energy = hit->energy();
00287 double eta = posi.eta();
00288 double phi = posi.phi();
00289 double theta = posi.theta();
00290 if(theta > M_PI) theta = 2 * M_PI- theta;
00291 double et = energy * sin(theta);
00292 math::PtEtaPhiELorentzVector p(et, eta, phi, energy);
00293 if(ROOT::Math::VectorUtil::DeltaR(p,jet.p4()) < associationRadius_)
00294 if(p.pt()>crystalThresholdE_)
00295 jetRecHits.push_back(p);
00296 }
00297
00298 if(jetRecHits.size()>0)
00299 std::sort(jetRecHits.begin(),jetRecHits.end(),comparePt);
00300
00301 return jetRecHits;
00302 }
00303
00304
00305
00306 math::PtEtaPhiELorentzVectorCollection
00307 L2TauModularIsolationProducer::getPFClusters(const CaloJet& jet,const edm::Event& iEvent,const edm::InputTag& input)
00308 {
00309 edm::Handle<PFClusterCollection> clusters;
00310 math::PtEtaPhiELorentzVectorCollection clusters2;
00311
00312
00313 if(iEvent.getByLabel(input,clusters))
00314 if(clusters->size()>0)
00315 for(PFClusterCollection::const_iterator c = clusters->begin();c!=clusters->end();++c)
00316 {
00317 double energy = c->energy();
00318 double eta = c->eta();
00319 double phi = c->phi();
00320 double theta = c->position().theta();
00321 if(theta > M_PI) theta = 2 * M_PI- theta;
00322 double et = energy * sin(theta);
00323 math::PtEtaPhiELorentzVector p(et, eta, phi, energy);
00324
00325 if(ROOT::Math::VectorUtil::DeltaR(p,jet.p4()) < associationRadius_)
00326 clusters2.push_back(p);
00327 }
00328
00329 if(clusters2.size()>0)
00330 std::sort(clusters2.begin(),clusters2.end(),comparePt);
00331 return clusters2;
00332 }
00333