00001
00002
00003 #include "StEmcPmtSimulator.h"
00004
00005 #include "StMessMgr.h"
00006 #include "StEvent/StEnumerations.h"
00007 #include "StEvent/StEmcRawHit.h"
00008 #include "StMcEvent/StMcCalorimeterHit.hh"
00009 #include "StEmcUtil/geometry/StEmcGeom.h"
00010 #include "StEmcUtil/database/StBemcTables.h"
00011
00012 ClassImp(StEmcPmtSimulator)
00013
00014 StEmcPmtSimulator::StEmcPmtSimulator(StDetectorId det, StEmcSimulatorMode mode)
00015 : StEmcSimpleSimulator(det, mode)
00016 {
00017 switch(mDetectorId) {
00018 case kBarrelEmcTowerId:
00019 mMipPhotoElectrons = 63.0;
00020 mMipEnergyDeposit = 0.0198;
00021 break;
00022
00023 case kBarrelEmcPreShowerId:
00024 mMipPhotoElectrons = 6.0;
00025 mMipEnergyDeposit = 0.002;
00026 break;
00027
00028 default:
00029 LOG_ERROR << "StEmcPmtSimulator isn't configured for " << mDetectorId << endm;
00030 }
00031
00032 switch(mMode) {
00033 case kPrimarySecondaryFullMode:
00034 mVer = StPmtSignal::kFullSimulator;
00035 break;
00036
00037 case kPrimarySecondaryFastMode:
00038 mVer = StPmtSignal::kFastSimulator;
00039 break;
00040
00041 default: break;
00042 }
00043 }
00044
00045 StEmcRawHit* StEmcPmtSimulator::makeRawHit(const StMcCalorimeterHit *mcHit) {
00046
00047 if(mcHit->module() <= 0 || mcHit->eta() <= 0 || mcHit->sub() <= 0) {
00048 LOG_ERROR << "These quantities must all be positive: module=" << mcHit->module()
00049 << " eta=" << mcHit->eta() << " sub=" << mcHit->sub() << endm;
00050 return NULL;
00051 }
00052
00053 StEmcRawHit *rawHit = new StEmcRawHit(mDetectorId, mcHit->module(), mcHit->eta(), mcHit->sub(), 0);
00054
00055 float pseudoRapidity; mGeom->getEta(mcHit->module(), mcHit->eta(), pseudoRapidity);
00056 int softId; mGeom->getId(mcHit->module(), mcHit->eta(), mcHit->sub(), softId);
00057
00058 double photoElectrons = mcHit->dE() * mMipPhotoElectrons / mMipEnergyDeposit;
00059 photoElectrons = mRandom.PoissonD(photoElectrons);
00060
00061
00062 float calib = mTables->calib(mDetectorId-8, softId);
00063
00064
00065 double totalGain = calib ? samplingFraction(pseudoRapidity) * (mMipEnergyDeposit / mMipPhotoElectrons) / calib : 0.0;
00066
00067 double pedMean(0.0), pedRMS(0.0);
00068 if(!mEmbeddingMode) {
00069 pedMean = mTables->pedestal(mDetectorId-8, softId);
00070 pedRMS = mTables->pedestalRMS(mDetectorId-8, softId);
00071 }
00072
00073 double ADC(0.0);
00074 switch(mMode) {
00075 case kTestMode: case kSimpleMode: {
00076 delete rawHit;
00077 return StEmcSimpleSimulator::makeRawHit(mcHit);
00078 }
00079
00080 case kPrimaryOnlyMode: {
00081 ADC = totalGain * photoElectrons;
00082 ADC += mRandom.Gaus(pedMean, pedRMS);
00083 break;
00084 }
00085
00086 case kPrimarySecondaryFullMode: case kPrimarySecondaryFastMode: {
00087 mPmtSignal.setTotalGain(totalGain);
00088 mPmtSignal.setPedestalMean(pedMean);
00089 mPmtSignal.setPedestalRMS(pedRMS);
00090
00091 ADC = mPmtSignal.getAdc(static_cast<int>(photoElectrons), mVer);
00092 break;
00093 }
00094 }
00095
00096
00097 ADC = pedMean + (ADC-pedMean) * mRandom.Gaus(mCalibScale, mCalibSpread);
00098
00099
00100 double maxADC = mRandom.Gaus(mMaxADC, mMaxADCSpread);
00101 if(ADC < 0) ADC = 0.0;
00102 if(ADC > maxADC) ADC = maxADC;
00103
00104 rawHit->setAdc(static_cast<unsigned int>(ADC));
00105
00106 float energy = (rawHit->adc() - pedMean) * calib;
00107 rawHit->setEnergy(energy);
00108
00109 LOG_DEBUG << Form("det=%2d softId=%5d dE=%e sF=%.1f ADC=%4d ped=%6.2f rms=%4.2f energy=%.4f",
00110 mDetectorId, softId, mcHit->dE(), samplingFraction(pseudoRapidity), rawHit->adc(),
00111 pedMean, pedRMS, rawHit->energy()) << endm;
00112
00113 return rawHit;
00114 }
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161