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
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
00060 if(theNeutronReader != 0)
00061 {
00062 theNeutronReader->addHits(hitMap);
00063 }
00064
00065
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;
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
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
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;
00115 theStripElectronicsSim->setStripConditions(cond);
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