00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "StMtdHitMaker.h"
00017 #include "StEventTypes.h"
00018 #include "StEvent/StMtdCollection.h"
00019 #include "StEvent/StMtdHeader.h"
00020 #include "StEvent/StMtdRawHit.h"
00021 #include "StEvent/StEvent.h"
00022 #include "StDAQMaker/StDAQReader.h"
00023 #include "StRtsTable.h"
00024 #include "DAQ_MTD/daq_mtd.h"
00025 #include "StBTofUtil/StBTofINLCorr.h"
00026
00027 ClassImp(StMtdHitMaker);
00028
00029
00030 StMtdHitMaker::StMtdHitMaker(const char *name):StRTSBaseMaker("mtd",name)
00031 , mStEvent(0),fMtd(0)
00032 , mNValidTrays(-1)
00033 , mMtdCollection(0)
00034 {
00035 LOG_DEBUG << "StMtdHitMaker::ctor" << endm;
00036 }
00037
00038
00039
00040 StMtdHitMaker::~StMtdHitMaker()
00041 { }
00042
00043
00044
00045 void StMtdHitMaker::Clear(Option_t* option) {
00046 MtdLeadingHits.clear();
00047 MtdTrailingHits.clear();
00048 memset(mTriggerTimeStamp,0,2);
00049 }
00050
00051
00052
00053 Int_t StMtdHitMaker::Init() {
00054 Clear("");
00056 memset(mTray2TdigMap,-1,sizeof(mTray2TdigMap));
00057 memset(mTrayId,0,sizeof(mTrayId));
00058 memset(mTdigId,0,sizeof(mTdigId));
00059
00060 return kStOK;
00061 }
00062
00063
00064
00065 Int_t StMtdHitMaker::InitRun(Int_t runnumber) {
00067 mYear= (Int_t)runnumber/1e6 -1 ;
00068
00070 if (mYear == 12){
00073 mTray2TdigMap[25][1] = 0;
00074 mTray2TdigMap[25][2] = 1;
00075 mTray2TdigMap[25][3] = 4;
00076
00077 mTray2TdigMap[26][0] = 0;
00078 mTray2TdigMap[26][1] = 1;
00079 mTray2TdigMap[26][2] = 2;
00080 mTray2TdigMap[26][3] = 5;
00081 mTray2TdigMap[26][4] = 4;
00082
00083 mTray2TdigMap[27][0] = 0;
00084 mTray2TdigMap[27][1] = 1;
00085 mTray2TdigMap[27][2] = 2;
00086 mTray2TdigMap[27][3] = 5;
00087 mTray2TdigMap[27][4] = 4;
00088
00090 mTrayId[25][1] = 200;
00091 mTrayId[25][2] = 211;
00092 mTrayId[25][3] = 210;
00093
00094 mTrayId[26][0] = 212;
00095 mTrayId[26][1] = 207;
00096 mTrayId[26][2] = 206;
00097 mTrayId[26][3] = 204;
00098 mTrayId[26][4] = 209;
00099
00100 mTrayId[27][0] = 208;
00101 mTrayId[27][1] = 205;
00102 mTrayId[27][2] = 202;
00103 mTrayId[27][3] = 201;
00104 mTrayId[27][4] = 203;
00105
00108 Int_t mTdigIdRun12[13] = { 494, 1150, 1151, 1152, 1153, 1141, 1143, 1149, 1155, 1134, 1136, 1140, 1145};
00109 for (int i=0;i<13;i++) mTdigId[i]=mTdigIdRun12[i];
00110 }
00111 else
00112 LOG_INFO << "No InitRun for Run " << mYear << endm;
00113
00115 LOG_DEBUG << "Initializing INL table:" << endm;
00116 mINLCorr = new StBTofINLCorr();
00117 mINLCorr->initFromDbase(this);
00118
00119 return kStOK;
00120 }
00121
00122
00123
00124 Int_t StMtdHitMaker::FinishRun(Int_t runnumber) {
00126 memset(mTray2TdigMap,-1,sizeof(mTray2TdigMap));
00127 memset(mTrayId,0,sizeof(mTrayId));
00128 memset(mTdigId,0,sizeof(mTdigId));
00129
00130 if(mINLCorr) delete mINLCorr;
00131 mINLCorr = 0;
00132
00133 return kStOK;
00134 }
00135
00136
00137
00138 Int_t StMtdHitMaker::Finish() {
00139 Clear("");
00140 return kStOK;
00141 }
00142
00143
00144
00150 StMtdCollection *StMtdHitMaker::GetMtdCollection() {
00152 StMtdCollection *mtdCollection = 0;
00153 mStEvent = dynamic_cast<StEvent *> (GetInputDS("StEvent"));
00154
00155 if (mStEvent) {
00156 mtdCollection = mStEvent->mtdCollection();
00157
00159 if ( !mtdCollection ) {
00161 mtdCollection = new StMtdCollection();
00162 mStEvent->setMtdCollection(mtdCollection);
00163 }
00164 }
00165 else {LOG_WARN << "No StEvent found" << endm; }
00166
00167 return mtdCollection;
00168 }
00169
00170
00171
00172 StRtsTable *StMtdHitMaker::GetNextRaw(int sec) {
00173 assert(0 && "RTS doesn't provide sector by sector legacy mtd banks yet");
00174 StRtsTable *daqMtdTable = GetNextLegacy(sec);
00175 if (daqMtdTable) {
00176 fMtd = (mtd_t*)*DaqDta()->begin();
00177 }
00178 return daqMtdTable;
00179 }
00180
00181
00182
00183 StRtsTable *StMtdHitMaker::GetNextRaw() {
00185 LOG_DEBUG << "GetNextRaw()" << endm;
00186
00187 StRtsTable *daqMtdTable = GetNextLegacy();
00188 if (daqMtdTable) {
00189 fMtd = (mtd_t*)*DaqDta()->begin();
00190 }
00191 return daqMtdTable;
00192 }
00193
00194
00195
00196 Int_t StMtdHitMaker::Make() {
00197 mMtdCollection = GetMtdCollection();
00198 LOG_DEBUG << " getting the mtd collection " << mMtdCollection << endm;
00199 if (mMtdCollection) {
00200 if ( GetNextRaw() ) {
00202 int errorType=UnpackMtdRawData();
00203 if(errorType>0) {
00204 LOG_WARN<<"MTD_READER::Unpack MTD Data ERROR!"<<endm;
00205 }
00206 fillMtdRawHitCollection();
00207 fillMtdHeader();
00208 fillMtdHitCollection();
00209 fillStEvent();
00210 }
00211 }
00212 return kStOk;
00213 }
00214
00215
00216
00221
00222 Int_t StMtdHitMaker::UnpackMtdRawData() {
00223 if(!fMtd) return 1;
00224
00226 MtdLeadingHits.clear();
00227 MtdTrailingHits.clear();
00228
00229 const int nTHUB=1;
00231 for(int ifib=0;ifib<nTHUB;ifib++){
00232 int nword=fMtd->ddl_words[ifib];
00233 if(nword <= 0) continue;
00234 int halfbacklegid = -99;
00235 int backlegid = -99;
00236 mTriggerTimeStamp[ifib] = 0;
00237
00238 LOG_DEBUG << "RDO " << ifib+1 << ": words " << fMtd->ddl_words[ifib] << endm;
00239
00241 for (int iword=0;iword<nword;iword++) {
00242 unsigned int dataword=fMtd->ddl[ifib][iword];
00243 LOG_DEBUG << "DATAWORD: 0x" << hex << dataword << dec << endm;
00244
00246 if( (dataword&0xF0000000)>>28 == 0x2) {
00247
00248 if(mTriggerTimeStamp[ifib]==0) mTriggerTimeStamp[ifib] = dataword;
00249 continue;
00250 }
00251
00252 if( (dataword&0xF0000000)>>28 == 0xD) continue;
00253 if( (dataword&0xF0000000)>>28 == 0xE) continue;
00254 if( (dataword&0xF0000000)>>28 == 0xA) continue;
00255
00257 if( (dataword&0xF0000000)>>28 == 0xC) {
00258 halfbacklegid = dataword&0x01;
00259 backlegid = (dataword&0x0FE)>>1;
00260 continue;
00261 }
00262
00263 if(halfbacklegid<0) continue;
00264 if(backlegid<1 || backlegid >124) {
00265 LOG_ERROR<<"StMtdHitMaker::DATA ERROR!! unexpected backlegID ! "<<endm;
00266 continue;
00267 }
00268
00269
00270 if( (dataword&0xF0000000)>>28 == 0x6) continue;
00271
00273 int edgeid =int( (dataword & 0xF0000000)>>28 );
00274 if((edgeid !=4) && (edgeid!=5)) continue;
00275
00277
00279 int tdcid=(dataword & 0x0F000000)>>24;
00280
00282 int tdigid=((tdcid & 0xC)>>2) + halfbacklegid*4;
00283
00285 int tdcchan=(dataword&0x00E00000)>>21;
00286
00288 unsigned int timeinbin = ((dataword&0x7ffff)<<2)+((dataword>>19)&0x03);
00289
00290
00292 int itray;
00293 for (itray=1;itray<=5;itray++){
00294 if (mTray2TdigMap[backlegid-1][itray-1] == tdigid) break;
00295 }
00296
00298 MtdRawHit temphit={0};
00299 memset(&temphit,0,sizeof(temphit));
00300 temphit.fiberid = (UChar_t)ifib;
00301 temphit.backlegID = (UChar_t)backlegid;
00302 temphit.tdc = timeinbin;
00304 if (mYear<12)
00305 temphit.globaltdcchan = (UChar_t)(tdcChan2globalStrip11(tdigid,tdcid,tdcchan,backlegid));
00306 else
00307 temphit.globaltdcchan = (UChar_t)(tdcChan2globalStrip(itray, tdigid,tdcid,tdcchan));
00308 temphit.dataword = dataword;
00309
00310 if(edgeid == 4) {
00311 MtdLeadingHits.push_back(temphit);
00312 } else if (edgeid==5){
00313 MtdTrailingHits.push_back(temphit);
00314 } else {
00315 LOG_WARN<<"StMtdHitMaker::Unknown TDC data type ! "<<endm;
00316 continue;
00317 }
00319 }
00320
00321 }
00322
00323 return -1;
00324 }
00325
00326
00327
00331 Int_t StMtdHitMaker::tdcChan2globalStrip(int itray, int tdigBoardId, int tdcId, int tdcChan) {
00332
00334 if (mYear<12){
00335 LOG_WARN << "calling Run12++ tdc mapping for Run" << mYear << ". Not good." << endm;
00336 }
00337
00338 Int_t globalStripId=-1;
00339 int Hnum=tdcId%4+1;
00340 int globalTdcChan=Hnum*10+tdcChan;
00341 int mtdStrip[24]={21,12,32,20,14,35,25,13,30,24,11,31,
00342 34,22,10,37,27,17,33,23,16,36,26,15};
00343 for(int i=0;i<24;i++){
00344 if(mtdStrip[i]==globalTdcChan) {globalStripId=i+1;break;}
00345 }
00346 if(tdigBoardId>3)
00347 globalStripId = (globalStripId>12)? globalStripId-12:globalStripId+12;
00348
00350 globalStripId += (itray-1)*24;
00351
00352 return globalStripId;
00353 }
00354
00355
00356
00360 Int_t StMtdHitMaker::tdcChan2globalStrip11(int tdigBoardId,int tdcId,int tdcChan,int backLegId) {
00361
00363 if (mYear>11) {
00364 LOG_WARN << "calling pre-Run12 tdc mapping for Run" << mYear << ". Not good." << endm;
00365 }
00366
00368 Int_t globalStripId=-1;
00369 if(backLegId==26){
00370 if (tdcId>3) tdcId=tdcId-4;
00371 int globalTdcChan=(tdcId+1)*10+tdcChan;
00372 int mtdStrip[24]={34,22,10,37,27,17,33,23,16,36,26,15,
00373 21,12,32,20,14,35,25,13,30,24,11,31};
00374 for(int i=0;i<24;i++){
00375 if(mtdStrip[i]==globalTdcChan) {globalStripId=i+1; break;}
00376 }
00377 }
00378
00379 if(backLegId==1){
00380 int globalTdcChan=(tdcId+1)*10+tdcChan;
00381 int mtdStrip[18]= {34,22,10,37,27,17, 32,20,30,24,11,31, 33,23,16,36,26,15};
00382 for(int i=0;i<18;i++){
00383 if(mtdStrip[i]==globalTdcChan) {globalStripId=i+1;break;}
00384 }
00385 }
00386
00387 return globalStripId;
00388 }
00389
00393 void StMtdHitMaker::fillMtdRawHitCollection() {
00395 for (unsigned int i=0;i<MtdLeadingHits.size();i++){
00396 char flag = (+1)*(MtdLeadingHits[i].fiberid+1);
00397 unsigned char backlegid = MtdLeadingHits[i].backlegID;
00398 unsigned char chn = MtdLeadingHits[i].globaltdcchan;
00399 unsigned int tdc = MtdLeadingHits[i].tdc;
00400 LOG_DEBUG << " mtd raw hit LE flag:" << (short)flag << " backlegid:"<< (short)backlegid << " chn:" << (short)chn << " tdc:"<< tdc << endm;
00401 mMtdCollection->addRawHit(new StMtdRawHit(flag,backlegid,chn,tdc));
00402 }
00403
00404 for (unsigned int i=0;i<MtdTrailingHits.size();i++){
00405 char flag = (-1)*(MtdTrailingHits[i].fiberid+1);
00406 unsigned char backlegid = MtdTrailingHits[i].backlegID;
00407 unsigned char chn = MtdTrailingHits[i].globaltdcchan;
00408 unsigned int tdc = MtdTrailingHits[i].tdc;
00409 LOG_DEBUG << " mtd raw hit TE flag:" << (short)flag << " backlegid:"<< (short)backlegid << " chn:" << (short)chn << " tdc:"<< tdc << endm;
00410 mMtdCollection->addRawHit(new StMtdRawHit(flag,backlegid,chn,tdc));
00411 }
00412 }
00413
00414
00415
00419 void StMtdHitMaker::fillMtdHeader() {
00421 StMtdHeader *mtdHeader = new StMtdHeader();
00422 const int nTHUB=1;
00423 for(int i=0;i<nTHUB;i++){
00424 mtdHeader->setTriggerTime(mTriggerTimeStamp[i], i);
00425 LOG_DEBUG << "Trigger Time Stamp "<< i+1 <<": " << (unsigned int)mTriggerTimeStamp[i] << endm;
00426 }
00427
00428 mMtdCollection->setHeader(mtdHeader);
00429 }
00430
00431
00432
00436 void StMtdHitMaker::fillMtdHitCollection() {
00437
00438
00439
00440
00441 }
00442
00443
00444
00448 void StMtdHitMaker::fillStEvent() {
00449
00450 LOG_DEBUG << "fillStEvent() Starting..." << endm;
00451
00453 if(!mMtdCollection){
00454 LOG_WARN << "No MtdCollection ... creating one in StEvent" << endm;
00455 mMtdCollection = new StMtdCollection();
00456 mStEvent->setMtdCollection(mMtdCollection);
00457 }
00458
00459
00460 StMtdCollection* mtdCollection = mStEvent->mtdCollection();
00461 if(mtdCollection){
00462 if(mtdCollection->rawHitsPresent()) {
00463 StSPtrVecMtdRawHit& rawMtdVec = mtdCollection->mtdRawHits();
00464 LOG_INFO << "MtdRawHitCollection: " << rawMtdVec.size() << " entries" << endm;
00465 if(Debug()) {
00466 for(size_t i=0;i<rawMtdVec.size();i++) {
00467 LOG_DEBUG << (*rawMtdVec[i]) << endm;
00468 }
00469 }
00470 }
00471 else {
00472 LOG_INFO << "No MtdRawHitCollection" << endm;
00473 }
00474
00475 if(mtdCollection->hitsPresent()) {
00476 StSPtrVecMtdHit& mtdVec = mtdCollection->mtdHits();
00477 LOG_INFO << "MtdHitCollection: " << mtdVec.size() << " entries..." << endm;
00478 if(Debug()) {
00479 for(size_t i=0;i<mtdVec.size();i++) {
00480 LOG_DEBUG << (*mtdVec[i]) << endm;
00481 }
00482 }
00483 }
00484 else {
00485 LOG_INFO << "No MtdHitCollection" << endm;
00486 }
00487
00488 }
00489 else {
00490 LOG_WARN << "No MtdCollection" << endm;
00491 LOG_INFO << "No MtdRawHitCollection" << endm;
00492 LOG_INFO << "No MtdHitCollection" << endm;
00493 }
00494 }