00001
00016 #include "StEEmcA2EMaker.h"
00017
00018
00019 #include "StMuDSTMaker/COMMON/StMuEmcCollection.h"
00020 #include "StMuDSTMaker/COMMON/StMuDst.h"
00021
00022
00023
00024 #include "StEEmcUtil/database/StEEmcDb.h"
00025 #include "StEEmcUtil/database/EEmcDbItem.h"
00026
00027
00029 #include "StEvent/StEvent.h"
00030 #include "StEvent/StEmcDetector.h"
00031 #include "StEvent/StEmcModule.h"
00032 #include "StEvent/StEmcRawHit.h"
00033 #include "StEvent/StEmcCollection.h"
00034
00035 #include "StMessMgr.h"
00036
00037 #include <iostream>
00038
00039 ClassImp(StEEmcA2EMaker);
00040
00041
00042 StEEmcA2EMaker::StEEmcA2EMaker(const Char_t *name) : StMaker(name)
00043 {
00044
00045 scale(1.0);
00046
00047 mEEgeom=new EEmcGeomSimple();
00048
00049
00051 for ( Int_t tower=0; tower < 720; tower++ ) {
00052 for ( Int_t layer=0; layer < 4; layer++ ) {
00053 mTowers[tower][layer].Clear("");
00054 mTowers[tower][layer].layer(layer);
00055 mTowers[tower][layer].index(tower);
00056 }
00057 }
00058
00059
00060
00061 for ( Int_t i=0;i<12;i++ )
00062 for ( Int_t j=0;j<6;j++ )
00063 {
00064 mEnergy[i][j] = 0.;
00065 mHits[i][j] = 0;
00066 }
00067
00068
00069
00071 for ( Int_t tower=0; tower < 720; tower++ )
00072 {
00073 for ( Int_t layer=0; layer < 4; layer++ )
00074 {
00075
00076 Int_t phibin=mTowers[tower][layer].phibin();
00077 Int_t etabin=mTowers[tower][layer].etabin();
00078
00079
00080
00081 for ( Int_t phi=phibin-1;phi<=phibin+1;phi++ )
00082 for ( Int_t eta=etabin-1;eta<=etabin+1;eta++ )
00083 {
00084
00086 if ( phi==phibin && eta==etabin ) continue;
00087
00089 if ( eta<0 || eta>11) continue;
00090
00092 Int_t kphi=phi;
00093 if ( kphi<0 ) kphi+=60;
00094 if ( kphi>59 ) kphi-=60;
00095
00096 Int_t neighbor=12*kphi+eta;
00097
00098 if ((neighbor>=0) && (neighbor<720)) {
00100 mTowers[tower][layer].neighbor( &mTowers[neighbor][layer] );
00101 }
00102 }
00103
00104
00105 }
00106 }
00107
00109 mHighTower[0]=&mTowers[0][0];
00110 mHighTower[1]=&mTowers[0][1];
00111 mHighTower[2]=&mTowers[0][2];
00112 mHighTower[3]=&mTowers[0][3];
00113
00115 for ( Int_t sec=0; sec<12; sec++ ) {
00116 for ( Int_t plane=0; plane<2; plane++ ) {
00117 for ( Int_t strip=0; strip<288; strip++ ) {
00118 mStrips[sec][plane][strip].Clear("");
00119 mStrips[sec][plane][strip].sector(sec);
00120 mStrips[sec][plane][strip].plane(plane);
00121 mStrips[sec][plane][strip].index(strip);
00122 }
00123 }
00124 }
00125
00127 mDbMaker = 0;
00128
00130 threshold(3.0,0);
00131 threshold(3.0,1);
00132 threshold(3.0,2);
00133 threshold(3.0,3);
00134 threshold(3.0,4);
00135 threshold(3.0,5);
00136
00139
00141 StEEmcTowerVec_t t;
00142 for ( Int_t i = 0; i < 4; i++ ) mHitTowers.push_back(t);
00143
00145 StEEmcStripVec_t s;
00146 std::vector< StEEmcStripVec_t > plane;
00147 plane.push_back(s);
00148 plane.push_back(s);
00149 for ( Int_t i=0; i < 12; i++ ) mHitStrips.push_back(plane);
00150
00151
00152
00153 }
00154
00155
00156 StEEmcA2EMaker::~StEEmcA2EMaker()
00157 {
00158 if (mEEgeom) delete mEEgeom;
00159 mEEgeom = 0;
00160 }
00161
00162
00163 Int_t StEEmcA2EMaker::Init()
00164 {
00166 mDbMaker = (const StEEmcDb*)this->GetDataSet("StEEmcDb");
00167 return StMaker::Init();
00168 }
00169
00170
00171 Int_t StEEmcA2EMaker::Make()
00172 {
00173 Int_t result = StMaker::Make();
00175 if ( !readData() ) return kStWarn;
00176 return result;
00177 }
00178
00179
00180 Bool_t StEEmcA2EMaker::readData()
00181 {
00183 const StMuDst* muDst = (const StMuDst*)GetInputDS("MuDst");
00184 if (muDst) {
00185 const StMuEmcCollection *emc = muDst->muEmcCollection();
00186 if (emc) {
00187 {LOG_DEBUG << "Reading from MuDst..." << endm;}
00188 return fillFromMuDst(emc);
00189 }
00190 }
00191 const StEvent *event = (const StEvent*)GetInputDS("StEvent");
00192 if (event) {
00193 const StEmcCollection *emc = event->emcCollection();
00194 if (emc) {
00195 {LOG_DEBUG << "Reading from StEvent..." << endm;}
00196 return fillFromSt(emc);
00197 }
00198 }
00199 {LOG_WARN << "Cannot find event" << endm;}
00200 return false;
00201 }
00202
00203
00204 Bool_t StEEmcA2EMaker::fillFromMuDst(const StMuEmcCollection *emc)
00205 {
00206 if (!emc) {
00207 {LOG_WARN << "Cannot find StMuEmcCollection" << endm;}
00208 return false;
00209 }
00210
00211 LOG_DEBUG<<GetName()<<"::fillFromMuDst() N tower ADC = "<<emc -> getNEndcapTowerADC()<<endm;
00212
00214 for ( Int_t ihit = 0; ihit < emc -> getNEndcapTowerADC(); ihit++ ) {
00215
00216 Int_t adc, sec, sub, eta;
00217 emc -> getEndcapTowerADC ( ihit, adc, sec, sub, eta );
00218
00219 sec--;
00220 sub--;
00221 eta--;
00222
00223 if ((sec >= 0) && (sec < 12) && (sub >= 0) && (sub < 5) && (eta >= 0) && (eta < 12)) {
00224 addTowerHit(sec,sub,eta,adc,0);
00225 } else {
00226
00227 }
00228 }
00229
00230 LOG_DEBUG<<GetName()<<"::fillFromMuDst() N pre/post ADC = "<<emc -> getNEndcapPrsHits()<<endm;
00231
00233 for ( Int_t ihit = 0; ihit < emc -> getNEndcapPrsHits(); ihit++ ) {
00234
00235 Int_t adc, sec, sub, eta, det;
00236 const StMuEmcHit *hit = emc -> getEndcapPrsHit(ihit, sec, sub, eta, det);
00237 if (!hit) continue;
00238
00239 adc = hit -> getAdc();
00240
00241 sec--;
00242 sub--;
00243 eta--;
00244
00245 if ((sec >= 0) && (sec < 12) && (sub >= 0) && (sub < 5) && (eta >= 0) && (eta < 12) && (det >= 1) && (det < 4)) {
00246 addTowerHit(sec,sub,eta,(Float_t)adc,det);
00247 } else {
00248
00249 }
00250 }
00251
00253 Char_t cpl[] = { 'U','V' };
00254 for ( Int_t plane = 0; plane < 2; plane++ )
00255 for ( Int_t ihit = 0; ihit < emc -> getNEndcapSmdHits(cpl[plane]); ihit++ ) {
00256
00257 Int_t sec, strip, adc;
00258 const StMuEmcHit *hit = emc -> getEndcapSmdHit( cpl[plane], ihit, sec, strip );
00259 adc = hit -> getAdc();
00260
00261 sec--;
00262 strip--;
00263
00264 if ((sec >= 0) && (sec < 12) && (strip >= 0) && (strip < 288)) {
00265 addSmdHit(sec,plane,strip,(Float_t)adc);
00266 } else {
00267
00268 }
00269 }
00270 return true;
00271 }
00272
00273
00274 void StEEmcA2EMaker::addTowerHit( Int_t sec, Int_t sub, Int_t eta, Float_t adc, Int_t layer )
00275 {
00276 if (!((sec>=0 && sec<12) && (sub>=0 && sub<5) && (eta>=0 && eta<12) && (layer>=0 && layer < 4))) {
00277 return;
00278 }
00279 Int_t index=60*sec+12*sub+eta;
00280 if (!((0<=index) && (index<720))) {
00281
00282 return;
00283 }
00284
00285 static const Char_t subsectors[] = { 'A','B','C','D','E' };
00286 static const Char_t detectors[] = { 'T', 'P', 'Q', 'R' };
00287
00291
00292 const EEmcDbItem *dbitem = mDbMaker ? mDbMaker -> getTile( sec+1,subsectors[sub],eta+1, detectors[layer] ) : 0;
00293 if (!dbitem) {
00294 return;
00295 }
00296
00298 mTowers[index][layer].fail( dbitem -> fail );
00299 mTowers[index][layer].stat( dbitem -> stat );
00300
00302 mTowers[index][layer].raw(adc);
00303
00305 if ( dbitem -> fail ) return;
00306
00307
00308 Float_t ped = dbitem -> ped;
00309 Float_t gain = dbitem -> gain;
00310 Float_t threshold = ped + dbitem -> sigPed * mSigmaPed[layer];
00311
00313 if ( adc < threshold ) return;
00314 mHits[sec][layer]++;
00315
00317 mTowers[index][layer].adc(adc-ped);
00318
00320 if ( gain <= 0. ) return;
00322 Float_t energy = ( adc - ped + 0.5 ) / gain;
00323
00325 mTowers[index][layer].energy( energy * mScale );
00326
00328 UInt_t s=(UInt_t)mTowers[index][layer].sector();
00329 UInt_t ss=(UInt_t)mTowers[index][layer].subsector();
00330 UInt_t eb=(UInt_t)mTowers[index][layer].etabin();
00331 TVector3 momentum=mEEgeom -> getTowerCenter( s,ss,eb );
00332 momentum=momentum.Unit();
00333 momentum*=energy;
00334 mTowers[index][layer].et( (Float_t)momentum.Perp() );
00335
00336 if ( !mTowers[index][layer].fail() )
00337 if ( adc - ped > mHighTower[layer]->adc() ) {
00338 mHighTower[layer] = &mTowers[index][layer];
00339 }
00340
00342
00343 mHitTowers[layer].push_back( mTowers[index][layer] );
00344 mEnergy[sec][layer] += mTowers[index][layer].energy();
00345
00346 #if 0
00347 mTowers[index][layer].print();
00348 #endif
00349
00350 }
00351
00352
00353 void StEEmcA2EMaker::addSmdHit( Int_t sec, Int_t plane, Int_t strip, Float_t adc )
00354 {
00355 if (!((0 <= sec) && (sec < 12) && (0 <= plane) && (plane < 2) && (0 <= strip) && (strip < 288))) {
00356 return;
00357 }
00358
00360 static const Char_t planes[] = { 'U', 'V' };
00361 const EEmcDbItem *dbitem = mDbMaker ? mDbMaker -> getByStrip ( sec+1, planes[plane], strip+1 ) : 0;
00362
00364 if ( dbitem == 0 ) return;
00365
00367 mStrips[sec][plane][strip].fail( dbitem -> fail );
00368 mStrips[sec][plane][strip].stat( dbitem -> stat );
00369
00371 mStrips[sec][plane][strip].raw(adc);
00372
00374 if ( dbitem -> fail ) return;
00375
00376
00377 Float_t ped = dbitem -> ped;
00378 Float_t gain = dbitem -> gain;
00379 Float_t threshold = ped + dbitem -> sigPed * mSigmaPed[4+plane];
00380
00382 if ( adc < threshold ) return;
00383 mHits[sec][plane+4]++;
00384
00386 mStrips[sec][plane][strip].adc(adc-ped);
00387
00389 if ( gain <= 0. ) return;
00390
00392 Float_t energy = ( adc - ped + 0.5 ) / gain;
00393
00394 mStrips[sec][plane][strip].energy(energy);
00395
00396 mHitStrips[sec][plane].push_back( mStrips[sec][plane][strip] );
00397
00398 mEnergy[sec][plane+4] += energy;
00399
00400 }
00401
00402
00403 void StEEmcA2EMaker::Clear(Option_t *opts)
00404 {
00405 StMaker::Clear(opts);
00407 for ( Int_t layer = 0; layer < 4; layer++ )
00408 mHitTowers[layer].clear();
00409
00410 for ( Int_t sector=0; sector<12; sector++ )
00411 for ( Int_t plane = 0; plane < 2; plane++ )
00412 mHitStrips[sector][plane].clear();
00413
00414
00418
00419 for ( Int_t i = 0; i < 720; i++ )
00420 for ( Int_t j = 0; j < 4; j++ )
00421 mTowers[i][j].Clear("");
00422
00423 for ( Int_t i = 0; i < 12; i++ )
00424 for ( Int_t j = 0; j < 2; j++ )
00425 for ( Int_t k = 0; k < 288; k++ )
00426 mStrips[i][j][k].Clear("");
00427
00429 for ( Int_t i = 0; i < 12; i++ )
00430 for ( Int_t j = 0; j < 6; j++ ) {
00431 mEnergy[i][j] = 0.;
00432 mHits[i][j]=0;
00433 }
00434 }
00435
00436
00437 Bool_t StEEmcA2EMaker::fillFromSt(const StEmcCollection *emc)
00438 {
00442 const StEmcDetector *detector=emc->detector(kEndcapEmcTowerId);
00443 if ( !detector )
00444 {
00445 Warning("fillFromSt","\n**********\nemc->detector() NULL for eemc towers. MAJOR PROBLEM, trying to procede.\n**********\n\n");
00446 return false;
00447 }
00448
00449 for ( UInt_t sec = 0; sec < detector -> numberOfModules(); sec++ )
00450 {
00451
00454 const StEmcModule *sector = detector -> module( sec+1 );
00455 if (!sector) {
00456 continue;
00457 }
00458 const StSPtrVecEmcRawHit &hits = sector->hits();
00459
00461 for ( UInt_t ihit=0; ihit<hits.size(); ihit++ )
00462 {
00463
00464 if (!hits[ihit]) {
00465 continue;
00466 }
00467
00470 Int_t isector = hits[ihit]->module() - 1;
00471 Int_t isubsector = hits[ihit]->sub() - 1;
00472 Int_t ietabin = hits[ihit]->eta() - 1;
00473 Int_t adc = hits[ihit]->adc();
00474 if (!((isector >= 0) && (isector < 12) && (isubsector >= 0) && (isubsector < 5) && (ietabin >= 0) && (ietabin < 12))) {
00475 continue;
00476 }
00477
00478 Int_t iphibin = 5 * isector + isubsector;
00479 Int_t index = 12 * iphibin + ietabin;
00480 if (!((iphibin >= 0) && (iphibin < 60) && (index >= 0) && (index < 720))) {
00481 continue;
00482 }
00483
00484 #if 0
00485 std::cout << "isector=" << isector
00486 << " isubsector=" << isubsector
00487 << " ietabin=" << ietabin
00488 << " " << hits[ihit]->module()
00489 << " " << hits[ihit]->sub()
00490 << " " << hits[ihit]->eta()
00491 << " " << hits[ihit]->adc()
00492 << std::endl;
00493 #endif
00494
00496 mTowers[index][0].stemc( hits[ihit] );
00497
00498
00504 addTowerHit(isector,isubsector,ietabin,(Float_t)adc,0);
00505
00506 }
00507
00508 }
00509
00510 #if 0
00512 for ( UInt_t ii=0; ii < mHitTowers.size(); ii++ )
00513 {
00514 std::cout << "mHitTowers[0][" << ii << "] "
00515 << mHitTowers[0][ii].sector() << " "
00516 << mHitTowers[0][ii].subsector() << " "
00517 << mHitTowers[0][ii].etabin() << " "
00518 << mHitTowers[0][ii].adc() << " "
00519 <<std::endl << " ====> "
00520 << mHitTowers[0][ii].stemc()
00521 << std::endl;
00522 }
00524 #endif
00525
00529
00530 detector=emc->detector(kEndcapEmcPreShowerId);
00531
00532 if ( !detector )
00533 {
00534 Warning("fillFromSt","\n**********\nemc->detector() NULL for eemc pre/post. MAJOR PROBLEM, trying to procede.\n**********\n\n");
00535 } else {
00536 for ( UInt_t sec = 0; sec < detector -> numberOfModules(); sec++ ) {
00537
00540 const StEmcModule *sector = detector -> module( sec+1 );
00541 const StSPtrVecEmcRawHit &hits = sector->hits();
00542
00544 for ( UInt_t ihit=0; ihit<hits.size(); ihit++ )
00545 {
00546
00547 if (!hits[ihit]) {
00548 continue;
00549 }
00550
00553 Int_t isector = hits[ihit]->module() - 1;
00554 Int_t isubsector = (hits[ihit]->sub() - 1) % 5;
00555 Int_t ietabin = hits[ihit]->eta() - 1;
00556 Int_t adc = hits[ihit]->adc();
00557
00558 Int_t ilayer = (hits[ihit]->sub() - 1) / 5 + 1;
00559 if (!((ilayer >= 1) && (ilayer < 4))) {
00560 continue;
00561 }
00562
00563 Int_t iphibin = 5*isector+isubsector;
00564 Int_t index = 12*iphibin + ietabin;
00565
00566 mTowers[index][ilayer].stemc( hits[ihit] );
00567
00570 addTowerHit( isector, isubsector, ietabin, (Float_t)adc, ilayer );
00571
00572 }
00573
00574 }
00575 }
00576
00580 StDetectorId ids[] = { kEndcapSmdUStripId, kEndcapSmdVStripId };
00582 for ( Int_t iplane=0; iplane<2; iplane++ )
00583 {
00584
00586 detector=emc->detector( ids[iplane] );
00587 if ( !detector ) {
00588 Warning("fillFromSt","\n**********\nemc->detector() NULL for esmd plane. MAJOR PROBLEM, trying to procede.\n**********\n\n");
00589 } else {
00590 for ( UInt_t sec = 0; sec < detector -> numberOfModules(); sec++ )
00591 {
00592
00595 const StEmcModule *sector = detector -> module( sec+1 );
00596 const StSPtrVecEmcRawHit &hits = sector->hits();
00597
00599 for ( UInt_t ihit=0; ihit<hits.size(); ihit++ )
00600 {
00601 Int_t isector=hits[ihit]->module()-1;
00602 Int_t istrip=hits[ihit]->eta()-1;
00603 Int_t adc =hits[ihit]->adc();
00604 if (!((isector >= 0) && (isector < 12) && (istrip >= 0) && (istrip < 288))) {
00605 continue;
00606 }
00607
00608 mStrips[isector][iplane][istrip].stemc( hits[ihit] );
00609
00611 addSmdHit( isector, iplane, istrip, (Float_t)adc);
00612
00613 }
00614
00615 }
00616 }
00617 }
00618 return true;
00619 }
00620
00621
00622 Float_t StEEmcA2EMaker::energy(Int_t layer) const
00623 {
00624 Float_t sum=0.;
00625 for ( Int_t sector=0;sector<12;sector++ ) sum+= energy(sector,layer);
00626 return sum;
00627 }
00628
00629
00630 StEEmcTower *StEEmcA2EMaker::tower(TVector3 &r, Int_t layer) {
00631 Int_t sec=-1,sub=-1,eta=-1;
00632 if ( !mEEgeom->getTower(r,sec,sub,eta) ) return NULL;
00633 return &mTowers[ index(sec,sub,eta) ][layer];
00634 }
00635
00636
00637 const StEEmcTower *StEEmcA2EMaker::tower(TVector3 &r, Int_t layer) const {
00638 Int_t sec=-1,sub=-1,eta=-1;
00639 if ( !mEEgeom->getTower(r,sec,sub,eta) ) return NULL;
00640 return &mTowers[ index(sec,sub,eta) ][layer];
00641 }