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