CMS 3D CMS Logo

ETLDeviceSim.cc
Go to the documentation of this file.
1 #include "CLHEP/Units/GlobalPhysicalConstants.h"
5 
6 
8  MIPPerMeV_( 1.0/pset.getParameter<double>("meVPerMIP") ),
9  bxTime_(pset.getParameter<double>("bxTime") ),
10  tofDelay_(pset.getParameter<double>("tofDelay") ) {}
11 
12 
13 void ETLDeviceSim::getHitsResponse(const std::vector<std::tuple<int,uint32_t,float> > &hitRefs,
15  mtd_digitizer::MTDSimHitDataAccumulator *simHitAccumulator,
16  CLHEP::HepRandomEngine *hre){
17 
18  bool weightToAbyEnergy(false);
19  float tdcOnset(0.f);
20 
21  const float refSpeed = 0.1*CLHEP::c_light;
22 
23  //loop over sorted hits
24  const int nchits = hitRefs.size();
25  for(int i=0; i<nchits; ++i) {
26  const int hitidx = std::get<0>(hitRefs[i]);
27  const uint32_t id = std::get<1>(hitRefs[i]);
28  const MTDDetId detId(id);
29 
30  // Safety check
31  if ( detId.det()!=DetId::Forward || detId.mtdSubDetector()!=2 ) continue;
32 
33  auto simHitIt = simHitAccumulator->emplace(id,mtd_digitizer::MTDCellInfo()).first;
34 
35  if(id==0) continue; // to be ignored at RECO level
36 
37  const float toa = std::get<2>(hitRefs[i]);
38  const PSimHit &hit = hits->at( hitidx );
39  const float charge = 1000.f*hit.energyLoss()*MIPPerMeV_;
40 
41  //distance to the center of the detector
42  const float dist2center( 0.1f*hit.entryPoint().mag() );
43 
44  //hit time: [time()]=ns [centerDist]=cm [refSpeed]=cm/ns + delay by 1ns
45  //accumulate in 15 buckets of 25ns (9 pre-samples, 1 in-time, 5 post-samples)
46  const float tof = toa-dist2center/refSpeed+tofDelay_ ;
47  const int itime = std::floor( tof/bxTime_ ) + 9;
48 
49  if(itime<0 || itime>14) continue;
50 
51  //check if time index is ok and store energy
52  if(itime >= (int)simHitIt->second.hit_info[0].size() ) continue;
53 
54  (simHitIt->second).hit_info[0][itime] += charge;
55  float accCharge=(simHitIt->second).hit_info[0][itime];
56 
57  //time-of-arrival (check how to be used)
58  if(weightToAbyEnergy) (simHitIt->second).hit_info[1][itime] += charge*tof;
59  else if((simHitIt->second).hit_info[1][itime]==0)
60  {
61  if( accCharge>tdcOnset )
62  {
63  //extrapolate linear using previous simhit if it concerns to the same DetId
64  float fireTDC=tof;
65  if(i>0)
66  {
67  uint32_t prev_id = std::get<1>(hitRefs[i-1]);
68  if(prev_id==id)
69  {
70  float prev_toa = std::get<2>(hitRefs[i-1]);
71  float prev_tof(prev_toa-dist2center/refSpeed+tofDelay_);
72  float deltaQ2TDCOnset = tdcOnset-((simHitIt->second).hit_info[0][itime]-charge);
73  float deltaQ = charge;
74  float deltaT = (tof-prev_tof);
75  fireTDC = deltaT*(deltaQ2TDCOnset/deltaQ)+prev_tof;
76  }
77  }
78 
79  (simHitIt->second).hit_info[1][itime]=fireTDC;
80 
81  }
82  }
83  }
84 
85 
86 }
Detector identifier base class for the MIP Timing Layer.
Definition: MTDDetId.h:21
double f[11][100]
void getHitsResponse(const std::vector< std::tuple< int, uint32_t, float > > &hitRefs, const edm::Handle< edm::PSimHitContainer > &hits, mtd_digitizer::MTDSimHitDataAccumulator *simHitAccumulator, CLHEP::HepRandomEngine *hre)
Definition: ETLDeviceSim.cc:13
float tofDelay_
Definition: ETLDeviceSim.h:37
std::unordered_map< uint32_t, MTDCellInfo > MTDSimHitDataAccumulator
float MIPPerMeV_
Definition: ETLDeviceSim.h:35
ETLDeviceSim(const edm::ParameterSet &pset)
Definition: ETLDeviceSim.cc:7