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
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113 #include <string.h>
00114 #include <assert.h>
00115 #include <iostream>
00116 #include "StTriggerData2009.h"
00117
00118 ClassImp(StTriggerData2009)
00119
00120 StTriggerData2009::StTriggerData2009():mData()
00121 {
00122 mDebug = 0;
00123
00124 }
00125
00126 StTriggerData2009::StTriggerData2009(const TriggerDataBlk2009* data, int run):mData()
00127 {
00128
00129 mYear=2009; mRun = run; mDebug = 0;
00130 mData = new TriggerDataBlk2009;
00131 readData(data,1);
00132 }
00133
00134 StTriggerData2009::StTriggerData2009(const TriggerDataBlk2009* data, int run, int bs, int dbg):mData()
00135 {
00136 mYear=2009; mRun = run; mDebug = dbg;
00137 if(mDebug==1) printf("StTriggerData2009 Constructor with trigger data block and byteswap option=%d\n",bs);
00138 mData = new TriggerDataBlk2009;
00139 readData(data,bs);
00140 }
00141
00142 void StTriggerData2009::readData(const TriggerDataBlk2009* data, int bs){
00143 int copyflag=1;
00144 if (data==0) {copyflag=0;}
00145 if(mDebug==1) printf("StTriggerData2009::readData copyflag=%d byteswap=%d data=%p mData=%p\n",copyflag,bs,data,mData);
00146
00147 if (copyflag==1){
00148 unsigned int ver = data->FormatVersion;
00149 if (bs) swapI(&ver);
00150
00151 if (ver == y9FORMAT_VERSION || ver == 0x08121140) {
00152 if (mDebug==1) printf("StTriggerData2009: version = 0x%x (0x%x or 0x08121140)\n",ver,y9FORMAT_VERSION);
00153 }
00154 else {
00155 mErrorFlag = mErrorFlag | 0x1;
00156 printf("StTriggerData2009: version = 0x%x != (0x%x or 0x08121140)\n",ver,y9FORMAT_VERSION);
00157 assert(0);
00158 }
00159
00160 unsigned int size = data->totalTriggerLength;
00161 if (bs) swapI(&size);
00162 if (size > y9MAX_TRG_BLK_SIZE) {
00163 gMessMgr->Warning() << "StTriggerData2009: Data length = " << size
00164 << " is bigger than max = " << y9MAX_TRG_BLK_SIZE
00165 << endm;
00166 assert(0);
00167 }
00168 if (mDebug==1) printf("StTriggerData2009: size = %d, maxsize = %d\n",size,y9MAX_TRG_BLK_SIZE);
00169 memcpy(mData,data,size);
00170 memset((char*)mData+size,0,sizeof(TriggerDataBlk2009)-size);
00171 }
00172
00173 if (bs) swapDataBlk(mData);
00174 if (mDebug==1){
00175 printf("StTriggerData2009: version = 0x%x (0x%x or 0x08121140)\n",mData->FormatVersion,y9FORMAT_VERSION);
00176 printf("StTriggerData2009: size = %d, maxsize = %d\n",mData->totalTriggerLength,y9MAX_TRG_BLK_SIZE);
00177 printf("EventDesc length=%10d offset=%10d\n",mData->EventDesc_ofl.length,mData->EventDesc_ofl.offset);
00178 printf("L1_DSM length=%10d offset=%10d\n",mData->L1_DSM_ofl.length,mData->L1_DSM_ofl.offset);
00179 printf("Summary length=%10d offset=%10d\n",mData->Summary_ofl.length,mData->Summary_ofl.offset);
00180 }
00181
00182 EvtDesc=0; L1_DSM=0; TrgSum=0;
00183 if (mData->EventDesc_ofl.length > 0) EvtDesc = (EvtDescData2009*)((char*)mData + mData->EventDesc_ofl.offset);
00184 if (mData->L1_DSM_ofl.length > 0) L1_DSM = (L1_DSM_Data2009*)((char*)mData + mData->L1_DSM_ofl.offset);
00185 if (mData->Summary_ofl.length > 0) TrgSum = (TrgSumData2009* )((char*)mData + mData->Summary_ofl.offset);
00186 if (bs){
00187 if (EvtDesc) swapEvtDesc(EvtDesc);
00188 if (L1_DSM) swapL1_DSM(L1_DSM);
00189 if (TrgSum) swapTrgSum(TrgSum);
00190 }
00191 if (EvtDesc==0 || L1_DSM==0 || TrgSum==0){
00192 mErrorFlag = mErrorFlag | 0x1;
00193 gMessMgr->Warning() << "StTriggerData2009: EvtDesc, L1_DSM or TrgSum is missing"
00194 <<" mErrorFlag="<<mErrorFlag<<endm;
00195 }
00196
00197 int npre = numberOfPreXing();
00198 int npost = numberOfPostXing();
00199 if (npre<0 || npre>10 || npost<0 || npost>10){
00200 mErrorFlag = mErrorFlag | 0x2;
00201 gMessMgr->Warning() << "StTriggerData2009: Invalid npre/post = "<< npre << " / " << npost
00202 <<" mErrorFlag="<<mErrorFlag<<endm;
00203 }
00204 if (mDebug==1) printf("StTriggerData2009: pre=%d post=%d\n",npre,npost);
00205
00206 memset(mBC1,0,sizeof(mBC1));
00207 memset(mMXQ,0,sizeof(mMXQ));
00208 memset(mMIX,0,sizeof(mMIX));
00209 memset(mBCW,0,sizeof(mBCW));
00210 memset(mBCE,0,sizeof(mBCE));
00211 memset(mFEQ,0,sizeof(mFEQ));
00212 memset(mBBC,0,sizeof(mBBC));
00213 memset(mBBQ,0,sizeof(mBBQ));
00214 memset(mFMS,0,sizeof(mFMS));
00215 memset(mQT1,0,sizeof(mQT1));
00216 memset(mQT2,0,sizeof(mQT2));
00217 memset(mQT3,0,sizeof(mQT3));
00218 memset(mQT4,0,sizeof(mQT4));
00219 memset(mxq,0,sizeof(mxq)); memset(tmxq,0,sizeof(tmxq));
00220 memset(feq,0,sizeof(feq)); memset(tfeq,0,sizeof(tfeq));
00221 memset(bbq,0,sizeof(bbq)); memset(tbbq,0,sizeof(tbbq));
00222 memset(qt1,0,sizeof(qt1)); memset(tqt1,0,sizeof(tqt1));
00223 memset(qt2,0,sizeof(qt2)); memset(tqt2,0,sizeof(tqt2));
00224 memset(qt3,0,sizeof(qt3)); memset(tqt3,0,sizeof(tqt3));
00225 memset(qt4,0,sizeof(qt4)); memset(tqt4,0,sizeof(tqt4));
00226 TrgOfflen2009* offlen;
00227
00228 for (int i=0; i<1+npre+npost; i++){
00229
00230 if (i==0)
00231 {offlen = mData->MainX;}
00232 else {
00233
00234 if (mData->PrePostList[i-1]==0) continue;
00235 offlen = (TrgOfflen2009*) ((char*)mData + mData->PrePostList[i-1]);
00236 }
00237 if (bs) swapRawDetOfflen(offlen);
00238 for(int k=0; k<y9MAX_OFFLEN; k++){
00239 if(static_cast<unsigned int>(offlen[k].length + offlen[k].offset) > static_cast<unsigned int>(mData->totalTriggerLength)) {
00240 mErrorFlag = mErrorFlag | (1 << k);
00241 gMessMgr->Warning() << "StTriggerData2009: offset ("<<offlen[k].offset<<") + length ("<<offlen[k].length
00242 <<") exceeds total size("<<mData->totalTriggerLength<<") for data block id="<<k
00243 <<" mErrorFlag="<<mErrorFlag<<endm;
00244 }
00245 }
00246 int j;
00247 j=offlen[y9BC1_CONF_NUM].length; if (j>0){mBC1[i] = (BELayerBlock2009*)((char*)mData + offlen[y9BC1_CONF_NUM].offset); swapRawDet((DataBlock2009*)mBC1[i],y9BC1_CONF_NUM,j,bs);}
00248 j=offlen[y9MXQ_CONF_NUM].length; if (j>0){mMXQ[i] = (QTBlock2009* )((char*)mData + offlen[y9MXQ_CONF_NUM].offset); swapRawDet((DataBlock2009*)mMXQ[i],y9MXQ_CONF_NUM,j,bs);}
00249 j=offlen[y9MIX_CONF_NUM].length; if (j>0){mMIX[i] = (MIXBlock2009* )((char*)mData + offlen[y9MIX_CONF_NUM].offset); swapRawDet((DataBlock2009*)mMIX[i],y9MIX_CONF_NUM,j,bs);}
00250 j=offlen[y9BCW_CONF_NUM].length; if (j>0){mBCW[i] = (BWestBlock2009* )((char*)mData + offlen[y9BCW_CONF_NUM].offset); swapRawDet((DataBlock2009*)mBCW[i],y9BCW_CONF_NUM,j,bs);}
00251 j=offlen[y9BCE_CONF_NUM].length; if (j>0){mBCE[i] = (BEastBlock2009* )((char*)mData + offlen[y9BCE_CONF_NUM].offset); swapRawDet((DataBlock2009*)mBCE[i],y9BCE_CONF_NUM,j,bs);}
00252 j=offlen[y9FEQ_CONF_NUM].length; if (j>0){mFEQ[i] = (QTBlock2009* )((char*)mData + offlen[y9FEQ_CONF_NUM].offset); swapRawDet((DataBlock2009*)mFEQ[i],y9FEQ_CONF_NUM,j,bs);}
00253 j=offlen[y9BBC_CONF_NUM].length; if (j>0){mBBC[i] = (BBCBlock2009* )((char*)mData + offlen[y9BBC_CONF_NUM].offset); swapRawDet((DataBlock2009*)mBBC[i],y9BBC_CONF_NUM,j,bs);}
00254 j=offlen[y9BBQ_CONF_NUM].length; if (j>0){mBBQ[i] = (QTBlock2009* )((char*)mData + offlen[y9BBQ_CONF_NUM].offset); swapRawDet((DataBlock2009*)mBBQ[i],y9BBQ_CONF_NUM,j,bs);}
00255 j=offlen[y9FMS_CONF_NUM].length; if (j>0){mFMS[i] = (FMSBlock2009* )((char*)mData + offlen[y9FMS_CONF_NUM].offset); swapRawDet((DataBlock2009*)mFMS[i],y9FMS_CONF_NUM,j,bs);}
00256 j=offlen[y9QT1_CONF_NUM].length; if (j>0){mQT1[i] = (QTBlock2009* )((char*)mData + offlen[y9QT1_CONF_NUM].offset); swapRawDet((DataBlock2009*)mQT1[i],y9QT1_CONF_NUM,j,bs);}
00257 j=offlen[y9QT2_CONF_NUM].length; if (j>0){mQT2[i] = (QTBlock2009* )((char*)mData + offlen[y9QT2_CONF_NUM].offset); swapRawDet((DataBlock2009*)mQT2[i],y9QT2_CONF_NUM,j,bs);}
00258 j=offlen[y9QT3_CONF_NUM].length; if (j>0){mQT3[i] = (QTBlock2009* )((char*)mData + offlen[y9QT3_CONF_NUM].offset); swapRawDet((DataBlock2009*)mQT3[i],y9QT3_CONF_NUM,j,bs);}
00259 j=offlen[y9QT4_CONF_NUM].length; if (j>0){mQT4[i] = (QTBlock2009* )((char*)mData + offlen[y9QT4_CONF_NUM].offset); swapRawDet((DataBlock2009*)mQT4[i],y9QT4_CONF_NUM,j,bs);}
00260 if (mMXQ[i]) decodeQT(mMXQ[i]->length/4, mMXQ[i]->data, mxq[i], tmxq[i]);
00261 if (mFEQ[i]) decodeQT(mFEQ[i]->length/4, mFEQ[i]->data, feq[i], tfeq[i]);
00262 if (mBBQ[i]) decodeQT(mBBQ[i]->length/4, mBBQ[i]->data, bbq[i], tbbq[i]);
00263 if (mQT1[i]) decodeQT(mQT1[i]->length/4, mQT1[i]->data, qt1[i], tqt1[i]);
00264 if (mQT2[i]) decodeQT(mQT2[i]->length/4, mQT2[i]->data, qt2[i], tqt2[i]);
00265 if (mQT3[i]) decodeQT(mQT3[i]->length/4, mQT3[i]->data, qt3[i], tqt3[i]);
00266 if (mQT4[i]) decodeQT(mQT4[i]->length/4, mQT4[i]->data, qt4[i], tqt4[i]);
00267 }
00268 if (mDebug==1) dump();
00269 }
00270
00271 StTriggerData2009::~StTriggerData2009() {delete mData;}
00272
00273 unsigned int StTriggerData2009::version() const
00274 {
00275 return EvtDesc->TrgDataFmtVer;
00276 }
00277
00278 unsigned int StTriggerData2009::eventNumber() const
00279 {
00280 return mData->eventNumber;
00281 }
00282
00283 unsigned int StTriggerData2009::token() const
00284 {
00285 return EvtDesc->TrgToken;
00286 }
00287
00288 unsigned int StTriggerData2009::triggerWord() const
00289 {
00290 return EvtDesc->TriggerWord;
00291 }
00292
00293 unsigned int StTriggerData2009::actionWord() const
00294 {
00295 return
00296 ( (unsigned short)(EvtDesc->actionWdTrgCommand) * 16 * 16 * 16 ) +
00297 ( (unsigned short)(EvtDesc->actionWdDaqCommand) * 16 * 16 ) +
00298 ( EvtDesc->actionWdDetectorBitMask & 0x00ff );
00299 }
00300
00301 unsigned int StTriggerData2009::numberOfPreXing() const
00302 {
00303 return EvtDesc->npre;
00304 }
00305
00306 unsigned int StTriggerData2009::numberOfPostXing() const
00307 {
00308 return EvtDesc->npost;
00309 }
00310
00311 unsigned short StTriggerData2009::busyStatus() const{
00312 return EvtDesc->internalBusy;
00313 }
00314
00315 unsigned short StTriggerData2009::dsmInput() const{
00316 return EvtDesc->DSMInput;
00317 }
00318
00319 unsigned short StTriggerData2009::trgToken() const{
00320 return EvtDesc->TrgToken;
00321 }
00322
00323 unsigned short StTriggerData2009::dsmAddress() const{
00324 return EvtDesc->DSMAddress;
00325 }
00326
00327 unsigned short StTriggerData2009::mAddBits() const{
00328 return EvtDesc->addBits;
00329 }
00330
00331 unsigned short StTriggerData2009::bcData(int channel) const{
00332 return L1_DSM->BCdata[channel];
00333 }
00334
00335 unsigned short StTriggerData2009::lastDSM(int channel) const{
00336 return L1_DSM->lastDSM[channel];
00337 }
00338
00339 unsigned short StTriggerData2009::tcuBits() const
00340 {
00341 return EvtDesc->DSMInput;
00342 }
00343
00344 unsigned int StTriggerData2009::bunchCounterHigh() const
00345 {
00346 return EvtDesc->bunchXing_hi;
00347 }
00348
00349 unsigned int StTriggerData2009::bunchCounterLow() const
00350 {
00351 return EvtDesc->bunchXing_lo;
00352 }
00353
00354 unsigned int StTriggerData2009::bunchId48Bit() const
00355 {
00356 unsigned long long bxinghi,bxing1,bxinglo, bx;
00357 bxinghi = L1_DSM->BCdata[3];
00358 bxing1 = L1_DSM->BCdata[10];
00359 bxinglo = (bxing1 << 16) + L1_DSM->BCdata[11];
00360 bx = (bxinghi << 32) + bxinglo;
00361 return (int)(bx % 120);
00362 }
00363
00364 unsigned int StTriggerData2009::bunchId7Bit() const
00365 {
00366 int b7=0, b7dat;
00367 b7dat = L1_DSM->BCdata[2];
00368 b7 = b7dat & 0x7f;
00369 return b7;
00370 }
00371
00372 unsigned int StTriggerData2009::spinBit() const
00373 {
00374 if(mRun<12000000){
00375 return (L1_DSM->lastDSM[7]/16)%256;
00376 }else{
00377 return (L1_DSM->lastDSM[4]/16)%256;
00378 }
00379 }
00380
00381 unsigned int StTriggerData2009::spinBitYellowFilled() const
00382 {
00383 unsigned int sb = spinBit();
00384 return sb%2;
00385 }
00386
00387 unsigned int StTriggerData2009::spinBitYellowUp() const
00388 {
00389 unsigned int sb = spinBit();
00390 return (sb/2)%2;
00391 }
00392
00393 unsigned int StTriggerData2009::spinBitYellowDown() const
00394 {
00395 unsigned int sb = spinBit();
00396 return (sb/4)%2;
00397 }
00398
00399 unsigned int StTriggerData2009::spinBitYellowUnpol() const
00400 {
00401 unsigned int sb = spinBit();
00402 return (sb/8)%2;
00403 }
00404
00405 unsigned int StTriggerData2009::spinBitBlueFilled() const
00406 {
00407 unsigned int sb = spinBit();
00408 return (sb/16)%2;
00409 }
00410
00411 unsigned int StTriggerData2009::spinBitBlueUp() const
00412 {
00413 unsigned int sb = spinBit();
00414 return (sb/32)%2;
00415 }
00416
00417 unsigned int StTriggerData2009::spinBitBlueDown() const
00418 {
00419 unsigned int sb = spinBit();
00420 return (sb/64)%2;
00421 }
00422
00423 unsigned int StTriggerData2009::spinBitBlueUnpol() const
00424 {
00425 unsigned int sb = spinBit();
00426 return (sb/128)%2;
00427 }
00428
00429 unsigned short StTriggerData2009::bbcADC(StBeamDirection eastwest, int pmt, int prepost) const
00430 {
00431 const int addrmap[2][24] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00432 4, 4, 4, 4, 4, 4, 4, 4},
00433 { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
00434 4, 4, 4, 4, 4, 4, 4, 4} };
00435 const int chmap[2][24] = { { 0, 3, 8,16,19,24, 1, 2, 9,10,11,17,18,25,26,27,
00436 0, 1, 2, 3, 8, 9,10,11},
00437 { 0, 3, 8,16,19,24, 1, 2, 9,10,11,17,18,25,26,27,
00438 16,17,18,19,24,25,26,27} };
00439 int buffer = prepostAddress(prepost);
00440 if (buffer >= 0 && pmt>=1 && pmt<=24) return bbq[buffer][addrmap[eastwest][pmt-1]][chmap[eastwest][pmt-1]];
00441 return 0;
00442 }
00443
00444 unsigned short StTriggerData2009::bbcTDC(StBeamDirection eastwest, int pmt, int prepost) const
00445 {
00446 const int addrmap[2][24] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00447 4, 4, 4, 4, 4, 4, 4, 4},
00448 { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
00449 4, 4, 4, 4, 4, 4, 4, 4} };
00450 const int chmap[2][24] = { { 0, 3, 8,16,19,24, 1, 2, 9,10,11,17,18,25,26,27,
00451 0, 1, 2, 3, 8, 9,10,11},
00452 { 0, 3, 8,16,19,24, 1, 2, 9,10,11,17,18,25,26,27,
00453 16,17,18,19,24,25,26,27} };
00454 int buffer = prepostAddress(prepost);
00455 if (buffer >= 0 && pmt>=1 && pmt<=24) return bbq[buffer][addrmap[eastwest][pmt-1]][chmap[eastwest][pmt-1]+4];
00456 return 0;
00457 }
00458
00459 unsigned short StTriggerData2009::bbcADCSum(StBeamDirection eastwest, int prepost) const
00460 {
00461 unsigned short sum=0;
00462 int buffer = prepostAddress(prepost);
00463 if (buffer >= 0) for(int i=1; i<=16; i++) {sum+=bbcADC(eastwest,i,prepost);}
00464 return sum;
00465 }
00466
00467 unsigned short StTriggerData2009::bbcADCSumLargeTile(StBeamDirection eastwest, int prepost) const
00468 {
00469 unsigned short sum=0;
00470 int buffer = prepostAddress(prepost);
00471 if (buffer >= 0) for(int i=17; i<=24; i++) {sum+=bbcADC(eastwest,i,prepost);}
00472 return sum;
00473 }
00474
00475 unsigned short StTriggerData2009::bbcEarliestTDC(StBeamDirection eastwest, int prepost) const
00476 {
00477 int buffer = prepostAddress(prepost);
00478 if (buffer >=0){
00479 if (mBBC[buffer]){
00480 if (eastwest==east) {return mBBC[buffer]->BBClayer1[2]%4096;}
00481 else {return mBBC[buffer]->BBClayer1[0]%4096;}
00482 }
00483 }
00484 return 0;
00485 }
00486
00487 unsigned short StTriggerData2009::bbcTimeDifference() const
00488 {
00489 return L1_DSM->VTX[3]%8192;
00490 }
00491
00492 unsigned short StTriggerData2009::bbcEarliestTDCLarge(StBeamDirection eastwest, int prepost) const
00493 {
00494 int buffer = prepostAddress(prepost);
00495 if (buffer >=0){
00496 if (mBBC[buffer]){
00497 if (eastwest==east) {return mBBC[buffer]->BBClayer1[11] & 0x0fff;}
00498 else {return ((mBBC[buffer]->BBClayer1[11] & 0xf000) >> 12)
00499 +((mBBC[buffer]->BBClayer1[10] & 0x00ff) << 4 );}
00500 }
00501 }
00502 return 0;
00503 }
00504
00505 unsigned short StTriggerData2009::bbcTimeDifferenceLarge() const
00506 {
00507 return L1_DSM->VTX[2]%8192;
00508 }
00509
00510
00511 unsigned short StTriggerData2009::fpd(StBeamDirection eastwest, int module, int pmt, int prepost) const
00512 {
00513 return 0;
00514 }
00515
00516 unsigned short StTriggerData2009::fpdSum(StBeamDirection eastwest, int module) const
00517 {
00518 return 0;
00519 }
00520
00521 unsigned short StTriggerData2009::fpdLayer1DSMRaw(StBeamDirection eastwest, int channel, int prepost) const{
00522 int buffer = prepostAddress(prepost);
00523 if (buffer >= 0){
00524 if (eastwest==east) { if (mMIX[buffer]) return mMIX[buffer]->FPDEastNSLayer1[channel]; }
00525 else { if (mFMS[buffer]) return mFMS[buffer]->FMS[channel]; }
00526 }
00527 return 0;
00528 }
00529
00530 unsigned short StTriggerData2009::fpdLayer2DSMRaw(int channel) const{
00531 if (channel<8) return L1_DSM->FPD[channel];
00532 return 0;
00533 }
00534
00535 bool StTriggerData2009::zdcPresent(int prepost) const
00536 {
00537 int buffer = prepostAddress(prepost);
00538 if (buffer >= 0) return mBBQ[buffer];
00539 return false;
00540 }
00541
00542 unsigned short StTriggerData2009::zdcAtChannel(int channel, int prepost) const
00543 {
00544 int buffer = prepostAddress(prepost);
00545 if (buffer >= 0 && channel>=0 && channel<32) return bbq[buffer][14][channel];
00546 return 0;
00547 }
00548
00549 unsigned short StTriggerData2009::zdcAtAddress(int address, int prepost) const
00550 {
00551 return zdcAtChannel(address,prepost);
00552 }
00553
00554 unsigned short StTriggerData2009::zdcUnAttenuated(StBeamDirection eastwest, int prepost) const
00555 {
00556 int buffer = prepostAddress(prepost);
00557 if (buffer >= 0) {
00558 if (eastwest == east) return bbq[buffer][14][2];
00559 else return bbq[buffer][14][18];
00560 }
00561 return 0;
00562 }
00563
00564 unsigned short StTriggerData2009::zdcAttenuated(StBeamDirection eastwest, int prepost) const
00565 {
00566 int buffer = prepostAddress(prepost);
00567 if (buffer >= 0) {
00568 if (eastwest == east) return bbq[buffer][14][3];
00569 else return bbq[buffer][14][19];
00570 }
00571 return 0;
00572 }
00573
00574 unsigned short StTriggerData2009::zdcADC(StBeamDirection eastwest, int pmt, int prepost) const
00575 {
00576 int buffer = prepostAddress(prepost);
00577 if (buffer >= 0 && pmt>=1 && pmt<=3) {
00578 if (eastwest == east) {
00579 if (pmt == 1) return bbq[buffer][14][0];
00580 if (pmt == 2) return bbq[buffer][14][8];
00581 if (pmt == 3) return bbq[buffer][14][9];
00582 }
00583 else {
00584 if (pmt == 1) return bbq[buffer][14][16];
00585 if (pmt == 2) return bbq[buffer][14][24];
00586 if (pmt == 3) return bbq[buffer][14][25];
00587 }
00588 }
00589 return 0;
00590 }
00591
00592 unsigned short StTriggerData2009::zdcTDC(StBeamDirection eastwest, int prepost) const
00593 {
00594 int buffer = prepostAddress(prepost);
00595 if (buffer >= 0) {
00596 if (eastwest == east) return bbq[buffer][14][6];
00597 else return bbq[buffer][14][22];
00598 }
00599 return 0;
00600 }
00601
00602 unsigned short StTriggerData2009::zdcPmtTDC(StBeamDirection eastwest, int pmt, int prepost) const
00603 {
00604 int buffer = prepostAddress(prepost);
00605 if (buffer >= 0 && pmt>=1 && pmt<=3) {
00606 if (eastwest == east) {
00607 if (pmt == 1) return bbq[buffer][14][4];
00608 if (pmt == 2) return bbq[buffer][14][12];
00609 if (pmt == 3) return bbq[buffer][14][13];
00610 }
00611 else {
00612 if (pmt == 1) return bbq[buffer][14][20];
00613 if (pmt == 2) return bbq[buffer][14][28];
00614 if (pmt == 3) return bbq[buffer][14][29];
00615 }
00616 }
00617 return 0;
00618 }
00619
00620 unsigned short StTriggerData2009::zdcHardwareSum(int prepost) const
00621 {
00622 int buffer = prepostAddress(prepost);
00623 if (buffer >= 0) return bbq[buffer][14][11];
00624 return 0;
00625 }
00626
00627 bool StTriggerData2009::zdcSMDPresent(int prepost) const
00628 {
00629 int buffer = prepostAddress(prepost);
00630 if (buffer >= 0) return mMXQ[buffer];
00631 return false;
00632 }
00633
00634 unsigned short StTriggerData2009::zdcSMD(StBeamDirection eastwest, int verthori, int strip, int prepost) const
00635 {
00636 static const int zdcsmd_map[2][2][8] ={
00637 { { 31, 30, 29, 28, 27, 26, 25, 19} ,
00638 { 24, 23, 22, 21, 20, 16, 18, 17} } ,
00639 { { 15, 14, 13, 12, 11, 10, 9, 2} ,
00640 { 8, 7, 6, 5, 4, 3, 0, 1} }
00641 };
00642 static const int zdcsmd_map2011[2][2][8] ={
00643 { {24, 25, 26, 27, 28, 29, 30, 31} ,
00644 {16, 17, 18, 19, 20, 21, 22, 23} } ,
00645 { {8, 9, 10, 11, 12, 13, 14, 15} ,
00646 {0, 1, 2, 3, 4, 5, 6, 7} }
00647 };
00648 if (verthori<0 || verthori>1) return 0;
00649 if (strip<1 || strip>8) return 0;
00650 int buffer = prepostAddress(prepost);
00651 if (buffer >= 0) {
00652 if(mRun<12034085){
00653 return mxq[buffer][4][zdcsmd_map[eastwest][verthori][strip-1]];
00654 }else{
00655 return mxq[buffer][4][zdcsmd_map2011[eastwest][verthori][strip-1]];
00656 }
00657 }
00658 return 0;
00659 }
00660
00661 unsigned short StTriggerData2009::zdcEarliestTDC(StBeamDirection eastwest, int prepost) const
00662 {
00663 int buffer = prepostAddress(prepost);
00664 if (buffer >=0){
00665 if (mBBC[buffer]){
00666 if(mRun<12000000){
00667 if (eastwest==east) {return ((mBBC[buffer]->ZDClayer1[3] >> 12) % 16) | ((mBBC[buffer]->ZDClayer1[2] % 256) << 4);}
00668 else {return (mBBC[buffer]->ZDClayer1[3]) % 4096;}
00669 }else{
00670 if (eastwest==east) {return ((mBBC[buffer]->ZDClayer1[3] >> 10) % 64) | ((mBBC[buffer]->ZDClayer1[2] % 16) << 6);}
00671 else {return (mBBC[buffer]->ZDClayer1[3]) % 1024;}
00672 }
00673 }
00674 }
00675 return 0;
00676 }
00677
00678 bool StTriggerData2009::zdcSumADCaboveThreshold(StBeamDirection eastwest, int prepost) const {
00679 int buffer = prepostAddress(prepost);
00680 if (buffer >=0){
00681 if (mBBC[buffer]){
00682 if(mRun<12000000){
00683 if (eastwest==east) {return mBBC[buffer]->ZDClayer1[2] & (1 << (27-16));}
00684 else {return mBBC[buffer]->ZDClayer1[2] & (1 << (24-16));}
00685 }else{
00686 if (eastwest==east) {return mBBC[buffer]->ZDClayer1[2] & (1 << (25-16));}
00687 else {return mBBC[buffer]->ZDClayer1[2] & (1 << (22-16));}
00688 }
00689 }
00690 }
00691 return 0;
00692 }
00693
00694 bool StTriggerData2009::zdcFrontADCaboveThreshold(StBeamDirection eastwest, int prepost) const {
00695 int buffer = prepostAddress(prepost);
00696 if (buffer >=0){
00697 if (mBBC[buffer]){
00698 if(mRun<12000000){
00699 if (eastwest==east) {return mBBC[buffer]->ZDClayer1[2] & (1 << (29-16));}
00700 else {return mBBC[buffer]->ZDClayer1[2] & (1 << (26-16));}
00701 }else{
00702 if (eastwest==east) {return mBBC[buffer]->ZDClayer1[2] & (1 << (23-16));}
00703 else {return mBBC[buffer]->ZDClayer1[2] & (1 << (20-16));}
00704 }
00705 }
00706 }
00707 return 0;
00708 }
00709
00710 bool StTriggerData2009::zdcBackADCaboveThreshold(StBeamDirection eastwest, int prepost) const {
00711 int buffer = prepostAddress(prepost);
00712 if (buffer >=0){
00713 if (mBBC[buffer]){
00714 if(mRun<12000000){
00715 if (eastwest==east) {return mBBC[buffer]->ZDClayer1[2] & (1 << (28-16));}
00716 else {return mBBC[buffer]->ZDClayer1[2] & (1 << (25-16));}
00717 }else{
00718 if (eastwest==east) {return mBBC[buffer]->ZDClayer1[2] & (1 << (24-16));}
00719 else {return mBBC[buffer]->ZDClayer1[2] & (1 << (21-16));}
00720 }
00721 }
00722 }
00723 return 0;
00724 }
00725
00726 unsigned short StTriggerData2009::zdcTimeDifference() const
00727 {
00728 return L1_DSM->VTX[1]%1024;
00729 }
00730
00731 bool StTriggerData2009::zdcSumADCaboveThresholdL2(StBeamDirection eastwest) const {
00732 return L1_DSM->VTX[1] & (1 << ((eastwest==east) ? 10 : 11));
00733 }
00734
00735 bool StTriggerData2009::zdcFrontADCaboveThresholdL2(StBeamDirection eastwest) const {
00736 return L1_DSM->VTX[1] & (1 << ((eastwest==east) ? 12 : 14));
00737 }
00738
00739 bool StTriggerData2009::zdcBackADCaboveThresholdL2(StBeamDirection eastwest) const {
00740 return L1_DSM->VTX[1] & (1 << ((eastwest==east) ? 13 : 15));
00741 }
00742
00743 bool StTriggerData2009::zdcSumADCaboveThresholdL3(StBeamDirection eastwest) const {
00744 if(mRun<12000000){ return lastDSM(2) & (1 << ((eastwest==east) ? 7 : 8)); }
00745 else { return lastDSM(1) & (1 << ((eastwest==east) ? 7 : 8)); }
00746 }
00747
00748 bool StTriggerData2009::zdcFrontADCaboveThresholdL3(StBeamDirection eastwest) const {
00749 if(mRun<12000000){ return lastDSM(2) & (1 << ((eastwest==east) ? 9 : 11)); }
00750 else { return lastDSM(1) & (1 << ((eastwest==east) ? 9 : 11)); }
00751 }
00752
00753 bool StTriggerData2009::zdcBackADCaboveThresholdL3(StBeamDirection eastwest) const {
00754 if(mRun<12000000){ return lastDSM(2) & (1 << ((eastwest==east) ? 10 : 12)); }
00755 else { return lastDSM(1) & (1 << ((eastwest==east) ? 10 : 12)); }
00756 }
00757
00758 bool StTriggerData2009::zdcTimeDifferenceInWindow() const
00759 {
00760 if(mRun<12000000){ return lastDSM(2) & (1 << 6); }
00761 else { return lastDSM(1) & (1 << 6); }
00762 }
00763
00764 unsigned short StTriggerData2009::zdcSMDHighestStrip(StBeamDirection eastwest, int verthori, int prepost) const
00765 {
00766 if(mRun<12000000) return 0;
00767
00768 int buffer = prepostAddress(prepost);
00769 if (buffer >=0){
00770 if (mBBC[buffer]){
00771 if (eastwest==east) {return (mBBC[buffer]->ZDClayer1[1] >> (verthori ? 6 : 9)) % 8;}
00772 else {return (mBBC[buffer]->ZDClayer1[1] >> (verthori ? 0 : 3)) % 8;}
00773 }
00774 }
00775 return 0;
00776 }
00777
00778 unsigned short StTriggerData2009::zdcTruncatedSum(StBeamDirection eastwest, int prepost) const
00779 {
00780 if(mRun<12000000) return 0;
00781 int buffer = prepostAddress(prepost);
00782 if (buffer >=0){
00783 if (mBBC[buffer]){
00784 if (eastwest==east) {return (mBBC[buffer]->ZDClayer1[2] >> (26-16)) % 8;}
00785 else {return (mBBC[buffer]->ZDClayer1[2] >> (29-16)) % 8;}
00786 }
00787 }
00788 return 0;
00789 }
00790
00791 unsigned short StTriggerData2009::pp2ppADC(StBeamDirection eastwest, int vh, int udio, int ch, int prepost) const
00792 {
00793 static const int map[2][2][2][2] ={ { { { 0, 1}, { 2, 3} } , { {16,17}, {18,19} } , } ,
00794 { { { 8, 9}, {10,11} } , { {24,25}, {26,27} } , } };
00795 if (vh<0 || vh>1) return 0;
00796 if (udio<0 || udio>1) return 0;
00797 if (ch<0 || ch>1) return 0;
00798 int buffer = prepostAddress(prepost);
00799 if (buffer >= 0) return mxq[buffer][2][map[eastwest][vh][udio][ch]];
00800 return 0;
00801 }
00802
00803 unsigned short StTriggerData2009::pp2ppTAC(StBeamDirection eastwest, int vh, int udio, int ch, int prepost) const
00804 {
00805 static const int map[2][2][2][2] ={ { { { 0, 1}, { 2, 3} } , { {16,17}, {18,19} } , } ,
00806 { { { 8, 9}, {10,11} } , { {24,25}, {26,27} } , } };
00807 if (vh<0 || vh>1) return 0;
00808 if (udio<0 || udio>1) return 0;
00809 if (ch<0 || ch>1) return 0;
00810 int buffer = prepostAddress(prepost);
00811 if (buffer >= 0) return mxq[buffer][2][map[eastwest][vh][udio][ch]+4];
00812 return 0;
00813 }
00814
00815 unsigned long StTriggerData2009::pp2ppDSM(int prepost) const {
00816 if (prepost!=0) return 0;
00817 return L1_DSM->TOF[7];
00818 }
00819
00820 unsigned short StTriggerData2009::bemcLayer1DSM(int channel, int prepost) const {
00821 const int n_bemc_layer1=48;
00822 if (channel<0 || channel >=n_bemc_layer1) {
00823 gMessMgr->Warning() << "Barrel DSM layer 1 out of range (" << channel << ")" << endm;
00824 return 0;
00825 }
00826 int buffer = prepostAddress(prepost);
00827 if (buffer >= 0) if (mBC1[buffer]) return mBC1[buffer]->BEMClayer1[channel];
00828 return 0;
00829 }
00830
00831 unsigned short StTriggerData2009::eemcLayer1DSM(int channel, int prepost) const {
00832 const int n_eemc_layer1=16;
00833 if (channel<0 || channel >=n_eemc_layer1) {
00834 gMessMgr->Warning() << "Endap DSM layer 1 out of range (" << channel << ")" << endm;
00835 return 0;
00836 }
00837 int buffer = prepostAddress(prepost);
00838 if (buffer >= 0) if (mBC1[buffer]) return mBC1[buffer]->EEMClayer1[channel];
00839 return 0;
00840 }
00841
00842 unsigned short StTriggerData2009::emcLayer2DSM(int channel) const {
00843 const int n_emc_layer2=8;
00844 if (channel<0 || channel >=n_emc_layer2) {
00845 gMessMgr->Warning() << "EMC DSM layer 2 out of range (" << channel << ")" << endm;
00846 return 0;
00847 }
00848 return L1_DSM->EMC[channel];
00849 }
00850
00851 unsigned char StTriggerData2009::bemcHighTower(int patch_id, int prepost) const {
00852
00853 const int m_max_patch=300;
00854 if ( patch_id < 0 || patch_id >= m_max_patch) {
00855 gMessMgr->Warning() << "Invalid Barrel patch id: " << patch_id << endm;
00856 return 0;
00857 }
00858 int buffer = prepostAddress(prepost);
00859 if (buffer >= 0) {
00860 int dsm=patch_id/10;
00861 int channel=patch_id%10;
00862 unsigned short trg_word;
00863 if (dsm>=15) {
00864 if (mBCE[buffer])
00865 trg_word=decodeEmc12bit(dsm-15,channel,mBCE[buffer]->BEMCEast);
00866 else
00867 return 0;
00868 }
00869 else {
00870 if (mBCW[buffer])
00871 trg_word=decodeEmc12bit(dsm,channel,mBCW[buffer]->BEMCWest);
00872 else
00873 return 0;
00874 }
00875 return trg_word & 0x3F;
00876 }
00877 return 0;
00878 }
00879
00880 unsigned char StTriggerData2009::bemcJetPatch (int patch_id, int prepost) const
00881 {
00882
00883 const int m_max_patch=300;
00884 if ( patch_id < 0 || patch_id >= m_max_patch) {
00885 gMessMgr->Warning() << "Invalid Barrel patch id: " << patch_id << endm;
00886 return 0;
00887 }
00888 int buffer = prepostAddress(prepost);
00889 if (buffer >= 0) {
00890 int dsm=patch_id/10;
00891 int channel=patch_id%10;
00892 unsigned short trg_word;
00893 if (dsm>=15) {
00894 if (mBCE[buffer])
00895 trg_word=decodeEmc12bit(dsm-15,channel,mBCE[buffer]->BEMCEast);
00896 else
00897 return 0;
00898 }
00899 else {
00900 if (mBCW[buffer])
00901 trg_word=decodeEmc12bit(dsm,channel,mBCW[buffer]->BEMCWest);
00902 else
00903 return 0;
00904 }
00905 return trg_word >> 6;
00906 }
00907 return 0;
00908 }
00909
00910
00911 unsigned char StTriggerData2009::eemcHighTower(int patch_id, int prepost) const
00912 {
00913
00914 const int m_max_patch=90;
00915 if ( patch_id < 0 || patch_id >= m_max_patch) {
00916 gMessMgr->Warning() << "Invalid Endcap patch id" << endm;
00917 return 0;
00918 }
00919 int buffer = prepostAddress(prepost);
00920 if (buffer >= 0 && mBC1[buffer]) {
00921 int dsm=patch_id/10;
00922 int channel=patch_id%10;
00923 unsigned short trg_word = decodeEmc12bit(dsm,channel,mBC1[buffer]->EEMC);
00924 return trg_word & 0x3F;
00925 }
00926 return 0;
00927 }
00928
00929 unsigned char StTriggerData2009::eemcJetPatch (int patch_id, int prepost) const
00930 {
00931
00932 const int m_max_patch=90;
00933 if ( patch_id < 0 || patch_id >= m_max_patch) {
00934 gMessMgr->Warning() << "Invalid Endcap patch id" << endm;
00935 return 0;
00936 }
00937 int buffer = prepostAddress(prepost);
00938 if (buffer >= 0 && mBC1[buffer]) {
00939 int dsm=patch_id/10;
00940 int channel=patch_id%10;
00941 unsigned short trg_word = decodeEmc12bit(dsm,channel,mBC1[buffer]->EEMC);
00942 return trg_word >> 6;
00943 }
00944 return 0;
00945 }
00946
00947 unsigned char StTriggerData2009::bemcHighestTowerADC(int prepost) const {
00948
00949 const int m_max_patch=300;
00950 unsigned char h=0;
00951 for (int i=1; i<m_max_patch; i++){
00952 unsigned char hh=bemcHighTower(i,prepost);
00953 if (h>hh) h=hh;
00954 }
00955 return h;
00956 }
00957
00958 unsigned char StTriggerData2009::eemcHighestTowerADC(int prepost) const {
00959
00960 const int m_max_patch=90;
00961 unsigned char h=0;
00962 for (int i=1; i<m_max_patch; i++){
00963 unsigned char hh=eemcHighTower(i,prepost);
00964 if (h>hh) h=hh;
00965 }
00966 return h;
00967 }
00968
00969 char* StTriggerData2009::getTriggerStructure()
00970 {
00971 return (char*) mData;
00972 }
00973
00974 TriggerDataBlk2009* StTriggerData2009::getTriggerStructure2009()
00975 {
00976 return mData;
00977 }
00978
00979 int StTriggerData2009::getRawSize() const
00980 {
00981 return mData->totalTriggerLength;
00982 }
00983
00984 unsigned char* StTriggerData2009::getDsm0_BEMCE(int prepost) const {
00985 int buffer = prepostAddress(prepost);
00986 if (buffer >= 0) if (mBCE[buffer]) return mBCE[buffer]->BEMCEast;
00987 return 0;
00988 }
00989
00990 unsigned char* StTriggerData2009::getDsm0_BEMCW(int prepost) const {
00991 int buffer = prepostAddress(prepost);
00992 if (buffer >= 0) if (mBCW[buffer]) return mBCW[buffer]->BEMCWest;
00993 return 0;
00994 }
00995
00996 unsigned short* StTriggerData2009::getDsm1_BEMC(int prepost) const {
00997 int buffer = prepostAddress(prepost);
00998 if (buffer >= 0) if (mBC1[buffer]) return mBC1[buffer]->BEMClayer1;
00999 return 0;
01000 }
01001
01002 unsigned char* StTriggerData2009::getDsm0_EEMC(int prepost) const {
01003 int buffer = prepostAddress(prepost);
01004 if (buffer >= 0) if (mBC1[buffer]) return mBC1[buffer]->EEMC;
01005 return 0;
01006 }
01007
01008 unsigned short* StTriggerData2009::getDsm1_EEMC(int prepost) const{
01009 int buffer = prepostAddress(prepost);
01010 if (buffer >= 0) if (mBC1[buffer]) return mBC1[buffer]->EEMClayer1;
01011 return 0;
01012 }
01013
01014 unsigned short* StTriggerData2009::getDsm2_EMC() const{
01015 return L1_DSM->EMC;
01016 }
01017
01018 unsigned short* StTriggerData2009::getDsm3() const{
01019 return L1_DSM->lastDSM;
01020 }
01021
01022 int StTriggerData2009::L2ResultsOffset(StL2AlgorithmId id) const
01023 {
01024 switch(id) {
01025 default: return -999999999;
01026 }
01027 }
01028
01029 bool StTriggerData2009::isL2Triggered(StL2TriggerResultType id) const
01030 {
01031 return false;
01032 }
01033
01034 unsigned int StTriggerData2009::l2ResultLength() const
01035 {
01036 return sizeof(TrgSum->L2Result)/sizeof(unsigned int);
01037 }
01038
01039 const unsigned int* StTriggerData2009::l2Result() const
01040 {
01041 return TrgSum->L2Result;
01042 }
01043
01044 unsigned long long StTriggerData2009::l2sum() const
01045 {
01046
01047
01048 unsigned long long mask=(TrgSum->L2Sum[1]<<32) | TrgSum->L2Sum[0];
01049 return mask;
01050 }
01051
01052 unsigned short StTriggerData2009::vpdADC(StBeamDirection eastwest, int pmt, int prepost) const
01053 {
01054 static const int map[16] = {0, 1, 2, 3, 8, 9,10,11,16,17,18,19,24,25,26,27};
01055 if (pmt<1 || pmt>16) return 0;
01056 int buffer = prepostAddress(prepost);
01057 if (buffer >= 0) {
01058 if (mRun<=12003001) {return bbq[buffer][10+(int)eastwest*2][map[pmt-1]];}
01059 else {return bbq[buffer][6+(int)eastwest*2][map[pmt-1]];}
01060 }
01061 return 0;
01062 }
01063
01064 unsigned short StTriggerData2009::vpdTDC(StBeamDirection eastwest, int pmt, int prepost) const
01065 {
01066 static const int map[16] = {0, 1, 2, 3, 8, 9,10,11,16,17,18,19,24,25,26,27};
01067 if (pmt<1 || pmt>16) return 0;
01068 int buffer = prepostAddress(prepost);
01069 if (buffer >= 0) {
01070 if (mRun<=12003001) {return bbq[buffer][10+(int)eastwest*2][map[pmt-1]+4];}
01071 else {return bbq[buffer][6+(int)eastwest*2][map[pmt-1]+4];}
01072 }
01073 return 0;
01074 }
01075
01076 unsigned short StTriggerData2009::vpdADCHighThr(StBeamDirection eastwest, int pmt, int prepost) const
01077 {
01078 static const int map[16] = {0, 1, 2, 3, 8, 9,10,11,16,17,18,19,24,25,26,27};
01079 if (pmt<1 || pmt>16) return 0;
01080 int buffer = prepostAddress(prepost);
01081 if (buffer >= 0) {
01082 if (mRun<=12003001) {return bbq[buffer][6+(int)eastwest*2][map[pmt-1]];}
01083 else {return mxq[buffer][6+(int)eastwest*2][map[pmt-1]];}
01084 }
01085 return 0;
01086 }
01087
01088 unsigned short StTriggerData2009::vpdTDCHighThr(StBeamDirection eastwest, int pmt, int prepost) const
01089 {
01090 static const int map[16] = {0, 1, 2, 3, 8, 9,10,11,16,17,18,19,24,25,26,27};
01091 if (pmt<1 || pmt>16) return 0;
01092 int buffer = prepostAddress(prepost);
01093 if (buffer >= 0) {
01094 if (mRun<=12003001) {return bbq[buffer][6+(int)eastwest*2][map[pmt-1]+4];}
01095 else {return mxq[buffer][6+(int)eastwest*2][map[pmt-1]+4];};
01096 }
01097 return 0;
01098 }
01099
01100 unsigned short StTriggerData2009::vpdEarliestTDC(StBeamDirection eastwest, int prepost) const
01101 {
01102 int buffer = prepostAddress(prepost);
01103 if (buffer >= 0){
01104 if (mBBC[buffer]){
01105 if (mRun<=10096084){
01106 if (eastwest==east) {return mBBC[buffer]->VPD[6]%4096;}
01107 else {return mBBC[buffer]->VPD[4]%4096;}
01108 }
01109 else if(mRun<=12003001) {
01110 if (eastwest==east) {return mBBC[buffer]->VPD[2]%4096;}
01111 else {return mBBC[buffer]->VPD[0]%4096;}
01112 }
01113 else {
01114 if (eastwest==east) {return mBBC[buffer]->VPD[6]%4096;}
01115 else {return mBBC[buffer]->VPD[4]%4096;}
01116 }
01117
01118 }
01119 }
01120 return 0;
01121 }
01122
01123 unsigned short StTriggerData2009::vpdEarliestTDCHighThr(StBeamDirection eastwest, int prepost) const
01124 {
01125 int buffer = prepostAddress(prepost);
01126 if (buffer >= 0){
01127 if (mRun<=10365999){
01128 return 0;
01129 }
01130 else if(mRun<=12003001) {
01131 if (mBBC[buffer]){
01132 if (eastwest==east) {return mBBC[buffer]->VPD[6]%4096;}
01133 else {return mBBC[buffer]->VPD[4]%4096;}
01134 }
01135 }else {
01136 if(mMIX[buffer]){
01137 if (eastwest==east) {return mMIX[buffer]->MTD_P2PLayer1[13] + ((mMIX[buffer]->MTD_P2PLayer1[12]&0x0f)<<8);}
01138 else {return mMIX[buffer]->MTD_P2PLayer1[9] + ((mMIX[buffer]->MTD_P2PLayer1[8]&0x0f)<<8);}
01139 }
01140 }
01141 }
01142 return 0;
01143 }
01144
01145 unsigned short StTriggerData2009::vpdTimeDifference() const
01146 {
01147 return L1_DSM->VTX[7]%8192;
01148 }
01149
01150 unsigned short StTriggerData2009::nQTdata(int prepost) const
01151 {
01152 return 0;
01153 }
01154
01155 unsigned int* StTriggerData2009::QTdata(int prepost) const
01156 {
01157 return 0;
01158 }
01159
01160 unsigned short StTriggerData2009::fmsADC(int crt, int adr, int ch, int prepost) const
01161 {
01162 int buffer = prepostAddress(prepost);
01163 if (buffer >= 0 && crt>=1 && crt<=5 && adr>=0 && adr<16 && ch>=0 && ch<=31){
01164 switch(crt){
01165 case 1: return qt1[buffer][adr][ch];
01166 case 2: return qt2[buffer][adr][ch];
01167 case 3: return qt3[buffer][adr][ch];
01168 case 4: return qt4[buffer][adr][ch];
01169 case 5: return feq[buffer][adr][ch];
01170 }
01171 }
01172 return 0;
01173 }
01174
01175 unsigned short StTriggerData2009::fmsTDC(int crt, int adr, int ch, int prepost) const
01176 {
01177 int buffer = prepostAddress(prepost);
01178 if (buffer >= 0 && crt>=1 && crt<=5 && adr>=0 && adr<16 && ch>=0 && ch<=31){
01179 switch(crt){
01180 case 1: return tqt1[buffer][adr][ch];
01181 case 2: return tqt2[buffer][adr][ch];
01182 case 3: return tqt3[buffer][adr][ch];
01183 case 4: return tqt4[buffer][adr][ch];
01184 case 5: return tfeq[buffer][adr][ch];
01185 }
01186 }
01187 return 0;
01188 }
01189
01190 unsigned char* StTriggerData2009::getDsm_FMS(int prepost) const
01191 {
01192 int buffer = prepostAddress(prepost);
01193 if (buffer >= 0) if (mFMS[buffer]) return mFMS[buffer]->FMS;
01194 return 0;
01195 }
01196
01197 unsigned short* StTriggerData2009::getDsm1_FMS(int prepost) const
01198 {
01199 int buffer = prepostAddress(prepost);
01200 if (buffer >= 0) if (mMIX[buffer]) return mMIX[buffer]->FPDEastNSLayer1;
01201 return 0;
01202 }
01203
01204 unsigned short* StTriggerData2009::getDsm2_FMS() const {return L1_DSM->FPD;}
01205
01206 unsigned short StTriggerData2009::mtdAtAddress(int address, int prepost) const
01207 {
01208 int buffer = prepostAddress(prepost);
01209 if (buffer >= 0 && address>=0 && address<32) return mxq[buffer][0][address];
01210 return 0;
01211 }
01212
01213 unsigned short StTriggerData2009::mtdgemAtAddress(int address, int prepost) const
01214 {
01215 if (mRun<=12003001) return 0;
01216 int buffer = prepostAddress(prepost);
01217 if (buffer >= 0 && address>=0 && address<32) return mxq[buffer][10][address];
01218 return 0;
01219 }
01220
01221
01222 unsigned short StTriggerData2009::mtdAdc(StBeamDirection eastwest, int pmt, int prepost) const
01223 {
01224
01225 int buffer = prepostAddress(prepost);
01226 if (buffer >= 0 && pmt==0){
01227 if (eastwest==east) {
01228 if (mRun<=10133008) return mxq[buffer][0][0];
01229 else return mxq[buffer][0][24];
01230 }
01231 if (eastwest==west) return mxq[buffer][0][8];
01232 }
01233 return 0;
01234 }
01235
01236 unsigned short StTriggerData2009::mtdTdc(StBeamDirection eastwest, int pmt, int prepost) const
01237 {
01238
01239 int buffer = prepostAddress(prepost);
01240 if (buffer >= 0 && pmt==0){
01241 if (eastwest==east) {
01242 if (mRun<=10133008) return mxq[buffer][0][4];
01243 else return mxq[buffer][0][28];
01244 }
01245 if (eastwest==west) return mxq[buffer][0][12];
01246 }
01247 return 0;
01248 }
01249
01250 unsigned char StTriggerData2009::mtdDsmAtCh(int ch, int prepost) const
01251 {
01252 int map[16] = {7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8};
01253 int buffer = prepostAddress(prepost);
01254 if (buffer >= 0 && ch>=0 && ch<16){
01255 if (mMIX[buffer]) return mMIX[buffer]->MTD_P2PLayer1[map[ch]];
01256 }
01257 return 0;
01258 }
01259
01260 bool StTriggerData2009::mtdDsmHit(int pmt, int prepost) const
01261 {
01262
01263 int buffer = prepostAddress(prepost);
01264 if (buffer >= 0){
01265 if(mMIX[buffer]){
01266 if(mRun<10133008 && mRun<11000000){
01267 if( (mMIX[buffer]->MTD_P2PLayer1[5] & 0x1) && (mMIX[buffer]->MTD_P2PLayer1[5] & 0x10) ) return true;
01268 }else{
01269 if(prepost!=0) return false;
01270 return (L1_DSM->TOF[3] & 0x1);
01271 }
01272 }
01273 }
01274 return false;
01275 }
01276
01277 unsigned short StTriggerData2009::tofAtAddress(int address, int prepost) const
01278 {
01279 int buffer = prepostAddress(prepost);
01280 if (buffer>=0 && address>=0 && address<48) {
01281 if (mMIX[buffer]) return mMIX[buffer]->TOF[address];
01282 }
01283 return 0;
01284 }
01285
01286 unsigned short StTriggerData2009::tofTrayMultiplicity(int tray, int prepost) const
01287 {
01288 int dsmmap[8] = {3,2,1,0,7,6,5,4};
01289 int traydsm[120] = { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5,
01290 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3,
01291 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,
01292 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
01293 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
01294 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1};
01295 int traych[120] = { 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3,
01296 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3,
01297 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3,
01298 18,19,10,11,12,13,14,15,16,17,18,19,10,11,12,13,14,15,16,17,
01299 18,19,10,11,12,13,14,15,16,17,18,19,10,11,12,13,14,15,16,17,
01300 18,19,10,11,12,13,14,15,16,17,18,19,10,11,12,13,14,15,16,17};
01301 int buffer = prepostAddress(prepost);
01302 if (buffer>=0 && tray>=1 && tray<=120) {
01303 if (mMIX[buffer]) {
01304 int address = traydsm[tray-1]*8 + dsmmap[traych[tray-1]/3];
01305 int ch = traych[tray-1]%3;
01306 return (mMIX[buffer]->TOF[address] >> (5*ch)) & 0x1f;
01307 }
01308 }
01309 return 0;
01310 }
01311
01312 unsigned short StTriggerData2009::tofMultiplicity(int prepost) const
01313 {
01314 if (prepost==0) return L1_DSM->TOF[1]%8192;
01315 return 0;
01316 }
01317
01318 void StTriggerData2009::dump() const
01319 {
01320 printf("***** StTriggerData Dump *****\n");
01321 printf(" mDebug=%d mData=%p\n",mDebug,mData);
01322 printf(" Year=%d Version=%x\n",year(),version());
01323 printf(" Run#=%d Event#=%d\n",mRun,eventNumber());
01324 printf(" %d pre and %d post crossing data available\n",numberOfPreXing(),numberOfPostXing());
01325 printf(" Token=%d TriggerWord=%x ActionWord=%x BusyStatus=%x\n",
01326 token(), triggerWord(), actionWord(), busyStatus());
01327 printf(" TUC Bits=%d : ",tcuBits());
01328 for (int i=0; i<16; i++) {printf(" %d",(tcuBits()>>(15-i))%2);}; printf("\n");
01329 printf(" BunchId 7bit=%d 48bit=%d\n",bunchId7Bit(), bunchId48Bit());
01330 printf(" Spin Bits=%d : ",spinBit());
01331 for (int i=0; i<8; i++) {printf(" %d",(spinBit()>>(7-i))%2);}; printf("\n");
01332
01333 printf(" BBC East ADC : "); for (int i=1; i<=24;i++){ printf("%d ",bbcADC(east,i,0)); }; printf("\n");
01334 printf(" BBC West ADC : "); for (int i=1; i<=24;i++){ printf("%d ",bbcADC(west,i,0)); }; printf("\n");
01335 printf(" BBC East TAC : "); for (int i=1; i<=16;i++){ printf("%d ",bbcTDC(east,i,0)); }; printf("\n");
01336 printf(" BBC West TAC : "); for (int i=1; i<=16;i++){ printf("%d ",bbcTDC(west,i,0)); }; printf("\n");
01337 for (int i=-numberOfPreXing(); i<=static_cast<int>(numberOfPostXing()); i++){
01338 printf(" BBC Sums %d xing : ",i);
01339 printf("East=%d West=%d Large tile East=%d West=%d\n",
01340 bbcADCSum(east,i),bbcADCSum(west,i),
01341 bbcADCSumLargeTile(east,i),bbcADCSumLargeTile(west,i));
01342 }
01343 printf(" BBC Earilest : "); printf("East=%d West=%d Difference+256=%d\n",
01344 bbcEarliestTDC(east,0),bbcEarliestTDC(west,0),bbcTimeDifference());
01345 printf(" ZDC Earilest : "); printf("East=%d West=%d Difference=%d\n",
01346 zdcEarliestTDC(east,0),zdcEarliestTDC(west,0),zdcTimeDifference());
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356
01357
01358 printf(" ZDC Sum(A) East : ");printf("%d ",zdcAttenuated(east)); printf("\n");
01359 printf(" ZDC Sum(A) West : ");printf("%d ",zdcAttenuated(west)); printf("\n");
01360 printf(" ZDC Sum(UA) East : ");printf("%d ",zdcUnAttenuated(east)); printf("\n");
01361 printf(" ZDC Sum(UA) West : ");printf("%d ",zdcUnAttenuated(west)); printf("\n");
01362 printf(" VPD E Earliest TAC : %d\n", vpdEarliestTDC(east));
01363 printf(" VPD W Earliest TAC : %d\n", vpdEarliestTDC(west));
01364 printf(" VPD TimeDifference : %d\n", vpdTimeDifference());
01365 printf(" L2 result : \n");
01366 for (int j=0; j<4 ;j++) { for (int k=0; k<16; k++) {printf("%u ",*(l2Result()+j*16+k)); } printf("\n");}
01367 printf("BBClayer1:");
01368 int buffer = prepostAddress(0);
01369 if (buffer >=0){
01370 if (mBBC[buffer]){
01371 for (int i = 0;i < 16;i++) printf(" %1x %04X", i, mBBC[buffer]->BBClayer1[i]);
01372 }
01373 }
01374 printf("\n");
01375 printf("ZDClayer1:");
01376 if (buffer >=0){
01377 if (mBBC[buffer]){
01378 for (int i = 0;i < 8;i++) printf(" %1x %04X", i, mBBC[buffer]->ZDClayer1[i]);
01379 }
01380 }
01381 printf("\n");
01382 printf("VPDlayer1:");
01383 if (buffer >=0){
01384 if (mBBC[buffer]){
01385 for (int i = 0;i < 8;i++) printf(" %1x %04X", i, mBBC[buffer]->VPD[i]);
01386 }
01387 }
01388 printf("\n");
01389 printf("VTX:");
01390 if (L1_DSM){
01391 for (int i = 0;i < 8;i++) printf(" %1x %04X", i, L1_DSM->VTX[i]);
01392 }
01393 printf("\n");
01394 printf("Last DSM:");
01395 if (L1_DSM){
01396 for (int i = 0;i < 8;i++) printf(" %1x %04X", i, L1_DSM->lastDSM[i]);
01397 }
01398 printf("\n");
01399 printf("***** End StTriggerData Dump *****\n");
01400 }
01401
01402 void StTriggerData2009::killFMS(){
01403 TrgOfflen2009* offlen;
01404 int npre = numberOfPreXing();
01405 int npost = numberOfPostXing();
01406 for (int i=0; i<1+npre+npost; i++){
01407 if (i==0)
01408 {offlen = mData->MainX;}
01409 else {
01410 if (mData->PrePostList[i-1]==0) continue;
01411 offlen = (TrgOfflen2009*) ((char*)mData + mData->PrePostList[i-1]);
01412 }
01413 int j;
01414 j=offlen[y9FEQ_CONF_NUM].length; if (j>0){memset((char*)mData + offlen[y9FEQ_CONF_NUM].offset, 0, j); offlen[y9FEQ_CONF_NUM].length=0;};
01415 j=offlen[y9QT1_CONF_NUM].length; if (j>0){memset((char*)mData + offlen[y9QT1_CONF_NUM].offset, 0, j); offlen[y9QT1_CONF_NUM].length=0;};
01416 j=offlen[y9QT2_CONF_NUM].length; if (j>0){memset((char*)mData + offlen[y9QT2_CONF_NUM].offset, 0, j); offlen[y9QT2_CONF_NUM].length=0;};
01417 j=offlen[y9QT3_CONF_NUM].length; if (j>0){memset((char*)mData + offlen[y9QT3_CONF_NUM].offset, 0, j); offlen[y9QT3_CONF_NUM].length=0;};
01418 j=offlen[y9QT4_CONF_NUM].length; if (j>0){memset((char*)mData + offlen[y9QT4_CONF_NUM].offset, 0, j); offlen[y9QT4_CONF_NUM].length=0;};
01419 }
01420 }
01421
01422 void StTriggerData2009::Streamer(TBuffer &R__b)
01423 {
01424
01425
01426 if (R__b.IsReading()) {
01427 R__b.ReadClassBuffer(StTriggerData2009::Class(),this);
01428
01429 if(mData) readData();
01430 }
01431 else {
01432 R__b.WriteClassBuffer(StTriggerData2009::Class(),this);
01433 }
01434 }