CMS 3D CMS Logo

CSCDigitizer.cc

Go to the documentation of this file.
00001 #include "Utilities/Timing/interface/TimingReport.h" 
00002 #include "SimMuon/CSCDigitizer/src/CSCDigitizer.h"
00003 #include "SimDataFormats/TrackingHit/interface/PSimHit.h"
00004 #include "SimMuon/CSCDigitizer/src/CSCDetectorHit.h"
00005 #include "SimMuon/CSCDigitizer/src/CSCWireHitSim.h"
00006 #include "SimMuon/CSCDigitizer/src/CSCStripHitSim.h"
00007 #include "SimMuon/CSCDigitizer/src/CSCDriftSim.h"
00008 #include "SimMuon/CSCDigitizer/src/CSCWireElectronicsSim.h"
00009 #include "SimMuon/CSCDigitizer/src/CSCStripElectronicsSim.h"
00010 #include "SimMuon/CSCDigitizer/src/CSCNeutronReader.h"
00011 #include "SimMuon/CSCDigitizer/src/CSCStripConditions.h"
00012 #include "Geometry/CSCGeometry/interface/CSCLayer.h"
00013 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00014 #include <iostream>
00015 
00016 
00017 CSCDigitizer::CSCDigitizer(const edm::ParameterSet & p)
00018 : theDriftSim(new CSCDriftSim()),
00019   theWireHitSim(new CSCWireHitSim(theDriftSim)),
00020   theStripHitSim(new CSCStripHitSim()),
00021   theWireElectronicsSim(new CSCWireElectronicsSim(p.getParameter<edm::ParameterSet>("wires"))),
00022   theStripElectronicsSim(new CSCStripElectronicsSim(p.getParameter<edm::ParameterSet>("strips"))),
00023   theNeutronReader(0),
00024   theCSCGeometry(0)
00025 {
00026   if(p.getParameter<bool>("doNeutrons"))
00027   {
00028     theNeutronReader = new CSCNeutronReader(p.getParameter<edm::ParameterSet>("neutrons"));
00029   }
00030 }
00031 
00032 
00033 CSCDigitizer::~CSCDigitizer() {
00034   delete theNeutronReader;
00035   delete theStripElectronicsSim;
00036   delete theWireElectronicsSim;
00037   delete theStripHitSim;
00038   delete theWireHitSim;
00039   delete theDriftSim;
00040 }
00041 
00042 
00043 
00044 void CSCDigitizer::doAction(MixCollection<PSimHit> & simHits, 
00045                             CSCWireDigiCollection & wireDigis, 
00046                             CSCStripDigiCollection & stripDigis, 
00047                             CSCComparatorDigiCollection & comparators,
00048                             DigiSimLinks & wireDigiSimLinks,
00049                             DigiSimLinks & stripDigiSimLinks) 
00050 {
00051   // arrange the hits by layer
00052   std::map<int, edm::PSimHitContainer> hitMap;
00053   for(MixCollection<PSimHit>::MixItr hitItr = simHits.begin();
00054       hitItr != simHits.end(); ++hitItr) 
00055   {
00056     hitMap[hitItr->detUnitId()].push_back(*hitItr);
00057   }
00058 
00059   // add neutron background, if needed
00060   if(theNeutronReader != 0)
00061   {
00062     theNeutronReader->addHits(hitMap);
00063   }
00064 
00065   // now loop over layers and run the simulation for each one
00066   for(std::map<int, edm::PSimHitContainer>::const_iterator hitMapItr = hitMap.begin();
00067       hitMapItr != hitMap.end(); ++hitMapItr)
00068   {
00069     if ( theConditions->isInBadChamber( CSCDetId(hitMapItr->first) ) ) continue; // skip 'bad' chamber
00070 
00071     const CSCLayer * layer = findLayer(hitMapItr->first);
00072     const edm::PSimHitContainer & layerSimHits = hitMapItr->second;
00073 
00074     std::vector<CSCDetectorHit> newWireHits, newStripHits;
00075   
00076     LogTrace("CSCDigitizer") << "CSCDigitizer: found " << layerSimHits.size() <<" hit(s) in layer"
00077        << " E" << layer->id().endcap() << " S" << layer->id().station() << " R" << layer->id().ring()
00078        << " C" << layer->id().chamber() << " L" << layer->id().layer();
00079 
00080     // turn the edm::PSimHits into WireHits, using the WireHitSim
00081     {
00082       TimeMe t("CSCWireHitSim");
00083       newWireHits.swap(theWireHitSim->simulate(layer, layerSimHits));
00084     }
00085     if(!newWireHits.empty()) {
00086       TimeMe t("CSCStripHitSim");
00087       newStripHits.swap(theStripHitSim->simulate(layer, newWireHits));
00088     }
00089 
00090     // turn the hits into wire digis, using the electronicsSim
00091     {
00092       TimeMe t("CSCWireElectronicsSim");
00093       theWireElectronicsSim->simulate(layer, newWireHits);
00094       theWireElectronicsSim->fillDigis(wireDigis);
00095       wireDigiSimLinks.insert( theWireElectronicsSim->digiSimLinks() );
00096     }  
00097     {
00098       TimeMe t("CSCStripElectronicsSim");
00099       theStripElectronicsSim->simulate(layer, newStripHits);
00100       theStripElectronicsSim->fillDigis(stripDigis, comparators);
00101       stripDigiSimLinks.insert( theStripElectronicsSim->digiSimLinks() );
00102     }
00103   }
00104 }
00105 
00106 
00107 void CSCDigitizer::setMagneticField(const MagneticField * field) {
00108   theDriftSim->setMagneticField(field);
00109 }
00110 
00111 
00112 void CSCDigitizer::setStripConditions(CSCStripConditions * cond)
00113 {
00114   theConditions = cond; // cache here
00115   theStripElectronicsSim->setStripConditions(cond); // percolate downwards
00116 }
00117 
00118 
00119 void CSCDigitizer::setParticleDataTable(const ParticleDataTable * pdt)
00120 {
00121   theWireHitSim->setParticleDataTable(pdt);
00122 }
00123 
00124 
00125 void CSCDigitizer::setRandomEngine(CLHEP::HepRandomEngine& engine)
00126 {
00127   theWireHitSim->setRandomEngine(engine);
00128   theWireElectronicsSim->setRandomEngine(engine);
00129   theStripElectronicsSim->setRandomEngine(engine);
00130   if(theNeutronReader) theNeutronReader->setRandomEngine(engine);
00131 }
00132 
00133 
00134 const CSCLayer * CSCDigitizer::findLayer(int detId) const {
00135   assert(theCSCGeometry != 0);
00136   const GeomDetUnit* detUnit = theCSCGeometry->idToDetUnit(CSCDetId(detId));
00137   if(detUnit == 0)
00138   {
00139     throw cms::Exception("CSCDigiProducer") << "Invalid DetUnit: " << CSCDetId(detId)
00140       << "\nPerhaps your signal or pileup dataset are not compatible with the current release?";
00141   }  
00142   return dynamic_cast<const CSCLayer *>(detUnit);
00143 }
00144 

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