test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CaloTDigitizer.h
Go to the documentation of this file.
1 #ifndef CaloSimAlgos_CaloTDigitizer_h
2 #define CaloSimAlgos_CaloTDigitizer_h
3 
13 #include <cassert>
14 #include <vector>
15 
16 namespace CLHEP {
17  class HepRandomEngine;
18 }
19 
20 template<class Traits>
22 public:
23  typedef typename Traits::ElectronicsSim ElectronicsSim;
24  typedef typename Traits::Digi Digi;
25  typedef typename Traits::DigiCollection DigiCollection;
26 
27  void operator()(DigiCollection & output, CLHEP::HepRandomEngine* engine, CaloSamples * analogSignal, std::vector<DetId>::const_iterator idItr, ElectronicsSim* theElectronicsSim){
28  Digi digi(*idItr);
29  theElectronicsSim->analogToDigital(engine, *analogSignal , digi);
30  output.push_back(std::move(digi));
31  }
32 
33 };
34 
35 //second parameter changes the operation of run() slightly (default value for old-style with edm::SortedCollection instead of edm::DataFrameContainer)
36 template<class Traits, template <class> class runHelper=CaloTDigitizerDefaultRun>
38 {
39 public:
43  typedef typename Traits::ElectronicsSim ElectronicsSim;
44  typedef typename Traits::Digi Digi;
45  typedef typename Traits::DigiCollection DigiCollection;
46 
47  CaloTDigitizer(CaloHitResponse * hitResponse, ElectronicsSim * electronicsSim, bool addNoise)
48  : theHitResponse(hitResponse),
50  theElectronicsSim(electronicsSim),
51  theDetIds(0),
52  addNoise_(addNoise),
54  {
55  }
56 
57 
60 
62  const std::vector<DetId>& detIds() const {assert( 0 != theDetIds ) ; return *theDetIds;}
63  void setDetIds(const std::vector<DetId> & detIds) {theDetIds = &detIds;}
64 
66  {
68  }
69 
71  debugCS_ = debug;
72  }
73 
75  return csColl_;
76  }
77 
78  void add(const std::vector<PCaloHit> & hits, int bunchCrossing, CLHEP::HepRandomEngine* engine) {
79  if(theHitResponse->withinBunchRange(bunchCrossing)) {
80  for(std::vector<PCaloHit>::const_iterator it = hits.begin(), itEnd = hits.end(); it != itEnd; ++it) {
81  theHitResponse->add(*it, engine);
82  }
83  }
84  }
85 
86  void initializeHits() {
88  }
89 
92  assert(0);
93  }
94 
96 
97  void run(DigiCollection & output, CLHEP::HepRandomEngine* engine) {
99  //std::cout << " In CaloTDigitizer, after finalize hits " << std::endl;
100 
101  assert(theDetIds->size() != 0);
102 
103  if(theNoiseSignalGenerator != 0) addNoiseSignals(engine);
104 
105  theElectronicsSim->newEvent(engine);
106 
107  // reserve space for how many digis we expect
108  int nDigisExpected = addNoise_ ? theDetIds->size() : theHitResponse->nSignals();
109  output.reserve(nDigisExpected);
110  if(debugCS_) {
111  csColl_.clear();
112  csColl_.reserve(nDigisExpected);
114  }
115 
116  // make a raw digi for evey cell
117  for(std::vector<DetId>::const_iterator idItr = theDetIds->begin();
118  idItr != theDetIds->end(); ++idItr)
119  {
120  CaloSamples * analogSignal = theHitResponse->findSignal(*idItr);
121  if(analogSignal && debugCS_) csColl_.push_back(*analogSignal);
122  bool needToDeleteSignal = false;
123  // don't bother digitizing if no signal and no noise
124  if(analogSignal == 0 && addNoise_) {
125  // I guess we need to make a blank signal for this cell.
126  // Don't bother storing it anywhere.
127  analogSignal = new CaloSamples(theHitResponse->makeBlankSignal(*idItr));
128  needToDeleteSignal = true;
129  }
130  if(analogSignal != 0) {
131  runAnalogToDigital(output,engine,analogSignal,idItr,theElectronicsSim);
132  if(needToDeleteSignal) delete analogSignal;
133  }
134  }
135 
136  // free up some memory
138  }
139 
140  void addNoiseSignals(CLHEP::HepRandomEngine* engine)
141  {
142  std::vector<CaloSamples> noiseSignals;
143  // noise signals need to be in units of photoelectrons. Fractional is OK
146  for(std::vector<CaloSamples>::const_iterator signalItr = noiseSignals.begin(),
147  signalEnd = noiseSignals.end(); signalItr != signalEnd; ++signalItr)
148  {
149  theHitResponse->add(*signalItr);
150  }
151  }
152 
153 private:
154  runHelper<Traits> runAnalogToDigital;
158  const std::vector<DetId>* theDetIds;
159  bool addNoise_;
160  bool debugCS_;
162 };
163 
164 #endif
165 
void setStorePrecise(bool sp)
CaloSamplesCollection csColl_
CaloSamples makeBlankSignal(const DetId &detId) const
creates an empty signal for this DetId
std::vector< CaloSamples > CaloSamplesCollection
Definition: CaloSamples.h:85
void add(const std::vector< PCaloHit > &hits, int bunchCrossing, CLHEP::HepRandomEngine *engine)
Traits::ElectronicsSim ElectronicsSim
bool withinBunchRange(int bunchCrossing) const
check if crossing is within bunch range:
assert(m_qm.get())
const std::vector< DetId > & detIds() const
tell the digitizer which cells exist
void operator()(DigiCollection &output, CLHEP::HepRandomEngine *engine, CaloSamples *analogSignal, std::vector< DetId >::const_iterator idItr, ElectronicsSim *theElectronicsSim)
std::tuple< unsigned int, int, int, DigiType, int, int, int, float > Digi
Definition: GenericDigi.h:30
Traits::ElectronicsSim ElectronicsSim
CaloVNoiseSignalGenerator * theNoiseSignalGenerator
virtual void finalizeHits(CLHEP::HepRandomEngine *)
Finalize hits.
Creates electronics signals from hits.
void initializeHits()
CaloTDigitizer(CaloHitResponse *hitResponse, ElectronicsSim *electronicsSim, bool addNoise)
virtual void initializeHits()
Initialize hits.
def move
Definition: eostools.py:510
void addNoiseSignals(CLHEP::HepRandomEngine *engine)
void setNoiseSignalGenerator(CaloVNoiseSignalGenerator *generator)
CaloHitResponse * theHitResponse
runHelper< Traits > runAnalogToDigital
~CaloTDigitizer()
doesn&#39;t delete the pointers passed in
#define debug
Definition: HDRShower.cc:19
void run(MixCollection< PCaloHit > &, DigiCollection &)
turns hits into digis
ElectronicsSim * theElectronicsSim
Traits::Digi Digi
CaloSamples * findSignal(const DetId &detId)
users can look for the signal for a given cell
virtual void add(const PCaloHit &hit, CLHEP::HepRandomEngine *)
process a single SimHit
void fillEvent(CLHEP::HepRandomEngine *)
fill theNoiseSignals with one event&#39;s worth of noise, in units of pe
void clear()
frees up memory
Traits::DigiCollection DigiCollection
void setDebugCaloSamples(bool debug)
void getNoiseSignals(std::vector< CaloSamples > &noiseSignals)
volatile std::atomic< bool > shutdown_flag false
Traits::DigiCollection DigiCollection
int nSignals() const
number of signals in the current cache
const CaloSamplesCollection & getCaloSamples() const
void run(DigiCollection &output, CLHEP::HepRandomEngine *engine)
Collects the digis.
void setDetIds(const std::vector< DetId > &detIds)
const std::vector< DetId > * theDetIds