CMS 3D CMS Logo

SiPixelDigitizer.cc

Go to the documentation of this file.
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 

Generated on Tue Jun 9 17:47:53 2009 for CMSSW by  doxygen 1.5.4