CMS 3D CMS Logo

EcalTDigitizer.h

Go to the documentation of this file.
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 

Generated on Tue Jun 9 17:46:16 2009 for CMSSW by  doxygen 1.5.4