File indexing completed on 2023-03-17 11:25:20
0001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0002 #include "Geometry/CSCGeometry/interface/CSCLayer.h"
0003 #include "Geometry/CSCGeometry/interface/CSCLayerGeometry.h"
0004 #include "SimMuon/CSCDigitizer/src/CSCDriftSim.h"
0005 #include "SimMuon/CSCDigitizer/src/CSCGasCollisions.h"
0006 #include "SimMuon/CSCDigitizer/src/CSCWireHitSim.h"
0007
0008 #include "CLHEP/Random/RandFlat.h"
0009
0010 CSCWireHitSim::CSCWireHitSim(CSCDriftSim *driftSim, const edm::ParameterSet &p)
0011 : theDriftSim(driftSim), theGasIonizer(new CSCGasCollisions(p)), theNewWireHits() {}
0012
0013 CSCWireHitSim::~CSCWireHitSim() { delete theGasIonizer; }
0014
0015 std::vector<CSCDetectorHit> &CSCWireHitSim::simulate(const CSCLayer *layer,
0016 const edm::PSimHitContainer &simHits,
0017 CLHEP::HepRandomEngine *engine) {
0018 const CSCLayerGeometry *geom = layer->geometry();
0019
0020 theNewWireHits.clear();
0021 for (edm::PSimHitContainer::const_iterator hitItr = simHits.begin(); hitItr != simHits.end(); ++hitItr) {
0022 std::vector<LocalPoint> ionClusters = getIonizationClusters(*hitItr, layer, engine);
0023
0024 unsigned nClusters = ionClusters.size();
0025 theNewWireHits.reserve(theNewWireHits.size() + nClusters);
0026
0027 for (unsigned icl = 0; icl < nClusters; ++icl) {
0028
0029 int nearestWire = geom->nearestWire(ionClusters[icl]);
0030
0031
0032
0033
0034 theNewWireHits.push_back(theDriftSim->getWireHit(ionClusters[icl], layer, nearestWire, *hitItr, engine));
0035 }
0036 }
0037 return theNewWireHits;
0038 }
0039
0040 std::vector<LocalPoint> CSCWireHitSim::getIonizationClusters(const PSimHit &simHit,
0041 const CSCLayer *layer,
0042 CLHEP::HepRandomEngine *engine) {
0043 const LocalPoint &entryPoint = simHit.entryPoint();
0044 const LocalPoint &exitPoint = simHit.exitPoint();
0045
0046 LogTrace("CSCWireHitSim") << "CSCWireHitSim:"
0047 << " type=" << simHit.particleType() << " mom=" << simHit.pabs() << "\n Local entry "
0048 << entryPoint << " exit " << exitPoint;
0049
0050 std::vector<LocalPoint> positions;
0051 std::vector<int> electrons;
0052 theGasIonizer->simulate(simHit, positions, electrons, engine);
0053
0054 std::vector<LocalPoint> results;
0055
0056 int j = 0;
0057 for (std::vector<LocalPoint>::const_iterator pointItr = positions.begin(); pointItr != positions.end(); ++pointItr) {
0058 ++j;
0059
0060 if (layer->geometry()->inside(*pointItr)) {
0061
0062
0063 for (int ie = 1; ie <= electrons[j - 1]; ++ie) {
0064
0065 float f_att = 0.5;
0066 if (CLHEP::RandFlat::shoot(engine) > f_att) {
0067 results.push_back(*pointItr);
0068 }
0069 }
0070 }
0071 }
0072 LogTrace("CSCWireHitSim") << "CSCWireHitSim: there are " << results.size()
0073 << " clusters identified with each electron.";
0074 return results;
0075 }
0076
0077 void CSCWireHitSim::setParticleDataTable(const ParticleDataTable *pdt) { theGasIonizer->setParticleDataTable(pdt); }