00001 // -*- C++ -*- 00002 // 00003 // Package: SiPixelDigitizer 00004 // Class: SiPixelDigitizer 00005 // 00013 // 00014 // Original Author: Michele Pioppi-INFN perugia 00015 // Modifications: Freya Blekman - Cornell University 00016 // Created: Mon Sep 26 11:08:32 CEST 2005 00017 // $Id: SiPixelDigitizer.cc,v 1.4 2008/06/30 17:56:42 fambrogl Exp $ 00018 // 00019 // 00020 00021 00022 // system include files 00023 #include <memory> 00024 // user include files 00025 #include "SimTracker/SiPixelDigitizer/interface/SiPixelDigitizer.h" 00026 #include "SimTracker/SiPixelDigitizer/interface/SiPixelDigitizerAlgorithm.h" 00027 00028 #include "SimDataFormats/TrackingHit/interface/PSimHit.h" 00029 #include "DataFormats/Common/interface/Handle.h" 00030 #include "FWCore/Framework/interface/ESHandle.h" 00031 #include "FWCore/Framework/interface/EventSetup.h" 00032 #include "DataFormats/SiPixelDigi/interface/PixelDigi.h" 00033 #include "SimDataFormats/TrackerDigiSimLink/interface/PixelDigiSimLink.h" 00034 #include "DataFormats/Common/interface/DetSetVector.h" 00035 #include "SimDataFormats/TrackingHit/interface/PSimHitContainer.h" 00036 #include "DataFormats/GeometryVector/interface/LocalPoint.h" 00037 #include "DataFormats/GeometryVector/interface/LocalVector.h" 00038 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h" 00039 00040 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h" 00041 00042 #include "Geometry/CommonTopologies/interface/PixelTopology.h" 00043 #include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetType.h" 00044 00045 #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h" 00046 // user include files 00047 #include "FWCore/Framework/interface/Frameworkfwd.h" 00048 #include "FWCore/Framework/interface/EDAnalyzer.h" 00049 00050 #include "FWCore/Framework/interface/Event.h" 00051 #include "FWCore/Framework/interface/MakerMacros.h" 00052 00053 #include "FWCore/ParameterSet/interface/ParameterSet.h" 00054 00055 #include "MagneticField/Engine/interface/MagneticField.h" 00056 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h" 00057 00058 #include "FWCore/Framework/interface/ESHandle.h" 00059 #include "FWCore/Framework/interface/EventSetup.h" 00060 #include "FWCore/MessageLogger/interface/MessageLogger.h" 00061 #include "SimDataFormats/CrossingFrame/interface/CrossingFrame.h" 00062 #include "SimDataFormats/CrossingFrame/interface/MixCollection.h" 00063 00064 // 00065 // constants, enums and typedefs 00066 // 00067 00068 // 00069 // static data member definitions 00070 // 00071 00072 // 00073 // constructors and destructor 00074 // 00075 //using namespace std; 00076 00077 00078 namespace cms 00079 { 00080 SiPixelDigitizer::SiPixelDigitizer(const edm::ParameterSet& iConfig): 00081 conf_(iConfig), 00082 _pixeldigialgo(iConfig) 00083 00084 { 00085 edm::LogInfo ("PixelDigitizer ") <<"Enter the Pixel Digitizer"; 00086 00087 std::string alias ( iConfig.getParameter<std::string>("@module_label") ); 00088 00089 produces<edm::DetSetVector<PixelDigi> >().setBranchAlias( alias ); 00090 produces<edm::DetSetVector<PixelDigiSimLink> >().setBranchAlias ( alias + "siPixelDigiSimLink"); 00091 trackerContainers.clear(); 00092 trackerContainers = iConfig.getParameter<std::vector<std::string> >("ROUList"); 00093 geometryType = iConfig.getParameter<std::string>("GeometryType"); 00094 00095 00096 00097 } 00098 00099 void SiPixelDigitizer::beginJob(const edm::EventSetup& es){ 00100 _pixeldigialgo.init(es); 00101 } 00102 00103 SiPixelDigitizer::~SiPixelDigitizer() 00104 { edm::LogInfo ("PixelDigitizer ") <<"Destruct the Pixel Digitizer";} 00105 00106 00107 // 00108 // member functions 00109 // 00110 00111 // ------------ method called to produce the data ------------ 00112 void 00113 SiPixelDigitizer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) 00114 { 00115 // Step A: Get Inputs 00116 edm::Handle<CrossingFrame<PSimHit> > cf_simhit; 00117 std::vector<const CrossingFrame<PSimHit> *> cf_simhitvec; 00118 for(uint32_t i = 0; i< trackerContainers.size();i++){ 00119 iEvent.getByLabel("mix",trackerContainers[i],cf_simhit); 00120 cf_simhitvec.push_back(cf_simhit.product()); 00121 } 00122 00123 std::auto_ptr<MixCollection<PSimHit> > allPixelTrackerHits(new MixCollection<PSimHit>(cf_simhitvec)); 00124 00125 edm::ESHandle<TrackerGeometry> pDD; 00126 00127 iSetup.get<TrackerDigiGeometryRecord> ().get(geometryType,pDD); 00128 00129 edm::ESHandle<MagneticField> pSetup; 00130 iSetup.get<IdealMagneticFieldRecord>().get(pSetup); 00131 00132 //Loop on PSimHit 00133 SimHitMap.clear(); 00134 00135 MixCollection<PSimHit>::iterator isim; 00136 for (isim=allPixelTrackerHits->begin(); isim!= allPixelTrackerHits->end();isim++) { 00137 DetId detid=DetId((*isim).detUnitId()); 00138 unsigned int subid=detid.subdetId(); 00139 if ((subid== PixelSubdetector::PixelBarrel) || (subid== PixelSubdetector::PixelEndcap)) { 00140 SimHitMap[(*isim).detUnitId()].push_back((*isim)); 00141 } 00142 } 00143 00144 // Step B: LOOP on PixelGeomDetUnit // 00145 for(TrackingGeometry::DetUnitContainer::const_iterator iu = pDD->detUnits().begin(); iu != pDD->detUnits().end(); iu ++){ 00146 DetId idet=DetId((*iu)->geographicalId().rawId()); 00147 unsigned int isub=idet.subdetId(); 00148 00149 00150 if ((isub== PixelSubdetector::PixelBarrel) || (isub== PixelSubdetector::PixelEndcap)) { 00151 00152 00153 //access to magnetic field in global coordinates 00154 GlobalVector bfield=pSetup->inTesla((*iu)->surface().position()); 00155 LogDebug ("PixelDigitizer ") << "B-field(T) at "<<(*iu)->surface().position()<<"(cm): " 00156 << pSetup->inTesla((*iu)->surface().position()); 00157 // 00158 00159 edm::DetSet<PixelDigi> collector((*iu)->geographicalId().rawId()); 00160 edm::DetSet<PixelDigiSimLink> linkcollector((*iu)->geographicalId().rawId()); 00161 00162 00163 collector.data= 00164 _pixeldigialgo.run(SimHitMap[(*iu)->geographicalId().rawId()], 00165 dynamic_cast<PixelGeomDetUnit*>((*iu)), 00166 bfield); 00167 if (collector.data.size()>0){ 00168 theDigiVector.push_back(collector); 00169 00170 //digisimlink 00171 if(SimHitMap[(*iu)->geographicalId().rawId()].size()>0){ 00172 linkcollector.data=_pixeldigialgo.make_link(); 00173 if (linkcollector.data.size()>0) theDigiLinkVector.push_back(linkcollector); 00174 } 00175 00176 } 00177 } 00178 00179 } 00180 00181 // Step C: create collection with the cache vector of DetSet 00182 std::auto_ptr<edm::DetSetVector<PixelDigi> > 00183 output(new edm::DetSetVector<PixelDigi>(theDigiVector) ); 00184 std::auto_ptr<edm::DetSetVector<PixelDigiSimLink> > 00185 outputlink(new edm::DetSetVector<PixelDigiSimLink>(theDigiLinkVector) ); 00186 00187 // Step D: write output to file 00188 iEvent.put(output); 00189 iEvent.put(outputlink); 00190 } 00191 00192 00193 00194 00195 }// end namespace cms:: 00196