CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/RecoEgamma/EgammaElectronProducers/plugins/SiStripElectronProducer.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:     EgammaElectronProducers
00004 // Class  :     SiStripElectronProducer
00005 // 
00006 // Implementation:
00007 //     <Notes on implementation>
00008 //
00009 // Original Author:  
00010 //         Created:  Fri May 26 16:11:30 EDT 2006
00011 // $Id: SiStripElectronProducer.cc,v 1.4 2013/01/14 21:33:02 dlange Exp $
00012 //
00013 
00014 // system include files
00015 #include <memory>
00016 #include <sstream>
00017 
00018 // user include files
00019 #include "DataFormats/EgammaCandidates/interface/SiStripElectronFwd.h"
00020 #include "SiStripElectronProducer.h"
00021 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
00022 #include "DataFormats/TrackCandidate/interface/TrackCandidateCollection.h"
00023 
00024 #include "FWCore/Framework/interface/Event.h"
00025 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00026 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00027 
00028 #include "DataFormats/Common/interface/Handle.h"
00029 #include "FWCore/Framework/interface/ESHandle.h"
00030 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
00031 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2DCollection.h"
00032 #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2DCollection.h"
00033 #include "MagneticField/Engine/interface/MagneticField.h"
00034 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h" 
00035 
00036 //
00037 // constants, enums and typedefs
00038 //
00039 
00040 //
00041 // static data member definitions
00042 //
00043 
00044 //
00045 // constructors and destructor
00046 //
00047 SiStripElectronProducer::SiStripElectronProducer(const edm::ParameterSet& iConfig)
00048 {
00049    // register your products
00050    siStripElectronsLabel_ = iConfig.getParameter<std::string>("siStripElectronsLabel");
00051    trackCandidatesLabel_ = iConfig.getParameter<std::string>("trackCandidatesLabel");
00052    produces<reco::SiStripElectronCollection>(siStripElectronsLabel_);
00053    produces<TrackCandidateCollection>(trackCandidatesLabel_);
00054 
00055    // get parameters
00056    siHitProducer_ = iConfig.getParameter<std::string>("siHitProducer");
00057    siRphiHitCollection_ = iConfig.getParameter<std::string>("siRphiHitCollection");
00058    siStereoHitCollection_ = iConfig.getParameter<std::string>("siStereoHitCollection");
00059    siMatchedHitCollection_ = iConfig.getParameter<std::string>("siMatchedHitCollection");
00060 
00061    superClusterProducer_ = iConfig.getParameter<std::string>("superClusterProducer");
00062    superClusterCollection_ = iConfig.getParameter<std::string>("superClusterCollection");
00063    
00064    algo_p = new SiStripElectronAlgo(
00065       iConfig.getParameter<int32_t>("maxHitsOnDetId"),
00066       iConfig.getParameter<double>("originUncertainty"),
00067       iConfig.getParameter<double>("phiBandWidth"),      // this is in radians
00068       iConfig.getParameter<double>("maxNormResid"),
00069       iConfig.getParameter<int32_t>("minHits"),
00070       iConfig.getParameter<double>("maxReducedChi2"));
00071 
00072    LogDebug("") << " Welcome to SiStripElectronProducer " ;
00073 
00074 }
00075 
00076 
00077 // SiStripElectronProducer::SiStripElectronProducer(const SiStripElectronProducer& rhs)
00078 // {
00079 //    // do actual copying here;
00080 // }
00081 
00082 SiStripElectronProducer::~SiStripElectronProducer()
00083 {
00084    // do anything here that needs to be done at desctruction time
00085    // (e.g. close files, deallocate resources etc.)
00086    delete algo_p;
00087 }
00088 
00089 //
00090 // assignment operators
00091 //
00092 // const SiStripElectronProducer& SiStripElectronProducer::operator=(const SiStripElectronProducer& rhs)
00093 // {
00094 //   //An exception safe implementation is
00095 //   SiStripElectronProducer temp(rhs);
00096 //   swap(rhs);
00097 //
00098 //   return *this;
00099 // }
00100 
00101 //
00102 // member functions
00103 //
00104 
00105 // ------------ method called to produce the data  ------------
00106 void
00107 SiStripElectronProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00108 {
00109    // Extract data from the event
00110    edm::ESHandle<TrackerGeometry> trackerHandle;
00111    iSetup.get<TrackerDigiGeometryRecord>().get(trackerHandle);
00112 
00113    edm::Handle<SiStripRecHit2DCollection> rphiHitsHandle;
00114    iEvent.getByLabel(siHitProducer_, siRphiHitCollection_, rphiHitsHandle);
00115 
00116    edm::Handle<SiStripRecHit2DCollection> stereoHitsHandle;
00117    iEvent.getByLabel(siHitProducer_, siStereoHitCollection_, stereoHitsHandle);
00118 
00119    edm::Handle<SiStripMatchedRecHit2DCollection> matchedHitsHandle;
00120    iEvent.getByLabel(siHitProducer_, siMatchedHitCollection_, matchedHitsHandle);
00121 
00122    edm::ESHandle<MagneticField> magneticFieldHandle;
00123    iSetup.get<IdealMagneticFieldRecord>().get(magneticFieldHandle);
00124 
00125    edm::Handle<reco::SuperClusterCollection> superClusterHandle;
00126    iEvent.getByLabel(superClusterProducer_, superClusterCollection_, superClusterHandle);
00127 
00128    // Set up SiStripElectronAlgo for this event
00129    algo_p->prepareEvent(trackerHandle, rphiHitsHandle, stereoHitsHandle, matchedHitsHandle, magneticFieldHandle);
00130 
00131    // Prepare the output electron candidates and clouds to be filled
00132    std::auto_ptr<reco::SiStripElectronCollection> electronOut(new reco::SiStripElectronCollection);
00133    std::auto_ptr<TrackCandidateCollection> trackCandidateOut(new TrackCandidateCollection);
00134 
00135    //Retrieve tracker topology from geometry
00136    edm::ESHandle<TrackerTopology> tTopoHand;
00137    iSetup.get<IdealGeometryRecord>().get(tTopoHand);
00138    const TrackerTopology *tTopo=tTopoHand.product();
00139 
00140    // counter for electron candidates
00141    int siStripElectCands = 0 ;
00142 
00143    std::ostringstream str;
00144 
00145 
00146    // Loop over clusters
00147    str << "Starting loop over superclusters."<< "\n" << std::endl;
00148    for (unsigned int i = 0;  i < superClusterHandle.product()->size();  i++) {
00149       const reco::SuperCluster* sc = &(*reco::SuperClusterRef(superClusterHandle, i));
00150       double energy = sc->energy();
00151 
00152       if (algo_p->findElectron(*electronOut, *trackCandidateOut, reco::SuperClusterRef(superClusterHandle, i),tTopo)) {
00153         str << "Supercluster energy: " << energy << ", FOUND an electron." << "\n" << std::endl;
00154          ++siStripElectCands ;
00155       }
00156       else {
00157          str << "Supercluster energy: " << energy << ", DID NOT FIND an electron."<< "\n" << std::endl;
00158       }
00159    }
00160    str << "Ending loop over superclusters." << "\n" << std::endl;
00161    
00162    str << " Found " << siStripElectCands 
00163                     << " SiStripElectron Candidates before track fit " 
00164                     << "\n" << std::endl ;
00165 
00166    LogDebug("SiStripElectronProducer") << str.str();
00167 
00168    // Put the electron candidates and the tracking trajectories into the event
00169    iEvent.put(electronOut, siStripElectronsLabel_);
00170    iEvent.put(trackCandidateOut, trackCandidatesLabel_);
00171 }
00172 
00173 //
00174 // const member functions
00175 //
00176 
00177 //
00178 // static member functions
00179 //