CMS 3D CMS Logo

/afs/cern.ch/work/c/cnuttens/private/SiStripDev/DocumentationProduction/CMSSW_6_1_0/src/SimTracker/SiStripDigitizer/plugins/DigiSimLinkProducer.cc

Go to the documentation of this file.
00001 // File: DigiSimLinkAlgorithm.cc
00002 // Description:  Class for digitization.
00003 
00004 // system include files
00005 #include <memory>
00006 
00007 #include "DigiSimLinkProducer.h"
00008 
00009 #include "DataFormats/Common/interface/DetSetVector.h"
00010 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
00011 #include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
00012 #include "SimDataFormats/TrackerDigiSimLink/interface/StripDigiSimLink.h"
00013 
00014 // user include files
00015 #include "FWCore/Framework/interface/Frameworkfwd.h"
00016 #include "FWCore/Framework/interface/EDProducer.h"
00017 
00018 #include "FWCore/Framework/interface/Event.h"
00019 #include "FWCore/Framework/interface/MakerMacros.h"
00020 
00021 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00022 #include "SimDataFormats/TrackingHit/interface/PSimHitContainer.h"
00023 #include "SimDataFormats/TrackingHit/interface/PSimHit.h"
00024 #include "SimDataFormats/CrossingFrame/interface/CrossingFrame.h"
00025 #include "SimDataFormats/CrossingFrame/interface/MixCollection.h"
00026 
00027 //needed for the geometry:
00028 #include "FWCore/Framework/interface/EventSetup.h"
00029 #include "FWCore/Framework/interface/ESHandle.h"
00030 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00031 #include "Geometry/CommonDetUnit/interface/GeomDetType.h"
00032 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
00033 #include "Geometry/TrackerNumberingBuilder/interface/GeometricDet.h"
00034 #include "Geometry/CommonTopologies/interface/StripTopology.h"
00035 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetType.h"
00036 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
00037 //needed for the magnetic field:
00038 #include "MagneticField/Engine/interface/MagneticField.h"
00039 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00040 
00041 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
00042 #include "SimGeneral/HepPDTRecord/interface/ParticleDataTable.h"
00043 
00044 //Data Base infromations
00045 #include "CondFormats/DataRecord/interface/SiStripCondDataRecords.h"
00046 #include "CalibTracker/Records/interface/SiStripDependentRecords.h"
00047 #include "CondFormats/SiStripObjects/interface/SiStripLorentzAngle.h"
00048 #include "CondFormats/SiStripObjects/interface/SiStripNoises.h"
00049 #include "CondFormats/SiStripObjects/interface/SiStripPedestals.h"
00050 #include "CondFormats/SiStripObjects/interface/SiStripThreshold.h"
00051 #include "CondFormats/SiStripObjects/interface/SiStripBadStrip.h"
00052 #include "CalibFormats/SiStripObjects/interface/SiStripGain.h"
00053 #include "CalibFormats/SiStripObjects/interface/SiStripDetCabling.h"
00054 #include "CalibFormats/SiStripObjects/interface/SiStripQuality.h"
00055 
00056 
00057 //Random Number
00058 #include "FWCore/ServiceRegistry/interface/Service.h"
00059 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
00060 #include "FWCore/Utilities/interface/Exception.h"
00061 #include "CLHEP/Random/RandomEngine.h"
00062 
00063 DigiSimLinkProducer::DigiSimLinkProducer(const edm::ParameterSet& conf) : 
00064   conf_(conf)
00065 {
00066   alias = conf.getParameter<std::string>("@module_label");
00067   edm::ParameterSet ParamSet=conf_.getParameter<edm::ParameterSet>("DigiModeList");
00068   
00069   produces<edm::DetSetVector<StripDigiSimLink> >().setBranchAlias ( alias + "siStripDigiSimLink");
00070   trackerContainers.clear();
00071   trackerContainers = conf.getParameter<std::vector<std::string> >("ROUList");
00072   geometryType = conf.getParameter<std::string>("GeometryType");
00073   useConfFromDB = conf.getParameter<bool>("TrackerConfigurationFromDB");
00074   edm::Service<edm::RandomNumberGenerator> rng;
00075   if ( ! rng.isAvailable()) {
00076     throw cms::Exception("Configuration")
00077       << "DigiSimLinkProducer requires the RandomNumberGeneratorService\n"
00078       "which is not present in the configuration file.  You must add the service\n"
00079       "in the configuration file or remove the modules that require it.";
00080   }
00081   
00082   rndEngine       = &(rng->getEngine());
00083   zeroSuppression = conf_.getParameter<bool>("ZeroSuppression");
00084   theDigiAlgo = new DigiSimLinkAlgorithm(conf_,(*rndEngine));
00085 
00086 }
00087 
00088 // Virtual destructor needed.
00089 DigiSimLinkProducer::~DigiSimLinkProducer() { 
00090   delete theDigiAlgo;
00091 }  
00092 
00093 // Functions that gets called by framework every event
00094 void DigiSimLinkProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00095 {
00096   // Step A: Get Inputs
00097   edm::ESHandle < ParticleDataTable > pdt;
00098   iSetup.getData( pdt );
00099 
00100   if(useConfFromDB){
00101     edm::ESHandle<SiStripDetCabling> detCabling;
00102     iSetup.get<SiStripDetCablingRcd>().get( detCabling );
00103     detCabling->addConnected(theDetIdList);
00104   }
00105 
00106   edm::Handle<CrossingFrame<PSimHit> > cf_simhit;
00107   std::vector<const CrossingFrame<PSimHit> *> cf_simhitvec;
00108   for(uint32_t i = 0; i< trackerContainers.size();i++){
00109     iEvent.getByLabel("mix",trackerContainers[i],cf_simhit);
00110     cf_simhitvec.push_back(cf_simhit.product());
00111   }
00112 
00113   std::auto_ptr<MixCollection<PSimHit> > allTrackerHits(new MixCollection<PSimHit>(cf_simhitvec));
00114   
00115   //Loop on PSimHit
00116   SimHitMap.clear();
00117   
00118   //inside SimHitSelectorFromDb add the counter information from the original allhits collection 
00119   std::vector<std::pair<const PSimHit*,int> > trackerHits(SimHitSelectorFromDB_.getSimHit(allTrackerHits,theDetIdList));
00120   std::vector<std::pair<const PSimHit*,int> >::iterator isim;
00121   for (isim=trackerHits.begin() ; isim!= trackerHits.end();isim++) {
00122     //make a pair = <*isim, counter> and save also position in the vector for DigiSimLink
00123     SimHitMap[((*isim).first)->detUnitId()].push_back(*isim);
00124   }
00125   
00126   edm::ESHandle<TrackerGeometry> pDD;
00127   iSetup.get<TrackerDigiGeometryRecord>().get(geometryType,pDD);
00128   
00129   edm::ESHandle<MagneticField> pSetup;
00130   iSetup.get<IdealMagneticFieldRecord>().get(pSetup);
00131   
00132   //get gain noise pedestal lorentzAngle from ES handle
00133   edm::ESHandle<SiStripLorentzAngle> lorentzAngleHandle;
00134   edm::ESHandle<SiStripGain> gainHandle;
00135   edm::ESHandle<SiStripNoises> noiseHandle;
00136   edm::ESHandle<SiStripThreshold> thresholdHandle;
00137   edm::ESHandle<SiStripPedestals> pedestalHandle;
00138   edm::ESHandle<SiStripBadStrip> deadChannelHandle;
00139   std::string LAname = conf_.getParameter<std::string>("LorentzAngle");
00140   iSetup.get<SiStripLorentzAngleSimRcd>().get(LAname,lorentzAngleHandle);
00141   std::string gainLabel = conf_.getParameter<std::string>("Gain");
00142   iSetup.get<SiStripGainSimRcd>().get(gainLabel,gainHandle);
00143   iSetup.get<SiStripNoisesRcd>().get(noiseHandle);
00144   iSetup.get<SiStripThresholdRcd>().get(thresholdHandle);
00145   iSetup.get<SiStripPedestalsRcd>().get(pedestalHandle);
00146   iSetup.get<SiStripBadChannelRcd>().get(deadChannelHandle);
00147 
00148   //Retrieve tracker topology from geometry
00149   edm::ESHandle<TrackerTopology> tTopoHand;
00150   iSetup.get<IdealGeometryRecord>().get(tTopoHand);
00151   const TrackerTopology *tTopo=tTopoHand.product();
00152 
00153   theDigiAlgo->setParticleDataTable(&*pdt);
00154 
00155   // Step B: LOOP on StripGeomDetUnit
00156   theDigiVector.reserve(10000);
00157   theDigiVector.clear();
00158   theDigiLinkVector.reserve(10000);
00159   theDigiLinkVector.clear();
00160 
00161   for(TrackingGeometry::DetUnitContainer::const_iterator iu = pDD->detUnits().begin(); iu != pDD->detUnits().end(); iu ++){
00162     if(useConfFromDB){
00163       //apply the cable map _before_ digitization: consider only the detis that are connected 
00164       if(theDetIdList.find((*iu)->geographicalId().rawId())==theDetIdList.end())
00165         continue;
00166     }
00167     GlobalVector bfield=pSetup->inTesla((*iu)->surface().position());
00168     StripGeomDetUnit* sgd = dynamic_cast<StripGeomDetUnit*>((*iu));
00169     if (sgd != 0){
00170       edm::DetSet<SiStripDigi> collectorZS((*iu)->geographicalId().rawId());
00171       edm::DetSet<SiStripRawDigi> collectorRaw((*iu)->geographicalId().rawId());
00172       edm::DetSet<StripDigiSimLink> linkcollector((*iu)->geographicalId().rawId());
00173       float langle = (lorentzAngleHandle.isValid()) ? lorentzAngleHandle->getLorentzAngle((*iu)->geographicalId().rawId()) : 0.;
00174       theDigiAlgo->run(collectorZS,collectorRaw,SimHitMap[(*iu)->geographicalId().rawId()],sgd,bfield,langle,
00175                        gainHandle,thresholdHandle,noiseHandle,pedestalHandle, deadChannelHandle, tTopo);
00176       if(zeroSuppression){
00177         if(collectorZS.data.size()>0){
00178           theDigiVector.push_back(collectorZS);
00179           if(SimHitMap[(*iu)->geographicalId().rawId()].size()>0){
00180             linkcollector.data = theDigiAlgo->make_link();
00181             if(linkcollector.data.size()>0)
00182               theDigiLinkVector.push_back(linkcollector);
00183           }
00184         }
00185       }else{
00186         if(collectorRaw.data.size()>0){
00187           theRawDigiVector.push_back(collectorRaw);
00188           if(SimHitMap[(*iu)->geographicalId().rawId()].size()>0){
00189             linkcollector.data = theDigiAlgo->make_link();
00190             if(linkcollector.data.size()>0)
00191               theDigiLinkVector.push_back(linkcollector);
00192           }
00193         }
00194       }
00195     }
00196   }
00197 
00198   // Step C: create output collection
00199   std::auto_ptr<edm::DetSetVector<StripDigiSimLink> > outputlink(new edm::DetSetVector<StripDigiSimLink>(theDigiLinkVector));
00200   // Step D: write output to file
00201   iEvent.put(outputlink);
00202 }