00001
00002
00003 #include <math.h>
00004 #include <assert.h>
00005
00006 #include <StMessMgr.h>
00007
00008 #include <StEventTypes.h>
00009 #include <StEvent.h>
00010
00011 #include <StDAQMaker/StEEMCReader.h>
00012
00013 #include <StEEmcUtil/database/StEEmcDb.h>
00014 #include <StEEmcUtil/database/EEmcDbItem.h>
00015 #include <StEEmcUtil/database/EEmcDbCrate.h>
00016
00017 #include <StEEmcUtil/EEfeeRaw/EEfeeDataBlock.h>
00018 #include "StMuDSTMaker/EZTREE/EztEmcRawData.h"
00019
00020 #include "StEemcRaw.h"
00021 #include "StEmcRawMaker.h"
00022 #include "DAQ_READER/daq_det.h"
00023 #include "DAQ_ETOW/daq_etow.h"
00024 #include "DAQ_ESMD/daq_esmd.h"
00025 #include "DAQ_EMC/daq_emc.h"
00026 #include "StChain/StRtsTable.h"
00027
00028 ClassImp(StEemcRaw)
00029
00030
00031 StEemcRaw::StEemcRaw()
00032 {
00033 mDb=0;
00034 memset(hs,0,sizeof(hs));
00035 }
00036
00037
00038 StEemcRaw::~StEemcRaw()
00039 {
00040 }
00041
00042
00043
00044
00045 Bool_t StEemcRaw::make(StEmcRawMaker* maker, StEvent* mEvent){
00046 if (hs[0])
00047 hs[0]->Fill(0);
00048
00049 StEmcRawData *eemcRaw = mEvent->emcCollection()->eemcRawData();
00050
00051 if(!maker || !mDb || ! eemcRaw )
00052 {
00053 gMessMgr->Message("","W") << GetName()<<"::makeEemc() , some pointers are ZERO, code is sick, chain should be aborted, no EEMC data processed,JB :" <<maker << mDb << eemcRaw <<endm;
00054 return false;
00055 }
00056
00057 if (hs[0])
00058 hs[0]->Fill(1);
00059
00060 if(! copyRawData(maker, eemcRaw) )
00061 return false;
00062
00063 if(hs[0])
00064 hs[0]->Fill(2);
00065
00066
00067 StL0Trigger* trg=mEvent->l0Trigger();
00068 if (! trg)
00069 {
00070 gMessMgr->Message("","W") << GetName()<<"::makeEemc() , l0Trigger data, EEMC not verified, abort all EEMC hits in StEvent EmcCollection, but raw data are saved" << endm;
00071 return false;
00072 }
00073
00074
00075 int token=trg->triggerToken();
00076
00077 int runId=mEvent->runId();
00078 int time=mEvent->time();
00079
00080 if( headersAreSick(maker, eemcRaw, token, runId, time) )
00081 return false;
00082 if (hs[0])
00083 hs[0]->Fill(3);
00084
00085 if( towerDataAreSick( eemcRaw))
00086 return false;
00087 if (hs[0])
00088 hs[0]->Fill(3);
00089
00090 raw2pixels(mEvent);
00091 return true;
00092
00093 }
00094
00095 Bool_t StEemcRaw::copyRawData(StEmcRawMaker* maker, StEmcRawData *raw)
00096 {
00097 StRtsTable* etow = maker->GetDaqElement("etow/adc");
00098 int nb=0;
00099 if(etow){
00100 etow_t* etowdata = (etow_t*)*etow->begin();
00101 for(int icr = 0; icr < ETOW_MAXFEE; icr++){
00102 nb++;
00103 const EEmcDbCrate *fiber = mDb->getFiber(icr);
00104
00105 raw->createBank(icr,fiber->nHead,fiber->nCh);
00106 for(int i = 0; i < fiber->nCh; i++){
00107 raw->setData(icr,i,etowdata->adc[icr][i]);
00108
00109 }
00110 for(int i = 0; i < fiber->nHead; i++){
00111 raw->setHeader(icr,i,etowdata->preamble[icr][i]);
00112
00113 }
00114 }
00115 }else{
00116 LOG_ERROR<<"ETOW Structure not found"<<endm;
00117 }
00118 StRtsTable* esmd = maker->GetDaqElement("esmd/adc");
00119 if(esmd){
00120 esmd_t* esmddata = (esmd_t*)*esmd->begin();
00121 for(int icr = 0; icr < ESMD_MAXFEE;icr++){
00122 nb++;
00123 int id = icr + ETOW_MAXFEE;
00124 const EEmcDbCrate *fiber = mDb->getFiber(id);
00125
00126 raw->createBank(id,fiber->nHead,fiber->nCh);
00127 for(int i = 0; i < fiber->nCh; i++){
00128 raw->setData(id,i,esmddata->adc[icr][i]);
00129
00130 }
00131 for(int i = 0; i < fiber->nHead; i++){
00132 raw->setHeader(id,i,esmddata->preamble[icr][i]);
00133
00134 }
00135 }
00136 }else{
00137 LOG_ERROR<<"ESMD Structure not found"<<endm;
00138 }
00139
00140 LOG_INFO << "StEemcRaw::copyRawData() "<<nb<<" data bloks copied" << endm;
00141 return true;
00142 }
00143
00144 Bool_t StEemcRaw::headersAreSick(StEmcRawMaker* maker, StEmcRawData *raw, int token, int runId, int time)
00145 {
00146 if (! raw)
00147 {
00148 gMessMgr->Message("","W") << "StEemcRaw::headersAreSick() no EEMC raw data" << endm;
00149 return true;
00150 }
00151
00152
00153 EEfeeDataBlock block;
00154
00155 int icr;
00156 int totErrBit=0;
00157 int nOn=0;
00158
00159 LOG_INFO << "StEemcRaw::headersAreSick() --> Nfibers=" << mDb->getNFiber() << endm;
00160
00161
00162
00163 for(icr=0;icr<mDb->getNFiber();icr++)
00164 {
00165 const EEmcDbCrate *fiber=mDb-> getFiber(icr);
00166 if(!fiber->useIt)
00167 continue;
00168
00169
00170
00171
00172 if(raw->sizeHeader(icr)<=0) {
00173 LOG_WARN <<Form("StEemcRaw::headersAreSick() sizeHeader(icr=%d)<=0, crID=%d, skip it\n",icr,fiber->crID)<<endm;
00174 continue;
00175 }
00176
00177
00178 int isOff=EztEmcRawData::isCrateOFF(raw->header(icr));
00179
00180 if(isOff)
00181 {
00182 mDb->setFiberOff(icr);
00183 LOG_WARN << "StEemcRaw::headersAreSick() detected icr="<<icr<< ", name="<<fiber->name<<" is OFF,\n this fiber will ignored till the end of this job" << endm;
00184 continue;
00185 }
00186 nOn++;
00187 block.clear();
00188 block.setHead(raw->header(icr));
00189
00190 int lenCount=fiber->nCh+fiber->nHead;
00191 int errFlag=0;
00192
00193 if(fiber->type=='T')
00194 lenCount+=32;
00195
00196 if(fiber->type=='S' && time<1104537600 && runId<6000000)
00197 errFlag=0x28;
00198
00199
00200
00201
00202
00203 int trigCommand=4;
00204 int sanity=block.isHeadValid(token,fiber->crIDswitch,lenCount,trigCommand,errFlag);
00205 if(0){
00206 block.print(1);
00207 cout<<(short)block.getCrateID()<<" "<<fiber->crIDswitch<<" :::: "<<block.getLenCount()<<" "<<lenCount<<" :::: "<<block.getTrigComm()<<" "<<trigCommand<<" :::: "<<block.getErrFlag()<<" "<<errFlag<<endl;
00208 }
00209
00210 int i;
00211 for(i=0;i<8;i++)
00212 {
00213 if(!(sanity&(1<<i)))
00214 continue;
00215 totErrBit++;
00216 int k=icr*10+i;
00217
00218 if (hs[3])
00219 hs[3]->Fill(k);
00220 }
00221 LOG_DEBUG << GetName()<<"::checkHeader("<<fiber->name<<"), errorCode="<<sanity<<endm;
00222 if(sanity) LOG_WARN << GetName()<<"::checkHeader("<<fiber->name<<"), errorCode="<<sanity<<endm;
00223 }
00224
00225 if (hs[4])
00226 hs[4]->Fill(totErrBit);
00227
00228 LOG_INFO<< GetName()<<"::checkHeader --> totErrBit "<<totErrBit<<" in "<<nOn<<" crates"<<endm;
00229 return totErrBit;
00230 }
00231
00235
00236 Bool_t StEemcRaw::make(StEEMCReader *eeReader, StEvent* mEvent){
00237
00238
00239 if (hs[0])
00240 hs[0]->Fill(0);
00241
00242 StEmcRawData *eemcRaw = mEvent->emcCollection()->eemcRawData();
00243
00244 if(!eeReader || !mDb || ! eemcRaw )
00245 {
00246 gMessMgr->Message("","W") << GetName()<<"::makeEemc() , some pointers are ZERO, code is sick, chain should be aborted, no EEMC data processed,JB :" <<eeReader << mDb << eemcRaw <<endm;
00247 return false;
00248 }
00249
00250 if (hs[0])
00251 hs[0]->Fill(1);
00252
00253 if(! copyRawData(eeReader, eemcRaw) )
00254 return false;
00255
00256 if(hs[0])
00257 hs[0]->Fill(2);
00258
00259
00260 StL0Trigger* trg=mEvent->l0Trigger();
00261 if (! trg)
00262 {
00263 gMessMgr->Message("","W") << GetName()<<"::makeEemc() , l0Trigger data, EEMC not verified, abort all EEMC hits in StEvent EmcCollection, but raw data are saved" << endm;
00264 return false;
00265 }
00266
00267
00268 int token=trg->triggerToken();
00269
00270 int runId=mEvent->runId();
00271 int time=mEvent->time();
00272
00273 if( headersAreSick(eeReader, eemcRaw, token, runId, time) )
00274 return false;
00275 if (hs[0])
00276 hs[0]->Fill(3);
00277
00278 if( towerDataAreSick( eemcRaw))
00279 return false;
00280 if (hs[0])
00281 hs[0]->Fill(3);
00282
00283 raw2pixels(mEvent);
00284 return true;
00285 }
00286
00287
00288
00289
00290 Bool_t StEemcRaw::copyRawData(StEEMCReader *eeReader, StEmcRawData *raw)
00291 {
00292 int nb=0;
00293 int icr;
00294 for(icr=0;icr<mDb->getNFiber();icr++)
00295 {
00296 const EEmcDbCrate *fiber=mDb-> getFiber(icr);
00297 if(!eeReader->isEemcBankIn(fiber->type))
00298 continue;
00299 nb++;
00300
00301 raw->createBank(icr,fiber->nHead,fiber->nCh);
00302 raw->setHeader(icr,eeReader->getEemcHeadBlock(fiber->fiber,fiber->type));
00303 raw->setData(icr,eeReader->getEemcDataBlock(fiber->fiber,fiber->type));
00304 }
00305 gMessMgr->Message("","I") << "StEemcRaw::copyRawData() "<<nb<<" data bloks copied" << endm;
00306 return true;
00307 }
00308
00309
00310
00311
00312
00313 Bool_t StEemcRaw::headersAreSick(StEEMCReader *eeReader, StEmcRawData *raw, int token, int runId, int time)
00314 {
00315
00316 if (! raw)
00317 {
00318 gMessMgr->Message("","W") << "StEemcRaw::headersAreSick() no EEMC raw data" << endm;
00319 return true;
00320 }
00321
00322
00323 EEfeeDataBlock block;
00324
00325 int icr;
00326 int totErrBit=0;
00327 int nOn=0;
00328
00329 LOG_INFO << "StEemcRaw::headersAreSick() --> Nfibers=" << mDb->getNFiber() << endm;
00330 LOG_INFO << "StEemcRaw::headersAreSick() --> isEemcBankIn('T')=" << eeReader->isEemcBankIn('T') << endm;
00331 LOG_INFO << "StEemcRaw::headersAreSick() --> isEemcBankIn('S')=" << eeReader->isEemcBankIn('S') << endm;
00332
00333 for(icr=0;icr<mDb->getNFiber();icr++)
00334 {
00335 const EEmcDbCrate *fiber=mDb-> getFiber(icr);
00336 if(!fiber->useIt)
00337 continue;
00338
00339 if (fiber->type == 'T' && !eeReader->isEemcBankIn('T')) continue;
00340 if (fiber->type == 'S' && !eeReader->isEemcBankIn('S')) continue;
00341
00342 if(raw->sizeHeader(icr)<=0) {
00343 gMessMgr->Message("","W") <<Form("StEemcRaw::headersAreSick() sizeHeader(icr=%d)<=0, crID=%d, skip it\n",icr,fiber->crID)<<endm;
00344 continue;
00345 }
00346
00347
00348 int isOff=EztEmcRawData::isCrateOFF(raw->header(icr));
00349
00350 if(isOff)
00351 {
00352 mDb->setFiberOff(icr);
00353 gMessMgr->Message("","W") << "StEemcRaw::headersAreSick() detected icr="<<icr<< ", name="<<fiber->name<<" is OFF,\n this fiber will ignored till the end of this job" << endm;
00354 continue;
00355 }
00356 nOn++;
00357 block.clear();
00358 block.setHead(raw->header(icr));
00359
00360 int lenCount=fiber->nCh+fiber->nHead;
00361 int errFlag=0;
00362
00363 if(fiber->type=='T')
00364 lenCount+=32;
00365
00366 if(fiber->type=='S' && time<1104537600 && runId<6000000)
00367 errFlag=0x28;
00368
00369
00370
00371
00372
00373 int trigCommand=4;
00374 int sanity=block.isHeadValid(token,fiber->crIDswitch,lenCount,trigCommand,errFlag);
00375
00376 int i;
00377 for(i=0;i<8;i++)
00378 {
00379 if(!(sanity&(1<<i)))
00380 continue;
00381 totErrBit++;
00382 int k=icr*10+i;
00383
00384 if (hs[3])
00385 hs[3]->Fill(k);
00386 }
00387 LOG_DEBUG << GetName()<<"::checkHeader("<<fiber->name<<"), errorCode="<<sanity<<endm;
00388 if(sanity) LOG_WARN << GetName()<<"::checkHeader("<<fiber->name<<"), errorCode="<<sanity<<endm;
00389 }
00390
00391 if (hs[4])
00392 hs[4]->Fill(totErrBit);
00393
00394 gMessMgr->Message("","I") << GetName()<<"::checkHeader --> totErrBit "<<totErrBit<<" in "<<nOn<<" crates"<<endm;
00395 return totErrBit;
00396 }
00397
00398
00399
00400
00401
00402 Bool_t StEemcRaw::towerDataAreSick(StEmcRawData* raw)
00403 {
00404 const int mxN256one=5;
00405 const int mxN256tot=40;
00406
00407 int nGhostTot=0, n256Tot=0;
00408 int icr;
00409 for(icr=0;icr<mDb->getNFiber();icr++)
00410 {
00411 const EEmcDbCrate *fiber=mDb-> getFiber(icr);
00412 if(!fiber->useIt)
00413 continue;
00414 if(fiber->type!='T')
00415 continue;
00416 const UShort_t* data=raw->data(icr);
00417
00418 int i;
00419 int nGhost=0, n256=0;
00420 for(i=0;i<raw->sizeData(icr);i++)
00421 {
00422 if((data[i] &0xff)==0 )
00423 n256++;
00424 if(i>=121 && data[i]>40)
00425 nGhost++;
00426 }
00427 nGhostTot+=nGhost;
00428 n256Tot+=n256;
00429 if(nGhost>0)
00430 {
00431 int k=icr*10+5;
00432 if (hs[3])
00433 hs[3]->Fill(k);
00434 }
00435 if(n256>mxN256one)
00436 {
00437 int k=icr*10+6;
00438 if (hs[3])
00439 hs[3]->Fill(k);
00440 }
00441
00442 }
00443
00444 if(hs[1])
00445 hs[1]->Fill(n256Tot);
00446 if(hs[2])
00447 hs[2]->Fill(nGhostTot);
00448
00449 gMessMgr->Message("","I") << GetName()<<"::checkTowerAdc-->total n256="<<n256Tot <<", nGhost="<<nGhostTot<<endm;
00450 if(nGhostTot>0)
00451 return true;
00452 if(n256Tot>mxN256tot)
00453 return true;
00454 return false;
00455 }
00456
00457
00458
00459
00460
00461 void StEemcRaw::raw2pixels(StEvent* mEvent)
00462 {
00463
00464 StEmcCollection* emcC =(StEmcCollection*)mEvent->emcCollection();
00465 if(emcC==0)
00466 {
00467 gMessMgr->Message("","W") << GetName()<<"::raw2pixels() no emc collection, skip"<<endm;
00468 return ;
00469 }
00470
00471 StEmcRawData* raw=emcC->eemcRawData();
00472 if (! raw)
00473 {
00474 gMessMgr->Message("","W") << "StEemcRaw::raw2pixels() no EEMC raw data" << endm;
00475 return;
00476 }
00477
00478
00479
00480 StEmcDetector* emcDet[kEndcapSmdVStripId+1];
00481 StDetectorId emcId[kEndcapSmdVStripId+1];
00482 memset(emcDet,0,sizeof(emcDet));
00483
00484 int det;
00485 for(det = kEndcapEmcTowerId; det<= kEndcapSmdVStripId; det++)
00486 {
00487 emcId[det] = StDetectorId(det);
00488 emcDet[det] = new StEmcDetector(emcId[det],MaxSectors);
00489 emcC->setDetector(emcDet[det]);
00490 }
00491
00492 gMessMgr->Message("","I") << GetName()<<"::raw2pixels() collections created"<<endm;
00493
00494
00495 int nDrop=0;
00496 int nMap=0;
00497 int nTow=0, nPre=0,nSmd=0;
00498 int icr;
00499 for(icr=0;icr<mDb->getNFiber();icr++)
00500 {
00501 const EEmcDbCrate *fiber=mDb-> getFiber(icr);
00502 if(!fiber->useIt)
00503 continue;
00504
00505 const UShort_t* data=raw->data(icr);
00506
00507
00508 for(int chan=0;chan<raw->sizeData(icr);chan++)
00509 {
00510 const EEmcDbItem *x=mDb->getByCrate(fiber->crID,chan);
00511 if(x==0)
00512 {
00513
00514 nDrop++;
00515 continue;
00516 }
00517
00518 int det = 0;
00519 char type=x->name[2];
00520 int sec=x->sec;
00521 int sub=1+x->sub-'A';
00522 int eta=x->eta;
00523
00524 int rawAdc=data[chan];
00525 float energy=123.456;
00526
00527 switch(type)
00528 {
00529 case 'T':
00530 det = kEndcapEmcTowerId;
00531 nTow++;
00532 break;
00533 case 'P':
00534 case 'Q':
00535 case 'R':
00536 sub+=5* (type-'P');
00537 det = kEndcapEmcPreShowerId;
00538 nPre++;
00539 break;
00540 case 'U':
00541 case 'V':
00542 sub=1;
00543 eta=x->strip;
00544 nSmd++;
00545 det = kEndcapSmdUStripId;
00546 if(type=='V')
00547 det = kEndcapSmdVStripId;
00548 break;
00549 default:
00550 continue;
00551 }
00552
00553
00554 if (! det)
00555 {
00556 gMessMgr->Message("","W") << "StEemcRaw::raw2pixels(), logic error2, skip" << endm;
00557 return;
00558 }
00559
00560
00561
00562 StEmcRawHit* h = new StEmcRawHit(emcId[det],sec,eta,sub,rawAdc,energy);
00563 emcDet[det]->addHit(h);
00564 nMap++;
00565
00566 }
00567 }
00568
00569
00570 gMessMgr->Message("","I") << GetName()<<"::raw2pixels() finished nDrop chan="<< nDrop<<",nMap="<< nMap<<",nTow="<<nTow <<",nPre="<<nPre <<", nSmd="<<nSmd <<endm;
00571
00572 }
00573
00574
00575
00576
00577
00578 void StEemcRaw::initHisto()
00579 {
00580
00581 hs[0]= new TH1F("EndcapHealth","raw data health; X: 0=nEve, 1=raw, 2=OKhead , 3=tower(No ghost/n256)",9,-1.5,7.5);
00582
00583 hs[1]= new TH1F("EndcapN256","No. of n256/eve, all header OK",100, -1.5,98.5);
00584 hs[2]= new TH1F("EndcapGhost","No. of tower nGhost/eve, all header OK, chan>119",100,-1.5,98.5);
00585
00586 hs[3]=new TH1F("EndcapCorrBytes","sanity, crates Tw cr=0-5, Mapmt cr=6-53, X= bits(cr)+ cr*10;bits: 0=crID, 1=token,2=len,3=trgCom,4=ErrFlg,5=Ghost,6=n256 ",540,-0.5,539.5);
00587
00588 hs[4]=new TH1F("EndcapCorrTot","total # of corruption bits in Headers per eve",220,-0.5,219.5);
00589
00590 return;
00591 }
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659 #if 0 // test of tower data storage
00660 {
00661 int det= kEndcapEmcTowerId;
00662 int eta,sub=1,sec=12;
00663 for(sec=1;sec<=12;sec++)
00664 for(sub=1;sub<=5;sub++)
00665 for(eta=1;eta<=12;eta++)
00666 {
00667 int adc=1000+ (eta-1) + (sub-1)*12 +(sec-1)*60;
00668 float ener=777;
00669 StEmcRawHit* h = new StEmcRawHit(emcId[det], sec,eta,sub,adc,ener);
00670 emcDet[det]->addHit(h);
00671 }
00672 }
00673 #endif
00674
00675
00676
00677 #if 0 // test of Pre/post data storage
00678 {
00679 int det= kEndcapEmcPreShowerId;
00680 int eta,sub,sec=12, pre=1;
00681 for(pre=1;pre<=3;pre++)
00682 for(sec=1;sec<=12;sec++)
00683 for(sub=1;sub<=5;sub++)
00684 for(eta=1;eta<=12;eta++)
00685 {
00686 int ssub=sub + 5*(pre-1);
00687 int adc= eta-1 + (sub-1)*12 +(sec-1)*60 +pre*1000;
00688 StEmcRawHit* h = new StEmcRawHit(emcId[det], sec,eta,ssub,adc);
00689 emcDet[det]->addHit(h);
00690 }
00691 }
00692 #endif
00693
00694
00695
00696 #if 0 // test of U-smd data storage
00697 {
00698 det = kEndcapSmdUStripId;
00699 int eta,sub=1,sec=12;
00700 for(sec=1;sec<=12;sec++)
00701 for(eta=1;eta<=288;eta++)
00702 {
00703 int adc= 1000 + eta-1 +(sec-1)*300;
00704 StEmcRawHit* h = new StEmcRawHit(emcId[det], sec,eta,sub,adc);
00705 emcDet[det]->addHit(h);
00706 }
00707 }
00708
00709 for(det = kEndcapEmcTowerId; det<= kEndcapSmdVStripId; det++)
00710 {
00711 StEmcDetector* emcDetX= emcC->detector( StDetectorId(det));
00712
00713 gMessMgr->Message("","I") <<" StEmcDetectorID="<< StDetectorId(det)<<" nHits="<<emcDetX->numberOfHits()<<endm;
00714 }
00715
00716
00717
00718 #endif
00719
00720
00721
00722 #if 0 // test of new access method
00723
00724 for(icr=0;icr<mDb->getNCrate();icr++)
00725 {
00726 const EEmcDbCrate *crate=mDb-> getCrate(icr);
00727 printf("geting data for fiber: ");
00728 crate->print();
00729
00730 printf("---- HEAD ----\n");
00731 for(ch=0;ch<crate->nHead;ch++)
00732 {
00733 int val=-1;
00734 val=steemcreader->getEemcHead(crate->fiber,ch,crate->type);
00735 printf("cr=%d ch=%d val=0x%04x\n",crate->crID,ch,val);
00736 }
00737
00738 printf("---- DATA ----\n");
00739 for(ch=0;ch<crate->nch;ch++)
00740 {
00741 int val=-1;
00742 val=steemcreader->getEemcData(crate->fiber,ch,type);
00743 printf("cr=%d ch=%d val=0x%04x\n",crate->crID,ch,val);
00744 }
00745
00746 }
00747 #endif
00748
00749