00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #include <assert.h>
00043 #include "TOF_Reader.hh"
00044 #include "StMessMgr.h"
00045 #include "TString.h"
00046
00047 using namespace OLDEVP;
00048
00049 bool TOF_Reader::year2Data(){return (mTofRawDataVersion==1);}
00050 bool TOF_Reader::year3Data(){return (mTofRawDataVersion==2);}
00051 bool TOF_Reader::year4Data(){return (mTofRawDataVersion==3);}
00052
00053 bool TOF_Reader::year5Data(){return (mTofRawDataVersion==0);}
00054
00055 void TOF_Reader::ProcessEvent(const Bank_TOFP * TofPTR) {
00056
00057 int unpackerr=0;
00058 if(year2Data()||year3Data()||year4Data()) {
00059 unpackerr=UnpackYear2to4Data(TofPTR);
00060 if(unpackerr>0) LOG_INFO<<"TOF_READER::UnPack Year2-4 data ERROR!"<<endm;
00061 }
00062
00063 if(year5Data()){
00064 unpackerr=UnpackYear5Data(TofPTR);
00065 if(unpackerr>0) LOG_INFO<<"TOF_READER::UnPack Year5 Data ERROR!"<<endm;
00066 }
00067
00068 }
00069
00070
00071 TOF_Reader::TOF_Reader(EventReader *er, Bank_TOFP *pTOFP)
00072 {
00073 pBankTOFP = pTOFP;
00074 ercpy = er;
00075 if (!pBankTOFP->test_CRC()) {
00076 LOG_DEBUG << Form("CRC error in TOFP: %s %d",__FILE__,__LINE__) << endm;
00077 }
00078 if (pBankTOFP->swap() < 0) {
00079 LOG_DEBUG << Form("swap error in TOFP: %s %d",__FILE__,__LINE__) << endm;
00080 }
00081
00082 pBankTOFP->header.CRC = 0;
00083 int Token = pBankTOFP->header.Token;
00084 Bank_DATAP *dp = (Bank_DATAP *)ercpy->getDATAP();
00085 if(Token !=dp->header.Token){
00086 LOG_DEBUG << Form("Token mismatch between global %d and TOF %d",dp->header.Token,Token) << endm;
00087 }
00088
00089 mTofRawDataVersion = pBankTOFP->header.FormatNumber;
00090
00091
00092 if (year2Data()){
00093 mMaxAdcChannels=48;
00094 mMaxTdcChannels=48;
00095 }
00096 else if (year3Data()) {
00097 mMaxAdcChannels=48+12+72;
00098 mMaxTdcChannels=48+72;
00099 }
00100 else {
00101 mMaxAdcChannels=TOF_MAX_ADC_CHANNELS;
00102 mMaxTdcChannels=TOF_MAX_TDC_CHANNELS;
00103 }
00104 mMaxScaChannels = TOF_MAX_SCA_CHANNELS;
00105 mMaxA2dChannels = TOF_MAX_A2D_CHANNELS;
00106
00107 ProcessEvent(pBankTOFP);
00108 }
00109
00110
00111 unsigned short TOF_Reader::GetAdc(int daqId){
00112 if ((daqId<0) || (daqId>mMaxAdcChannels-1)){
00113 LOG_INFO << "TOF_Reader::GetAdc slatId out of range " << daqId << endm;
00114 return 0;
00115 }
00116 return mTheTofArray.AdcData[daqId];
00117 }
00118 unsigned short TOF_Reader::GetAdcFromSlat(int slatId){return GetAdc(slatId);}
00119
00120
00121 unsigned short TOF_Reader::GetTdc(int daqId){
00122 if ((daqId<0) || (daqId>mMaxTdcChannels-1)){
00123 LOG_INFO << "TOF_Reader::GetTdc daqId out of range " << daqId << endm;
00124 return 0;
00125 }
00126 return mTheTofArray.TdcData[daqId];
00127 }
00128
00129 unsigned short TOF_Reader::GetTdcFromSlat(int slatId){return GetTdc(slatId);}
00130
00131
00132 unsigned short TOF_Reader::GetTofpAdc(int slatId){
00133 if ((slatId<0) || (slatId>41)){
00134 LOG_INFO << "TOF_Reader::GetTofpAdc slatId out of range " << slatId << endm;
00135 return 0;
00136 }
00137 return mTheTofArray.AdcData[slatId];
00138 }
00139
00140
00141 unsigned short TOF_Reader::GetTofpTdc(int slatId){
00142 if ((slatId<0) || (slatId>41)){
00143 LOG_INFO << "TOF_Reader::GetTofpTdc slatId out of range " << slatId << endm;
00144 return 0;
00145 }
00146 return mTheTofArray.TdcData[slatId];
00147 }
00148
00149
00150 unsigned short TOF_Reader::GetTofrAdc(int padId){
00151 if (year2Data()){
00152 LOG_INFO << "TOF_Reader: TOFr ADC data not available for year2 data" << endm;
00153 return 0;
00154 }
00155 if (year3Data()) {
00156 if((padId<0) || (padId>71)) {
00157 LOG_INFO << "TOF_Reader::GetTofrAdc padId out of range " << padId << endm;
00158 return 0;
00159 }
00160 }
00161 if (year4Data()) {
00162 if ((padId<0) || (padId>119)){
00163 LOG_INFO << "TOF_Reader::GetTofrAdc padId out of range " << padId << endm;
00164 return 0;
00165 }
00166 }
00167 return mTheTofArray.AdcData[60+padId];
00168 }
00169
00170
00171 unsigned short TOF_Reader::GetTofrTdc(int padId){
00172 if (year2Data()){
00173 LOG_INFO << "TOF_Reader: TOFr TDC data not available for year2 data" << endm;
00174 return 0;
00175 }
00176 if (year3Data()) {
00177 if((padId<0) || (padId>71)) {
00178 LOG_INFO << "TOF_Reader::GetTofrTdc padId out of range " << padId << endm;
00179 return 0;
00180 }
00181 return mTheTofArray.TdcData[48+padId];
00182 }
00183 if (year4Data()) {
00184 if ((padId<0) || (padId>119)){
00185 LOG_INFO << "TOF_Reader::GetTofrTdc padId out of range " << padId << endm;
00186 return 0;
00187 }
00188 int offset = 0;
00189 if(padId<24) {
00190 offset = 0;
00191 } else if(padId<48) {
00192 offset = 2;
00193 } else if(padId<72) {
00194 offset = 4;
00195 } else {
00196 offset = 8;
00197 }
00198 return mTheTofArray.TdcData[48+offset+padId];
00199 }
00200 assert(0); return 0;
00201 }
00202
00203 unsigned short TOF_Reader::GetTofrTOT(int totId){
00204 if(year2Data()||year3Data()) {
00205 LOG_INFO << "TOF_Reader:: TOFr TOT data not available for year3 and year3 data" << endm;
00206 return 0;
00207 }
00208 if((totId<0) || (totId>9)) {
00209 LOG_INFO << "TOF_Reader::GetTofrTOT totId out of range " << totId << endm;
00210 }
00211 unsigned short tdcId[10] = {72, 73, 98, 99, 124, 125, 176, 177, 178, 179};
00212
00213 return mTheTofArray.TdcData[tdcId[totId]];
00214 }
00215
00216 unsigned short TOF_Reader::GetPvpdAdc(int pvpdId){
00217 if ((pvpdId<0) || (pvpdId>5)){
00218 LOG_INFO << "TOF_Reader::GetPvpdAdc pvpdId out of range " << pvpdId << endm;
00219 return 0;
00220 }
00221 return mTheTofArray.AdcData[43+pvpdId];
00222 }
00223
00224
00225 unsigned short TOF_Reader::GetPvpdAdcHigh(int pvpdId){
00226 if (year2Data()){
00227 LOG_INFO << "TOF_Reader: pVPD high gain data not available for year2 data" << endm;
00228 return 0;
00229 }
00230 if ((pvpdId<0) || (pvpdId>5)){
00231 LOG_INFO << "TOF_Reader::GetPvpdAdcHigh pvpdId out of range " << pvpdId << endm;
00232 return 0;
00233 }
00234 return mTheTofArray.TdcData[54+pvpdId];
00235 }
00236
00237 unsigned short TOF_Reader::GetPvpdTdc(int pvpdId){
00238 if ((pvpdId<0) || (pvpdId>5)){
00239 LOG_INFO << "TOF_Reader::GetPvpdTdc pvpdId out of range " << pvpdId << endm;
00240 return 0;
00241 }
00242 return mTheTofArray.TdcData[43+pvpdId];
00243 }
00244
00245 unsigned short TOF_Reader::GetClockAdc(){return mTheTofArray.AdcData[42];}
00246
00247
00248 short TOF_Reader::GetTc(int chanId){
00249 if ((chanId<0) || (chanId>mMaxA2dChannels-1)){
00250 LOG_INFO << "TOF_Reader::GetTc chanId out of range " << chanId << endm;
00251 return 0;
00252 }
00253 return mTheTofArray.A2dData[chanId];
00254 }
00255
00256
00257 unsigned short TOF_Reader::GetSc(int chanId){
00258 if ((chanId<0) || (chanId>mMaxScaChannels-1)){
00259 LOG_INFO << "TOF_Reader::GetSc chanId out of range " << chanId << endm;
00260 return 0;
00261 }
00262 return mTheTofArray.ScaData[chanId];
00263 }
00264
00265
00266 unsigned int TOF_Reader::GetEventNumber(){
00267 return mTheTofArray.EventNumber;
00268 }
00269
00270 void TOF_Reader::printRawData(){
00271 LOG_INFO << "StDaqLib/TOF/TOF_Reader Printing Raw Data...";
00272 LOG_INFO << "\n --- ADCD: ";
00273 for (int i=0;i<mMaxAdcChannels;i++) LOG_INFO << " " << mTheTofArray.AdcData[i];
00274 LOG_INFO << "\n --- TDCD: ";
00275 for (int i=0;i<mMaxTdcChannels;i++) LOG_INFO << " " << mTheTofArray.TdcData[i];
00276 LOG_INFO << "\n --- A2DD: ";
00277 for (int i=0;i<mMaxA2dChannels;i++) LOG_INFO << " " << mTheTofArray.A2dData[i];
00278 LOG_INFO << "\n --- SCAD: ";
00279 for (int i=0;i<mMaxScaChannels;i++) LOG_INFO << " " << mTheTofArray.ScaData[i];
00280 LOG_INFO << "\nStDaqLib/TOF/TOF_Reader Done Printing Raw Data..." << endm;
00281 }
00282
00283
00284
00285 unsigned int TOF_Reader::GetLdTdc(int daqId){
00286 if ((daqId<0) || (daqId>mMaxTdcChannels-1)){
00287 LOG_INFO << "TOF_Reader::GetTdc daqId out of range " << daqId << endm;
00288 return 0;
00289 }
00290 return mTheTofArray.LdTdcData[daqId];
00291 }
00292
00293 unsigned int TOF_Reader::GetTrTdc(int daqId){
00294 if ((daqId<0) || (daqId>mMaxTdcChannels-1)){
00295 LOG_INFO << "TOF_Reader::GetTdc daqId out of range " << daqId << endm;
00296 return 0;
00297 }
00298 return mTheTofArray.TrTdcData[daqId];
00299 }
00300
00301 unsigned int TOF_Reader::GetLdmTdc(int daqId,int n){
00302 if ((daqId<0) || (daqId>mMaxTdcChannels-1)){
00303 LOG_INFO << "TOF_Reader::GetTdc daqId out of range " << daqId << endm;
00304 return 0;
00305 }
00306 int chan=0;
00307 for(unsigned int i=0;i<mTheTofArray.TofLeadingHits.size();i++){
00308 chan = mTheTofArray.TofLeadingHits[i].globaltdcchan;
00309 if(chan == daqId) break;
00310 }
00311 return mTheTofArray.TofLeadingHits[chan+n].tdc;
00312 }
00313
00314 unsigned int TOF_Reader::GetTrmTdc(int daqId,int n){
00315 if ((daqId<0) || (daqId>mMaxTdcChannels-1)){
00316 LOG_INFO << "TOF_Reader::GetTdc daqId out of range " << daqId << endm;
00317 return 0;
00318 }
00319 int chan=0;
00320 for(unsigned int i=0;i<mTheTofArray.TofTrailingHits.size();i++){
00321 chan = mTheTofArray.TofTrailingHits[i].globaltdcchan;
00322 if(chan == daqId) break;
00323 }
00324 return mTheTofArray.TofTrailingHits[chan+n].tdc;
00325 }
00326
00327 unsigned short TOF_Reader::GetNLdHits(int daqId){
00328 if ((daqId<0) || (daqId>mMaxTdcChannels-1)){
00329 LOG_INFO << "TOF_Reader::GetTdc daqId out of range " << daqId << endm;
00330 return 0;
00331 }
00332 return mTheTofArray.LdNHit[daqId];
00333 }
00334
00335 unsigned short TOF_Reader::GetNTrHits(int daqId){
00336 if ((daqId<0) || (daqId>mMaxTdcChannels-1)){
00337 LOG_INFO << "TOF_Reader::GetTdc daqId out of range " << daqId << endm;
00338 return 0;
00339 }
00340 return mTheTofArray.TrNHit[daqId];
00341 }
00342
00343 unsigned int TOF_Reader::GetPvpdLdTdc(int pvpdId){
00344 if ((pvpdId<0) || (pvpdId>5)){
00345 LOG_INFO << "TOF_Reader::GetPvpdTdc pvpdId out of range " << pvpdId << endm;
00346 return 0;
00347 }
00348 return mTheTofArray.LdTdcData[192+pvpdId];
00349 }
00350
00351 unsigned int TOF_Reader::GetPvpdTrTdc(int pvpdId){
00352 if ((pvpdId<0) || (pvpdId>5)){
00353 LOG_INFO << "TOF_Reader::GetPvpdTdc pvpdId out of range " << pvpdId << endm;
00354 return 0;
00355 }
00356 return mTheTofArray.TrTdcData[192+pvpdId];
00357 }
00358
00359 unsigned int TOF_Reader::GetPvpdLdmTdc(int daqId,int n){
00360 if ((daqId<0) || (daqId>5)){
00361 LOG_INFO << "TOF_Reader::GetPvpdTdc daqId out of range " << daqId << endm;
00362 return 0;
00363 }
00364 int chan=0;
00365 for(unsigned int i=0;i<mTheTofArray.TofLeadingHits.size();i++){
00366 chan = mTheTofArray.TofLeadingHits[i].globaltdcchan;
00367 if(chan-192 == daqId) break;
00368 }
00369 return mTheTofArray.TofLeadingHits[chan+n].tdc;
00370 }
00371
00372 unsigned int TOF_Reader::GetPvpdTrmTdc(int daqId,int n){
00373 if ((daqId<0) || (daqId>5)){
00374 LOG_INFO << "TOF_Reader::GetPvpdTdc daqId out of range " << daqId << endm;
00375 return 0;
00376 }
00377 int chan=0;
00378 for(unsigned int i=0;i<mTheTofArray.TofTrailingHits.size();i++){
00379 chan = mTheTofArray.TofTrailingHits[i].globaltdcchan;
00380 if(chan-192 == daqId) break;
00381 }
00382 return mTheTofArray.TofTrailingHits[chan+n].tdc;
00383 }
00384
00385 unsigned int TOF_Reader::GetNLeadingHits() {
00386 return (unsigned int)(mTheTofArray.TofLeadingHits.size());
00387 }
00388
00389 unsigned int TOF_Reader::GetLeadingEventNumber(int ihit) {
00390 if(ihit<0 || ihit >= (int) mTheTofArray.TofLeadingHits.size()) return 0;
00391 else
00392 return mTheTofArray.TofLeadingHits[ihit].EventNumber;
00393 }
00394
00395 unsigned short TOF_Reader::GetLeadingFiberId(int ihit) {
00396 if(ihit<0 || ihit >= (int )mTheTofArray.TofLeadingHits.size()) return 9999;
00397 else
00398 return mTheTofArray.TofLeadingHits[ihit].fiberid;
00399 }
00400
00401 unsigned short TOF_Reader::GetLeadingGlobalTdcChan(int ihit) {
00402 if(ihit<0 || ihit >= (int) mTheTofArray.TofLeadingHits.size()) return 9999;
00403 else
00404 return mTheTofArray.TofLeadingHits[ihit].globaltdcchan;
00405 }
00406
00407 unsigned int TOF_Reader::GetLeadingTdc(int ihit) {
00408 if(ihit<0 || ihit >= (int) mTheTofArray.TofLeadingHits.size()) return 0;
00409 else
00410 return mTheTofArray.TofLeadingHits[ihit].tdc;
00411 }
00412
00413 unsigned int TOF_Reader::GetNTrailingHits() {
00414 return (unsigned int)(mTheTofArray.TofTrailingHits.size());
00415 }
00416
00417 unsigned int TOF_Reader::GetTrailingEventNumber(int ihit) {
00418 if(ihit<0 || ihit >= (int) mTheTofArray.TofTrailingHits.size()) return 0;
00419 else
00420 return mTheTofArray.TofTrailingHits[ihit].EventNumber;
00421 }
00422
00423 unsigned short TOF_Reader::GetTrailingFiberId(int ihit) {
00424 if(ihit<0 || ihit >= (int) mTheTofArray.TofTrailingHits.size()) return 9999;
00425 else
00426 return mTheTofArray.TofTrailingHits[ihit].fiberid;
00427 }
00428
00429 unsigned short TOF_Reader::GetTrailingGlobalTdcChan(int ihit) {
00430 if(ihit<0 || ihit >= (int) mTheTofArray.TofTrailingHits.size()) return 9999;
00431 else
00432 return mTheTofArray.TofTrailingHits[ihit].globaltdcchan;
00433 }
00434
00435 unsigned int TOF_Reader::GetTrailingTdc(int ihit) {
00436 if(ihit<0 || ihit >= (int) mTheTofArray.TofTrailingHits.size()) return 0;
00437 else
00438 return mTheTofArray.TofTrailingHits[ihit].tdc;
00439 }
00440
00441 int TOF_Reader::UnpackYear2to4Data(const Bank_TOFP * TofPTR) {
00442
00443 unsigned short numberOfDataWords, slot, channel;
00444 int dataDWord, value;
00445
00446 unsigned short Token = TofPTR->header.Token;
00447 if (Token==0){
00448 LOG_INFO << "TOF_Reader: do not know how to handle token==0"<<endm;
00449
00450 }
00451 mTheTofArray.EventNumber = Token;
00452
00453 mTheTofArray.ByteSwapped = 0x04030201;
00454
00455 int tofRawDataVersion = TofPTR->header.FormatNumber;
00456
00457
00458 if ((tofRawDataVersion <1) || (tofRawDataVersion >3)){
00459 LOG_INFO << "TOF_Reader: ERROR unknown raw data version " << tofRawDataVersion << endm;
00460 return 1;
00461 }
00462
00463
00464
00465
00466
00467 TOFADCD * TofAdcD;
00468 if (TofPTR->AdcPTR.length>0) {
00469 TofAdcD = (TOFADCD *) ((unsigned long *)TofPTR + TofPTR->AdcPTR.offset);
00470
00471 TofAdcD->swap();
00472 if (TofAdcD->header.Token!=Token){
00473 LOG_INFO << "TOF_Reader: Token mismatch TOFP "<< Token
00474 << " ADCD " << TofAdcD->header.Token << endm;
00475 mTheTofArray.EventNumber=0;
00476 }
00477 numberOfDataWords=TofAdcD->header.BankLength - (INT32)sizeof(TofAdcD->header)/4;
00478 if (numberOfDataWords!=mMaxAdcChannels){
00479 LOG_INFO << "TOF_Reader: ADCD #channels mismatch " << numberOfDataWords << endm;
00480 if (numberOfDataWords>mMaxAdcChannels) numberOfDataWords=mMaxAdcChannels;
00481 }
00482
00483 for (dataDWord=0; dataDWord < numberOfDataWords; dataDWord++) {
00484
00485
00486
00487 slot = int( TofAdcD->data[dataDWord].data & 0x000000FF);
00488 channel = int((TofAdcD->data[dataDWord].data & 0x0000FF00) >> 8);
00489 value = int((TofAdcD->data[dataDWord].data & 0xFFFF0000) >> 16);
00490 mTheTofArray.AdcData[dataDWord]=value;
00491 }
00492 }
00493
00494
00495 TOFTDCD * TofTdcD;
00496 if (TofPTR->TdcPTR.length>0) {
00497 TofTdcD = (TOFTDCD *) ((unsigned long *)TofPTR + TofPTR->TdcPTR.offset);
00498
00499 TofTdcD->swap();
00500 if (TofTdcD->header.Token!=Token){
00501 LOG_INFO << "TOF_Reader: Token mismatch TOFP "<< Token
00502 << " TDCD " << TofTdcD->header.Token << endm;
00503 mTheTofArray.EventNumber=0;
00504 }
00505 numberOfDataWords=TofTdcD->header.BankLength - (INT32)sizeof(TofTdcD->header)/4;
00506 if (numberOfDataWords!=mMaxTdcChannels){
00507 LOG_INFO << "TOF_Reader: TDCD #channels mismatch " << numberOfDataWords << endm;
00508 if (numberOfDataWords>mMaxTdcChannels) numberOfDataWords=mMaxTdcChannels;
00509 }
00510
00511 for (dataDWord=0; dataDWord < numberOfDataWords; dataDWord++) {
00512
00513
00514
00515 slot = int( TofTdcD->data[dataDWord].data & 0x000000FF);
00516 channel = int((TofTdcD->data[dataDWord].data & 0x0000FF00) >> 8);
00517 value = int((TofTdcD->data[dataDWord].data & 0xFFFF0000) >> 16);
00518 mTheTofArray.TdcData[dataDWord]=value;
00519 }
00520 }
00521
00522
00523 TOFA2DD * TofA2dD;
00524 if (TofPTR->A2dPTR.length>0) {
00525 TofA2dD = (TOFA2DD *) ((unsigned long *)TofPTR + TofPTR->A2dPTR.offset);
00526
00527 TofA2dD->swap();
00528 if (TofA2dD->header.Token!=Token){
00529 LOG_INFO << "TOF_Reader: Token mismatch TOFP "<< Token
00530 << " A2DD " << TofA2dD->header.Token << endm;
00531 mTheTofArray.EventNumber=0;
00532 }
00533 numberOfDataWords=TofA2dD->header.BankLength - (INT32)sizeof(TofA2dD->header)/4;
00534 if (numberOfDataWords!=mMaxA2dChannels){
00535 LOG_INFO << "TOF_Reader: A2DD #channels mismatch " << numberOfDataWords << endm;
00536 if (numberOfDataWords>mMaxA2dChannels) numberOfDataWords=mMaxA2dChannels;
00537 }
00538
00539 for (dataDWord=0; dataDWord < numberOfDataWords; dataDWord++) {
00540
00541
00542
00543 slot = int( TofA2dD->data[dataDWord].data & 0x000000FF);
00544 channel = int((TofA2dD->data[dataDWord].data & 0x0000FF00) >> 8);
00545 value = int(int(TofA2dD->data[dataDWord].data) >> 16);
00546 mTheTofArray.A2dData[dataDWord]=value;
00547 }
00548 }
00549
00550
00551 TOFSCAD * TofScaD;
00552 if (TofPTR->ScaPTR.length>0) {
00553 TofScaD = (TOFSCAD *) ((unsigned long *)TofPTR + TofPTR->ScaPTR.offset);
00554
00555 TofScaD->swap();
00556 if (TofScaD->header.Token!=Token){
00557 LOG_INFO << "TOF_Reader: Token mismatch TOFP "<< Token
00558 << " SCAD " << TofScaD->header.Token << endm;
00559 mTheTofArray.EventNumber=0;
00560 }
00561 numberOfDataWords=TofScaD->header.BankLength - (INT32)sizeof(TofScaD->header)/4;
00562 if (numberOfDataWords!=mMaxScaChannels){
00563 LOG_INFO << "TOF_Reader: SCAD #channels mismatch " << numberOfDataWords << endm;
00564 if (numberOfDataWords>mMaxScaChannels) numberOfDataWords=mMaxScaChannels;
00565 }
00566
00567 for (dataDWord=0; dataDWord < numberOfDataWords; dataDWord++) {
00568
00569
00570 channel = int( TofScaD->data[dataDWord].data & 0x000000FF);
00571 value = int((TofScaD->data[dataDWord].data & 0xFFFFFF00) >> 8);
00572 mTheTofArray.ScaData[dataDWord]=value;
00573 }
00574 }
00575 return -1;
00576 }
00577
00578 int TOF_Reader::UnpackYear5Data(const Bank_TOFP * TofPTR) {
00579
00580
00581
00582
00583
00584 unsigned short Token = TofPTR->header.Token;
00585 if (Token==0){
00586 LOG_INFO << "TOF_Reader: do not know how to handle token==0"<<endm;
00587
00588 }
00589 mTheTofArray.EventNumber = Token;
00590
00591 mTheTofArray.ByteSwapped = 0x04030201;
00592
00593 int tofRawDataVersion = TofPTR->header.FormatNumber;
00594
00595
00596
00597 if ((tofRawDataVersion <0) || (tofRawDataVersion >3)){
00598 LOG_INFO << "TOF_Reader: ERROR unknown raw data version " << tofRawDataVersion << endm;
00599
00600
00601 }
00602
00603
00604
00605
00606 mTheTofArray.TofLeadingHits.clear();
00607 mTheTofArray.TofTrailingHits.clear();
00608
00609 for(int ifib=0;ifib<4;ifib++) {
00610 if(ifib>2) continue;
00611
00612
00613 if (TofPTR->DDLRPTR[ifib].length<=0) {
00614 LOG_INFO<<"No data words in this fiber! "<<endm;
00615 continue;
00616 }
00617 TOFDDLR *TofDdlr = (TOFDDLR *)((unsigned long *)TofPTR + TofPTR->DDLRPTR[ifib].offset);
00618 int nword = TofPTR->DDLRPTR[ifib].length-10;
00619 int halftrayid=0;
00620 int timeinbin=0;
00621
00622 int runnumber = ercpy->runno();
00623 int fiboffset1[6]={1,2,3,4,5,6};
00624 int fiboffset2[6]={4,5,6,1,2,3};
00625 int fiboffset[6];
00626 if(runnumber<6055081) for(int i=0;i<6;i++){fiboffset[i]=fiboffset1[i];}
00627 if(runnumber>=6055081) for(int i=0;i<6;i++){fiboffset[i]=fiboffset2[i];}
00628
00629 for (int iword=0;iword<nword;iword++) {
00630
00631 int dataword=TofDdlr->data[iword];
00632
00633 if( (dataword&0xF0000000)>>28 == 0xe) continue;
00634 if( (dataword&0xF0000000)>>28 == 0xc) halftrayid = dataword&0x01;
00635
00636
00637 int edgeid =int( (dataword & 0xf0000000)>>28 );
00638 if((edgeid !=LEADING) && (edgeid!=TRAILING)) continue;
00639 int tdcid = (dataword & 0x0f000000)>>24;
00640 int tdcchan=0;
00641
00642 if(edgeid == LEADING) {
00643 TofRawHit templdhit;
00644 templdhit.fiberid=ifib;
00645 tdcchan=(dataword&0x00E00000)>>21;
00646 timeinbin=((dataword&0x7ffff)<<2)+((dataword>>19)&0x03);
00647 templdhit.tdc=timeinbin;
00648
00649 if(ifib==0)templdhit.globaltdcchan=tdcchan + (tdcid&0x03)*8+(tdcid>>2)*24+halftrayid*96;
00650 if(ifib>=1) {
00651 if(tdcid==0&&tdcchan==0)templdhit.globaltdcchan=191 + fiboffset[0+3*(ifib-1)];
00652 if(tdcid==1&&tdcchan==0)templdhit.globaltdcchan=191 + fiboffset[1+3*(ifib-1)];
00653 if(tdcid==1&&tdcchan==2)templdhit.globaltdcchan=191 + fiboffset[2+3*(ifib-1)];
00654 }
00655 mTheTofArray.TofLeadingHits.push_back(templdhit);
00656 } else if (edgeid==TRAILING){
00657 TofRawHit temptrhit;
00658 temptrhit.fiberid=ifib;
00659 tdcchan=(dataword&0x0F80000)>>19;
00660 timeinbin = dataword & 0x7ffff;
00661 temptrhit.tdc=timeinbin;
00662 if(ifib==0)temptrhit.globaltdcchan=tdcchan +(tdcid>>2)*24+halftrayid*96;
00663 if(ifib>=1) {
00664 if(tdcid==3&&tdcchan==0)temptrhit.globaltdcchan=191 + fiboffset[0+3*(ifib-1)];
00665 if(tdcid==3&&tdcchan==8)temptrhit.globaltdcchan=191 + fiboffset[1+3*(ifib-1)];
00666 if(tdcid==3&&tdcchan==10)temptrhit.globaltdcchan=191+ fiboffset[2+3*(ifib-1)];
00667 }
00668 mTheTofArray.TofTrailingHits.push_back(temptrhit);
00669 } else {
00670 LOG_INFO<<" UNKNOWN TDC data ! "<<endm;
00671 return 1;
00672 }
00673
00674 }
00675 }
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686 for(unsigned int i=0;i<TOF_MAX_TDC_CHANNELS;i++){mTheTofArray.LdNHit[i]=0;mTheTofArray.LdTdcData[i]=0;}
00687 for(unsigned int i=0;i<TOF_MAX_TDC_CHANNELS;i++){mTheTofArray.TrNHit[i]=0;mTheTofArray.TrTdcData[i]=0;}
00688
00689 for(unsigned int i=0;i<mTheTofArray.TofLeadingHits.size();i++){
00690 int chan = mTheTofArray.TofLeadingHits[i].globaltdcchan;
00691 if(chan <=0) continue;
00692 mTheTofArray.LdNHit[chan]++;
00693 }
00694 for(unsigned int i=0;i<mTheTofArray.TofTrailingHits.size();i++){
00695 int chan = mTheTofArray.TofTrailingHits[i].globaltdcchan;
00696 if(chan <=0) continue;
00697 mTheTofArray.TrNHit[chan]++;
00698 }
00699
00700 int oldchan=0;
00701 for(unsigned int i=0;i<mTheTofArray.TofLeadingHits.size();i++){
00702 int chan = mTheTofArray.TofLeadingHits[i].globaltdcchan;
00703 if(chan == oldchan) continue;
00704 mTheTofArray.LdTdcData[chan]=mTheTofArray.TofLeadingHits[i].tdc;
00705 oldchan=chan;
00706 }
00707 oldchan=0;
00708 for(unsigned int i=0;i<mTheTofArray.TofTrailingHits.size();i++){
00709 int chan = mTheTofArray.TofTrailingHits[i].globaltdcchan;
00710 if(chan == oldchan) continue;
00711 mTheTofArray.TrTdcData[chan]=mTheTofArray.TofTrailingHits[i].tdc;
00712 oldchan=chan;
00713 }
00714
00715
00716
00717
00718
00719
00720 return -1;
00721 }
00722
00723