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 #include "L3_Reader.hh"
00057
00058
00059
00060
00061
00062
00063 using namespace OLDEVP;
00064 L3_Reader::L3_Reader(EventReader *er, Bank_L3_P *pL3P)
00065 {
00066 mBankL3P = pL3P;
00067 mBankL3SUMD = NULL;
00068 mBankL3GTD = NULL;
00069 mBankL3SECP = NULL;
00070 mBankL3SECCD = NULL;
00071 mBankL3SECTP = NULL;
00072 mBankTPCSECLP = NULL;
00073 mBankTPCRBCLP = NULL;
00074 mBankTPCMZCLD = NULL;
00075 mSVT = NULL;
00076 mFTPC = NULL;
00077 mEMC = NULL;
00078 mAlr = NULL;
00079 mGtr = NULL;
00080 mScr = NULL;
00081 mStr = NULL;
00082 mIcr = NULL;
00083
00084
00085
00086 mTime = mBankL3P->time;
00087 mGl3Id = mBankL3P->gl3Id;
00088 mL3sum = (L3_Summary *)mBankL3P->L3_Summary;
00089 }
00090
00091
00092
00093 L3_Reader::~L3_Reader()
00094 {
00095 delete mAlr;
00096 delete mGtr;
00097 delete mScr;
00098 delete mStr;
00099 delete mIcr;
00100 }
00101
00102
00103
00104 Bank_L3_SUMD * L3_Reader::getL3_SUMD()
00105 {
00106
00107 if (mBankL3P->header.FormatNumber < 4) {
00108 L3ERROR(INFO_MISSING_BANK, "wrong data format, no L3_SUMD bank");
00109 return NULL;
00110 }
00111
00112
00113 if (mBankL3P->summary_data.length==0) {
00114 L3ERROR(INFO_MISSING_BANK, "no L3_SUMD bank");
00115 return NULL;
00116 }
00117
00118 mBankL3SUMD = (Bank_L3_SUMD *) ((INT32 *)mBankL3P + mBankL3P->summary_data.offset);
00119 if (strncmp(mBankL3SUMD->header.BankType, CHAR_L3_SUMD, 8) != 0) {
00120 L3ERROR(ERR_BAD_HEADER, "bad L3_SUMD header");
00121 mBankL3SUMD = NULL;
00122 return mBankL3SUMD;
00123 }
00124
00125 if (mBankL3SUMD->swap() < 0) L3ERROR(ERR_SWAP, "swap L3_SUMD");
00126
00127 return mBankL3SUMD;
00128 }
00129
00130
00131
00132 Bank_L3_GTD * L3_Reader::getL3_GTD ()
00133 {
00134 if (mBankL3P->tracks.length==0) {
00135 L3ERROR(INFO_MISSING_BANK, "no L3_GTD bank");
00136 return NULL;
00137 }
00138
00139 mBankL3GTD = (Bank_L3_GTD *) ((INT32 *)mBankL3P + mBankL3P->tracks.offset);
00140 if (strncmp(mBankL3GTD->header.BankType, CHAR_L3_GTD, 8) != 0) {
00141 L3ERROR(ERR_BAD_HEADER, "bad L3_GTD header");
00142 mBankL3GTD = NULL;
00143 return mBankL3GTD;
00144 }
00145
00146 if (mBankL3GTD->swap() < 0) L3ERROR(ERR_SWAP, "swap L3_GTD");
00147
00148 return mBankL3GTD;
00149 }
00150
00151
00152
00153 Bank_L3_SECP * L3_Reader::getL3_SECP (int sec)
00154 {
00155 if (mBankL3P->sector[sec-1].length==0) {
00156 L3secERROR(INFO_MISSING_BANK, "no L3_SECP bank", sec);
00157 mBankL3SECP = NULL;
00158 return mBankL3SECP;
00159 }
00160
00161 mBankL3SECP = (Bank_L3_SECP *) ((INT32 *)mBankL3P + mBankL3P->sector[sec-1].offset);
00162 if (strncmp(mBankL3SECP->header.BankType, CHAR_L3_SECP, 8) != 0) {
00163 L3secERROR(ERR_BAD_HEADER, "bad L3_SECP header", sec);
00164 mBankL3SECP = NULL;
00165 return mBankL3SECP;
00166 }
00167
00168 if (mBankL3SECP->swap() < 0) L3secERROR(ERR_SWAP, "swap L3_SECP", sec);
00169
00170 return mBankL3SECP;
00171 }
00172
00173
00174
00175 Bank_L3_SECCD * L3_Reader::getL3_SECCD (int sec)
00176 {
00177
00178 mBankL3SECP = getL3_SECP(sec);
00179 if (mBankL3SECP==NULL) {
00180 mBankL3SECCD = NULL;
00181 return mBankL3SECCD;
00182 }
00183
00184
00185 if (mBankL3SECP->sl3clusterp.length==0) {
00186 L3secERROR(INFO_MISSING_BANK, "no L3_SECCD bank", sec);
00187 mBankL3SECCD = NULL;
00188 return mBankL3SECCD;
00189 }
00190
00191 mBankL3SECCD = (Bank_L3_SECCD *) ((INT32 *)mBankL3SECP + mBankL3SECP->sl3clusterp.offset);
00192 if (strncmp(mBankL3SECCD->header.BankType, CHAR_L3_SECCD, 8) != 0) {
00193 L3secERROR(ERR_BAD_HEADER, "bad L3_SECCD header", sec);
00194 mBankL3SECCD = NULL;
00195 return mBankL3SECCD;
00196 }
00197
00198 if (mBankL3SECCD->swap() < 0) L3secERROR(ERR_SWAP, "swap L3_SECCD", sec);
00199
00200 return mBankL3SECCD;
00201 }
00202
00203
00204
00205 Bank_L3_SECTP * L3_Reader::getL3_SECTP (int sec)
00206 {
00207
00208 mBankL3SECP = getL3_SECP(sec);
00209 if (mBankL3SECP==NULL) {
00210 mBankL3SECTP = NULL;
00211 return mBankL3SECTP;
00212 }
00213
00214
00215 if (mBankL3SECP->trackp.length==0) {
00216 L3secERROR(INFO_MISSING_BANK, "no L3_SECTP bank", sec);
00217 mBankL3SECTP = NULL;
00218 return mBankL3SECTP;
00219 }
00220
00221 mBankL3SECTP = (Bank_L3_SECTP *) ((INT32 *)mBankL3SECP + mBankL3SECP->trackp.offset);
00222 if (strncmp(mBankL3SECTP->header.BankType, CHAR_L3_SECTP, 8) != 0) {
00223 L3secERROR(ERR_BAD_HEADER, "bad L3_SECTP header", sec);
00224 mBankL3SECTP = NULL;
00225 return mBankL3SECTP;
00226 }
00227
00228 if (mBankL3SECTP->swap() < 0) L3secERROR(ERR_SWAP, "swap L3_SECTP", sec);
00229
00230 return mBankL3SECTP;
00231 }
00232
00233
00234
00235 Bank_TPCSECLP * L3_Reader::getTPCSECLP (int sec)
00236 {
00237
00238 mBankL3SECP = getL3_SECP(sec);
00239 if (mBankL3SECP==NULL) {
00240 mBankTPCSECLP = NULL;
00241 return mBankTPCSECLP;
00242 }
00243
00244
00245 if (mBankL3SECP->clusterp.length==0) {
00246 L3secERROR(INFO_MISSING_BANK, "no TPCSECLP bank", sec);
00247 mBankTPCSECLP = NULL;
00248 return mBankTPCSECLP;
00249 }
00250
00251 mBankTPCSECLP = (Bank_TPCSECLP *) ((INT32 *)mBankL3SECP + mBankL3SECP->clusterp.offset);
00252 if (strncmp(mBankTPCSECLP->header.BankType, CHAR_TPCSECLP, 8) != 0) {
00253 L3secERROR(ERR_BAD_HEADER, "bad TPCSECLP header", sec);
00254 mBankTPCSECLP = NULL;
00255 return mBankTPCSECLP;
00256 }
00257
00258 if (mBankTPCSECLP->swap() < 0) L3secERROR(ERR_SWAP, "swap TPCSECLP", sec);
00259
00260 return mBankTPCSECLP;
00261
00262 }
00263
00264
00265
00266 Bank_TPCRBCLP * L3_Reader::getTPCRBCLP (int sec, int rb)
00267 {
00268 mBankTPCSECLP = getTPCSECLP(sec);
00269 if (mBankTPCSECLP==NULL) {
00270 mBankTPCRBCLP = NULL;
00271 return mBankTPCRBCLP;
00272 }
00273
00274
00275 if (mBankTPCSECLP->receiverBoard[rb-1].length==0) {
00276 L3secERROR(INFO_MISSING_BANK, "no TPCRBCLP bank", sec);
00277 mBankTPCRBCLP = NULL;
00278 return mBankTPCRBCLP;
00279 }
00280
00281 mBankTPCRBCLP = (Bank_TPCRBCLP *) ((INT32 *)mBankTPCSECLP + mBankTPCSECLP->receiverBoard[rb-1].offset);
00282 if (strncmp(mBankTPCRBCLP->header.BankType, CHAR_TPCRBCLP, 8) != 0) {
00283 L3secERROR(ERR_BAD_HEADER, "bad TPCRBCLP header", sec);
00284 mBankTPCRBCLP = NULL;
00285 return mBankTPCRBCLP;
00286 }
00287
00288 if (mBankTPCRBCLP->swap() < 0) L3secERROR(ERR_SWAP, "swap TPCRBCLP", sec);
00289
00290 return mBankTPCRBCLP;
00291
00292 }
00293
00294
00295
00296 Bank_TPCMZCLD * L3_Reader::getTPCMZCLD (int sec, int rb, int mz)
00297 {
00298 mBankTPCRBCLP = getTPCRBCLP(sec, rb);
00299 if (mBankTPCRBCLP==NULL) {
00300 mBankTPCMZCLD = NULL;
00301 return mBankTPCMZCLD;
00302 }
00303
00304
00305 if (mBankTPCRBCLP->mezzBoard[mz-1].length==0) {
00306 L3secERROR(INFO_MISSING_BANK, "no TPCMZCLD bank", sec);
00307 mBankTPCMZCLD = NULL;
00308 return mBankTPCMZCLD;
00309 }
00310
00311 mBankTPCMZCLD = (Bank_TPCMZCLD *) ((INT32 *)mBankTPCRBCLP + mBankTPCRBCLP->mezzBoard[mz-1].offset);
00312 if (strncmp(mBankTPCMZCLD->header.BankType, CHAR_TPCMZCLD, 8) != 0) {
00313 L3secERROR(ERR_BAD_HEADER, "bad TPCMZCLD header", sec);
00314 mBankTPCMZCLD = NULL;
00315 return mBankTPCMZCLD;
00316 }
00317
00318 if (mBankTPCMZCLD->swap() < 0) L3secERROR(ERR_SWAP, "swap TPCMZCLD", sec);
00319
00320 return mBankTPCMZCLD;
00321 }
00322
00323
00324
00325 int * L3_Reader::getSVT_Bank(int sector)
00326 {
00327
00328 if (mBankL3P->header.FormatNumber < 4) {
00329 L3ERROR(INFO_MISSING_BANK, "wrong data format, no SVT");
00330 return NULL;
00331 }
00332
00333
00334 if (mBankL3P->svt[sector-1].length==0) {
00335 L3ERROR(INFO_MISSING_BANK, "no SVT bank");
00336 return NULL;
00337 }
00338
00339 mSVT = (INT32 *)mBankL3P + mBankL3P->svt[sector-1].offset;
00340
00341 return mSVT;
00342 }
00343
00344
00345
00346 int * L3_Reader::getFTPC_Bank(int sector)
00347 {
00348
00349 if (mBankL3P->header.FormatNumber < 4) {
00350 L3ERROR(INFO_MISSING_BANK, "wrong data format, no FTPC");
00351 return NULL;
00352 }
00353
00354
00355 if (mBankL3P->ftpc[sector-1].length==0) {
00356 L3ERROR(INFO_MISSING_BANK, "no FTPC bank");
00357 return NULL;
00358 }
00359
00360 mFTPC = (INT32 *)mBankL3P + mBankL3P->ftpc[sector-1].offset;
00361
00362 return mFTPC;
00363 }
00364
00365
00366
00367 int * L3_Reader::getEMC_Bank()
00368 {
00369
00370 if (mBankL3P->header.FormatNumber < 4) {
00371 L3ERROR(INFO_MISSING_BANK, "wrong data format, no EMC");
00372 return NULL;
00373 }
00374
00375
00376 if (mBankL3P->emc.length==0) {
00377 L3ERROR(INFO_MISSING_BANK, "no EMC bank");
00378 return NULL;
00379 }
00380
00381 mEMC = (INT32 *)mBankL3P + mBankL3P->emc.offset;
00382
00383 return mEMC;
00384 }
00385
00386
00387
00388
00389 Gl3AlgorithmReader * L3_Reader::getGl3AlgorithmReader()
00390 {
00391
00392 if (!mAlr) {
00393 mAlr = new Gl3AlgorithmReader (this);
00394 if (!mAlr->initialize()) {
00395
00396 return NULL;
00397 }
00398 }
00399 return mAlr;
00400 }
00401
00402
00403
00404
00405 GlobalTrackReader * L3_Reader::getGlobalTrackReader ()
00406 {
00407
00408 if (!mGtr) {
00409 mGtr = new GlobalTrackReader (this);
00410 if (!mGtr->initialize()) {
00411
00412 return NULL;
00413 }
00414 }
00415 return mGtr;
00416 }
00417
00418
00419
00420 Sl3ClusterReader * L3_Reader::getSl3ClusterReader (int sec)
00421 {
00422 if (!mScr) mScr = new Sl3ClusterReader (this);
00423 if (!mScr->initialize(sec)) {
00424
00425 return NULL;
00426 }
00427 return mScr;
00428 }
00429
00430
00431
00432 Sl3TrackReader * L3_Reader::getSl3TrackReader (int sec)
00433 {
00434 if (!mStr) mStr = new Sl3TrackReader (this);
00435 if (!mStr->initialize(sec)) {
00436
00437 return NULL;
00438 }
00439 return mStr;
00440 }
00441
00442
00443
00444 I960ClusterReader * L3_Reader::getI960ClusterReader (int sec)
00445 {
00446 if (!mIcr) mIcr = new I960ClusterReader (this);
00447 if (!mIcr->initialize(sec)) {
00448
00449 return NULL;
00450 }
00451 return mIcr;
00452 }
00453
00454
00455
00456
00457
00458
00459 Gl3AlgorithmReader::Gl3AlgorithmReader(L3_Reader *l3r)
00460 {
00461 mL3r = l3r;
00462 mL3SUMD = NULL;
00463 mAlgData = NULL;
00464 mNProcessed = 0;
00465 mNReconstructed = 0;
00466 mNAlg = 0;
00467 }
00468
00469
00470 int Gl3AlgorithmReader::initialize()
00471 {
00472 mL3SUMD = mL3r->getL3_SUMD();
00473 if (mL3SUMD == NULL) {
00474
00475 return FALSE;
00476 }
00477
00478 mNProcessed = mL3SUMD->nProcessed;
00479 mNReconstructed = mL3SUMD->nReconstructed;
00480 mNAlg = mL3SUMD->nAlg;
00481 mAlgData = mL3SUMD->alg;
00482
00483 return TRUE;
00484 }
00485
00486
00487
00488
00489
00490
00491 GlobalTrackReader::GlobalTrackReader (L3_Reader *l3r)
00492 {
00493 mL3 = l3r;
00494 mL3GTD = NULL;
00495 mTracks = NULL;
00496 mNTracks = 0;
00497 mNHits = 0;
00498 mGlobalVertex.x = 0;
00499 mGlobalVertex.y = 0;
00500 mGlobalVertex.z = 0;
00501 }
00502
00503
00504 int GlobalTrackReader::initialize ()
00505 {
00506 mL3GTD = mL3->getL3_GTD();
00507 if (mL3GTD == NULL) {
00508
00509 return FALSE;
00510 }
00511
00512 mTracks = mL3GTD->track;
00513 mNTracks = mL3GTD->nTracks;
00514 mNHits = mL3GTD->nHits;
00515
00516 mGlobalVertex.x = mL3GTD->xVert;
00517 mGlobalVertex.y = mL3GTD->yVert;
00518 mGlobalVertex.z = mL3GTD->zVert;
00519
00520 return TRUE;
00521 }
00522
00523
00524
00525
00526
00527
00528
00529 Sl3ClusterReader::Sl3ClusterReader (L3_Reader *l3r)
00530 {
00531 mL3 = l3r;
00532 mSector = -1;
00533 mL3SECCD = NULL;
00534 mCluster = NULL;
00535 mNCluster = 0;
00536 }
00537
00538
00539 int Sl3ClusterReader::initialize (int sec)
00540 {
00541
00542 if (mSector!=sec) {
00543
00544 mSector = sec;
00545 mL3SECCD = mL3->getL3_SECCD(mSector);
00546 if (mL3SECCD == NULL) {
00547
00548 return FALSE;
00549 }
00550 mCluster = mL3SECCD->cluster;
00551 mNCluster = mL3SECCD->nrClusters_in_sector;
00552 }
00553 return TRUE;
00554 }
00555
00556
00557
00558
00559
00560
00561
00562 I960ClusterReader::I960ClusterReader (L3_Reader *l3r)
00563 {
00564 mL3 = l3r;
00565 mSector = -1;
00566 mCluster = new L3_Cluster[maxClusterPerSector];
00567 mNCluster = 0;
00568 for (int rb=0; rb<12; rb++) {
00569 for (int mz=0; mz<3; mz++) {
00570 mBankTPCMZCLD[rb][mz] = NULL;
00571 }
00572 }
00573 }
00574
00575
00576 I960ClusterReader::~I960ClusterReader ()
00577 {
00578 delete [] mCluster;
00579 }
00580
00581
00582 int I960ClusterReader::initialize (int sec)
00583 {
00584 Bank_TPCMZCLD *cld;
00585
00586 struct Centroids {
00587 unsigned short x;
00588 unsigned short t;
00589 };
00590
00591 struct SpacePt {
00592 Centroids centroids;
00593 unsigned short flags;
00594 unsigned short q;
00595 };
00596
00597
00598 if (mSector!=sec) {
00599
00600 mSector = sec;
00601 mNCluster = 0;
00602
00603 int rb;
00604 for (rb=1; rb<=12; rb++) {
00605 for (int mz=1; mz<=3; mz++) {
00606
00607 mBankTPCMZCLD[rb-1][mz-1] = mL3->getTPCMZCLD(mSector, rb, mz);
00608 cld = mBankTPCMZCLD[rb-1][mz-1];
00609 if (!cld) continue;
00610 int *ptr = (int *)&cld->stuff;
00611
00612 for (int ir=0; ir<cld->numberOfRows; ir++) {
00613
00614 ptr++;
00615 int nHitsThisRow = *ptr++;
00616 mNCluster += nHitsThisRow;
00617 ptr += 2 * nHitsThisRow;
00618 }
00619 }
00620 }
00621
00622
00623
00624 if (mNCluster>maxClusterPerSector) {
00625 cout << "ERROR: L3_Reader: reached maxClusterPerSector limit!" << endl;
00626 return FALSE;
00627 }
00628 if (mCluster==NULL) {
00629 cout << "failed to allocate cluster structures " << endl;
00630 return FALSE;
00631 }
00632
00633
00634 if (mNCluster==0) {
00635 cout << "no i960 clusters found" << endl;
00636 return FALSE;
00637 }
00638
00639
00640
00641 L3_Cluster *pcluster;
00642 pcluster = mCluster;
00643
00644 for ( rb=1; rb<=12; rb++) {
00645 for (int mz=1; mz<=3; mz++) {
00646 cld = mBankTPCMZCLD[rb-1][mz-1];
00647 if (!cld) continue;
00648 int *ptr = &cld->stuff[0];
00649 for (int ir=0; ir<cld->numberOfRows; ir++){
00650 int row = *ptr++;
00651 int nsp = *ptr++;
00652 for (int isp=0; isp<nsp; isp++, ptr+=2) {
00653 SpacePt *hit = (SpacePt *)ptr;
00654 pcluster->pad = hit->centroids.x;
00655 pcluster->time = hit->centroids.t;
00656 pcluster->charge = hit->q;
00657 pcluster->flags = hit->flags;
00658 pcluster->padrow = row;
00659 pcluster->RB_MZ = 16 * rb + mz;
00660 pcluster->trackId = 0;
00661 pcluster++;
00662 }
00663 }
00664 }
00665 }
00666 }
00667 return TRUE;
00668 }
00669
00670
00671
00672
00673
00674
00675
00676 Sl3TrackReader::Sl3TrackReader (L3_Reader *l3r)
00677 {
00678 mL3 = l3r;
00679 mSector = -1;
00680 mL3LTD = NULL;
00681 mTracks = NULL;
00682 mNTracks = 0;
00683 mNHits = 0;
00684 mCpuTime = 0;
00685 mRealTime = 0;
00686 mParaSet = 0;
00687 mSectorVertex.x = 0;
00688 mSectorVertex.y = 0;
00689 mSectorVertex.z = 0;
00690 }
00691
00692
00693 int Sl3TrackReader::initialize (int sec)
00694 {
00695
00696 if (mSector!=sec) {
00697
00698 mSector = sec;
00699 mL3SECTP = mL3->getL3_SECTP(mSector);
00700 if (mL3SECTP == NULL) {
00701
00702 return FALSE;
00703 }
00704
00705
00706 if (mL3SECTP->banks[0].length == 0) {
00707 pL3secERROR(INFO_MISSING_BANK, "no L3_LTD bank", mSector);
00708 return FALSE;
00709 }
00710
00711 mL3LTD = (Bank_L3_LTD *) ((INT32 *)mL3SECTP + mL3SECTP->banks[0].offset);
00712 if (strncmp(mL3LTD->header.BankType, CHAR_L3_LTD, 8) != 0) {
00713 pL3secERROR(ERR_BAD_HEADER, "bad L3_LTD header", mSector);
00714 return FALSE;
00715 }
00716
00717 if (mL3LTD->swap() < 0) pL3secERROR(ERR_SWAP, "swap L3_LTD", mSector);
00718
00719
00720
00721
00722
00723
00724 mTracks = mL3LTD->track;
00725 mNTracks = mL3SECTP->nTracks;
00726 mNHits = mL3SECTP->nHits;
00727 mCpuTime = mL3SECTP->cpuTime;
00728 mRealTime = mL3SECTP->realTime;
00729 mParaSet = mL3SECTP->para;
00730 mSectorVertex.x = mL3SECTP->xVert;
00731 mSectorVertex.y = mL3SECTP->yVert;
00732 mSectorVertex.z = mL3SECTP->zVert;
00733 }
00734 return TRUE;
00735 }