Go to the documentation of this file.00001 #ifndef CaloSimAlgos_CaloTDigitizer_h
00002 #define CaloSimAlgos_CaloTDigitizer_h
00003
00009 #include "SimCalorimetry/CaloSimAlgos/interface/CaloHitResponse.h"
00010 #include "SimCalorimetry/CaloSimAlgos/interface/CaloVNoiseHitGenerator.h"
00011 #include "SimCalorimetry/CaloSimAlgos/interface/CaloVNoiseSignalGenerator.h"
00012 #include "SimDataFormats/CrossingFrame/interface/MixCollection.h"
00013 #include "SimDataFormats/CaloHit/interface/PCaloHit.h"
00014 #include <cassert>
00015
00016 template<class Traits>
00017 class CaloTDigitizer
00018 {
00019 public:
00023 typedef typename Traits::ElectronicsSim ElectronicsSim;
00024 typedef typename Traits::Digi Digi;
00025 typedef typename Traits::DigiCollection DigiCollection;
00026
00027 CaloTDigitizer(CaloHitResponse * hitResponse, ElectronicsSim * electronicsSim, bool addNoise)
00028 : theHitResponse(hitResponse),
00029 theNoiseHitGenerator(0),
00030 theNoiseSignalGenerator(0),
00031 theElectronicsSim(electronicsSim),
00032 theDetIds(0),
00033 addNoise_(addNoise)
00034 {
00035 }
00036
00037
00039 ~CaloTDigitizer() {}
00040
00042 const std::vector<DetId>& detIds() const {assert( 0 != theDetIds ) ; return *theDetIds;}
00043 void setDetIds(const std::vector<DetId> & detIds) {theDetIds = &detIds;}
00044
00045 void setNoiseHitGenerator(CaloVNoiseHitGenerator * generator)
00046 {
00047 theNoiseHitGenerator = generator;
00048 }
00049
00050 void setNoiseSignalGenerator(CaloVNoiseSignalGenerator * generator)
00051 {
00052 theNoiseSignalGenerator = generator;
00053 }
00054
00055 void setRandomEngine(CLHEP::HepRandomEngine & engine)
00056 {
00057 theHitResponse->setRandomEngine(engine);
00058 theElectronicsSim->setRandomEngine(engine);
00059 }
00060
00062 void run(MixCollection<PCaloHit> & input, DigiCollection & output) {
00063 assert(theDetIds->size() != 0);
00064
00065 if(theNoiseHitGenerator != 0) addNoiseHits();
00066 if(theNoiseSignalGenerator != 0) addNoiseSignals();
00067
00068 theHitResponse->run(input);
00069 theElectronicsSim->newEvent();
00070
00071
00072 int nDigisExpected = addNoise_ ? theDetIds->size() : theHitResponse->nSignals();
00073 output.reserve(nDigisExpected);
00074
00075
00076 for(std::vector<DetId>::const_iterator idItr = theDetIds->begin();
00077 idItr != theDetIds->end(); ++idItr)
00078 {
00079 Digi digi(*idItr);
00080 CaloSamples * analogSignal = theHitResponse->findSignal(*idItr);
00081 bool needToDeleteSignal = false;
00082
00083 if(analogSignal == 0 && addNoise_) {
00084
00085
00086 analogSignal = new CaloSamples(theHitResponse->makeBlankSignal(*idItr));
00087 needToDeleteSignal = true;
00088 }
00089 if(analogSignal != 0) {
00090 theElectronicsSim->analogToDigital(*analogSignal , digi);
00091 output.push_back(digi);
00092 if(needToDeleteSignal) delete analogSignal;
00093 }
00094 }
00095
00096
00097 theHitResponse->clear();
00098 }
00099
00100
00101 void addNoiseHits()
00102 {
00103 std::vector<PCaloHit> noiseHits;
00104 theNoiseHitGenerator->getNoiseHits(noiseHits);
00105 for(std::vector<PCaloHit>::const_iterator hitItr = noiseHits.begin(),
00106 hitEnd = noiseHits.end(); hitItr != hitEnd; ++hitItr)
00107 {
00108 theHitResponse->add(*hitItr);
00109 }
00110 }
00111
00112 void addNoiseSignals()
00113 {
00114 std::vector<CaloSamples> noiseSignals;
00115
00116 theNoiseSignalGenerator->fillEvent();
00117 theNoiseSignalGenerator->getNoiseSignals(noiseSignals);
00118 for(std::vector<CaloSamples>::const_iterator signalItr = noiseSignals.begin(),
00119 signalEnd = noiseSignals.end(); signalItr != signalEnd; ++signalItr)
00120 {
00121 theHitResponse->add(*signalItr);
00122 }
00123 }
00124
00125 private:
00126 CaloHitResponse * theHitResponse;
00127 CaloVNoiseHitGenerator * theNoiseHitGenerator;
00128 CaloVNoiseSignalGenerator * theNoiseSignalGenerator;
00129 ElectronicsSim * theElectronicsSim;
00130 const std::vector<DetId>* theDetIds;
00131 bool addNoise_;
00132 };
00133
00134 #endif
00135