00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "gl3Event.h"
00014 #include <rtsLog.h>
00015 #include "gl3Histo.h"
00016 #ifdef OLD_DAQ_READER
00017 #include <evpReader.hh>
00018 #else
00019 #include <DAQ_READER/daqReader.h>
00020 #endif
00021 #include "FtfSl3.h"
00022 #ifndef OLD_DAQ_READER
00023
00024 #include <DAQ_READER/daq_dta.h>
00025 #include <DAQ_TPC/daq_tpc.h>
00026 #include <DAQ_TPX/daq_tpx.h>
00027 #include <DAQ_SC/daq_sc.h>
00028
00029 tpc_t *pTPC=NULL;
00030
00031 #endif
00032
00033
00034
00035
00036 #ifdef OLD_DAQ_READER
00037 int gl3Event::readFromEvpReader(evpReader *evp,
00038 #else
00039 int gl3Event::readFromEvpReader(daqReader *rdr,
00040 #endif
00041 char *mem,
00042 float defaultbField,
00043 float bField,
00044 int what)
00045 {
00046 #ifndef OLD_DAQ_READER
00047 daq_dta *dd;
00048
00049 #endif
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 LOG(DBG, "Reader from EVP Reader: evt=%d token=%d",rdr->seq,rdr->token);
00063
00064 resetEvent();
00065 nHits = 0;
00066
00067 LOG(DBG, "Check magnetic field");
00068
00069
00070 if(bField == 1000) {
00071 bField = defaultbField;
00072
00073 #ifdef OLD_DAQ_READER
00074 int ret = scReader(mem);
00075 if(ret >= 0) {
00076 if(sc.valid) bField = sc.mag_field;
00077 #else
00078 dd = rdr->det("sc")->get("legacy");
00079
00080 if(dd) {
00081 dd->iterate();
00082 sc_t *sc = (sc_t *)dd->Void;
00083 if(sc->valid) bField = sc->mag_field;
00084 #endif
00085 }
00086 }
00087
00088 if(fabs(bField) < .1) bField = .1;
00089
00090 LOG(NOTE, "bField set to %f",bField,0,0,0,0);
00091
00092 setBField(bField);
00093
00094
00095 coordinateTransformer->Set_parameters_by_hand(0.581, 200.668, 201.138 );
00096 coordinateTransformer->LoadTPCLookupTable("/RTS/conf/L3/map.bin");
00097
00098 FtfSl3 *tracker = new FtfSl3(coordinateTransformer);
00099
00100 tracker->setup();
00101 tracker->para.bField = fabs(bField);
00102
00103
00104 tracker->para.bFieldPolarity = (bField>0) ? 1 : -1;
00105
00106
00108 tracker->setXyError(.12) ;
00109 tracker->setZError(.24) ;
00110
00111 tracker->para.ptMinHelixFit = 0.;
00112 tracker->para.maxChi2Primary = 0.;
00113
00114 tracker->para.trackChi2Cut = 10 ;
00115 tracker->para.hitChi2Cut = 50 ;
00116 tracker->para.goodHitChi2 = 20 ;
00118
00119
00120 tracker->reset();
00121
00122
00123 L3_SECTP *sectp = NULL;
00124
00125 if(what & GL3_READ_TPC_TRACKS) {
00126 sectp = (L3_SECTP *)malloc(szSECP_max);
00127 }
00128
00129 int i;
00130 int ret;
00131 for(i=0;i<24;i++) {
00132 if(what & GL3_READ_TPC_TRACKS) {
00133 if((i%2) == 0) {
00134 tracker->nHits = 0;
00135 tracker->setTrackingAngles(i+1);
00136 }
00137 }
00138
00139 LOG(DBG, "READ TPC data for sector %d (0x%x)",i+1,rdr);
00140
00141
00142 #ifdef OLD_DAQ_READER
00143 ret = tpcReader(mem, i);
00144 if(ret < 0) {
00145 LOG(NOTE, "No data for sector %d",i+1,0,0,0,0);
00146 #else
00147 dd = rdr->det("tpx")->get("legacy",i+1);
00148 if(dd) {
00149 LOG(NOTE, "There is tpx data...");
00150 dd->iterate();
00151 pTPC = (tpc_t *)dd->Void;
00152 }
00153 else {
00154 LOG(NOTE, "No tpx data for sector %d check for TPC",i);
00155
00156 dd = rdr->det("tpc")->get("legacy",i+1);
00157 if(dd) {
00158 dd->iterate();
00159 pTPC = (tpc_t *)dd->Void;
00160
00161
00162
00164
00165
00166
00167
00168
00169 int cl_found = 0;
00170 for(int pr=0;pr<45;pr++) {
00171 cl_found += pTPC->cl_counts[pr];
00172 }
00173
00174 LOG(NOTE, "Found tpc data for sector %d... %d clusters found",i,cl_found);
00175 }
00176 else {
00177 pTPC = NULL;
00178 }
00179 }
00180
00181 if(!pTPC) {
00182 LOG(NOTE, "No data for TPC sector %d",i+1,0,0,0,0);
00183 #endif
00184 continue;
00185 }
00186
00187
00188 #ifdef OLD_DAQ_READER
00189 if(!tpc.has_clusters) {
00190
00191
00192 int ncl_recount = fcfReader(i);
00193 if (ncl_recount) {
00194
00195 }
00196 #else
00197 if(!pTPC->has_clusters) {
00198 LOG(WARN, "TPC sector %d has no clusters",i);
00199 continue;
00200 #endif
00201 }
00202
00203
00204 if(what & GL3_READ_TPC_CLUSTERS) {
00205
00206 LOG(DBG, "Reading clusters");
00207 readClustersFromEvpReader(i+1);
00208
00209 int nnn=0;
00210 for(int i=0;i<45;i++) {
00211 #ifdef OLD_DAQ_READER
00212 nnn += tpc.cl_counts[i];
00213 #else
00214 nnn += pTPC->cl_counts[i];
00215 #endif
00216 }
00217 LOG(DBG, "clusters done %d",nnn);
00218 }
00219
00220
00221 if(what & GL3_READ_TPC_TRACKS) {
00222 LOG(DBG, "Tracking...");
00223 tracker->readSectorFromEvpReader(i+1);
00224
00225
00226 if((i%2) == 1) {
00227 tracker->processSector();
00228 tracker->fillTracks(szSECP_max, (char *)sectp, 0);
00229
00230 LOG(DBG, "SECP size = %d",sectp->bh.length*4 + sectp->banks[0].len*4);
00231
00232 int n = readSectorTracks((char *)sectp);
00233
00234
00235 if(n < 0) {
00236 LOG(WARN, "Error reading tracker: sector %d\n",i,0,0,0,0);
00237 continue;
00238 }
00239 }
00240 }
00241 }
00242
00243
00244 if(what & GL3_READ_TPC_TRACKS) {
00245
00246 finalizeReconstruction();
00247 free(sectp);
00248 }
00249
00250
00251 #ifdef EMC_LEGACY
00252
00253 #ifdef OLD_DAQ_READER
00254 emc.readFromEvpReader(evp, mem);
00255 #else
00256 emc.readFromEvpReader(rdr, mem);
00257 #endif
00258 #endif
00259
00260 delete tracker;
00261 return 0;
00262 }
00263
00264
00265
00266
00267 void gl3Event::readClustersFromEvpReader(int sector)
00268 {
00269 #ifdef OLD_DAQ_READER
00270 if(!tpc.has_clusters) return;
00271 #else
00272
00273 LOG(DBG, "have clusters? %d",pTPC->has_clusters);
00274 if(!pTPC->has_clusters) return;
00275 #endif
00276
00277 for(int r=0;r<45;r++) {
00278 #ifdef OLD_DAQ_READER
00279 for(int j=0;j<tpc.cl_counts[r];j++) {
00280 tpc_cl *c = &tpc.cl[r][j];
00281 #else
00282 for(int j=0;j<pTPC->cl_counts[r];j++) {
00283 tpc_cl *c = &pTPC->cl[r][j];
00284 #endif
00285
00286 gl3Hit *gl3c = &hit[nHits];
00287 nHits++;
00288
00289 l3_cluster sl3c;
00290 sl3c.pad = (int)((c->p - 0.5) * 64);
00291 sl3c.time = (int)((c->t - 0.5) * 64);
00292 sl3c.charge = c->charge;
00293 sl3c.flags = c->flags;
00294 sl3c.padrow = r;
00295 sl3c.RB_MZ = 0;
00296
00297
00298
00299
00300
00301 gl3c->set(coordinateTransformer, sector, &sl3c);
00302
00303
00304
00305
00306
00307
00308
00309 }
00310 }
00311 }
00312
00313
00314
00315
00316 gl3Event::gl3Event( l3CoordinateTransformer* inTrans,
00317 l3EmcCalibration* inBemcCalib,
00318 l3EmcCalibration* inEemcCalib,
00319 int mxHits, int mxTracks)
00320 : emc(inBemcCalib, inEemcCalib)
00321 {
00322 hit = NULL;
00323 track = NULL;
00324 busy = 0;
00325
00326 trackContainer = 0;
00327 trackIndex = 0;
00328 hitProcessing = 0;
00329 maxSectorNForTrackMerging = 1000000;
00330 coordinateTransformer = inTrans;
00331
00332 setup( mxHits, mxTracks );
00333 resetEvent();
00334 };
00335
00336
00337 gl3Event::~gl3Event( )
00338 {
00339 if ( hit != 0 ) delete[] hit ;
00340 if ( track != 0 ) delete[] track;
00341 if ( trackContainer != 0 ) delete[] trackContainer;
00342 if ( trackIndex != 0 ) delete[] trackIndex ;
00343 };
00344
00345
00346
00347
00348
00349
00350
00351 gl3Track* gl3Event::getTrack ( int n ) {
00352 if ( n < 0 || n > nTracks ) {
00353 fprintf ( stderr, " %d track index out of range \n", n );
00354 return NULL;
00355 }
00356 return &(track[n]);
00357 }
00358
00359
00360 gl3Hit* gl3Event::getHit ( int n ) {
00361 if ( n < 0 || n > nHits ) {
00362 fprintf ( stderr, " %d hit index out of range \n", n );
00363 return NULL;
00364 }
00365 return &(hit[n]);
00366 }
00367
00368 gl3Sector* gl3Event::getSector ( int n ) {
00369 if ( n < 0 || n > nSectors ) {
00370 fprintf ( stderr, " %d sector index out of range \n", n );
00371 return NULL;
00372 }
00373 return &(sectorInfo[n]);
00374 }
00375
00376
00377 int gl3Event::getTrgCmd()
00378 {
00379
00380 return -1;
00381 };
00382
00383 int gl3Event::getTrgWord()
00384 {
00385 return trgData.triggerWord;
00386 };
00387
00388 int gl3Event::getZDC(int n)
00389 {
00390 return trgData.ZDC[n];
00391 };
00392
00393 int gl3Event::getCTB(int n)
00394 {
00395 return trgData.CTB[n];
00396 };
00397
00398 double gl3Event::getZDCVertex()
00399 {
00400 return ((double)(trgData.ZDC[9] - trgData.ZDC[8]) + 21.3) * 3.3;
00401 };
00402
00403
00404
00405
00406
00407 unsigned int gl3Event::getBXingLo()
00408 {
00409 return trgData.bunchXing_lo;
00410 }
00411
00412 unsigned int gl3Event::getBXingHi()
00413 {
00414 return trgData.bunchXing_hi;
00415 }
00416
00417 unsigned long long gl3Event::getBXing()
00418 {
00419 unsigned long long bx_hi_long = trgData.bunchXing_hi;
00420 unsigned long long bx_lo_long = trgData.bunchXing_lo;
00421
00422 return (bx_hi_long << 32) | bx_lo_long;
00423 };
00424
00425
00426
00427
00428
00429
00430
00431 void gl3Event::addTracks ( short sector, int nTrk, local_track* localTrack ) {
00432
00433 gl3Track* lTrack = &(track[nTracks]) ;
00434 local_track *trk = localTrack ;
00435 int indexStore = -1 ;
00436
00437 int idTrack ;
00438 for ( int i = 0 ; i < nTrk ; i++ ) {
00439 lTrack->set ( sector, trk ) ;
00440 lTrack->id = sector * 1000 + abs(trk->id) ;
00441 lTrack->para = ¶ ;
00442 lTrack->sector = sector ;
00443 idTrack = trk->id ;
00444
00445
00446
00447
00448 if ( hitProcessing ) {
00449 indexStore = -1 ;
00450 if ( abs(idTrack) < maxTracksSector )
00451 indexStore = (sector-1)*maxTracksSector + abs(idTrack) ;
00452 else {
00453 LOG(ERR, " gl3Event::addTracks: max number of tracks per Sector reached %d reached", idTrack ,0,0,0,0) ;
00454 }
00455 }
00456
00457
00458
00459 gl3Track* fatterTrack = 0 ;
00460 if ( maxSectorNForTrackMerging > nTrk && idTrack < 0 ) {
00461
00462 fatterTrack = lTrack->merge ( trackContainer ) ;
00463 if ( fatterTrack ) {
00464 if ( hitProcessing && indexStore > 0 ) {
00465 trackIndex[indexStore] =
00466 ((char *)fatterTrack - (char *)track )/sizeof(gl3Track)+1;
00467 }
00468 trk++ ;
00469 nMergedTracks++ ;
00470 continue ;
00471 }
00472 nMergableTracks++ ;
00473 }
00474
00475
00476 if ( hitProcessing && indexStore > 0 )
00477 trackIndex[indexStore] = nTracks + 1;
00478
00479
00480 lTrack++ ;
00481 nTracks++ ;
00482 trk++ ;
00483 if ( nTracks+1 >= maxTracks ) {
00484 LOG(ERR," gl3Event::addTracks: max number of tracks %d reached, sector: %i nrSectorTracks: %i", maxTracks, sector, nTrk ,0,0) ;
00485 nTracks-- ;
00486 lTrack--;
00487 break;
00488 }
00489 }
00490 }
00491
00492
00493
00494
00495
00496
00497 int gl3Event::fillTracks ( int maxBytes, char* buffer, unsigned int token ){
00498
00499
00500
00501 int nBytesNeeded = sizeof(L3_GTD) + (nTracks-1) * sizeof(global_track) ;
00502 if ( nBytesNeeded > maxBytes ) {
00503 LOG(ERR, " gl3Event::writeTracks: %d bytes needed less than max = %d \n",
00504 nBytesNeeded, maxBytes ,0,0,0) ;
00505 return 0 ;
00506 }
00507
00508 L3_GTD* head = (L3_GTD *)buffer ;
00509
00510 head->nHits = nHits;
00511 head->xVert = vertex.Getx();
00512 head->yVert = vertex.Gety();
00513 head->zVert = vertex.Getz();
00514
00515
00516 memcpy(head->bh.bank_type,CHAR_L3_GTD,8);
00517 head->bh.bank_id = 1;
00518 head->bh.format_ver = DAQ_RAW_FORMAT_VERSION ;
00519 head->bh.byte_order = DAQ_RAW_FORMAT_ORDER ;
00520 head->bh.format_number = 0;
00521 head->bh.token = token;
00522 head->bh.w9 = DAQ_RAW_FORMAT_WORD9;
00523 head->bh.crc = 0;
00524 head->bh.length = (sizeof(struct L3_GTD)
00525 + (nTracks-1) * sizeof(struct global_track))/4 ;
00526
00527
00528
00529
00530
00531 global_track* oTrack = (global_track *)head->track ;
00532 int counter = 0 ;
00533 for ( int i = 0 ; i < nTracks ; i++ ) {
00534 if ( fabs(track[i].z0) > 205 ) {
00535
00536 nBadTracks++ ;
00537 continue ;
00538 }
00539 oTrack->id = track[i].id ;
00540 oTrack->flag = track[i].flag ;
00541 oTrack->innerMostRow = track[i].innerMostRow ;
00542 oTrack->outerMostRow = track[i].outerMostRow ;
00543 oTrack->nHits = track[i].nHits ;
00544 oTrack->ndedx = track[i].nDedx ;
00545 oTrack->q = track[i].q ;
00546 oTrack->chi2[0] = track[i].chi2[0] ;
00547 oTrack->chi2[1] = track[i].chi2[1] ;
00548 oTrack->dedx = track[i].dedx ;
00549 oTrack->pt = track[i].pt ;
00550 oTrack->phi0 = track[i].phi0 ;
00551 oTrack->r0 = track[i].r0 ;
00552 oTrack->z0 = track[i].z0 ;
00553 oTrack->psi = track[i].psi ;
00554 oTrack->tanl = track[i].tanl ;
00555 oTrack->length = track[i].length ;
00556 oTrack->dpt = track[i].dpt ;
00557 oTrack->dpsi = track[i].dpsi ;
00558 oTrack->dz0 = track[i].dz0 ;
00559 oTrack->dtanl = track[i].dtanl ;
00560 oTrack++ ;
00561 counter++ ;
00562 }
00563 head->nTracks = counter ;
00564
00565
00566
00567 return ((char *)oTrack-buffer) ;
00568 }
00569
00570
00571
00572
00573
00574
00575 int gl3Event::readL3Data( L3_P* header )
00576 {
00577
00578 char* buffer = (char *)header;
00579
00580
00581 int length, offset ;
00582 char* trackPointer ;
00583 char* hitPointer ;
00584
00585 resetEvent ( );
00586 int i ;
00587 L3_SECP* sectorP ;
00588 for ( i = 0 ; i < nSectors ; i++ ) {
00589 length = header->sector[i].len ;
00590
00591 if ( length==0 ) continue ;
00592
00593 offset = 4 * header->sector[i].off ;
00594 sectorP = (L3_SECP *)&(buffer[offset]);
00595
00596 trackPointer = (char *)sectorP + sectorP->trackp.off * 4 ;
00597
00598
00599 int nSectorTracks = 0;
00600 if (sectorP->trackp.off) {
00601 nSectorTracks = readSectorTracks ( trackPointer ) ;
00602
00603 if ( nSectorTracks < 0 ) {
00604 LOG(ERR, "gl3Event:readEvent: error reading tracks, sector %d", i+1,0,0,0,0);
00605 return -1 ;
00606 }
00607 }
00608
00609 if ( hitProcessing && sectorP->sl3clusterp.off ) {
00610 hitPointer = (char *)sectorP + sectorP->sl3clusterp.off * 4 ;
00611 readSectorHits ( hitPointer, nSectorTracks ) ;
00612 }
00613
00614 }
00615
00616 if(header->bh.format_number>=5 && header->trig.len){
00617
00618
00619 trgData.readL3P(header);
00620
00621 }
00622
00623
00624 if( header->bh.format_number>=7 ){
00625
00626 emc.readRawData(header);
00627 } else {
00628
00629
00630 }
00631 #ifdef EVENTDISPLAY
00632
00633
00634
00635
00636
00637 double radius ;
00638
00639 for ( int i = 0 ; i < nTracks ; i++ ) {
00640
00641 radius = coordinateTransformer->
00642 GetRadialDistanceAtRow(track[i].innerMostRow-1) ;
00643
00644 track[i].updateToRadius ( radius ) ;
00645
00646
00647
00648 if ( fabs(track[i].z0) > 205 ) track[i].updateToRadius ( radius+5. ) ;
00649 if ( fabs(track[i].z0) > 205 ) {
00650 LOG(ERR, "gl3Event:: problem after extrapolation id %d z0 %f",
00651 track[i].id, track[i].z0 ,0,0,0) ;
00652 }
00653 }
00654 #endif
00655
00656
00657
00658 busy = 1 ;
00659
00660 return 0 ;
00661 }
00662
00663
00664
00665
00666
00667 int gl3Event::finalizeReconstruction()
00668 {
00669
00670
00671 if (vertexFinder & 0x01)
00672 makeVertex();
00673
00674
00675
00676 if ((vertexFinder & 0x02) && lmv) {
00677
00678 lmv->makeVertex(this);
00679 Ftf3DHit vtx = lmv->getVertex();
00680
00681 lmVertex.Setx(vtx.x);
00682 lmVertex.Sety(vtx.y);
00683 lmVertex.Setz(vtx.z);
00684 }
00685
00686
00687 Ftf3DHit vertex_ftf;
00688 vertex_ftf.x = vertex.Getx();
00689 vertex_ftf.y = vertex.Gety();
00690 vertex_ftf.z = vertex.Getz();
00691
00692
00693 for (int i=0 ; i<getNTracks() ; i++) {
00694 getTrack(i)->setDca(vertex_ftf);
00695 }
00696
00697
00698 return 0;
00699 }
00700
00701
00702
00703
00704
00705
00706 int gl3Event::readSectorHits ( char* buffer, int nSectorTracks ){
00707 L3_SECCD* head = (L3_SECCD *)buffer ;
00708
00709
00710
00711 if ( !coordinateTransformer ) {
00712 LOG(ERR, "gl3Event::readSectorHits: there is not Coordinate Transformer",0,0,0,0,0);
00713 return 0 ;
00714 }
00715
00716
00717
00718
00719
00720 if ( strncmp(head->bh.bank_type,CHAR_L3_SECCD,8) ) {
00721 LOG(ERR, "gl3Event::readSectorHits: wrong bank type %s",
00722 head->bh.bank_type,0,0,0,0 ) ;
00723 LOG(ERR, " correct bank type would be %s", CHAR_L3_SECCD,0,0,0,0 ) ;
00724 return 0 ;
00725 }
00726 int sector = head->bh.bank_id;
00727 int nSectorHits = head->nrClusters_in_sector ;
00728
00729
00730
00731
00732 if ( nHits + nSectorHits > maxHits ) {
00733 LOG(ERR, "gl3Event:readSectorHits: not enough space for hits in sector %d", sector,0,0,0,0 ) ;
00734 LOG(ERR, " maxHits %d nSectorHits %d nHits %d", maxHits,
00735 nSectorHits, nHits ,0,0) ;
00736 return 0 ;
00737 }
00738
00739 l3_cluster* cluster = (l3_cluster *)head->cluster ;
00740 l3_cluster* hitP ;
00741 gl3Hit* gHitP = 0 ;
00742
00743 for ( int i = 0 ; i < nSectorHits ; i++ ) {
00744 hitP = &(cluster[i]) ;
00745
00746
00747
00748 if ( hitProcessing > 1 ) {
00749 gHitP = &(hit[nHits+i]);
00750 gHitP->set (coordinateTransformer, sector, hitP);
00751 }
00752
00753
00754
00755
00756 int trkId = hitP->trackId ;
00757 if ( trkId < 0 || trkId > nSectorTracks ) {
00758 LOG(ERR, "gl3Event:readSectorHits: %d wrong track id in hit of sector %d \n",
00759 trkId, sector ,0,0,0) ;
00760 continue ;
00761 }
00762 int indexStore = (sector-1)*maxTracksSector+trkId ;
00763 if ( indexStore < 0 || indexStore > nSectors*maxTracksSector ) {
00764 LOG(ERR, "gl3Event:readSectorHits: %d wrong indexStore\n",
00765 indexStore ,0,0,0,0) ;
00766 continue ;
00767 }
00768 int index = trackIndex[indexStore] - 1 ;
00769 if ( index < 0 || index > nTracks ) continue ;
00770
00771
00772
00773
00774 if ( hitProcessing > 1 ) {
00775 if ( track[index].firstHit == 0 )
00776 track[index].firstHit = (void *)gHitP ;
00777 else
00778 ((gl3Hit *)(track[index].lastHit))->nextHit = (void *)gHitP ;
00779 track[index].lastHit = (void *)gHitP ;
00780 gHitP->trackId = track[index].id ;
00781 }
00782
00783
00784
00785 hitP->trackId = track[index].id ;
00786
00787
00788 }
00789 nHits += nSectorHits ;
00790
00791 return nSectorHits ;
00792 }
00793
00794
00795
00796
00797
00798
00799 int gl3Event::readSectorTracks ( char* buffer ){
00800
00801 struct L3_SECTP *head = (struct L3_SECTP *)buffer ;
00802
00803 if ( strncmp(head->bh.bank_type,CHAR_L3_SECTP,8) ) {
00804 LOG(ERR, "gl3Event::readSectorTracks, wrong bank type %s\n",
00805 head->bh.bank_type,0,0,0,0 ) ;
00806 return -1 ;
00807 }
00808
00809 int sector = head->bh.bank_id ;
00810 if ( sector < 0 || sector > nSectors ) {
00811 LOG(ERR," gl3Event::readSector: %d wrong sector \n", sector ,0,0,0,0) ;
00812 return 1 ;
00813 }
00814
00815 gl3Sector* sectorP = &(sectorInfo[sector-1]) ;
00816 sectorP->filled = 1 ;
00817 sectorP->nHits = head->nHits ;
00818 sectorP->nTracks = head->nTracks ;
00819 sectorP->cpuTime = head->cpuTime ;
00820 sectorP->realTime = head->realTime ;
00821 sectorP->xVert = float(head->xVert)/1000000 ;
00822 sectorP->yVert = float(head->yVert)/1000000 ;
00823 sectorP->zVert = float(head->zVert)/1000000 ;
00824 sectorP->rVert = sqrt((double)( sectorP->xVert*sectorP->xVert +
00825 sectorP->yVert*sectorP->yVert)) ;
00826 sectorP->phiVert = atan2((double)sectorP->yVert,(double)sectorP->xVert) ;
00827 if ( sectorP->phiVert < 0 ) sectorP->phiVert += 2. * M_PI ;
00828
00829
00830
00831
00832
00833 para.xVertex = sectorP->xVert ;
00834 para.yVertex = sectorP->yVert ;
00835 para.zVertex = sectorP->zVert ;
00836 para.rVertex = sectorP->rVert ;
00837 para.phiVertex = sectorP->phiVert ;
00838
00839 char* pointer = head->banks[0].off * 4 + buffer ;
00840 int nSectorTracks ;
00841
00842 if ( (head->banks[0].len > 0) && (head->bh.format_number > 0) ) {
00843
00844 nSectorTracks = (4 * head->banks[0].len - sizeof(struct bankHeader))
00845 /sizeof(struct local_track);
00846 }
00847 else nSectorTracks = 0 ;
00848
00849
00850
00851 if ( nSectorTracks > 0 ) {
00852 struct L3_LTD* headerLocal = (struct L3_LTD*)pointer ;
00853 local_track* localTrack = headerLocal->track ;
00854 addTracks ( sector, nSectorTracks, localTrack ) ;
00855 }
00856
00857
00858 return sectorP->nTracks ;
00859 }
00860
00861
00862
00863
00864
00865 int gl3Event::makeVertex (){
00866
00867
00868
00869
00870
00871 gl3Track* gTrack ;
00872 Ftf3DHit closestHit ;
00873
00874 hVz->Reset();
00875 hVx->Reset();
00876 hVy->Reset();
00877
00878
00879 vertex.Setxyz(0.0,0.0,0.0);
00880
00881
00882 for(int iter = 0 ; iter<2; iter++ ) {
00883
00884 for(int trkcnt = 0 ; trkcnt<getNTracks(); trkcnt++ ) {
00885 gTrack = getTrack(trkcnt);
00886
00887
00888
00889
00890 if ( gTrack->nHits > minNoOfHitsOnTrackUsedForVertexCalc &&
00891 gTrack->pt > minMomUsedForVertexCalc) {
00892
00893 closestHit = gTrack->closestApproach(getVertex().Getx(),
00894 getVertex().Gety());
00895
00896
00897
00898
00899 hVz->Fill(closestHit.z,1.0);
00900 hVx->Fill(closestHit.x,1.0);
00901 hVy->Fill(closestHit.y,1.0);
00902 }
00903 }
00904
00905
00906 vertex.Setxyz(hVx->getWeightedMean(6.0),
00907 hVy->getWeightedMean(6.0),
00908 hVz->getWeightedMean(4.0));
00909
00910 }
00911
00912
00913 return 0;
00914 }
00915
00916
00917
00918
00919 int gl3Event::resetEvent ( ){
00920 nHits = 0 ;
00921 nTracks = 0 ;
00922 nMergedTracks = 0 ;
00923 nMergableTracks = 0 ;
00924 nBadTracks = 0 ;
00925 busy = 0 ;
00926
00927
00928 memset(trackContainer, 0,
00929 para.nPhiTrackPlusOne*para.nEtaTrackPlusOne*sizeof(FtfContainer));
00930
00931
00932 if ( hitProcessing ) {
00933 memset ( trackIndex, 0, maxTracksSector*nSectors*sizeof(int) ) ;
00934 delete[] hit;
00935 hit = new gl3Hit[maxHits];
00936 }
00937
00938
00939 for (int i=0; i<16; i++)
00940 trgData.ZDC[i] = 0;
00941
00942 for (int i=0; i<240; i++)
00943 trgData.CTB[i] = 0;
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954 vertex.Setxyz(0.0, 0.0, 0.0);
00955
00956 emc.reset();
00957
00958 return 0 ;
00959 }
00960
00961
00962
00963
00964 int gl3Event::setup ( int mxHits, int mxTracks )
00965 {
00966
00967 if ( mxHits < 0 || mxHits > 1000000 ) {
00968 LOG(ERR, " gl3Event::setup: maxHits %d out of range \n", maxHits,0,0,0,0 ) ;
00969 mxHits = 500000 ;
00970 }
00971
00972 if ( mxTracks < 0 || mxTracks > 1000000 ) {
00973 LOG(ERR, " gl3Event::setup: maxTracks %d out of range \n", maxTracks,0,0,0,0 );
00974 mxTracks = 50000 ;
00975 }
00976
00977
00978 maxHits = mxHits ;
00979 maxTracks = mxTracks ;
00980 maxTracksSector = maxTracks*2/ nSectors ;
00981 hit = new gl3Hit[maxHits] ;
00982 track = new gl3Track[maxTracks] ;
00983 trackIndex = new int[maxTracksSector*nSectors];
00984
00985
00986
00987 nMergedTracks = 0 ;
00988
00989 para.nPhiTrackPlusOne = para.nPhiTrack + 1 ;
00990 para.nEtaTrackPlusOne = para.nEtaTrack + 1 ;
00991
00992
00993
00994 para.phiSliceTrack = (para.phiMaxTrack - para.phiMinTrack)/para.nPhiTrack;
00995 para.etaSliceTrack = (para.etaMaxTrack - para.etaMinTrack)/para.nEtaTrack;
00996
00997 int nTrackVolumes = para.nPhiTrackPlusOne* para.nEtaTrackPlusOne ;
00998 trackContainer = new FtfContainer[nTrackVolumes];
00999 if(trackContainer == NULL) {
01000 LOG(ERR, "Problem with memory allocation... exiting\n",0,0,0,0,0) ;
01001 return 1 ;
01002 }
01003 para.primaries = 1 ;
01004 para.ptMinHelixFit = 1.e60 ;
01005
01006 nTracks = 0 ;
01007
01008
01009
01010
01011 minNoOfHitsOnTrackUsedForVertexCalc=14;
01012 minMomUsedForVertexCalc=0.25;
01013
01014 char hid[50] ;
01015 char title[100] ;
01016
01017 strcpy ( hid, "Vertex_Vz" ) ;
01018 strcpy ( title, "Vertex_Vz" ) ;
01019 hVz = new gl3Histo ( hid, title, 400, -200., 200. ) ;
01020
01021 strcpy ( hid, "Vertex_Vx" ) ;
01022 strcpy ( title, "Vertex_Vx" ) ;
01023 hVx = new gl3Histo ( hid, title, 100,-10,10);
01024
01025 strcpy ( hid, "Vertex_Vy" ) ;
01026 strcpy ( title, "Vertex_Vy" ) ;
01027 hVy = new gl3Histo ( hid, title, 100,-10,10);
01028
01029
01030
01031 return 0 ;
01032 }