00001
00002
00003 #include "StEmcSimpleSimulator.h"
00004
00005 #include "TMath.h"
00006
00007 #include "StMessMgr.h"
00008 #include "StEvent/StEnumerations.h"
00009 #include "StEvent/StEmcRawHit.h"
00010 #include "StMcEvent/StMcCalorimeterHit.hh"
00011 #include "StEmcUtil/geometry/StEmcGeom.h"
00012 #include "StEmcUtil/database/StBemcTables.h"
00013
00014 ClassImp(StEmcSimpleSimulator)
00015
00016 StEmcSimpleSimulator::StEmcSimpleSimulator(StDetectorId det, StEmcSimulatorMode mode):StEmcVirtualSimulator() {
00017 mDetectorId = det;
00018 mMode = mode;
00019
00020
00021 switch(mDetectorId) {
00022 case kBarrelEmcTowerId:
00023 mMaxADC = 4095.0;
00024 mSF[0] = 14.365;
00025 mSF[1] = -0.512;
00026 mSF[2] = 0.668;
00027 break;
00028
00029
00030 case kBarrelEmcPreShowerId:
00031 mMaxADC = 1023.0;
00032 mSF[0] = 1.0;
00033 mSF[1] = 0.0;
00034 mSF[2] = 0.0;
00035 break;
00036
00037 case kBarrelSmdEtaStripId:
00038 mMaxADC = 1023.9;
00039 mSF[0] = 118500.0;
00040 mSF[1] = -32920.0;
00041 mSF[2] = 31130.0;
00042 break;
00043
00044 case kBarrelSmdPhiStripId:
00045 mMaxADC = 1023.0;
00046 mSF[0] = 126000.0;
00047 mSF[1] = -13950.0;
00048 mSF[2] = 19710.0;
00049 break;
00050
00051 default:
00052 LOG_ERROR << det << " is not an OK value for detector (see StEnumerations.h). BEMC simulations will be JUNK!" << endm;
00053 }
00054
00055 mGeom = StEmcGeom::instance(det - 8);
00056
00057 mEmbeddingMode = false;
00058
00059 mTables = NULL;
00060
00061 mCalibScale = 1.0;
00062 mCalibSpread = 0.0;
00063
00064 mMaxADCSpread = 0.0;
00065 }
00066
00067 StEmcRawHit* StEmcSimpleSimulator::makeRawHit(const StMcCalorimeterHit *mcHit) {
00068
00069 if(mcHit->module() <= 0 || mcHit->eta() <= 0 || mcHit->sub() <= 0) {
00070 LOG_ERROR << "These quantities must all be positive: module=" << mcHit->module()
00071 << " eta=" << mcHit->eta() << " sub=" << mcHit->sub() << endm;
00072 return NULL;
00073 }
00074
00075 StEmcRawHit *rawHit = new StEmcRawHit(mDetectorId, mcHit->module(), mcHit->eta(), mcHit->sub(), 0);
00076
00077 float pseudoRapidity; mGeom->getEta(mcHit->module(), mcHit->eta(), pseudoRapidity);
00078 int softId; mGeom->getId(mcHit->module(), mcHit->eta(), mcHit->sub(), softId);
00079
00080 switch(mMode) {
00081 case kTestMode: {
00082 rawHit->setEnergy(mcHit->dE() * samplingFraction(pseudoRapidity));
00083
00084 LOG_DEBUG << Form("det=%2d softId=%5d dE=%e sF=%.1f ADC=%4d ped=%6.2f rms=%4.2f energy=%.4f",
00085 mDetectorId, softId, mcHit->dE(), samplingFraction(pseudoRapidity), rawHit->adc(),
00086 0.0, 0.0, rawHit->energy()) << endm;
00087
00088 return rawHit;
00089 }
00090
00091 case kSimpleMode: {
00092 float calib = mTables->calib(mDetectorId-8, softId);
00093
00094 double ADC = mcHit->dE() * samplingFraction(pseudoRapidity) / calib;
00095
00096
00097 float pedMean(0.0), pedRMS(0.0);
00098 if(!mEmbeddingMode) {
00099 pedMean = mTables->pedestal(mDetectorId-8, softId);
00100 pedRMS = mTables->pedestalRMS(mDetectorId-8, softId);
00101 ADC += mRandom.Gaus(pedMean, pedRMS);
00102 }
00103
00104
00105 ADC = pedMean + (ADC-pedMean) * mRandom.Gaus(mCalibScale, mCalibSpread);
00106
00107
00108
00109 double maxADC = mRandom.Gaus(mMaxADC, mMaxADCSpread);
00110 if(ADC < 0) ADC = 0.0;
00111 if(ADC > maxADC) ADC = maxADC;
00112
00113 rawHit->setAdc(static_cast<unsigned int>(ADC));
00114
00115 float energy = (rawHit->adc() - pedMean) * calib;
00116 rawHit->setEnergy(energy);
00117
00118 LOG_DEBUG << Form("det=%2d softId=%5d dE=%e sF=%.1f ADC=%4d ped=%6.2f rms=%4.2f energy=%.4f",
00119 mDetectorId, softId, mcHit->dE(), samplingFraction(pseudoRapidity), rawHit->adc(),
00120 pedMean, pedRMS, rawHit->energy()) << endm;
00121
00122 return rawHit;
00123 }
00124
00125 default: {
00126 LOG_ERROR << "StEmcSimpleSimulator is not configured for " << mMode << " so raw hit is NULL" << endm;
00127 delete rawHit;
00128 return NULL;
00129 }
00130 }
00131 }
00132
00133 double StEmcSimpleSimulator::samplingFraction(double eta) {
00134 Double_t x = TMath::Abs(eta);
00135 return mSF[0]+mSF[1]*x+mSF[2]*x*x;
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
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189