![]() |
![]() |
00001 #ifndef EcalSimAlgos_CaloTDigitizer_h 00002 #define EcalSimAlgos_CaloTDigitizer_h 00003 00009 #include "SimCalorimetry/CaloSimAlgos/interface/CaloHitResponse.h" 00010 #include "SimDataFormats/CrossingFrame/interface/MixCollection.h" 00011 #include "SimDataFormats/CaloHit/interface/PCaloHit.h" 00012 // #include "DataFormats/EcalDigi/interface/EcalDataFrame.h" 00013 // #include "DataFormats/Common/interface/DataFrame.h" 00014 00015 00016 template<class Traits> 00017 class EcalTDigitizer 00018 { 00019 public: 00023 typedef typename Traits::ElectronicsSim ElectronicsSim; 00024 typedef typename Traits::Digi Digi; 00025 typedef typename Traits::DigiCollection DigiCollection; 00026 00027 EcalTDigitizer(CaloHitResponse * hitResponse, ElectronicsSim * electronicsSim, bool addNoise) 00028 : theHitResponse(hitResponse), 00029 theElectronicsSim(electronicsSim), 00030 theDetIds(0), 00031 addNoise_(addNoise) 00032 { 00033 } 00034 00035 00036 00038 ~EcalTDigitizer() {} 00039 00041 void setDetIds(const std::vector<DetId> & detIds) {theDetIds = detIds;} 00042 00044 void run(MixCollection<PCaloHit> & input, DigiCollection & output) { 00045 assert(theDetIds.size() != 0); 00046 00047 theHitResponse->run(input); 00048 00049 theElectronicsSim->newEvent(); 00050 00051 // reserve space for how many digis we expect 00052 int nDigisExpected = addNoise_ ? theDetIds.size() : theHitResponse->nSignals(); 00053 output.reserve(nDigisExpected); 00054 00055 // make a raw digi for evey cell 00056 for(std::vector<DetId>::const_iterator idItr = theDetIds.begin(); 00057 idItr != theDetIds.end(); ++idItr) 00058 { 00059 CaloSamples * analogSignal = theHitResponse->findSignal(*idItr); 00060 bool needToDeleteSignal = false; 00061 // don't bother digitizing if no signal and no noise 00062 if(analogSignal == 0 && addNoise_) { 00063 // I guess we need to make a blank signal for this cell. 00064 // Don't bother storing it anywhere. 00065 analogSignal = new CaloSamples(theHitResponse->makeBlankSignal(*idItr)); 00066 needToDeleteSignal = true; 00067 } 00068 if(analogSignal != 0) { 00069 output.push_back(*idItr); 00070 Digi digi(output.back()); 00071 theElectronicsSim->analogToDigital(*analogSignal , digi); 00072 if(needToDeleteSignal) delete analogSignal; 00073 } 00074 } 00075 00076 // free up some memory 00077 theHitResponse->clear(); 00078 } 00079 00080 00081 private: 00082 CaloHitResponse * theHitResponse; 00083 ElectronicsSim * theElectronicsSim; 00084 std::vector<DetId> theDetIds; 00085 bool addNoise_; 00086 }; 00087 00088 #endif 00089