Go to the documentation of this file.00001 #include "SimCalorimetry/HcalSimAlgos/interface/HcalSiPMHitResponse.h"
00002 #include "SimCalorimetry/HcalSimAlgos/interface/HcalSiPM.h"
00003 #include "SimCalorimetry/HcalSimAlgos/interface/HcalSimParameters.h"
00004 #include "SimCalorimetry/HcalSimAlgos/interface/HcalShapes.h"
00005 #include "DataFormats/HcalDetId/interface/HcalDetId.h"
00006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00007 #include "SimCalorimetry/CaloSimAlgos/interface/CaloVHitFilter.h"
00008 #include "SimCalorimetry/CaloSimAlgos/interface/CaloVSimParameterMap.h"
00009 #include "SimCalorimetry/CaloSimAlgos/interface/CaloSimParameters.h"
00010 #include "SimCalorimetry/CaloSimAlgos/interface/CaloVHitCorrection.h"
00011 #include "SimCalorimetry/CaloSimAlgos/interface/CaloVShape.h"
00012 #include "FWCore/Utilities/interface/isFinite.h"
00013
00014 HcalSiPMHitResponse::HcalSiPMHitResponse(const CaloVSimParameterMap * parameterMap,
00015 const CaloShapes * shapes) :
00016 CaloHitResponse(parameterMap, shapes), theSiPM(0), theRecoveryTime(250.) {
00017 theSiPM = new HcalSiPM(14000);
00018 }
00019
00020 HcalSiPMHitResponse::~HcalSiPMHitResponse() {
00021 if (theSiPM)
00022 delete theSiPM;
00023 }
00024
00025 void HcalSiPMHitResponse::initializeHits() {
00026 }
00027
00028 void HcalSiPMHitResponse::finalizeHits() {
00029 }
00030
00031
00032 void HcalSiPMHitResponse::add(const PCaloHit& hit) {
00033 if (!edm::isNotFinite(hit.time()) &&
00034 ((theHitFilter == 0) || (theHitFilter->accepts(hit)))) {
00035 DetId id(hit.id());
00036 if (pixelHistory.find(id)==pixelHistory.end()) {
00037 pixelHistory.insert(std::pair<DetId, HcalSiPMRecovery>(id, HcalSiPMRecovery(theRecoveryTime)));
00038 }
00039 int pixelIntegral = pixelHistory[id].getIntegral(hit.time());
00040 int oldIntegral = pixelIntegral;
00041 CaloSamples signal(makeSiPMSignal(id, hit, pixelIntegral));
00042 pixelHistory[id].addToHistory(hit.time(), pixelIntegral-oldIntegral);
00043 add(signal);
00044 }
00045 }
00046
00047 void HcalSiPMHitResponse::run(MixCollection<PCaloHit> & hits) {
00048 typedef std::multiset <const PCaloHit *, PCaloHitCompareTimes> SortedHitSet;
00049
00050 std::map< DetId, SortedHitSet > sortedhits;
00051 for (MixCollection<PCaloHit>::MixItr hitItr = hits.begin();
00052 hitItr != hits.end(); ++hitItr) {
00053 if (!((hitItr.bunch() < theMinBunch) || (hitItr.bunch() > theMaxBunch)) &&
00054 !(edm::isNotFinite(hitItr->time())) &&
00055 ((theHitFilter == 0) || (theHitFilter->accepts(*hitItr)))) {
00056 DetId id(hitItr->id());
00057 if (sortedhits.find(id)==sortedhits.end())
00058 sortedhits.insert(std::pair<DetId, SortedHitSet>(id, SortedHitSet()));
00059 sortedhits[id].insert(&(*hitItr));
00060 }
00061 }
00062 int pixelIntegral, oldIntegral;
00063 HcalSiPMRecovery pixelHistory(theRecoveryTime);
00064 for (std::map<DetId, SortedHitSet>::iterator i = sortedhits.begin();
00065 i!=sortedhits.end(); ++i) {
00066 pixelHistory.clearHistory();
00067 for (SortedHitSet::iterator itr = i->second.begin();
00068 itr != i->second.end(); ++itr) {
00069 const PCaloHit& hit = **itr;
00070 pixelIntegral = pixelHistory.getIntegral(hit.time());
00071 oldIntegral = pixelIntegral;
00072 CaloSamples signal(makeSiPMSignal(i->first, hit, pixelIntegral));
00073 pixelHistory.addToHistory(hit.time(), pixelIntegral-oldIntegral);
00074 add(signal);
00075 }
00076 }
00077 }
00078
00079
00080 void HcalSiPMHitResponse::setRandomEngine(CLHEP::HepRandomEngine & engine)
00081 {
00082 theSiPM->initRandomEngine(engine);
00083 CaloHitResponse::setRandomEngine(engine);
00084 }
00085
00086
00087 CaloSamples HcalSiPMHitResponse::makeSiPMSignal(const DetId & id,
00088 const PCaloHit & inHit,
00089 int & integral ) const {
00090
00091 PCaloHit hit = inHit;
00092 if (theHitCorrection != 0) {
00093 hit.setTime(hit.time() + theHitCorrection->delay(hit));
00094 }
00095
00096 const HcalSimParameters& pars = dynamic_cast<const HcalSimParameters&>(theParameterMap->simParameters(id));
00097 theSiPM->setNCells(pars.pixels());
00098
00099 double signal = analogSignalAmplitude(id, hit.energy(), pars);
00100 int photons = static_cast<int>(signal + 0.5);
00101 int pixels = theSiPM->hitCells(photons, integral);
00102 integral += pixels;
00103 signal = double(pixels);
00104
00105 CaloSamples result(makeBlankSignal(id));
00106
00107 if(pixels > 0)
00108 {
00109 const CaloVShape * shape = theShapes->shape(id);
00110 double jitter = hit.time() - timeOfFlight(id);
00111
00112 const double tzero = pars.timePhase() - jitter -
00113 BUNCHSPACE*(pars.binOfMaximum() - thePhaseShift_);
00114 double binTime = tzero;
00115
00116 for (int bin = 0; bin < result.size(); bin++) {
00117 result[bin] += (*shape)(binTime)*signal;
00118 binTime += BUNCHSPACE;
00119 }
00120 }
00121
00122 return result;
00123 }
00124