00001 #include <iostream>
00002 #include <vector>
00003 #include <memory>
00004
00005
00006 #include "FWCore/Framework/interface/Event.h"
00007 #include "FWCore/Framework/interface/EventSetup.h"
00008 #include "DataFormats/Common/interface/Handle.h"
00009 #include "FWCore/Framework/interface/ESHandle.h"
00010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00011 #include "FWCore/Utilities/interface/Exception.h"
00012
00013 #include "DataFormats/TrackCandidate/interface/TrackCandidateCollection.h"
00014 #include "DataFormats/EgammaTrackReco/interface/TrackCandidateSuperClusterAssociation.h"
00015 #include "DataFormats/EgammaTrackReco/interface/TrackCandidateCaloClusterAssociation.h"
00016
00017 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00018
00019 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00020
00021 #include "RecoEgamma/EgammaPhotonAlgos/interface/ConversionSeedFinder.h"
00022 #include "RecoEgamma/EgammaPhotonAlgos/interface/ConversionTrackFinder.h"
00023
00024 #include "RecoEgamma/EgammaPhotonProducers/interface/ConversionTrackCandidateProducer.h"
00025
00026 #include "RecoTracker/Record/interface/CkfComponentsRecord.h"
00027 #include "RecoTracker/Record/interface/TrackerRecoGeometryRecord.h"
00028 #include "RecoTracker/Record/interface/NavigationSchoolRecord.h"
00029 #include "RecoEgamma/EgammaPhotonAlgos/interface/OutInConversionSeedFinder.h"
00030 #include "RecoEgamma/EgammaPhotonAlgos/interface/InOutConversionSeedFinder.h"
00031 #include "RecoEgamma/EgammaPhotonAlgos/interface/OutInConversionTrackFinder.h"
00032 #include "RecoEgamma/EgammaPhotonAlgos/interface/InOutConversionTrackFinder.h"
00033 #include "RecoEgamma/EgammaIsolationAlgos/interface/EgammaTowerIsolation.h"
00034 #include "RecoEgamma/EgammaIsolationAlgos/interface/EgammaRecHitIsolation.h"
00035
00036 #include "CondFormats/DataRecord/interface/EcalChannelStatusRcd.h"
00037 #include "Geometry/Records/interface/CaloGeometryRecord.h"
00038 #include "CommonTools/Utils/interface/StringToEnumValue.h"
00039 #include "DataFormats/EgammaCandidates/interface/Photon.h"
00040 #include "DataFormats/DetId/interface/DetId.h"
00041 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00042 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00043
00044
00045 ConversionTrackCandidateProducer::ConversionTrackCandidateProducer(const edm::ParameterSet& config) :
00046 conf_(config),
00047 theNavigationSchool_(0),
00048 theOutInSeedFinder_(0),
00049 theOutInTrackFinder_(0),
00050 theInOutSeedFinder_(0),
00051 theInOutTrackFinder_(0)
00052 {
00053
00054 nEvt_=0;
00055
00056
00057
00058
00059 bcBarrelCollection_ = conf_.getParameter<edm::InputTag>("bcBarrelCollection");
00060 bcEndcapCollection_ = conf_.getParameter<edm::InputTag>("bcEndcapCollection");
00061
00062 scHybridBarrelProducer_ = conf_.getParameter<edm::InputTag>("scHybridBarrelProducer");
00063 scIslandEndcapProducer_ = conf_.getParameter<edm::InputTag>("scIslandEndcapProducer");
00064
00065 OutInTrackCandidateCollection_ = conf_.getParameter<std::string>("outInTrackCandidateCollection");
00066 InOutTrackCandidateCollection_ = conf_.getParameter<std::string>("inOutTrackCandidateCollection");
00067
00068
00069 OutInTrackSuperClusterAssociationCollection_ = conf_.getParameter<std::string>("outInTrackCandidateSCAssociationCollection");
00070 InOutTrackSuperClusterAssociationCollection_ = conf_.getParameter<std::string>("inOutTrackCandidateSCAssociationCollection");
00071
00072 barrelecalCollection_ = conf_.getParameter<edm::InputTag>("barrelEcalRecHitCollection");
00073 endcapecalCollection_ = conf_.getParameter<edm::InputTag>("endcapEcalRecHitCollection");
00074
00075 hcalTowers_ = conf_.getParameter<edm::InputTag>("hcalTowers");
00076 hOverEConeSize_ = conf_.getParameter<double>("hOverEConeSize");
00077 maxHOverE_ = conf_.getParameter<double>("maxHOverE");
00078 minSCEt_ = conf_.getParameter<double>("minSCEt");
00079 isoConeR_ = conf_.getParameter<double>("isoConeR");
00080 isoInnerConeR_ = conf_.getParameter<double>("isoInnerConeR");
00081 isoEtaSlice_ = conf_.getParameter<double>("isoEtaSlice");
00082 isoEtMin_ = conf_.getParameter<double>("isoEtMin");
00083 isoEMin_ = conf_.getParameter<double>("isoEMin");
00084 vetoClusteredHits_ = conf_.getParameter<bool>("vetoClusteredHits");
00085 useNumXtals_ = conf_.getParameter<bool>("useNumXstals");
00086 ecalIsoCut_offset_ = conf_.getParameter<double>("ecalIsoCut_offset");
00087 ecalIsoCut_slope_ = conf_.getParameter<double>("ecalIsoCut_slope");
00088
00089
00090 const std::vector<std::string> flagnamesEB =
00091 config.getParameter<std::vector<std::string> >("RecHitFlagToBeExcludedEB");
00092
00093 const std::vector<std::string> flagnamesEE =
00094 config.getParameter<std::vector<std::string> >("RecHitFlagToBeExcludedEE");
00095
00096 flagsexclEB_=
00097 StringToEnumValue<EcalRecHit::Flags>(flagnamesEB);
00098
00099 flagsexclEE_=
00100 StringToEnumValue<EcalRecHit::Flags>(flagnamesEE);
00101
00102 const std::vector<std::string> severitynamesEB =
00103 config.getParameter<std::vector<std::string> >("RecHitSeverityToBeExcludedEB");
00104
00105 severitiesexclEB_=
00106 StringToEnumValue<EcalSeverityLevel::SeverityLevel>(severitynamesEB);
00107
00108 const std::vector<std::string> severitynamesEE =
00109 config.getParameter<std::vector<std::string> >("RecHitSeverityToBeExcludedEE");
00110
00111 severitiesexclEE_=
00112 StringToEnumValue<EcalSeverityLevel::SeverityLevel>(severitynamesEE);
00113
00114
00115
00116 produces< TrackCandidateCollection > (OutInTrackCandidateCollection_);
00117 produces< TrackCandidateCollection > (InOutTrackCandidateCollection_);
00118
00119 produces< reco::TrackCandidateCaloClusterPtrAssociation > ( OutInTrackSuperClusterAssociationCollection_);
00120 produces< reco::TrackCandidateCaloClusterPtrAssociation > ( InOutTrackSuperClusterAssociationCollection_);
00121
00122
00123 }
00124
00125 ConversionTrackCandidateProducer::~ConversionTrackCandidateProducer() {}
00126
00127 void ConversionTrackCandidateProducer::setEventSetup (const edm::EventSetup & theEventSetup) {
00128
00129
00130 theOutInSeedFinder_->setEventSetup(theEventSetup);
00131 theInOutSeedFinder_->setEventSetup(theEventSetup);
00132 theOutInTrackFinder_->setEventSetup(theEventSetup);
00133 theInOutTrackFinder_->setEventSetup(theEventSetup);
00134
00135
00136 }
00137
00138
00139 void ConversionTrackCandidateProducer::beginRun (edm::Run& r , edm::EventSetup const & theEventSetup) {
00140
00141 edm::ESHandle<NavigationSchool> nav;
00142 theEventSetup.get<NavigationSchoolRecord>().get("SimpleNavigationSchool", nav);
00143 theNavigationSchool_ = nav.product();
00144
00145
00146 theOutInSeedFinder_ = new OutInConversionSeedFinder ( conf_ );
00147
00148
00149 theOutInTrackFinder_ = new OutInConversionTrackFinder ( theEventSetup, conf_ );
00150
00151
00152
00153 theInOutSeedFinder_ = new InOutConversionSeedFinder ( conf_ );
00154
00155
00156
00157 theInOutTrackFinder_ = new InOutConversionTrackFinder ( theEventSetup, conf_ );
00158 }
00159
00160
00161 void ConversionTrackCandidateProducer::endRun (edm::Run& r , edm::EventSetup const & theEventSetup) {
00162 delete theOutInSeedFinder_;
00163 delete theOutInTrackFinder_;
00164 delete theInOutSeedFinder_;
00165 delete theInOutTrackFinder_;
00166 }
00167
00168
00169
00170
00171 void ConversionTrackCandidateProducer::produce(edm::Event& theEvent, const edm::EventSetup& theEventSetup) {
00172
00173 using namespace edm;
00174 nEvt_++;
00175
00176
00177
00178
00179 setEventSetup( theEventSetup );
00180 theOutInSeedFinder_->setEvent(theEvent);
00181 theInOutSeedFinder_->setEvent(theEvent);
00182 theOutInTrackFinder_->setEvent(theEvent);
00183 theInOutTrackFinder_->setEvent(theEvent);
00184
00185
00186 NavigationSetter setter(*theNavigationSchool_);
00187
00188
00189
00190
00191
00192 std::auto_ptr<TrackCandidateCollection> outInTrackCandidate_p(new TrackCandidateCollection);
00193
00194 std::auto_ptr<TrackCandidateCollection> inOutTrackCandidate_p(new TrackCandidateCollection);
00195
00196 std::auto_ptr<reco::TrackCandidateCaloClusterPtrAssociation> outInAssoc_p(new reco::TrackCandidateCaloClusterPtrAssociation);
00197 std::auto_ptr<reco::TrackCandidateCaloClusterPtrAssociation> inOutAssoc_p(new reco::TrackCandidateCaloClusterPtrAssociation);
00198
00199
00200 bool validBarrelBCHandle=true;
00201 edm::Handle<edm::View<reco::CaloCluster> > bcBarrelHandle;
00202 theEvent.getByLabel(bcBarrelCollection_, bcBarrelHandle);
00203 if (!bcBarrelHandle.isValid()) {
00204 edm::LogError("ConversionTrackCandidateProducer") << "Error! Can't get the product "<<bcBarrelCollection_.label();
00205 validBarrelBCHandle=false;
00206 }
00207
00208
00209
00210 bool validEndcapBCHandle=true;
00211 edm::Handle<edm::View<reco::CaloCluster> > bcEndcapHandle;
00212 theEvent.getByLabel(bcEndcapCollection_, bcEndcapHandle);
00213 if (!bcEndcapHandle.isValid()) {
00214 edm::LogError("CoonversionTrackCandidateProducer") << "Error! Can't get the product "<<bcEndcapCollection_.label();
00215 validEndcapBCHandle=false;
00216 }
00217
00218
00219
00220
00221 bool validBarrelSCHandle=true;
00222 edm::Handle<edm::View<reco::CaloCluster> > scBarrelHandle;
00223 theEvent.getByLabel(scHybridBarrelProducer_,scBarrelHandle);
00224 if (!scBarrelHandle.isValid()) {
00225 edm::LogError("CoonversionTrackCandidateProducer") << "Error! Can't get the product "<<scHybridBarrelProducer_.label();
00226 validBarrelSCHandle=false;
00227 }
00228
00229
00230
00231 bool validEndcapSCHandle=true;
00232 edm::Handle<edm::View<reco::CaloCluster> > scEndcapHandle;
00233 theEvent.getByLabel(scIslandEndcapProducer_,scEndcapHandle);
00234 if (!scEndcapHandle.isValid()) {
00235 edm::LogError("CoonversionTrackCandidateProducer") << "Error! Can't get the product "<<scIslandEndcapProducer_.label();
00236 validEndcapSCHandle=false;
00237 }
00238
00239
00240
00241 theEventSetup.get<CaloGeometryRecord>().get(theCaloGeom_);
00242
00243
00244 Handle<CaloTowerCollection> hcalTowersHandle;
00245 theEvent.getByLabel(hcalTowers_, hcalTowersHandle);
00246
00247 edm::Handle<EcalRecHitCollection> ecalhitsCollEB;
00248 edm::Handle<EcalRecHitCollection> ecalhitsCollEE;
00249
00250 theEvent.getByLabel(endcapecalCollection_, ecalhitsCollEE);
00251 theEvent.getByLabel(barrelecalCollection_, ecalhitsCollEB);
00252
00253 edm::ESHandle<EcalSeverityLevelAlgo> sevlv;
00254 theEventSetup.get<EcalSeverityLevelAlgoRcd>().get(sevlv);
00255 const EcalSeverityLevelAlgo* sevLevel = sevlv.product();
00256
00257 std::auto_ptr<CaloRecHitMetaCollectionV> RecHitsEE(0);
00258 RecHitsEE = std::auto_ptr<CaloRecHitMetaCollectionV>(new EcalRecHitMetaCollection(ecalhitsCollEE.product()));
00259
00260 std::auto_ptr<CaloRecHitMetaCollectionV> RecHitsEB(0);
00261 RecHitsEB = std::auto_ptr<CaloRecHitMetaCollectionV>(new EcalRecHitMetaCollection(ecalhitsCollEB.product()));
00262
00263
00264 caloPtrVecOutIn_.clear();
00265 caloPtrVecInOut_.clear();
00266
00267 bool isBarrel=true;
00268 if ( validBarrelBCHandle && validBarrelSCHandle )
00269 buildCollections(isBarrel, scBarrelHandle, bcBarrelHandle, ecalhitsCollEB, &(*RecHitsEB), sevLevel, hcalTowersHandle, *outInTrackCandidate_p, *inOutTrackCandidate_p, caloPtrVecOutIn_, caloPtrVecInOut_);
00270
00271 if ( validEndcapBCHandle && validEndcapSCHandle ) {
00272 isBarrel=false;
00273 buildCollections(isBarrel, scEndcapHandle, bcEndcapHandle, ecalhitsCollEE, &(*RecHitsEE), sevLevel, hcalTowersHandle, *outInTrackCandidate_p, *inOutTrackCandidate_p, caloPtrVecOutIn_, caloPtrVecInOut_);
00274 }
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284 const edm::OrphanHandle<TrackCandidateCollection> refprodOutInTrackC = theEvent.put( outInTrackCandidate_p, OutInTrackCandidateCollection_ );
00285
00286
00287
00288 const edm::OrphanHandle<TrackCandidateCollection> refprodInOutTrackC = theEvent.put( inOutTrackCandidate_p, InOutTrackCandidateCollection_ );
00289
00290
00291
00292 edm::ValueMap<reco::CaloClusterPtr>::Filler fillerOI(*outInAssoc_p);
00293 fillerOI.insert(refprodOutInTrackC, caloPtrVecOutIn_.begin(), caloPtrVecOutIn_.end());
00294 fillerOI.fill();
00295 edm::ValueMap<reco::CaloClusterPtr>::Filler fillerIO(*inOutAssoc_p);
00296 fillerIO.insert(refprodInOutTrackC, caloPtrVecInOut_.begin(), caloPtrVecInOut_.end());
00297 fillerIO.fill();
00298
00299
00300
00301
00302 theEvent.put( outInAssoc_p, OutInTrackSuperClusterAssociationCollection_);
00303
00304
00305 theEvent.put( inOutAssoc_p, InOutTrackSuperClusterAssociationCollection_);
00306
00307 theOutInSeedFinder_->clear();
00308 theInOutSeedFinder_->clear();
00309
00310
00311
00312 }
00313
00314
00315 void ConversionTrackCandidateProducer::buildCollections(bool isBarrel,
00316 const edm::Handle<edm::View<reco::CaloCluster> > & scHandle,
00317 const edm::Handle<edm::View<reco::CaloCluster> > & bcHandle,
00318 edm::Handle<EcalRecHitCollection> ecalRecHitHandle,
00319 CaloRecHitMetaCollectionV* ecalRecHits,
00320 const EcalSeverityLevelAlgo* sevLevel,
00321
00322
00323 const edm::Handle<CaloTowerCollection> & hcalTowersHandle,
00324 TrackCandidateCollection& outInTrackCandidates,
00325 TrackCandidateCollection& inOutTrackCandidates,
00326 std::vector<edm::Ptr<reco::CaloCluster> >& vecRecOI,
00327 std::vector<edm::Ptr<reco::CaloCluster> >& vecRecIO )
00328
00329 {
00330
00331
00332
00333
00334
00335 for (unsigned i = 0; i < scHandle->size(); ++i ) {
00336
00337 reco::CaloClusterPtr aClus= scHandle->ptrAt(i);
00338
00339
00340 if (aClus->energy()/cosh(aClus->eta()) <= minSCEt_) continue;
00341 const reco::CaloCluster* pClus=&(*aClus);
00342 const reco::SuperCluster* sc=dynamic_cast<const reco::SuperCluster*>(pClus);
00343 double scEt = sc->energy()/cosh(sc->eta());
00344 const CaloTowerCollection* hcalTowersColl = hcalTowersHandle.product();
00345 EgammaTowerIsolation towerIso(hOverEConeSize_,0.,0.,-1,hcalTowersColl) ;
00346 double HoE = towerIso.getTowerESum(sc)/sc->energy();
00347 if (HoE >= maxHOverE_) continue;
00348
00350 EgammaRecHitIsolation ecalIso(isoConeR_,
00351 isoInnerConeR_,
00352 isoEtaSlice_,
00353 isoEtMin_,
00354 isoEMin_,
00355 theCaloGeom_,
00356 &(*ecalRecHits),
00357 sevLevel,
00358 DetId::Ecal);
00359
00360 ecalIso.setVetoClustered(vetoClusteredHits_);
00361 ecalIso.setUseNumCrystals(useNumXtals_);
00362 if (isBarrel) {
00363 ecalIso.doFlagChecks(flagsexclEB_);
00364 ecalIso.doSeverityChecks(ecalRecHitHandle.product(), severitiesexclEB_);
00365 } else {
00366 ecalIso.doFlagChecks(flagsexclEE_);
00367 ecalIso.doSeverityChecks(ecalRecHitHandle.product(), severitiesexclEE_);
00368 }
00369
00370 double ecalIsolation = ecalIso.getEtSum(sc);
00371 if ( ecalIsolation > ecalIsoCut_offset_ + ecalIsoCut_slope_*scEt ) continue;
00372
00373
00374 theOutInSeedFinder_->setCandidate(pClus->energy(), GlobalPoint(pClus->position().x(),pClus->position().y(),pClus->position().z() ) );
00375 theOutInSeedFinder_->makeSeeds( bcHandle );
00376
00377 std::vector<Trajectory> theOutInTracks= theOutInTrackFinder_->tracks(theOutInSeedFinder_->seeds(), outInTrackCandidates);
00378
00379 theInOutSeedFinder_->setCandidate(pClus->energy(), GlobalPoint(pClus->position().x(),pClus->position().y(),pClus->position().z() ) );
00380 theInOutSeedFinder_->setTracks( theOutInTracks );
00381 theInOutSeedFinder_->makeSeeds( bcHandle);
00382
00383 std::vector<Trajectory> theInOutTracks= theInOutTrackFinder_->tracks(theInOutSeedFinder_->seeds(), inOutTrackCandidates);
00384
00385
00386
00387
00388
00390 for (std::vector<Trajectory>::const_iterator it = theOutInTracks.begin(); it != theOutInTracks.end(); ++it) {
00391 caloPtrVecOutIn_.push_back(aClus);
00392
00393 }
00394
00395 for (std::vector<Trajectory>::const_iterator it = theInOutTracks.begin(); it != theInOutTracks.end(); ++it) {
00396 caloPtrVecInOut_.push_back(aClus);
00397
00398 }
00399 }
00400 }
00401