00001
00002
00003
00004
00005 #include "St_DataSetIter.h"
00006 #include "StEventTypes.h"
00007
00008 #include "StEEmcFastMaker.h"
00009
00010
00011 #include "StEEmcUtil/EEevent/EEeventDst.h"
00012 #include "StEEmcUtil/EEevent/EEsectorDst.h"
00013 #include "StEEmcUtil/EEevent/EEtwHitDst.h"
00014 #include "StEEmcUtil/EEevent/EEsmdHitDst.h"
00015
00016 #include "StEEmcUtil/EEmcMC/EEmcMCData.h"
00017 #include "StEEmcUtil/EEmcGeom/EEmcGeomDefs.h"
00018
00019
00020 ClassImp(StEEmcFastMaker)
00021
00022
00023 void
00024 StEEmcFastMaker::Clear(Option_t *) {
00025 meeve->Clear();
00026 if(mEmcCollectionIsLocal) {
00027 delete mLocalStEmcCollection;
00028 mLocalStEmcCollection=0;
00029 }
00030
00031 StMaker::Clear();
00032 }
00033
00034
00035 StEEmcFastMaker::StEEmcFastMaker(const char *name):StMaker(name){
00037 SetEmcCollectionLocal(false);
00038 mLocalStEmcCollection=0;
00039 mUseFullTower = true;
00040 mUseFullPreShower = false;
00041 mUseFullSmdu = false;
00042 mUseFullSmdv = false;
00043 mevIN= new EEmcMCData;
00044 meeve= new EEeventDst;
00045
00046
00047 mfixTgain=new float [kEEmcNumEtas];
00048 for (Int_t i=0;i<kEEmcNumEtas;i++) {
00049 mfixTgain[i]=getTowerGains()[i];
00050 }
00051
00052
00053
00054 }
00055
00056
00057 StEEmcFastMaker::~StEEmcFastMaker(){
00058 delete mevIN;
00059 delete meeve;
00060 delete [] mfixTgain;
00061 if(mEmcCollectionIsLocal){
00062 mLocalStEmcCollection->Clear();
00063 delete mLocalStEmcCollection;
00064 }
00065 }
00066
00067
00068
00069
00070 Int_t
00071 StEEmcFastMaker::Init(){
00072 LOG_INFO<<"::Init() \n"<< endm;
00073 if(mEmcCollectionIsLocal) {
00074 LOG_INFO<<"::Init() use local EmcCollection\n"<< endm;
00075 }
00076 return StMaker::Init();
00077 }
00078
00079
00080
00081
00082 Int_t
00083 StEEmcFastMaker::Make(){
00084
00085 LOG_INFO <<"::Make() , mEmcCollectionIsLocal="<<mEmcCollectionIsLocal<<endm;
00086 meeve->clear();
00087
00088 int nh=-1;
00089 if ( (nh = mevIN->readEventFromChain(this)) >0) {
00090 LOG_INFO <<" RAW geant EEMC hits="<<nh<<endm;
00091
00092 } else {
00093 LOG_INFO <<" RAW geant EEMC not seen"<<endm;
00094 return kStOK;
00095 }
00096
00097 EEeventDst eeveRaw;
00098
00099
00100 mevIN->write(&eeveRaw);
00101
00102
00103 eeveRaw.sumRawMC(meeve);
00104
00105
00106 StEmcCollection *emcColl=0;
00107 if(mEmcCollectionIsLocal) {
00108 mLocalStEmcCollection=new StEmcCollection();
00109 emcColl=mLocalStEmcCollection;
00110 } else {
00111 StEvent *stevent = (StEvent *) GetInputDS("StEvent");
00112 assert(stevent);
00113 emcColl=stevent->emcCollection();
00114 if(emcColl==0) {
00115 emcColl=new StEmcCollection();
00116 stevent->setEmcCollection(emcColl);
00117 LOG_WARN<<"::Make() has added a non existing StEmcCollection()"<<endm;
00118 }
00119 }
00120
00121 mEE2ST(meeve, emcColl);
00122
00123 return kStOK;
00124 }
00125
00126
00127
00128
00129
00130 void
00131 StEEmcFastMaker::mEE2ST(EEeventDst* eevt, StEmcCollection* emcC){
00132 int mxSector = kEEmcNumSectors;
00133
00134
00135 assert(emcC);
00136 LOG_DEBUG<< Form("EE2ST got emcCollection\n")<<endm;
00137
00138 for(int det = kEndcapEmcTowerId; det<= kEndcapSmdVStripId; det++){
00139
00140 StDetectorId id = StDetectorId(det);
00141 StEmcDetector* d = new StEmcDetector(id,mxSector);
00142 emcC->setDetector(d);
00143 TClonesArray* tca;
00144 LOG_DEBUG<< Form("EE2ST() copy hits from %d EEMC sectors, det=%d\n",eevt->getNSectors(),det)<<endm;
00145
00146 for(int isec=0; isec<mxSector; isec++){
00147 int secID=isec+1;
00148 EEsectorDst* EEsec = (EEsectorDst*)eevt->getSec(secID);
00149
00150 LOG_DEBUG<< Form("EE2ST() isec=%d sec_add=%p secID=%d det=%d\n",isec,(void*)EEsec,secID,det)<<endm;
00151
00152 switch (det){
00153 case kEndcapEmcTowerId: {
00154 bool hasHit[kEEmcNumSubSectors][kEEmcNumEtas];
00155 memset(hasHit,0,sizeof(hasHit));
00156 if (EEsec) {
00157 tca = EEsec->getTwHits();
00158 for(int j=0; j<=tca->GetLast(); j++){
00159 EEtwHitDst* t = (EEtwHitDst *) tca->At(j);
00160 int eta=t->eta();
00161 int sub=t->sub()-'A'+1;
00162
00163
00164 int adc=(int) (t->energy() * mfixTgain[eta-1]);
00165 if(adc<0) adc=0; if (adc> getMaxAdc()) adc=getMaxAdc();
00166
00167 StEmcRawHit* h = new StEmcRawHit(id,secID,eta,sub,adc,t->energy());
00168 d->addHit(h);
00169 hasHit[sub-1][eta-1] = true;
00170
00171 LOG_DEBUG<< Form("Tw %c %d %f %d \n",t->sub(),t->eta(),t->energy(),adc)<<endm;
00172 }
00173 }
00174 if (mUseFullTower) {
00175
00176 for (int sub = 1; sub <= kEEmcNumSubSectors; ++sub)
00177 for (int eta = 1; eta <= kEEmcNumEtas; ++eta)
00178 if (!hasHit[sub-1][eta-1]) d->addHit(new StEmcRawHit(id,secID,eta,sub,0,0));
00179 }
00180 } break;
00181
00182 case kEndcapEmcPreShowerId: {
00183 bool hasHit[3*kEEmcNumSubSectors][kEEmcNumEtas];
00184 memset(hasHit,0,sizeof(hasHit));
00185 if (EEsec) {
00186 tca = EEsec->getPre1Hits();
00187 for(int j=0; j<=tca->GetLast(); j++){
00188 EEtwHitDst* t = (EEtwHitDst *)(* tca)[j];
00189 int eta=t->eta();
00190 int sub=t->sub()-'A'+1;
00191 int adc= (int) (t->energy()* getPreshowerGain());
00192 if(adc<0) adc=0; if (adc> getMaxAdc()) adc=getMaxAdc();
00193
00194 StEmcRawHit* h = new StEmcRawHit(id,secID,eta,sub,adc,t->energy());
00195 d->addHit(h);
00196 hasHit[sub-1][eta-1] = true;
00197 LOG_DEBUG<< Form("Pr1 %c %d adc=%d e=%f\n",t->sub(),t->eta(),adc,t->energy())<<endm;
00198 }
00199
00200 tca = EEsec->getPre2Hits();
00201 for(int j=0; j<=tca->GetLast(); j++){
00202 EEtwHitDst* t = (EEtwHitDst *)(* tca)[j];
00203 int eta=t->eta();
00204 int sub=t->sub()-'A'+5+1;
00205 int adc= (int) (t->energy()* getPreshowerGain());
00206 if(adc<0) adc=0; if (adc> getMaxAdc()) adc=getMaxAdc();
00207
00208 StEmcRawHit* h = new StEmcRawHit(id,secID,eta,sub,adc,t->energy());
00209 d->addHit(h);
00210 hasHit[sub-1][eta-1] = true;
00211 LOG_DEBUG<< Form("Pr2 %c %d %d %f\n",t->sub(),t->eta(),adc,t->energy())<<endm;
00212 }
00213
00214 tca = EEsec->getPostHits();
00215 for(int j=0; j<=tca->GetLast(); j++){
00216 EEtwHitDst* t = (EEtwHitDst *)(* tca)[j];
00217 int eta=t->eta();
00218 int sub=t->sub()-'A'+10+1;
00219 int adc= (int) (t->energy()* getPreshowerGain());
00220 if(adc<0) adc=0; if (adc> getMaxAdc()) adc=getMaxAdc();
00221
00222 StEmcRawHit* h = new StEmcRawHit(id,secID,eta,sub,adc,t->energy());
00223 d->addHit(h);
00224 hasHit[sub-1][eta-1] = true;
00225 LOG_DEBUG<< Form ("Post %c %d %d %f\n",t->sub(),t->eta(),adc,t->energy())<<endm;
00226 }
00227 }
00228 if (mUseFullPreShower) {
00229
00230 for (int sub = 1; sub <= 15; ++sub)
00231 for (int eta = 1; eta <= kEEmcNumEtas; ++eta)
00232 if (!hasHit[sub-1][eta-1]) d->addHit(new StEmcRawHit(id,secID,eta,sub,0,0));
00233 }
00234 } break;
00235
00236 case kEndcapSmdUStripId: {
00237 bool hasHit[kEEmcNumStrips];
00238 memset(hasHit,0,sizeof(hasHit));
00239 if (EEsec) {
00240 tca = EEsec->getSmdUHits();
00241
00242 for(int j=0; j<=tca->GetLast(); j++){
00243 EEsmdHitDst* t = (EEsmdHitDst *)(* tca)[j];
00244 int eta=t->strip();
00245 int sub=1;
00246 int adc= (int) (t->energy()* getSmdGain());
00247 if(adc<0) adc=0; if (adc> getMaxAdc()) adc=getMaxAdc();
00248
00249 StEmcRawHit* h = new StEmcRawHit(id,secID,eta,sub,adc,t->energy());
00250 d->addHit(h);
00251 hasHit[eta-1] = true;
00252 LOG_DEBUG<< Form("SMDU %d %d %f\n",t->strip(),adc,t->energy())<<endm;
00253 }
00254 }
00255 if (mUseFullSmdu) {
00256
00257 for (int eta = 1; eta <= kEEmcNumStrips; ++eta)
00258 if (!hasHit[eta-1]) d->addHit(new StEmcRawHit(id,secID,eta,1,0,0));
00259 }
00260 } break;
00261
00262 case kEndcapSmdVStripId: {
00263 bool hasHit[kEEmcNumStrips];
00264 memset(hasHit,0,sizeof(hasHit));
00265 if (EEsec) {
00266 tca = EEsec->getSmdVHits();
00267 for(int j=0; j<=tca->GetLast(); j++){
00268 EEsmdHitDst* t = (EEsmdHitDst *)(* tca)[j];
00269 int eta=t->strip();
00270
00271 int sub=2;
00272 int adc= (int) (t->energy()*getSmdGain());
00273 if(adc<0) adc=0; if (adc> getMaxAdc()) adc=getMaxAdc();
00274
00275 StEmcRawHit* h = new StEmcRawHit(id,secID,eta,sub,adc,t->energy());
00276 LOG_DEBUG<< Form("SMDV %d %d %f\n",t->strip(),adc,t->energy())<<endm;
00277 d->addHit(h);
00278 hasHit[eta-1] = true;
00279 }
00280 }
00281 if (mUseFullSmdv) {
00282
00283 for (int eta = 1; eta <= kEEmcNumStrips; ++eta)
00284 if (!hasHit[eta-1]) d->addHit(new StEmcRawHit(id,secID,eta,2,0,0));
00285 }
00286 } break;
00287 default:
00288 assert(1==2);
00289 }
00290 }
00291 }
00292 }
00293
00294
00295
00298
00299 Float_t StEEmcFastMaker::getSamplingFraction()
00300 {
00301
00302
00303
00304 return 0.048;
00305 }
00306
00307 Float_t *StEEmcFastMaker::getTowerGains()
00308 {
00309
00310
00311
00312
00313 const float feta[kEEmcNumEtas]= {1.95,1.855,1.765,1.675,1.59,1.51,1.435,1.365,1.3,1.235,1.17,1.115};
00314
00315 Float_t *mygains=new Float_t[kEEmcNumEtas];
00316 int i;
00317 Float_t msamplingFraction = getSamplingFraction();
00318 Int_t maxEtot=getMaxET();
00319 Int_t maxAdc=getMaxAdc();
00320 for (i=0;i<kEEmcNumEtas;i++) {
00321 mygains[i]=maxAdc/maxEtot/cosh(feta[i])/msamplingFraction;
00322 }
00323 return mygains;
00324 }
00325
00326 Float_t StEEmcFastMaker::getSmdGain()
00327 {
00328
00329
00330 return 23000;
00331 }
00332
00333 Float_t StEEmcFastMaker::getPreshowerGain()
00334 {
00335
00336
00337 return 23000;
00338 }
00339
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430