Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:30:43

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       // Drift the electrons in the cluster to the nearest wire...
0029       int nearestWire = geom->nearestWire(ionClusters[icl]);
0030 
0031       // The wire hit contains wire# and position measured _along the wire_
0032       // from where it intersects local y axis.
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;  // start empty
0055 
0056   int j = 0;
0057   for (std::vector<LocalPoint>::const_iterator pointItr = positions.begin(); pointItr != positions.end(); ++pointItr) {
0058     ++j;
0059     // some verification
0060     if (layer->geometry()->inside(*pointItr)) {
0061       // push the point for each electron at this point
0062 
0063       for (int ie = 1; ie <= electrons[j - 1]; ++ie) {
0064         // probability of getting attached
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); }