00001
00002
00003
00004
00005
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <memory>
00022 #include <string>
00023 #include <iostream>
00024 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00025
00026
00027 #include "FWCore/Framework/interface/Frameworkfwd.h"
00028 #include "FWCore/Framework/interface/EDProducer.h"
00029 #include "FWCore/Framework/interface/Event.h"
00030 #include "FWCore/Framework/interface/EventSetup.h"
00031 #include "FWCore/Framework/interface/MakerMacros.h"
00032 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00033 #include "FWCore/ParameterSet/interface/InputTag.h"
00034 #include "FWCore/Framework/interface/ESHandle.h"
00035
00036
00037 #include "DataFormats/Common/interface/Ref.h"
00038 #include "DataFormats/JetReco/interface/Jet.h"
00039 #include "DataFormats/BTauReco/interface/JetCrystalsAssociation.h"
00040
00041
00042 #include "DataFormats/CaloTowers/interface/CaloTowerCollection.h"
00043 #include "DataFormats/DetId/interface/DetId.h"
00044 #include "DataFormats/EgammaReco/interface/BasicCluster.h"
00045 #include "DataFormats/EcalDetId/interface/EcalSubdetector.h"
00046
00047 #include "DataFormats/CaloTowers/interface/CaloTowerDetId.h"
00048 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00049 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00050 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00051
00052 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00053 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
00054 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00055 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
00056 #include "Geometry/Records/interface/CaloGeometryRecord.h"
00057
00058
00059 #include "Math/GenVector/VectorUtil.h"
00060 #include "Math/GenVector/PxPyPzE4D.h"
00061 using namespace reco;
00062
00063
00064
00065
00066
00067 class JetCrystalsAssociator : public edm::EDProducer {
00068
00069 public:
00070 explicit JetCrystalsAssociator(const edm::ParameterSet&);
00071 ~JetCrystalsAssociator();
00072
00073
00074 virtual void produce(edm::Event&, const edm::EventSetup&);
00075 private:
00076 std::auto_ptr<JetCrystalsAssociationCollection> associate(
00077 const edm::Handle<CaloJetCollection> & jets,
00078 const edm::OrphanHandle<EMLorentzVectorCollection> & myLorentzRecHits) const;
00079
00080
00081
00082 edm::InputTag m_jetsSrc;
00083 edm::InputTag m_EBRecHits;
00084 edm::InputTag m_EERecHits;
00085
00086 double m_deltaRCut;
00087 };
00088
00089 JetCrystalsAssociator::JetCrystalsAssociator(const edm::ParameterSet& iConfig)
00090 {
00091 produces<reco::JetCrystalsAssociationCollection>();
00092 produces<reco::EMLorentzVectorCollection>();
00093
00094 m_EBRecHits = iConfig.getParameter<edm::InputTag>("EBRecHits");
00095 m_EERecHits = iConfig.getParameter<edm::InputTag>("EERecHits");
00096 m_jetsSrc = iConfig.getParameter<edm::InputTag>("jets");
00097 m_deltaRCut = iConfig.getParameter<double>("coneSize");
00098 }
00099
00100
00101 JetCrystalsAssociator::~JetCrystalsAssociator()
00102 {
00103
00104
00105
00106
00107 }
00108
00109
00110
00111
00112
00113
00114
00115 void
00116 JetCrystalsAssociator::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00117 {
00118 using namespace edm;
00119 using namespace reco;
00120 using namespace std;
00121
00122
00123 ESHandle<CaloGeometry> geometry;
00124 iSetup.get<CaloGeometryRecord>().get(geometry);
00125
00126 const CaloSubdetectorGeometry* EB = geometry->getSubdetectorGeometry(DetId::Ecal,EcalBarrel);
00127 const CaloSubdetectorGeometry* EE = geometry->getSubdetectorGeometry(DetId::Ecal,EcalEndcap);
00128
00129
00130 Handle<CaloJetCollection> jets;
00131 iEvent.getByLabel(m_jetsSrc, jets);
00132
00133
00134
00135
00136
00137
00138 Handle<EBRecHitCollection> EBRecHits;
00139 Handle<EERecHitCollection> EERecHits;
00140 iEvent.getByLabel( m_EBRecHits, EBRecHits );
00141 iEvent.getByLabel( m_EERecHits, EERecHits );
00142
00143 std::auto_ptr<EMLorentzVectorCollection> jetRecHits( new EMLorentzVectorCollection() );
00144
00145 for (size_t t = 0; t < jets->size(); t++)
00146 {
00147 const std::vector<CaloTowerPtr> myTowers=(*jets)[t].getCaloConstituents();
00148
00149
00150 for (unsigned int iTower = 0; iTower < myTowers.size(); iTower++)
00151 {
00152 CaloTowerPtr theTower = myTowers[iTower];
00153 size_t numRecHits = theTower->constituentsSize();
00154
00155 for (size_t j = 0; j < numRecHits; j++) {
00156 DetId RecHitDetID=theTower->constituent(j);
00157 DetId::Detector DetNum=RecHitDetID.det();
00158 if( DetNum == DetId::Ecal ){
00159 int EcalNum = RecHitDetID.subdetId();
00160 if( EcalNum == 1 ){
00161 EBDetId EcalID = RecHitDetID;
00162 EBRecHitCollection::const_iterator theRecHit=EBRecHits->find(EcalID);
00163 if(theRecHit != EBRecHits->end()){
00164 DetId id = theRecHit->detid();
00165 const CaloCellGeometry* this_cell = EB->getGeometry(id);
00166 if (this_cell) {
00167 GlobalPoint posi = this_cell->getPosition();
00168 double energy = theRecHit->energy();
00169 double eta = posi.eta();
00170 double phi = posi.phi();
00171 double theta = posi.theta();
00172 if(theta > M_PI) theta = 2 * M_PI- theta;
00173 double et = energy * sin(theta);
00174
00175 EMLorentzVector p(et, eta, phi, energy);
00176 jetRecHits->push_back(p);
00177 }
00178 }
00179 } else if ( EcalNum == 2 ) {
00180 EEDetId EcalID = RecHitDetID;
00181 EERecHitCollection::const_iterator theRecHit=EERecHits->find(EcalID);
00182 if(theRecHit != EBRecHits->end()){
00183 DetId id = theRecHit->detid();
00184 const CaloCellGeometry* this_cell = EE->getGeometry(id);
00185 if (this_cell) {
00186 GlobalPoint posi = this_cell->getPosition();
00187 double energy = theRecHit->energy();
00188 double eta = posi.eta();
00189 double phi = posi.phi();
00190 double theta = posi.theta();
00191 if (theta > M_PI) theta = 2 * M_PI - theta;
00192 double et = energy * sin(theta);
00193
00194 EMLorentzVector p(et, eta, phi, energy);
00195 jetRecHits->push_back(p);
00196 }
00197 }
00198 }
00199 }
00200 }
00201 }
00202 }
00203
00204 edm::OrphanHandle <reco::EMLorentzVectorCollection> myRecHits = iEvent.put(jetRecHits);
00205
00206 std::auto_ptr<JetCrystalsAssociationCollection> jetCrystals = associate(jets,myRecHits);
00207 iEvent.put( jetCrystals );
00208 }
00209
00210 std::auto_ptr<JetCrystalsAssociationCollection> JetCrystalsAssociator::associate(
00211 const edm::Handle<CaloJetCollection> & jets,
00212 const edm::OrphanHandle<EMLorentzVectorCollection> & myLorentzRecHits) const
00213 {
00214
00215 std::auto_ptr<JetCrystalsAssociationCollection> outputCollection( new JetCrystalsAssociationCollection( jets->size() ) );
00216
00217
00218 for (size_t j = 0; j < jets->size(); j++) {
00219 (*outputCollection)[j].first = edm::RefToBase<Jet>(CaloJetRef(jets, j));
00220 for (size_t t = 0; t < myLorentzRecHits->size(); t++) {
00221 double delta = ROOT::Math::VectorUtil::DeltaR((*jets)[j].p4().Vect(), (*myLorentzRecHits)[t]);
00222 if (delta < m_deltaRCut)
00223 (*outputCollection)[j].second.push_back( EMLorentzVectorRef(myLorentzRecHits, t) );
00224 }
00225 }
00226 return outputCollection;
00227 }
00228
00229
00230 DEFINE_FWK_MODULE(JetCrystalsAssociator);