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 #include <string.h>
00034 #include <assert.h>
00035 #include <iostream>
00036 #include "StTriggerData2008.h"
00037
00038 ClassImp(StTriggerData2008)
00039
00040 StTriggerData2008::StTriggerData2008()
00041 {
00042 mYear=2008;
00043 mData=0;
00044 }
00045
00046 StTriggerData2008::StTriggerData2008(const TrgDataType2008* data, int run)
00047 {
00048 mYear=2008;
00049 mRun = run;
00050 mData= new TrgDataType2008;
00051 int npre = data->EvtDesc.npre;
00052 int npost = data->EvtDesc.npost;
00053 assert(npre >=0);
00054 assert(npre <=5);
00055 assert(npost>=0);
00056 assert(npost<=5);
00057 int size = sizeof(EvtDescData2008)+sizeof(TrgSumData2008)
00058 + sizeof(RawTrgDet2008)*(npre+npost+1);
00059 memcpy(mData,data,size);
00060 memset((char*)mData+size,0,sizeof(TrgDataType2008)-size);
00061
00062 }
00063
00064 unsigned int StTriggerData2008::version() const
00065 {
00066 return mData->EvtDesc.TrgDataFmtVer;
00067 }
00068
00069 StTriggerData2008::~StTriggerData2008() {delete mData;}
00070
00071 unsigned int StTriggerData2008::token() const
00072 {
00073 return mData->EvtDesc.TrgToken;
00074 }
00075
00076 unsigned int StTriggerData2008::triggerWord() const
00077 {
00078 return mData->EvtDesc.TriggerWord;
00079 }
00080
00081 unsigned int StTriggerData2008::actionWord() const
00082 {
00083 return
00084 ( (unsigned short)(mData->EvtDesc.actionWdTrgCommand) * 16 * 16 * 16 ) +
00085 ( (unsigned short)(mData->EvtDesc.actionWdDaqCommand) * 16 * 16 ) +
00086 ( mData->EvtDesc.actionWdDetectorBitMask & 0x00ff ) ;
00087 }
00088
00089 unsigned int StTriggerData2008::numberOfPreXing() const
00090 {
00091 return mData->EvtDesc.npre;
00092 }
00093
00094 unsigned int StTriggerData2008::numberOfPostXing() const
00095 {
00096 return mData->EvtDesc.npost;
00097 }
00098
00099 unsigned short StTriggerData2008::busyStatus() const{
00100 return mData->EvtDesc.modifiedBusyStatus;
00101 }
00102
00103 unsigned short StTriggerData2008::dsmInput() const{
00104 return mData->EvtDesc.DSMInput;
00105 }
00106
00107 unsigned short StTriggerData2008::trgToken() const{
00108 return mData->EvtDesc.TrgToken;
00109 }
00110
00111 unsigned short StTriggerData2008::dsmAddress() const{
00112 return mData->EvtDesc.DSMAddress;
00113 }
00114
00115 unsigned short StTriggerData2008::mAddBits() const{
00116 return mData->EvtDesc.addBits;
00117 }
00118
00119 unsigned short StTriggerData2008::bcData(int channel) const{
00120 return mData->TrgSum.DSMdata.BCdata[channel];
00121 }
00122
00123 unsigned short StTriggerData2008::lastDSM(int channel) const{
00124 return mData->TrgSum.DSMdata.lastDSM[channel];
00125 }
00126
00127 unsigned short StTriggerData2008::tcuBits() const
00128 {
00129 return mData->EvtDesc.DSMInput;
00130 }
00131
00132 unsigned int StTriggerData2008::bunchCounterHigh() const
00133 {
00134 return mData->EvtDesc.bunchXing_hi;
00135 }
00136
00137 unsigned int StTriggerData2008::bunchCounterLow() const
00138 {
00139 return mData->EvtDesc.bunchXing_lo;
00140 }
00141
00142 unsigned int StTriggerData2008::bunchId48Bit() const
00143 {
00144 unsigned long long bxinghi,bxing1,bxinglo, bx;
00145 bxinghi = mData->TrgSum.DSMdata.BCdata[3];
00146 bxing1 = mData->TrgSum.DSMdata.BCdata[10];
00147 bxinglo = (bxing1 << 16) + mData->TrgSum.DSMdata.BCdata[11];
00148 bx = (bxinghi << 32) + bxinglo;
00149 return (int)(bx % 120);
00150 }
00151
00152 unsigned int StTriggerData2008::bunchId7Bit() const
00153 {
00154 int b7=0, b7dat;
00155 b7dat = mData->TrgSum.DSMdata.BCdata[2];
00156 b7 = b7dat & 0x7f;
00157 return b7;
00158 }
00159
00160 unsigned int StTriggerData2008::spinBit() const
00161 {
00162 return (mData->TrgSum.DSMdata.lastDSM[7]/16)%256;
00163 }
00164
00165 unsigned int StTriggerData2008::spinBitYellowFilled() const
00166 {
00167 unsigned int sb = spinBit();
00168 return sb%2;
00169 }
00170
00171 unsigned int StTriggerData2008::spinBitYellowUp() const
00172 {
00173 unsigned int sb = spinBit();
00174 return (sb/2)%2;
00175 }
00176
00177 unsigned int StTriggerData2008::spinBitYellowDown() const
00178 {
00179 unsigned int sb = spinBit();
00180 return (sb/4)%2;
00181 }
00182
00183 unsigned int StTriggerData2008::spinBitYellowUnpol() const
00184 {
00185 unsigned int sb = spinBit();
00186 return (sb/8)%2;
00187 }
00188
00189 unsigned int StTriggerData2008::spinBitBlueFilled() const
00190 {
00191 unsigned int sb = spinBit();
00192 return (sb/16)%2;
00193 }
00194
00195 unsigned int StTriggerData2008::spinBitBlueUp() const
00196 {
00197 unsigned int sb = spinBit();
00198 return (sb/32)%2;
00199 }
00200
00201 unsigned int StTriggerData2008::spinBitBlueDown() const
00202 {
00203 unsigned int sb = spinBit();
00204 return (sb/64)%2;
00205 }
00206
00207 unsigned int StTriggerData2008::spinBitBlueUnpol() const
00208 {
00209 unsigned int sb = spinBit();
00210 return (sb/128)%2;
00211 }
00212
00213 unsigned short StTriggerData2008::ctbRaw(int address, int prepost) const
00214 {
00215 return mData->rawTriggerDet[prepostAddress(prepost)].CTB[address];
00216 }
00217
00218 unsigned short StTriggerData2008::ctb(int pmt, int prepost) const
00219 {
00220 static const unsigned char ctbMap[240] = {
00221 7, 6, 5, 4, 3, 23, 22, 21, 20, 19,
00222 2, 1, 0, 15, 14, 18, 17, 16, 31, 30,
00223 13, 12, 11, 10, 9, 29, 28, 27, 26, 25,
00224 39, 38, 37, 36, 35, 55, 54, 53, 52, 51,
00225 34, 33, 32, 47, 46, 50, 49, 48, 63, 62,
00226 45, 44, 43, 42, 41, 61, 60, 59, 58, 57,
00227 71, 70, 69, 68, 67, 87, 86, 85, 84, 83,
00228 66, 65, 64, 79, 78, 82, 81, 80, 95, 94,
00229 77, 76, 75, 74, 73, 93, 92, 91, 90, 89,
00230 103, 102, 101, 100, 99, 119, 118, 117, 116, 115,
00231 98, 97, 96, 111, 110, 114, 113, 112, 127, 126,
00232 109, 108, 107, 106, 105, 125, 124, 123, 122, 121,
00233 135, 134, 133, 132, 131, 151, 150, 149, 148, 147,
00234 130, 129, 128, 143, 142, 146, 145, 144, 159, 158,
00235 141, 140, 139, 138, 137, 157, 156, 155, 154, 153,
00236 167, 166, 165, 164, 163, 183, 182, 181, 180, 179,
00237 162, 161, 160, 175, 174, 178, 177, 176, 191, 190,
00238 173, 172, 171, 170, 169, 189, 188, 187, 186, 185,
00239 199, 198, 197, 196, 195, 215, 214, 213, 212, 211,
00240 194, 193, 192, 207, 206, 210, 209, 208, 223, 222,
00241 205, 204, 203, 202, 201, 221, 220, 219, 218, 217,
00242 231, 230, 229, 228, 227, 247, 246, 245, 244, 243,
00243 226, 225, 224, 239, 238, 242, 241, 240, 255, 254,
00244 237, 236, 235, 234, 233, 253, 252, 251, 250, 249,
00245 } ;
00246 int v=0;
00247 int add=prepostAddress(prepost);
00248 if(add>=0) v=mData->rawTriggerDet[add].CTB[ctbMap[pmt]];
00249 return v;
00250 }
00251
00252 unsigned short StTriggerData2008::ctbTraySlat(int tray, int slat, int prepost) const{
00253 static const unsigned char ctbMap[2][120] = {
00254 { 109, 108, 107, 106, 105, 7, 6, 5, 4, 3,
00255 2, 1, 0, 15, 14, 13, 12, 11, 10, 9,
00256 39, 38, 37, 36, 35, 34, 33, 32, 47, 46,
00257 45, 44, 43, 42, 41, 71, 70, 69, 68, 67,
00258 66, 65, 64, 79, 78, 77, 76, 75, 74, 73,
00259 103, 102, 101, 100, 99, 98, 97, 96, 111, 110,
00260 141, 140, 139, 138, 137, 167, 166, 165, 164, 163,
00261 162, 161, 160, 175, 174, 173, 172, 171, 170, 169,
00262 199, 198, 197, 196, 195, 194, 193, 192, 207, 206,
00263 205, 204, 203, 202, 201, 231, 230, 229, 228, 227,
00264 226, 225, 224, 239, 238, 237, 236, 235, 234, 233,
00265 135, 134, 133, 132, 131, 130, 129, 128, 143, 142},
00266 { 125, 124, 123, 122, 121, 23, 22, 21, 20, 19,
00267 18, 17, 16, 31, 30, 29, 28, 27, 26, 25,
00268 55, 54, 53, 52, 51, 50, 49, 48, 63, 62,
00269 61, 60, 59, 58, 57, 87, 86, 85, 84, 83,
00270 82, 81, 80, 95, 94, 93, 92, 91, 90, 89,
00271 119, 118, 117, 116, 115, 114, 113, 112, 127, 126,
00272 157, 156, 155, 154, 153, 183, 182, 181, 180, 179,
00273 178, 177, 176, 191, 190, 189, 188, 187, 186, 185,
00274 215, 214, 213, 212, 211, 210, 209, 208, 223, 222,
00275 221, 220, 219, 218, 217, 247, 246, 245, 244, 243,
00276 242, 241, 240, 255, 254, 253, 252, 251, 250, 249,
00277 151, 150, 149, 148, 147, 146, 145, 144, 159, 158}
00278 };
00279 int v=0;
00280 int add=prepostAddress(prepost);
00281 if(add>=0) v=mData->rawTriggerDet[add].CTB[ctbMap[slat][tray]];
00282 return v;
00283 }
00284
00285 unsigned short StTriggerData2008::ctbSum(int prepost) const{
00286 unsigned short sum=0;
00287 for (int i=1; i<240; i++){sum+=ctb(i,prepost);}
00288 return sum;
00289 }
00290
00291 unsigned short StTriggerData2008::bbcADC(StBeamDirection eastwest, int pmt, int prepost) const
00292 {
00293 static const int q_map[2][24] = {
00294 { 8 , 5 , 4 , 40 , 37 , 36 , 7 , 6 ,
00295 3 , 2 , 1 , 39 , 38 , 35 , 34 , 33 ,
00296 72 , 71 , 70 , 69 , 68 , 67 , 66 , 65 },
00297 { 24 , 21 , 20 , 56 , 53 , 52 , 23 , 22 ,
00298 19 , 18 , 17 , 55 , 54 , 51 , 50 , 49 ,
00299 88 , 87 , 86 , 85 , 84 , 83 , 82 , 81 }
00300 };
00301 return mData->rawTriggerDet[prepostAddress(prepost)].BBC[q_map[eastwest][pmt-1]-1];
00302 }
00303
00304 unsigned short StTriggerData2008::bbcTDC(StBeamDirection eastwest, int pmt, int prepost) const
00305 {
00306 static const int t_map[2][24] ={
00307 { 16 , 13 , 12 , 48 , 45 , 44 , 15 , 14 ,
00308 11 , 10 , 9 , 47 , 46 , 43 , 42 , 41 ,
00309 80 , 79 , 78 , 77 , 76 , 75 , 74 , 73 },
00310 { 32 , 29 , 28 , 64 , 61 , 60 , 31 , 30 ,
00311 27 , 26 , 25 , 63 , 62 , 59 , 58 , 57 ,
00312 96 , 95 , 94 , 93 , 92 , 91 , 90 , 89 }
00313 };
00314 return mData->rawTriggerDet[prepostAddress(prepost)].BBC[t_map[eastwest][pmt-1]-1];
00315 }
00316
00317 unsigned short StTriggerData2008::bbcADCSum(StBeamDirection eastwest, int prepost) const
00318 {
00319 int address = prepostAddress(prepost);
00320 if (eastwest==east){
00321 return
00322 mData->rawTriggerDet[address].BBClayer1[7]%2048+
00323 mData->rawTriggerDet[address].BBClayer1[3]%2048;
00324 }
00325 else {
00326 return
00327 mData->rawTriggerDet[address].BBClayer1[5]%2048+
00328 mData->rawTriggerDet[address].BBClayer1[1]%2048;
00329 }
00330 }
00331
00332 unsigned short StTriggerData2008::bbcADCSumLargeTile(StBeamDirection eastwest, int prepost) const
00333 {
00334 int address = prepostAddress(prepost);
00335 if (eastwest==east) { return mData->rawTriggerDet[address].BBClayer1[11]%2048; }
00336 else { return mData->rawTriggerDet[address].BBClayer1[10]%2048; }
00337 }
00338
00339 unsigned short StTriggerData2008::bbcEarliestTDC(StBeamDirection eastwest, int prepost) const
00340 {
00341 int address = prepostAddress(prepost), t1, t2;
00342 if (eastwest==east){
00343 t1 = mData->rawTriggerDet[address].BBClayer1[6]%256;
00344 t2 = mData->rawTriggerDet[address].BBClayer1[2]%256;
00345 }
00346 else {
00347 t1 = mData->rawTriggerDet[address].BBClayer1[4]%256;
00348 t2 = mData->rawTriggerDet[address].BBClayer1[0]%256;
00349 }
00350 return (t1>t2) ? t1 : t2;
00351 }
00352
00353 unsigned short StTriggerData2008::bbcTimeDifference() const
00354 {
00355 return mData->TrgSum.DSMdata.VTX[3]%512;
00356 }
00357
00358 unsigned short StTriggerData2008::fpd(StBeamDirection eastwest, int module, int pmt, int prepost) const
00359 {
00360 static const short fpdmap[2][6][49] = {
00361
00362 {
00363
00364 {39, 38, 37, 36, 35, 34, 33,
00365 7, 6, 5, 23, 22, 21, 55,
00366 4, 3, 2, 20, 19, 18, 54,
00367 1, 0, 15, 17, 16, 31, 53,
00368 14, 13, 12, 30, 29, 28, 52,
00369 11, 10, 9, 27, 26, 25, 51,
00370 32, 47, 46, 45, 44, 43, 42},
00371
00372 { 103,101,100, 99, 98, 97, 96,
00373 71, 70, 69, 87, 86, 85, 48,
00374 68, 67, 66, 84, 83, 82, 63,
00375 65, 64, 79, 81, 80, 95, 61,
00376 78, 77 ,76, 94, 93, 92, 60,
00377 75, 74, 73, 91, 90, 89, 59,
00378 111,110,109,108, 107, 106,105},
00379
00380 {135, 134, 133, 132, 131, 130, 129, 128, 143, 142,
00381 119, 118, 117, 116, 115, 114, 113, 112,
00382 127, 126, 125, 124, 123, 122, 121,
00383 -1, -1, -1,
00384 -1, -1, -1, -1, -1, -1, -1,
00385 -1, -1, -1, -1, -1, -1, -1,
00386 -1, -1, -1, -1, -1, -1, -1},
00387
00388 {151, 150, 149, 148, 147, 146, 145, 144,
00389 159, 158, 157, 156, 155, 154, 153,
00390 167, 166, 165, 164, 163, 162, 161, 160, 175, 174,
00391 -1, -1, -1,
00392 -1, -1, -1, -1, -1, -1, -1,
00393 -1, -1, -1, -1, -1, -1, -1,
00394 -1, -1, -1, -1, -1, -1, -1},
00395
00396 { 50, 49, 141, 140, 139, 138, 137,
00397 -1, -1, -1, -1, -1, -1, -1,
00398 -1, -1, -1, -1, -1, -1, -1,
00399 -1, -1, -1, -1, -1, -1, -1,
00400 -1, -1, -1, -1, -1, -1, -1,
00401 -1, -1, -1, -1, -1, -1, -1,
00402 -1, -1, -1, -1, -1, -1, -1},
00403
00404 { 58, 57, 173, 172, 171, 170, 169,
00405 -1, -1, -1, -1, -1, -1, -1,
00406 -1, -1, -1, -1, -1, -1, -1,
00407 -1, -1, -1, -1, -1, -1, -1,
00408 -1, -1, -1, -1, -1, -1, -1,
00409 -1, -1, -1, -1, -1, -1, -1,
00410 -1, -1, -1, -1, -1, -1, -1},
00411 },
00412
00413 {
00414
00415 { -1, -1, -1, -1, -1, -1, -1,
00416 -1, -1, -1, -1, -1, -1, -1,
00417 -1, -1, -1, -1, -1, -1, -1,
00418 -1, -1, -1, -1, -1, -1, -1,
00419 -1, -1, -1, -1, -1, -1, -1,
00420 -1, -1, -1, -1, -1, -1, -1,
00421 -1, -1, -1, -1, -1, -1, -1},
00422
00423 { 71, 70, 87, 86, 96, 97, 48,
00424 69, 68, 85, 84, 98, 99, 63,
00425 67, 66, 83, 82, 100, 101, 62,
00426 65, 64, 81, 80, 102, 103, 61,
00427 79, 78, 90, 91, 106, 107, 60,
00428 77, 76, 92, 93, 108, 109, 59,
00429 75, 74, 94, 95, 110, 111, 58},
00430
00431 { -1, -1, -1, -1, -1, -1, -1,
00432 -1, -1, -1, -1, -1, -1, -1,
00433 -1, -1, -1, -1, -1, -1, -1,
00434 -1, -1, -1, -1, -1, -1, -1,
00435 -1, -1, -1, -1, -1, -1, -1,
00436 -1, -1, -1, -1, -1, -1, -1,
00437 -1, -1, -1, -1, -1, -1, -1},
00438
00439 { 77, 70, 69, 68, 67,
00440 66, 65, 64, 79, 78,
00441 87, 86, 85, 84, 83,
00442 82, 81, 80, 95, 94,
00443 93, 76, 91, 90, 89,
00444 -1, -1, -1,
00445 -1, -1, -1, -1, -1, -1, -1,
00446 -1, -1, -1, -1, -1, -1, -1,
00447 -1, -1, -1, -1, -1, -1, -1},
00448
00449 { -1, -1, -1, -1, -1, -1, -1,
00450 -1, -1, -1, -1, -1, -1, -1,
00451 -1, -1, -1, -1, -1, -1, -1,
00452 -1, -1, -1, -1, -1, -1, -1,
00453 -1, -1, -1, -1, -1, -1, -1,
00454 -1, -1, -1, -1, -1, -1, -1,
00455 -1, -1, -1, -1, -1, -1, -1},
00456
00457 { 7, 6, 5, 4, 3, 2, 1,
00458 -1, -1, -1, -1, -1, -1, -1,
00459 -1, -1, -1, -1, -1, -1, -1,
00460 -1, -1, -1, -1, -1, -1, -1,
00461 -1, -1, -1, -1, -1, -1, -1,
00462 -1, -1, -1, -1, -1, -1, -1,
00463 -1, -1, -1, -1, -1, -1, -1},
00464 }
00465 };
00466 int address = fpdmap[eastwest][module][pmt-1];
00467 if (address>=0){
00468 if (eastwest==east){
00469 if (address<112) return mData->rawTriggerDet[prepostAddress(prepost)].FPDEastNSLayer0[address];
00470 else return mData->rawTriggerDet[prepostAddress(prepost)].FPDEastTBLayer0[address-112];
00471 }
00472 else {
00473 return 0;
00474 }
00475 }
00476 else {
00477 return 0;
00478 }
00479 }
00480
00481 unsigned short StTriggerData2008::fpdSum(StBeamDirection eastwest, int module) const
00482 {
00483 static const short map[2][4]={{3,2,1,0},{7,6,5,4}};
00484 static const short nbit[2][4]={{16384,16384,8192,8192},{16384,16384,8192,8192}};
00485 return mData->TrgSum.DSMdata.FPD[map[eastwest][module]] % nbit[eastwest][module];
00486 }
00487
00488 unsigned short StTriggerData2008::fpdLayer1DSMRaw(StBeamDirection eastwest, int channel, int prepost) const{
00489 if (eastwest==east){
00490 if (channel<8) return mData->rawTriggerDet[prepostAddress(prepost)].FPDEastNSLayer1[channel];
00491 }
00492 return 0;
00493 }
00494
00495 unsigned short StTriggerData2008::fpdLayer1DSM(StBeamDirection eastwest, int module, int board, int prepost) const{
00496 static const short map[4][4]={{3,2,1,0},{7,6,5,4},{3,2,6,7},{1,0,4,5}};
00497 if (board<4){
00498 if (eastwest==east){
00499 if (module<2) return mData->rawTriggerDet[prepostAddress(prepost)].FPDEastNSLayer1[map[module][board]];
00500 else return 0;
00501 }
00502 else{
00503 return 0;
00504 }
00505 }
00506 return 0;
00507 }
00508
00509 unsigned short StTriggerData2008::fpdLayer2DSMRaw(int channel) const{
00510 if (channel<8) return mData->TrgSum.DSMdata.FPD[channel];
00511 return 0;
00512 }
00513
00514 unsigned short StTriggerData2008::fpdLayer2DSM(StBeamDirection eastwest, int module) const{
00515 static const int dsmmap[2][4]={{3,2,1,0},{7,6,5,4}};
00516 if (module<4) return mData->TrgSum.DSMdata.FPD[dsmmap[eastwest][module]];
00517 return 0;
00518 }
00519
00520 unsigned short StTriggerData2008::zdcAtChannel(int channel, int prepost) const
00521 {
00522 static const int dsmmap[16]={7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8};
00523 if (channel>=0 && channel<16){ return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[dsmmap[channel]]; }
00524 return 0;
00525 }
00526
00527 unsigned short StTriggerData2008::zdcAtAddress(int address, int prepost) const
00528 {
00529 if (address>=0 && address<16){ return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[address]; }
00530 return 0;
00531 }
00532
00533 unsigned short StTriggerData2008::zdcUnAttenuated(StBeamDirection eastwest, int prepost) const
00534 {
00535 if (eastwest==east) {return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[4];}
00536 if (eastwest==west) {return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[0];}
00537 return 0;
00538 }
00539
00540 unsigned short StTriggerData2008::zdcAttenuated(StBeamDirection eastwest, int prepost) const
00541 {
00542 if (eastwest==east) {return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[13];}
00543 if (eastwest==west) {return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[10];}
00544 return 0;
00545 }
00546
00547 unsigned short StTriggerData2008::zdcADC(StBeamDirection eastwest, int pmt, int prepost) const
00548 {
00549 if (eastwest==east && pmt==1) {return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[7];}
00550 if (eastwest==east && pmt==2) {return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[6];}
00551 if (eastwest==east && pmt==3) {return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[5];}
00552 if (eastwest==west && pmt==1) {return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[3];}
00553 if (eastwest==west && pmt==2) {return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[2];}
00554 if (eastwest==west && pmt==3) {return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[1];}
00555 return 0;
00556
00557 }
00558
00559 unsigned short StTriggerData2008::zdcTDC(StBeamDirection eastwest, int prepost) const
00560 {
00561 if (eastwest==east) {return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[8];}
00562 if (eastwest==west) {return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[9];}
00563 return 0;
00564 }
00565
00566 unsigned short StTriggerData2008::zdcHardwareSum(int prepost) const
00567 {
00568 return mData->rawTriggerDet[prepostAddress(prepost)].ZDC[14];
00569 }
00570
00571 unsigned short StTriggerData2008::zdcSMD(StBeamDirection eastwest, int verthori, int strip, int prepost) const
00572 {
00573
00574 static const int zdcsmd_map[2][2][8] ={
00575 { { 7, 6, 5, 4, 3, 2, 1,11} ,
00576 { 0,15,14,13,12,8, 10, 9} } ,
00577 { {23,22,21,20,19,18,17,26} ,
00578 {16,31,30,29,28,27,24,25} }
00579 };
00580 if (verthori<0 || verthori>1) return 0;
00581 if (strip<1 || strip>8) return 0;
00582 int add=-1;
00583 add=zdcsmd_map[eastwest][verthori][strip-1];
00584 if(add>=0) return mData->rawTriggerDet[prepostAddress(prepost)].ZDCSMD[add];
00585 else return 0;
00586 };
00587
00588 unsigned short StTriggerData2008::bemcLayer1DSM(int channel, int prepost) const {
00589 const int n_bemc_layer1=48;
00590 if (channel<0 || channel >=n_bemc_layer1) {
00591 gMessMgr->Warning() << "Barrel DSM layer 1 out of range (" << channel << ")" << endm;
00592 return 0;
00593 }
00594 return mData->rawTriggerDet[prepostAddress(prepost)].BEMClayer1[channel];
00595 }
00596
00597 unsigned short StTriggerData2008::eemcLayer1DSM(int channel, int prepost) const {
00598 const int n_eemc_layer1=48;
00599 if (channel<0 || channel >=n_eemc_layer1) {
00600 gMessMgr->Warning() << "Endap DSM layer 1 out of range (" << channel << ")" << endm;
00601 return 0;
00602 }
00603 return mData->rawTriggerDet[prepostAddress(prepost)].EEMClayer1[channel];
00604 }
00605
00606 unsigned short StTriggerData2008::emcLayer2DSM(int channel) const {
00607 const int n_emc_layer2=8;
00608 if (channel<0 || channel >=n_emc_layer2) {
00609 gMessMgr->Warning() << "EMC DSM layer 2 out of range (" << channel << ")" << endm;
00610 return 0;
00611 }
00612 return mData->TrgSum.DSMdata.EMC[channel];
00613 }
00614
00615 unsigned char StTriggerData2008::bemcHighTower(int patch_id, int prepost) const
00616 {
00617
00618 const int m_max_patch=300;
00619
00620 if ( patch_id < 0 || patch_id >= m_max_patch) {
00621 gMessMgr->Warning() << "Invalid Barrel patch id: " << patch_id << endm;
00622 return 0;
00623 }
00624
00625 int dsm=patch_id/10;
00626 int channel=patch_id%10;
00627 unsigned short trg_word;
00628 if (dsm>=15)
00629 trg_word=decodeEmc12bit(dsm-15,channel,mData->rawTriggerDet[prepostAddress(prepost)].BEMCEast);
00630 else
00631 trg_word=decodeEmc12bit(dsm,channel,mData->rawTriggerDet[prepostAddress(prepost)].BEMCWest);
00632 return trg_word & 0x3F;
00633 }
00634
00635 unsigned char StTriggerData2008::bemcJetPatch (int patch_id, int prepost) const
00636 {
00637
00638 const int m_max_patch=300;
00639
00640 if ( patch_id < 0 || patch_id >= m_max_patch) {
00641 gMessMgr->Warning() << "Invalid Barrel patch id: " << patch_id << endm;
00642 return 0;
00643 }
00644
00645 int dsm=patch_id/10;
00646 int channel=patch_id%10;
00647 unsigned short trg_word;
00648 if (dsm>=15)
00649 trg_word=decodeEmc12bit(dsm-15,channel,mData->rawTriggerDet[prepostAddress(prepost)].BEMCEast);
00650 else
00651 trg_word=decodeEmc12bit(dsm,channel,mData->rawTriggerDet[prepostAddress(prepost)].BEMCWest);
00652 return trg_word >> 6;
00653 }
00654
00655 unsigned char StTriggerData2008::eemcHighTower(int patch_id, int prepost) const
00656 {
00657
00658 const int m_max_patch=90;
00659
00660 if ( patch_id < 0 || patch_id >= m_max_patch) {
00661 gMessMgr->Warning() << "Invalid Endcap patch id" << endm;
00662 return 0;
00663 }
00664
00665 int dsm=patch_id/10;
00666 int channel=patch_id%10;
00667 unsigned short trg_word;
00668 trg_word=decodeEmc12bit(dsm,channel,mData->rawTriggerDet[prepostAddress(prepost)].EEMC);
00669 return trg_word & 0x3F;
00670 }
00671
00672 unsigned char StTriggerData2008::eemcJetPatch (int patch_id, int prepost) const
00673 {
00674
00675 const int m_max_patch=90;
00676
00677 if ( patch_id < 0 || patch_id >= m_max_patch) {
00678 gMessMgr->Warning() << "Invalid Endcap patch id" << endm;
00679 return 0;
00680 }
00681
00682 int dsm=patch_id/10;
00683 int channel=patch_id%10;
00684 unsigned short trg_word;
00685 trg_word=decodeEmc12bit(dsm,channel,mData->rawTriggerDet[prepostAddress(prepost)].EEMC);
00686 return trg_word >> 6;
00687 }
00688
00689 unsigned char StTriggerData2008::bemcHighestTowerADC(int prepost) const
00690 {
00691
00692 const int m_max_patch=300;
00693 unsigned char h=0;
00694 for (int i=1; i<m_max_patch; i++){
00695 unsigned char hh=bemcHighTower(i,prepost);
00696 if (h>hh) h=hh;
00697 }
00698 return h;
00699 }
00700
00701 unsigned char StTriggerData2008::eemcHighestTowerADC(int prepost) const
00702 {
00703
00704 const int m_max_patch=90;
00705 unsigned char h=0;
00706 for (int i=1; i<m_max_patch; i++){
00707 unsigned char hh=eemcHighTower(i,prepost);
00708 if (h>hh) h=hh;
00709 }
00710 return h;
00711 }
00712
00713 void StTriggerData2008::dump() const
00714 {
00715 printf("***** StTriggerData Dump *****\n");
00716 printf(" Year=%d Version=%x\n",year(),version());
00717 printf(" %d pre and %d post crossing data available\n",numberOfPreXing(),numberOfPostXing());
00718 printf(" Token=%d TriggerWord=%x ActionWord=%x BusyStatus=%x\n",
00719 token(), triggerWord(), actionWord(), busyStatus());
00720 printf(" TUC Bits=%d : ",tcuBits());
00721 for (int i=0; i<16; i++) {printf(" %d",(tcuBits()>>(15-i))%2);}; printf("\n");
00722 printf(" BunchId 7bit=%d 48bit=%d\n",bunchId7Bit(), bunchId48Bit());
00723 printf(" Spin Bits=%d : ",spinBit());
00724 for (int i=0; i<8; i++) {printf(" %d",(spinBit()>>(7-i))%2);}; printf("\n");
00725 printf(" CTB ADC : "); for (int i=0; i<240;i++){ printf("%d ",ctb(i,0)); }; printf("\n");
00726 printf(" BBC East ADC : "); for (int i=1; i<=24;i++){ printf("%d ",bbcADC(east,i,0)); }; printf("\n");
00727 printf(" BBC West ADC : "); for (int i=1; i<=24;i++){ printf("%d ",bbcADC(west,i,0)); }; printf("\n");
00728 printf(" BBC East TAC : "); for (int i=1; i<=16;i++){ printf("%d ",bbcTDC(east,i,0)); }; printf("\n");
00729 printf(" BBC West TAC : "); for (int i=1; i<=16;i++){ printf("%d ",bbcTDC(west,i,0)); }; printf("\n");
00730 for (int i=-numberOfPreXing(); i<=static_cast<int>(numberOfPostXing()); i++){
00731 printf(" BBC Sums %d xing : ",i);
00732 printf("East=%d West=%d Large tile East=%d West=%d\n",
00733 bbcADCSum(east,i),bbcADCSum(west,i),
00734 bbcADCSumLargeTile(east,i),bbcADCSumLargeTile(west,i));
00735 }
00736 printf(" BBC Earilest : "); printf("East=%d West=%d Difference+256=%d\n",
00737 bbcEarliestTDC(east,0),bbcEarliestTDC(west,0),bbcTimeDifference());
00738 printf(" FPD East North : ");for (int i=1; i<=49;i++){ printf("%d ",fpd(east,0,i,0)); }; printf("\n");
00739 printf(" FPD East South : ");for (int i=1; i<=49;i++){ printf("%d ",fpd(east,1,i,0)); }; printf("\n");
00740 printf(" FPD East Top : ");for (int i=1; i<=25;i++){ printf("%d ",fpd(east,2,i,0)); }; printf("\n");
00741 printf(" FPD East Bottom : ");for (int i=1; i<=25;i++){ printf("%d ",fpd(east,3,i,0)); }; printf("\n");
00742 printf(" FPD East North PS: ");for (int i=1; i<= 7;i++){ printf("%d ",fpd(east,4,i,0)); }; printf("\n");
00743 printf(" FPD East South PS: ");for (int i=1; i<= 7;i++){ printf("%d ",fpd(east,5,i,0)); }; printf("\n");
00744 printf(" FPD West South : ");for (int i=1; i<=49;i++){ printf("%d ",fpd(west,1,i,0)); }; printf("\n");
00745 printf(" FPD West Bottom : ");for (int i=1; i<=25;i++){ printf("%d ",fpd(west,3,i,0)); }; printf("\n");
00746 printf(" FPD West South PS: ");for (int i=1; i<= 7;i++){ printf("%d ",fpd(west,5,i,0)); }; printf("\n");
00747 printf(" FPD Sums East : ");for (int j=0; j<4 ;j++) printf("%d ",fpdSum(east,j)); printf("\n");
00748 printf(" FPD Sums West : ");for (int j=0; j<4 ;j++) printf("%d ",fpdSum(west,j)); printf("\n");
00749 printf(" ZDC Sum(A) East : ");printf("%d ",zdcAttenuated(east)); printf("\n");
00750 printf(" ZDC Sum(A) West : ");printf("%d ",zdcAttenuated(west)); printf("\n");
00751 printf(" ZDC Sum(UA) East : ");printf("%d ",zdcUnAttenuated(east)); printf("\n");
00752 printf(" ZDC Sum(UA) West : ");printf("%d ",zdcUnAttenuated(west)); printf("\n");
00753 printf(" VPD E Earliest TAC : %d\n", vpdEarliestTDC(east));
00754 printf(" VPD W Earliest TAC : %d\n", vpdEarliestTDC(west));
00755 printf(" VPD TimeDifference : %d\n", vpdTimeDifference());
00756 printf(" TOF : "); for (int j=0; j<16 ;j++) {printf("%d ",tofAtAddress(j));} printf("\n");
00757 printf(" TOF Multiplicity : %d\n",tofMultiplicity());
00758 printf(" NQTData=%d\n",nQTdata());
00759 printf(" QTLastWord=0x%x\n",(QTdata())[nQTdata()-1]);
00760 printf(" L2 result : \n");
00761 for (int j=0; j<4 ;j++) { for (int k=0; k<16; k++) {printf("%u ",*(l2Result()+j*16+k)); } printf("\n");}
00762 printf("\n");
00763 printf("***** StTriggerData Dump *****\n");
00764 }
00765
00766 char* StTriggerData2008::getTriggerStructure()
00767 {
00768 return (char*) mData;
00769 }
00770
00771 TrgDataType2008* StTriggerData2008::getTriggerStructure2008()
00772 {
00773 return mData;
00774 }
00775
00776 int StTriggerData2008::getRawSize() const
00777 {
00778 int npre = numberOfPreXing();
00779 int npost = numberOfPostXing();
00780 int rawSize=sizeof(EvtDescData2008)+sizeof(TrgSumData2008)
00781 + sizeof(RawTrgDet2008)*(npre+npost+1);
00782 return rawSize;
00783 }
00784
00785 unsigned char * StTriggerData2008::getDsm0_EEMC(int prepost) const {
00786 return mData->rawTriggerDet[prepostAddress(prepost)].EEMC;
00787 }
00788
00789 unsigned short int * StTriggerData2008::getDsm1_EEMC(int prepost) const{
00790 return mData->rawTriggerDet[prepostAddress(prepost)].EEMClayer1;
00791 }
00792
00793 unsigned short int * StTriggerData2008::getDsm2_EMC() const{
00794 return mData->TrgSum.DSMdata.EMC;
00795 }
00796
00797 unsigned short int * StTriggerData2008::getDsm3() const{
00798 return mData->TrgSum.DSMdata.lastDSM;
00799 }
00800
00801 int StTriggerData2008::L2ResultsOffset(StL2AlgorithmId id) const
00802 {
00803 switch(id) {
00804 case l2Diagnostic: return L2RESULTS_2008_OFFSET_TRG;
00805 case l2EmcCheck: return L2RESULTS_2008_OFFSET_EMC_CHECK;
00806 case l2Jpsi: return L2RESULTS_2008_OFFSET_JPSI;
00807 case l2Upsilon: return L2RESULTS_2008_OFFSET_UPS;
00808 case l2EmcPedestal: return L2RESULTS_2008_OFFSET_EMC_PED;
00809 case l2Pi0Gamma: return L2RESULTS_2008_OFFSET_GAMMA;
00810 case l2Dijet: return L2RESULTS_2008_OFFSET_DIJET;
00811 default: return -999999999;
00812 }
00813 }
00814
00815 bool StTriggerData2008::isL2Triggered(StL2TriggerResultType id) const
00816 {
00817 return false;
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856 }
00857
00858 unsigned int StTriggerData2008::l2ResultLength() const
00859 {
00860 return sizeof(mData->TrgSum.L2Result)/sizeof(unsigned int);
00861 }
00862
00863 const unsigned int* StTriggerData2008::l2Result() const
00864 {
00865 return mData->TrgSum.L2Result;
00866 }
00867
00868 unsigned short StTriggerData2008::vpdADC(StBeamDirection eastwest, int pmt, int prepost) const
00869 {
00870 static const int map[2][16] = {
00871 { 7, 6, 5, 4, 3, 2, 1, 0,
00872 23, 22, 21, 20, 19, 18, 17, 16} ,
00873 { 39, 38, 37, 36, 35, 34, 33, 32,
00874 55, 54, 53, 52, 51, 50, 49, 48}
00875 };
00876 return mData->rawTriggerDet[prepostAddress(prepost)].VPD[map[eastwest][pmt-1]];
00877 }
00878
00879 unsigned short StTriggerData2008::vpdTDC(StBeamDirection eastwest, int pmt, int prepost) const
00880 {
00881 static const int map[2][16] = {
00882 { 15, 14, 13, 12, 11, 10, 9, 8,
00883 31, 30, 29, 28, 27, 26, 25, 24} ,
00884 { 47, 46, 45, 44, 43, 42, 41, 40,
00885 63, 62, 61, 60, 59, 58, 57, 56}
00886 };
00887 return mData->rawTriggerDet[prepostAddress(prepost)].VPD[map[eastwest][pmt-1]];
00888 }
00889
00890 unsigned short StTriggerData2008::vpdEarliestTDC(StBeamDirection eastwest, int prepost) const
00891 {
00892 if(prepost!=0) return 0;
00893 int map[2][2] = {{2, 0},{6, 4}};
00894 int i1 = map[eastwest][0];
00895 int i2 = map[eastwest][1];
00896 bool b1 = (mData->TrgSum.DSMdata.VPD[i1] >> 8) & 0x1;
00897 bool b2 = (mData->TrgSum.DSMdata.VPD[i2] >> 8) & 0x1;
00898 int t1 = mData->TrgSum.DSMdata.VPD[i1] & 0xFF;
00899 int t2 = mData->TrgSum.DSMdata.VPD[i2] & 0xFF;
00900 if(b1 && b2) {return (t1>t2) ? t1 : t2;}
00901 else if(b1) {return t1;}
00902 else if(b2) {return t2;}
00903 else {return 0;}
00904 }
00905
00906 unsigned short StTriggerData2008::vpdTimeDifference() const
00907 {
00908 return mData->TrgSum.DSMdata.CTB[4] & 0x1FF;
00909 }
00910
00911 unsigned short StTriggerData2008::nQTdata(int prepost) const
00912 {
00913 return mData->rawTriggerDet[prepostAddress(prepost)].QQTdataBytes/4;
00914 }
00915
00916 unsigned int* StTriggerData2008::QTdata(int prepost) const
00917 {
00918 return mData->rawTriggerDet[prepostAddress(prepost)].QQTdata;
00919 }
00920
00921 unsigned char* StTriggerData2008::getDsm_FMS(int prepost) const {return mData->rawTriggerDet[prepostAddress(prepost)].FPDW;}
00922 unsigned char* StTriggerData2008::getDsm01_FMS(int prepost) const {return mData->rawTriggerDet[prepostAddress(prepost)].FPDEastNSLayer0;}
00923 unsigned char* StTriggerData2008::getDsm02_FMS(int prepost) const {return mData->rawTriggerDet[prepostAddress(prepost)].FPDEastTBLayer0;}
00924 unsigned short int* StTriggerData2008::getDsm1_FMS(int prepost) const {return mData->rawTriggerDet[prepostAddress(prepost)].FPDEastNSLayer1;}
00925 unsigned short int* StTriggerData2008::getDsm2_FMS() const {return mData->TrgSum.DSMdata.FPD;}
00926
00927 unsigned short StTriggerData2008::mtdAtAddress(int address, int prepost) const
00928 {
00929 if (address>=0 && address<32){ return mData->rawTriggerDet[prepostAddress(prepost)].MTD[address]; }
00930 return 0;
00931 }
00932
00933 unsigned short StTriggerData2008::mtdAdc(StBeamDirection eastwest, int pmt, int prepost) const
00934 {
00935 static const int map[2][8] = {
00936 { 6, 5, 11, 12, 13, 10, 9, 8},
00937 { 7, 4, 3, 2, 1, 0, 15, 14}
00938 };
00939 if(pmt>=0 && pmt<8) { return mData->rawTriggerDet[prepostAddress(prepost)].MTD[map[eastwest][pmt]]; }
00940 return 0;
00941 }
00942
00943 unsigned short StTriggerData2008::mtdTdc(StBeamDirection eastwest, int pmt, int prepost) const
00944 {
00945 static const int map[2][8] = {
00946 {22,21,27,28,29,26,25,24},
00947 {23,20,19,18,17,16,31,30}
00948 };
00949 if(pmt>=0 && pmt<8) { return mData->rawTriggerDet[prepostAddress(prepost)].MTD[map[eastwest][pmt]]; }
00950 return 0;
00951 }
00952
00953 unsigned short StTriggerData2008::tofAtAddress(int address, int prepost) const
00954 {
00955 if (address>=0 && address<16){ return mData->rawTriggerDet[prepostAddress(prepost)].TOF[address]; }
00956 return 0;
00957 }
00958
00959 unsigned short StTriggerData2008::tofMultiplicity(int prepost) const
00960 {
00961 return mData->rawTriggerDet[prepostAddress(prepost)].TOF[8];
00962 }