00001 #include "StEEmcA2EMaker.h"
00002
00003 #include "StMuDSTMaker/COMMON/StMuDstMaker.h"
00004 #include "StMuDSTMaker/COMMON/StMuEmcCollection.h"
00005 #include "StMuDSTMaker/COMMON/StMuDst.h"
00006
00007 #include "StEventMaker/StEventMaker.h"
00008
00009 #include "StEEmcUtil/database/StEEmcDb.h"
00010 #include "StEEmcUtil/database/EEmcDbItem.h"
00011
00012
00014 #include "StEvent/StEvent.h"
00015 #include "StEvent/StEmcDetector.h"
00016 #include "StEvent/StEmcModule.h"
00017 #include "StEvent/StEmcRawHit.h"
00018 #include "StEvent/StEmcCollection.h"
00019
00020 #include <iostream>
00021
00022 ClassImp(StEEmcA2EMaker);
00023
00024
00025 StEEmcA2EMaker::StEEmcA2EMaker(const Char_t *name) : StMaker(name)
00026 {
00027
00028 scale(1.0);
00029
00030 mEEgeom=new EEmcGeomSimple();
00031
00032
00034 for ( Int_t tower=0; tower < 720; tower++ ) {
00035 for ( Int_t layer=0; layer < 4; layer++ ) {
00036 mTowers[tower][layer].Clear("");
00037 mTowers[tower][layer].layer(layer);
00038 mTowers[tower][layer].index(tower);
00039 }
00040 }
00041
00042
00043
00044 for ( Int_t i=0;i<12;i++ )
00045 for ( Int_t j=0;j<6;j++ )
00046 {
00047 mEnergy[i][j] = 0.;
00048 mHits[i][j] = 0;
00049 }
00050
00051
00052
00054 for ( Int_t tower=0; tower < 720; tower++ )
00055 {
00056 for ( Int_t layer=0; layer < 4; layer++ )
00057 {
00058
00059 Int_t phibin=mTowers[tower][layer].phibin();
00060 Int_t etabin=mTowers[tower][layer].etabin();
00061
00062
00063
00064 for ( Int_t phi=phibin-1;phi<=phibin+1;phi++ )
00065 for ( Int_t eta=etabin-1;eta<=etabin+1;eta++ )
00066 {
00067
00069 if ( phi==phibin && eta==etabin ) continue;
00070
00072 if ( eta<0 || eta>11) continue;
00073
00075 Int_t kphi=phi;
00076 if ( kphi<0 ) kphi+=60;
00077 if ( kphi>59 ) kphi-=60;
00078
00079 Int_t neighbor=12*kphi+eta;
00080
00081 assert(neighbor>=0 && neighbor<720 );
00082
00084 mTowers[tower][layer].neighbor( &mTowers[neighbor][layer] );
00085
00086 }
00087
00088
00089 }
00090 }
00091
00092
00093
00095 mHighTower[0]=&mTowers[0][0];
00096 mHighTower[1]=&mTowers[0][1];
00097 mHighTower[2]=&mTowers[0][2];
00098 mHighTower[3]=&mTowers[0][3];
00099
00101 for ( Int_t sec=0; sec<12; sec++ ) {
00102 for ( Int_t plane=0; plane<2; plane++ ) {
00103 for ( Int_t strip=0; strip<288; strip++ ) {
00104 mStrips[sec][plane][strip].Clear("");
00105 mStrips[sec][plane][strip].sector(sec);
00106 mStrips[sec][plane][strip].plane(plane);
00107 mStrips[sec][plane][strip].index(strip);
00108 }
00109 }
00110 }
00111
00113 mDbMaker = 0;
00114 mMuDstMaker = 0;
00115 mEventMaker = 0;
00116
00117
00118
00120 threshold(3.0,0);
00121 threshold(3.0,1);
00122 threshold(3.0,2);
00123 threshold(3.0,3);
00124 threshold(3.0,4);
00125 threshold(3.0,5);
00126
00129
00130
00131
00133 StEEmcTowerVec_t t;
00134 for ( Int_t i = 0; i < 4; i++ ) mHitTowers.push_back(t);
00135
00137 StEEmcStripVec_t s;
00138 std::vector< StEEmcStripVec_t > plane;
00139 plane.push_back(s);
00140 plane.push_back(s);
00141 for ( Int_t i=0; i < 12; i++ ) mHitStrips.push_back(plane);
00142
00143
00144
00145 }
00146
00147
00148 Int_t StEEmcA2EMaker::Init()
00149 {
00150 mDbMaker = (StEEmcDb*)this->GetDataSet("StEEmcDb");
00151 assert(mDbMaker);
00152
00154 if ( mInputType == 1 ) {
00155 mMuDstMaker = (StMuDstMaker *)GetMaker(mInputName);
00156 }
00157 if ( mInputType == 2 ) {
00158 mEventMaker = (StEventMaker *)GetMaker(mInputName);
00159 }
00160 if ( mInputType == 3 ) {
00161 mMuDstMaker = (StMuDstMaker *)GetMaker(mInputName);
00162 }
00163
00164 return StMaker::Init();
00165 }
00166
00167
00168 Int_t StEEmcA2EMaker::Make()
00169 {
00170
00172 if ( !readData() ) return kStWarn;
00173
00174 return kStOK;
00175 }
00176
00177
00178 Bool_t StEEmcA2EMaker::readData()
00179 {
00180
00182 if ( mInputType == 1 ) {
00183 if ( mMuDstMaker ) return readMuDst();
00184 }
00185 if ( mInputType == 2 ) {
00186
00187 return readStEvent();
00188 }
00189 if ( mInputType == 3 ) {
00190 if ( mMuDstMaker ) return readEzt();
00191 }
00192
00193 return false;
00194 }
00195
00196
00197 Bool_t StEEmcA2EMaker::readMuDst()
00198 {
00199 assert(mMuDstMaker);
00200
00202 StMuEmcCollection *emc = mMuDstMaker->muDst()->muEmcCollection();
00203 if ( !emc ) return false;
00204
00205 fillFromMuDst(emc);
00206
00207 return true;
00208
00209 }
00210
00211 Bool_t StEEmcA2EMaker::fillFromMuDst( StMuEmcCollection *emc )
00212 {
00213
00214 assert(emc);
00215
00217 for ( Int_t ihit = 0; ihit < emc -> getNEndcapTowerADC(); ihit++ ) {
00218
00219 Int_t adc, sec, sub, eta;
00220 emc -> getEndcapTowerADC ( ihit, adc, sec, sub, eta );
00221
00222 sec--;
00223 sub--;
00224 eta--;
00225
00226 assert( sec >= 0 && sec < 12 );
00227 assert( sub >= 0 && sub < 5 );
00228 assert( eta >= 0 && eta < 12 );
00229
00230 addTowerHit(sec,sub,eta,adc,0);
00231
00232 }
00233
00235 for ( Int_t ihit = 0; ihit < emc -> getNEndcapPrsHits(); ihit++ ) {
00236
00237 Int_t adc, sec, sub, eta, det;
00238 StMuEmcHit *hit = emc -> getEndcapPrsHit(ihit, sec, sub, eta, det);
00239 adc = hit -> getAdc();
00240
00241 sec--;
00242 sub--;
00243 eta--;
00244
00245 assert( sec >= 0 && sec < 12 );
00246 assert( sub >= 0 && sub < 5 );
00247 assert( eta >= 0 && eta < 12 );
00248 assert( det >= 1 && det < 4 );
00249
00250 addTowerHit(sec,sub,eta,(Float_t)adc,det);
00251
00252 }
00253
00255 Char_t cpl[] = { 'U','V' };
00256 for ( Int_t plane = 0; plane < 2; plane++ )
00257 for ( Int_t ihit = 0; ihit < emc -> getNEndcapSmdHits(cpl[plane]); ihit++ ) {
00258
00259 Int_t sec, strip, adc;
00260 StMuEmcHit *hit = emc -> getEndcapSmdHit( cpl[plane], ihit, sec, strip );
00261 adc = hit -> getAdc();
00262
00263 sec--;
00264 strip--;
00265
00266 assert( sec >= 0 && sec < 12 );
00267 assert( strip >= 0 && strip < 288 );
00268
00269 addSmdHit(sec,plane,strip,(Float_t)adc);
00270
00271 }
00272
00273 return true;
00274 }
00275
00276
00277 Bool_t StEEmcA2EMaker::readEzt()
00278 {
00279 assert(0);
00280 return true;
00281 }
00282
00283
00284 void StEEmcA2EMaker::addTowerHit( Int_t sec, Int_t sub, Int_t eta, Float_t adc, Int_t layer )
00285 {
00286 assert(sec>=0 && sec<12);
00287 assert(sub>=0 && sub<5);
00288 assert(eta>=0 && eta<12);
00289 assert(layer>=0 && layer < 4);
00290
00291 Int_t index=60*sec+12*sub+eta;
00292 assert(0<=index && index<720);
00293
00294 static Char_t subsectors[] = { 'A','B','C','D','E' };
00295 static Char_t detectors[] = { 'T', 'P', 'Q', 'R' };
00296
00300
00301 const EEmcDbItem *dbitem = mDbMaker -> getTile( sec+1,subsectors[sub],eta+1, detectors[layer] );
00302 assert(dbitem);
00303
00304
00305
00307 mTowers[index][layer].fail( dbitem -> fail );
00308 mTowers[index][layer].stat( dbitem -> stat );
00309
00311 #if 1
00312 if ( dbitem -> fail ) return;
00313
00314 #endif
00315
00316 Float_t ped = dbitem -> ped;
00317 Float_t gain = dbitem -> gain;
00318 Float_t threshold = ped + dbitem -> sigPed * mSigmaPed[layer];
00319
00321 if ( adc < threshold ) return;
00322 mHits[sec][layer]++;
00323
00325 mTowers[index][layer].raw(adc);
00326 mTowers[index][layer].adc(adc-ped);
00327
00329 if ( gain <= 0. ) return;
00331 Float_t energy = ( adc - ped + 0.5 ) / gain;
00332
00334 mTowers[index][layer].energy( energy * mScale );
00335
00337 UInt_t s=(UInt_t)mTowers[index][layer].sector();
00338 UInt_t ss=(UInt_t)mTowers[index][layer].subsector();
00339 UInt_t eb=(UInt_t)mTowers[index][layer].etabin();
00340 TVector3 momentum=mEEgeom -> getTowerCenter( s,ss,eb );
00341 momentum=momentum.Unit();
00342 momentum*=energy;
00343 mTowers[index][layer].et( (Float_t)momentum.Perp() );
00344
00345 if ( !mTowers[index][layer].fail() )
00346 if ( adc - ped > mHighTower[layer]->adc() ) {
00347 mHighTower[layer] = &mTowers[index][layer];
00348 }
00349
00351
00352 mHitTowers[layer].push_back( mTowers[index][layer] );
00353 mEnergy[sec][layer] += energy;
00354
00355 #if 0
00356 mTowers[index][layer].print();
00357 #endif
00358
00359 }
00360
00361 void StEEmcA2EMaker::addSmdHit( Int_t sec, Int_t plane, Int_t strip, Float_t adc )
00362 {
00363 assert(0<=sec && sec<12);
00364 assert(0<=plane && plane<2);
00365 assert(0<=strip && strip<288);
00366
00368 static Char_t planes[] = { 'U', 'V' };
00369 const EEmcDbItem *dbitem = mDbMaker -> getByStrip ( sec+1, planes[plane], strip+1 );
00370
00372 if ( dbitem == 0 ) return;
00373
00375 mStrips[sec][plane][strip].fail( dbitem -> fail );
00376 mStrips[sec][plane][strip].stat( dbitem -> stat );
00377
00379 if ( dbitem -> fail ) return;
00380
00381
00382 Float_t ped = dbitem -> ped;
00383 Float_t gain = dbitem -> gain;
00384 Float_t threshold = ped + dbitem -> sigPed * mSigmaPed[4+plane];
00385
00387 if ( adc < threshold ) return;
00388 mHits[sec][plane+4]++;
00389
00391 mStrips[sec][plane][strip].raw(adc);
00392 mStrips[sec][plane][strip].adc(adc-ped);
00393
00395 if ( gain <= 0. ) return;
00396
00398 Float_t energy = ( adc - ped + 0.5 ) / gain;
00399
00400 mStrips[sec][plane][strip].energy(energy);
00401
00402 mHitStrips[sec][plane].push_back( mStrips[sec][plane][strip] );
00403
00404 mEnergy[sec][plane+4] += energy;
00405
00406 }
00407
00408
00409
00410 void StEEmcA2EMaker::Clear(Option_t *opts)
00411 {
00412
00413
00415 for ( Int_t layer = 0; layer < 4; layer++ )
00416 mHitTowers[layer].clear();
00417
00418 for ( Int_t sector=0; sector<12; sector++ )
00419 for ( Int_t plane = 0; plane < 2; plane++ )
00420 mHitStrips[sector][plane].clear();
00421
00422
00426
00427 for ( Int_t i = 0; i < 720; i++ )
00428 for ( Int_t j = 0; j < 4; j++ )
00429 mTowers[i][j].Clear("");
00430
00431 for ( Int_t i = 0; i < 12; i++ )
00432 for ( Int_t j = 0; j < 2; j++ )
00433 for ( Int_t k = 0; k < 288; k++ ){
00434 mStrips[i][j][k].Clear("");
00435 }
00436
00438 for ( Int_t i = 0; i < 12; i++ )
00439 for ( Int_t j = 0; j < 6; j++ ) {
00440 mEnergy[i][j] = 0.;
00441 mHits[i][j]=0;
00442 }
00443
00444
00445
00446 }
00447
00448
00449
00450 Bool_t StEEmcA2EMaker::readStEvent()
00451 {
00452
00453 StEvent *event=(StEvent*)GetInputDS("StEvent");
00454 assert(event);
00455 StEmcCollection *emc=event->emcCollection();
00456 assert(emc);
00457
00458 fillFromSt( emc );
00459
00460 return true;
00461 }
00462
00463 Bool_t StEEmcA2EMaker::fillFromSt( StEmcCollection *emc )
00464 {
00465
00466
00470 StEmcDetector *detector=emc->detector(kEndcapEmcTowerId);
00471 if ( !detector )
00472 {
00473 Warning("fillFromSt","\n**********\nemc->detector() NULL for eemc towers. MAJOR PROBLEM, trying to procede.\n**********\n\n");
00474 return false;
00475 }
00476
00477 for ( UInt_t sec = 0; sec < detector -> numberOfModules(); sec++ )
00478 {
00479
00482 StEmcModule *sector = detector -> module( sec+1 );
00483 assert(sector);
00484 StSPtrVecEmcRawHit &hits = sector->hits();
00485
00487 for ( UInt_t ihit=0; ihit<hits.size(); ihit++ )
00488 {
00489
00490 assert(hits[ihit]);
00491
00494 Int_t isector = hits[ihit]->module() - 1;
00495 Int_t isubsector = hits[ihit]->sub() - 1;
00496 Int_t ietabin = hits[ihit]->eta() - 1;
00497 Int_t adc = hits[ihit]->adc();
00498 assert(isector>=0 && isector<12);
00499 assert(isubsector>=0 && isubsector<5);
00500 assert(ietabin>=0 && ietabin<12);
00501
00502 Int_t iphibin = 5 * isector + isubsector;
00503 assert(iphibin>=0 && iphibin<60);
00504 Int_t index = 12 * iphibin + ietabin;
00505 assert(index>=0 && index<720);
00506
00507 #if 0
00508 std::cout << "isector=" << isector
00509 << " isubsector=" << isubsector
00510 << " ietabin=" << ietabin
00511 << " " << hits[ihit]->module()
00512 << " " << hits[ihit]->sub()
00513 << " " << hits[ihit]->eta()
00514 << " " << hits[ihit]->adc()
00515 << std::endl;
00516 #endif
00517
00519 mTowers[index][0].stemc( hits[ihit] );
00520
00521
00527 addTowerHit(isector,isubsector,ietabin,(Float_t)adc,0);
00528
00529 }
00530
00531 }
00532
00533
00534 #if 0
00536 for ( UInt_t ii=0; ii < mHitTowers.size(); ii++ )
00537 {
00538 std::cout << "mHitTowers[0][" << ii << "] "
00539 << mHitTowers[0][ii].sector() << " "
00540 << mHitTowers[0][ii].subsector() << " "
00541 << mHitTowers[0][ii].etabin() << " "
00542 << mHitTowers[0][ii].adc() << " "
00543 <<std::endl << " ====> "
00544 << mHitTowers[0][ii].stemc()
00545 << std::endl;
00546 }
00548 #endif
00549
00550
00551
00555
00556 detector=emc->detector(kEndcapEmcPreShowerId);
00557
00558 if ( !detector )
00559 {
00560 Warning("fillFromSt","\n**********\nemc->detector() NULL for eemc pre/post. MAJOR PROBLEM, trying to procede.\n**********\n\n");
00561 }
00562 else
00563 for ( UInt_t sec = 0; sec < detector -> numberOfModules(); sec++ )
00564 {
00565
00568 StEmcModule *sector = detector -> module( sec+1 );
00569 StSPtrVecEmcRawHit &hits = sector->hits();
00570
00572 for ( UInt_t ihit=0; ihit<hits.size(); ihit++ )
00573 {
00574
00575 assert(hits[ihit]);
00576
00579 Int_t isector = hits[ihit]->module() - 1;
00580 Int_t isubsector = (hits[ihit]->sub() - 1) % 5;
00581 Int_t ietabin = hits[ihit]->eta() - 1;
00582 Int_t adc = hits[ihit]->adc();
00583
00584 Int_t ilayer = (hits[ihit]->sub() - 1) / 5 + 1;
00585 assert(ilayer >= 1 && ilayer < 4 );
00586
00587 Int_t iphibin = 5*isector+isubsector;
00588 Int_t index = 12*iphibin + ietabin;
00589
00590
00591 mTowers[index][ilayer].stemc( hits[ihit] );
00592
00595 addTowerHit( isector, isubsector, ietabin, (Float_t)adc, ilayer );
00596
00597 }
00598
00599 }
00600
00601
00605 StDetectorId ids[] = { kEndcapSmdUStripId, kEndcapSmdVStripId };
00607 for ( Int_t iplane=0; iplane<2; iplane++ )
00608 {
00609
00611 detector=emc->detector( ids[iplane] );
00612 if ( !detector )
00613 {
00614 Warning("fillFromSt","\n**********\nemc->detector() NULL for esmd plane. MAJOR PROBLEM, trying to procede.\n**********\n\n");
00615 }
00616 else
00617 for ( UInt_t sec = 0; sec < detector -> numberOfModules(); sec++ )
00618 {
00619
00622 StEmcModule *sector = detector -> module( sec+1 );
00623 StSPtrVecEmcRawHit &hits = sector->hits();
00624
00626 for ( UInt_t ihit=0; ihit<hits.size(); ihit++ )
00627 {
00628 Int_t isector=hits[ihit]->module()-1;
00629 Int_t istrip=hits[ihit]->eta()-1;
00630 Int_t adc =hits[ihit]->adc();
00631 assert(isector>=0 && isector<12);
00632 assert(istrip>=0 && istrip < 288);
00633
00634 mStrips[isector][iplane][istrip].stemc( hits[ihit] );
00635
00637 addSmdHit( isector, iplane, istrip, (Float_t)adc);
00638
00639 }
00640
00641 }
00642
00643 }
00644
00645
00646
00647 return true;
00648 }
00649
00650
00651
00652 Float_t StEEmcA2EMaker::energy(Int_t layer)
00653 {
00654 Float_t sum=0.;
00655 for ( Int_t sector=0;sector<12;sector++ ) sum+= energy(sector,layer);
00656 return sum;
00657 }
00658
00659
00660
00661 StEEmcTower *StEEmcA2EMaker::tower( TVector3 &r, Int_t layer )
00662 {
00663 Int_t sec=-1,sub=-1,eta=-1;
00664 if ( !mEEgeom->getTower(r,sec,sub,eta) ) return NULL;
00665 return &mTowers[ index(sec,sub,eta) ][layer];
00666 }