Stl3Util/gl3/gl3Event.cxx
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "Stl3Util/gl3/gl3Event.h"
00014
00015 #include "Stl3Util/base/realcc.h"
00016 #include "Stl3Util/base/FtfLog.h"
00017
00018
00019
00020
00021
00022 gl3Event::gl3Event(int mxHits, int mxTracks,
00023 St_l3_Coordinate_Transformer* inTrans)
00024 {
00025 hit = NULL;
00026 track = NULL;
00027 busy = 0;
00028
00029 trackContainer = 0;
00030 trackIndex = 0;
00031 hitProcessing = 0;
00032 maxSectorNForTrackMerging = 1000000;
00033 coordinateTransformer = inTrans;
00034 setup( mxHits, mxTracks );
00035 resetEvent();
00036 };
00037
00038
00039 gl3Event::~gl3Event( )
00040 {
00041 if ( hit != 0 ) delete[] hit ;
00042 if ( track != 0 ) delete[] track;
00043 if ( trackContainer != 0 ) delete[] trackContainer;
00044 if ( trackIndex != 0 ) delete[] trackIndex ;
00045 };
00046
00047
00048
00049
00050
00051
00052
00053 gl3Track* gl3Event::getTrack ( int n ) {
00054 if ( n < 0 || n > nTracks ) {
00055 fprintf ( stderr, " %d track index out of range \n", n );
00056 return NULL;
00057 }
00058 return &(track[n]);
00059 }
00060
00061
00062 gl3Hit* gl3Event::getHit ( int n ) {
00063 if ( n < 0 || n > nHits ) {
00064 fprintf ( stderr, " %d hit index out of range \n", n );
00065 return NULL;
00066 }
00067 return &(hit[n]);
00068 }
00069
00070 gl3Sector* gl3Event::getSector ( int n ) {
00071 if ( n < 0 || n > NSECTORS ) {
00072 fprintf ( stderr, " %d sector index out of range \n", n );
00073 return NULL;
00074 }
00075 return &(sectorInfo[n]);
00076 }
00077
00078
00079 int gl3Event::getTrgCmd()
00080 {
00081 return trgData.trgCmd;
00082 };
00083
00084 int gl3Event::getTrgWord()
00085 {
00086 return trgData.trgWord;
00087 };
00088
00089 int gl3Event::getZDC(int n)
00090 {
00091 return trgData.ZDC[n];
00092 };
00093
00094 int gl3Event::getCTB(int n)
00095 {
00096 return trgData.CTB[n];
00097 };
00098
00099
00100
00101
00102
00103
00104 void gl3Event::addTracks ( short sector, int nTrk, local_track* localTrack ) {
00105
00106 gl3Track* lTrack = &(track[nTracks]) ;
00107 local_track *trk = localTrack ;
00108 int indexStore = -1 ;
00109
00110 int idTrack ;
00111 for ( int i = 0 ; i < nTrk ; i++ ) {
00112 lTrack->set ( sector, trk ) ;
00113 lTrack->id = sector * 1000 + abs(trk->id) ;
00114 lTrack->para = ¶ ;
00115 lTrack->sector = sector ;
00116 idTrack = trk->id ;
00117
00118
00119
00120
00121 if ( hitProcessing ) {
00122 indexStore = -1 ;
00123 if ( abs(idTrack) < maxTracksSector )
00124 indexStore = (sector-1)*maxTracksSector + abs(idTrack) ;
00125 else {
00126 ftfLog ( " gl3Event::addTracks: max number of tracks per Sector reached %d reached\n",
00127 idTrack ) ;
00128 }
00129 }
00130
00131
00132
00133 gl3Track* fatterTrack = 0 ;
00134 if ( maxSectorNForTrackMerging > nTrk && idTrack < 0 ) {
00135
00136 fatterTrack = lTrack->merge ( trackContainer ) ;
00137 if ( fatterTrack ) {
00138
00139 if ( hitProcessing && indexStore > 0 ) {
00140 trackIndex[indexStore] =
00141 ((char *)fatterTrack - (char *)track )/sizeof(gl3Track)+1;
00142 }
00143 trk++ ;
00144 nMergedTracks++ ;
00145 continue ;
00146 }
00147 nMergableTracks++ ;
00148 }
00149
00150
00151 if ( hitProcessing && indexStore > 0 )
00152 trackIndex[indexStore] = nTracks + 1;
00153
00154
00155 lTrack++ ;
00156 nTracks++ ;
00157 trk++ ;
00158 if ( nTracks+1 >= maxTracks ) {
00159 ftfLog ( " gl3Event::addTracks: max number of tracks %d reached, sector: %i nrSectorTracks: %i\n", maxTracks, sector, nTrk ) ;
00160 nTracks-- ;
00161 lTrack--;
00162 break;
00163 }
00164 }
00165 }
00166
00167
00168
00169
00170
00171
00172 int gl3Event::fillTracks ( int maxBytes, char* buffer, unsigned int token ){
00173
00174
00175
00176 int nBytesNeeded = sizeof(L3_GTD) + (nTracks-1) * sizeof(global_track) ;
00177 if ( nBytesNeeded > maxBytes ) {
00178 ftfLog ( " gl3Event::writeTracks: %d bytes needed less than max = %d \n",
00179 nBytesNeeded, maxBytes ) ;
00180 return 0 ;
00181 }
00182
00183 L3_GTD* head = (L3_GTD *)buffer ;
00184
00185 head->nHits = nHits ;
00186 head->xVert = 0 ;
00187 head->yVert = 0 ;
00188 head->zVert = 0 ;
00189
00190
00191 memcpy(head->bh.bank_type,CHAR_L3_GTD,8);
00192 head->bh.bank_id = 1;
00193 head->bh.format_ver = DAQ_RAW_FORMAT_VERSION ;
00194 head->bh.byte_order = DAQ_RAW_FORMAT_ORDER ;
00195 head->bh.format_number = 0;
00196 head->bh.token = token;
00197 head->bh.w9 = DAQ_RAW_FORMAT_WORD9;
00198 head->bh.crc = 0;
00199 head->bh.length = (sizeof(struct L3_GTD)
00200 + (nTracks-1) * sizeof(struct global_track))/4 ;
00201
00202
00203
00204
00205
00206 global_track* oTrack = (global_track *)head->track ;
00207 int counter = 0 ;
00208 for ( int i = 0 ; i < nTracks ; i++ ) {
00209 if ( fabs(track[i].z0) > 205 ) {
00210
00211
00212 nBadTracks++ ;
00213 continue ;
00214 }
00215 oTrack->id = track[i].id ;
00216 oTrack->flag = track[i].flag ;
00217 oTrack->innerMostRow = track[i].innerMostRow ;
00218 oTrack->outerMostRow = track[i].outerMostRow ;
00219 oTrack->nHits = track[i].nHits ;
00220 oTrack->ndedx = track[i].nDedx ;
00221 oTrack->q = track[i].q ;
00222 oTrack->chi2[0] = track[i].chi2[0] ;
00223 oTrack->chi2[1] = track[i].chi2[1] ;
00224 oTrack->dedx = track[i].dedx ;
00225 oTrack->pt = track[i].pt ;
00226 oTrack->phi0 = track[i].phi0 ;
00227 oTrack->r0 = track[i].r0 ;
00228 oTrack->z0 = track[i].z0 ;
00229 oTrack->psi = track[i].psi ;
00230 oTrack->tanl = track[i].tanl ;
00231 oTrack->length = track[i].length ;
00232 oTrack->dpt = track[i].dpt ;
00233 oTrack->dpsi = track[i].dpsi ;
00234 oTrack->dz0 = track[i].dz0 ;
00235 oTrack->dtanl = track[i].dtanl ;
00236 oTrack++ ;
00237 counter++ ;
00238 }
00239 head->nTracks = counter ;
00240
00241
00242
00243 return ((char *)oTrack-buffer) ;
00244 }
00245
00246
00247
00248
00249
00250
00251
00252 int gl3Event::readEventDescriptor( EventDescriptor *descr )
00253 {
00254 if (!descr) {
00255 ftfLog("gl3Event::readEventDescriptor: got NULL pointer");
00256 return 0;
00257 }
00258
00259 trgData.trgCmd = ((descr->TRG_DAQ_cmds) & 0xf0) >> 4;
00260 trgData.trgWord = descr->TRG_word;
00261
00262 return 0;
00263 }
00264
00265
00266
00267
00268
00269
00270
00271
00272 int gl3Event::readL3Data( L3_P* header )
00273 {
00274
00275 char* buffer = (char *)header;
00276
00277
00278 int length, offset ;
00279 char* trackPointer ;
00280 char* hitPointer ;
00281
00282 resetEvent ( );
00283 int i ;
00284 L3_SECP* sectorP ;
00285 for ( i = 0 ; i < NSECTORS ; i++ ) {
00286 length = header->sector[i].len ;
00287
00288 if ( length==0 ) continue ;
00289
00290 offset = 4 * header->sector[i].off ;
00291 sectorP = (L3_SECP *)&(buffer[offset]);
00292 trackPointer = (char *)sectorP + sectorP->trackp.off * 4 ;
00293 int nSectorTracks = readSectorTracks ( trackPointer ) ;
00294
00295 if ( nSectorTracks < 0 ) {
00296 ftfLog("gl3Event:readEvent: error reading tracks, sector %d \n",
00297 i+1);
00298 return -1 ;
00299 }
00300
00301 if ( hitProcessing && sectorP->sl3clusterp.off ) {
00302 hitPointer = (char *)sectorP + sectorP->sl3clusterp.off * 4 ;
00303 readSectorHits ( hitPointer, nSectorTracks ) ;
00304 }
00305
00306
00307
00308 }
00309
00310 makeVertex();
00311
00312
00313 #ifdef EVENTDISPLAY
00314
00315
00316
00317
00318
00319 double radius ;
00320
00321 for ( int i = 0 ; i < nTracks ; i++ ) {
00322
00323 radius = coordinateTransformer->
00324 GetRadialDistanceAtRow(track[i].innerMostRow-1) ;
00325
00326 track[i].updateToRadius ( radius ) ;
00327
00328
00329
00330 if ( fabs(track[i].z0) > 205 ) track[i].updateToRadius ( radius+5. ) ;
00331 if ( fabs(track[i].z0) > 205 ) {
00332 ftfLog ( "gl3Event:: problem after extrapolation id %d z0 %f\n",
00333 track[i].id, track[i].z0 ) ;
00334 }
00335 }
00336 #endif
00337
00338
00339
00340 busy = 1 ;
00341
00342 return 0 ;
00343 }
00344
00345
00346
00347
00348
00349
00350 int gl3Event::readTrgData(TrgSumData* trgSum, RawTrgDet* rawTrg)
00351 {
00352 if (trgSum != NULL) {
00353
00354 for (int i=0; i<16; i++) {
00355 trgData.ZDC[i] = trgSum->DSM.ZDC[i];
00356 }
00357 }
00358
00359 if (rawTrg != NULL) {
00360
00361
00362
00363
00364
00365
00366 for (int chunk=0; chunk<16; chunk++) {
00367 for (int slat=0; slat<15; slat++) {
00368 trgData.CTB[15*chunk + slat] =
00369 rawTrg->CTB[16*chunk + slat];
00370 }
00371 }
00372 }
00373
00374 return 0;
00375 }
00376
00377
00378
00379
00380
00381 int gl3Event::readSectorHits ( char* buffer, int nSectorTracks ){
00382 L3_SECCD* head = (L3_SECCD *)buffer ;
00383
00384
00385
00386 if ( !coordinateTransformer ) {
00387 ftfLog("gl3Event::readSectorHits: there is not Coordinate Transformer \n");
00388 return 0 ;
00389 }
00390
00391
00392
00393
00394
00395 if ( strncmp(head->bh.bank_type,CHAR_L3_SECCD,8) ) {
00396 ftfLog ( "gl3Event::readSectorHits: wrong bank type %s\n",
00397 head->bh.bank_type ) ;
00398 ftfLog ( " right bank type %s \n", CHAR_L3_SECCD ) ;
00399 return 0 ;
00400 }
00401 int sector = head->bh.bank_id;
00402 int nSectorHits = head->nrClusters_in_sector ;
00403
00404
00405
00406
00407 if ( nHits + nSectorHits > maxHits ) {
00408 ftfLog("gl3Event:readSectorHits: not enough space for hits in sector %d\n",
00409 sector ) ;
00410 ftfLog ( " maxHits %d nSectorHits %d nHits %d \n", maxHits,
00411 nSectorHits, nHits ) ;
00412 return 0 ;
00413 }
00414
00415 l3_cluster* cluster = (l3_cluster *)head->cluster ;
00416 l3_cluster* hitP ;
00417 gl3Hit* gHitP = 0 ;
00418
00419 for ( int i = 0 ; i < nSectorHits ; i++ ) {
00420 hitP = &(cluster[i]) ;
00421
00422
00423
00424 if ( hitProcessing > 1 ) {
00425 gHitP = &(hit[nHits+i]);
00426 gHitP->set (coordinateTransformer, sector, hitP);
00427 }
00428
00429
00430
00431
00432 int trkId = hitP->trackId ;
00433 if ( trkId < 0 || trkId > nSectorTracks ) {
00434 ftfLog ( "gl3Event:readSectorHits: %d wrong track id in hit of sector %d \n",
00435 trkId, sector ) ;
00436 continue ;
00437 }
00438 int indexStore = (sector-1)*maxTracksSector+trkId ;
00439 if ( indexStore < 0 || indexStore > NSECTORS*maxTracksSector ) {
00440 ftfLog ( "gl3Event:readSectorHits: %d wrong indexStore\n",
00441 indexStore ) ;
00442 continue ;
00443 }
00444 int index = trackIndex[indexStore] - 1 ;
00445 if ( index < 0 || index > nTracks ) continue ;
00446
00447
00448
00449
00450 if ( hitProcessing > 1 ) {
00451 if ( track[index].firstHit == 0 )
00452 track[index].firstHit = (void *)gHitP ;
00453 else
00454 ((gl3Hit *)(track[index].lastHit))->nextHit = (void *)gHitP ;
00455 track[index].lastHit = (void *)gHitP ;
00456 gHitP->trackId = track[index].id ;
00457 }
00458
00459
00460
00461 hitP->trackId = track[index].id ;
00462
00463
00464 }
00465 nHits += nSectorHits ;
00466
00467 return nSectorHits ;
00468 }
00469
00470
00471
00472
00473
00474
00475 int gl3Event::readSectorTracks ( char* buffer ){
00476
00477 struct L3_SECTP *head = (struct L3_SECTP *)buffer ;
00478
00479 if ( strncmp(head->bh.bank_type,CHAR_L3_SECTP,8) ) {
00480 ftfLog ( "gl3Event::readSectorTracks, wrong bank type %s\n",
00481 head->bh.bank_type ) ;
00482 return -1 ;
00483 }
00484
00485 int sector = head->bh.bank_id ;
00486 if ( sector < 0 || sector > NSECTORS ) {
00487 ftfLog ( " gl3Event::readSector: %d wrong sector \n", sector ) ;
00488 return 1 ;
00489 }
00490
00491 gl3Sector* sectorP = &(sectorInfo[sector-1]) ;
00492 sectorP->filled = 1 ;
00493 sectorP->nHits = head->nHits ;
00494 sectorP->nTracks = head->nTracks ;
00495 sectorP->cpuTime = head->cpuTime ;
00496 sectorP->realTime = head->realTime ;
00497 sectorP->xVert = float(head->xVert)/1000000 ;
00498 sectorP->yVert = float(head->yVert)/1000000 ;
00499 sectorP->zVert = float(head->zVert)/1000000 ;
00500 sectorP->rVert = ::sqrt((double)( sectorP->xVert*sectorP->xVert +
00501 sectorP->yVert*sectorP->yVert)) ;
00502 sectorP->phiVert = atan2((double)sectorP->yVert,(double)sectorP->xVert) ;
00503 if ( sectorP->phiVert < 0 ) sectorP->phiVert += 2. * M_PI ;
00504
00505
00506
00507
00508
00509 para.xVertex = sectorP->xVert ;
00510 para.yVertex = sectorP->yVert ;
00511 para.zVertex = sectorP->zVert ;
00512 para.rVertex = sectorP->rVert ;
00513 para.phiVertex = sectorP->phiVert ;
00514
00515 char* pointer = head->banks[0].off * 4 + buffer ;
00516 int nSectorTracks ;
00517
00518 if ( (head->banks[0].len > 0) && (head->bh.format_number > 0) ) {
00519
00520 nSectorTracks = (4 * head->banks[0].len - sizeof(struct bankHeader))
00521 /sizeof(struct local_track);
00522 }
00523 else nSectorTracks = 0 ;
00524
00525
00526
00527 if ( nSectorTracks > 0 ) {
00528 struct L3_LTD* headerLocal = (struct L3_LTD*)pointer ;
00529 local_track* localTrack = headerLocal->track ;
00530 addTracks ( sector, nSectorTracks, localTrack ) ;
00531 }
00532
00533
00534 return sectorP->nTracks ;
00535 }
00536
00537
00538
00539
00540
00541 void gl3Event::makeVertex (){
00542
00543
00544
00545
00546
00547 gl3Track* gTrack ;
00548 Ftf3DHit closestHit ;
00549
00550 hVz->Reset();
00551 hVx->Reset();
00552 hVy->Reset();
00553
00554 vertex.Setxyz(0.0,0.0,0.0);
00555
00556
00557 for(int iter = 0 ; iter<1; iter++ ) {
00558
00559 for(int trkcnt = 0 ; trkcnt<getNTracks(); trkcnt++ ) {
00560 gTrack = getTrack(trkcnt);
00561
00562
00563 if ( gTrack->nHits > minNoOfHitsOnTrackUsedForVertexCalc &&
00564 gTrack->pt > minMomUsedForVertexCalc) {
00565
00566 closestHit = gTrack->closestApproach(getVertex().Getx(),
00567 getVertex().Gety());
00568
00569 hVz->Fill(closestHit.z,1.0);
00570 hVx->Fill(closestHit.x,1.0);
00571 hVy->Fill(closestHit.y,1.0);
00572 }
00573 }
00574
00575
00576 vertex.Setxyz(hVx->getWeightedMean(6.0),
00577 hVy->getWeightedMean(6.0),
00578 hVz->getWeightedMean(4.0));
00579
00580 }
00581
00582 }
00583
00584
00585
00586
00587 int gl3Event::resetEvent ( ){
00588 nHits = 0 ;
00589 nTracks = 0 ;
00590 nMergedTracks = 0 ;
00591 nMergableTracks = 0 ;
00592 nBadTracks = 0 ;
00593 busy = 0 ;
00594
00595
00596 memset(trackContainer, 0,
00597 para.nPhiTrackPlusOne*para.nEtaTrackPlusOne*sizeof(FtfContainer));
00598
00599
00600 if ( hitProcessing )
00601 memset ( trackIndex, 0, maxTracksSector*NSECTORS*sizeof(int) ) ;
00602
00603
00604 for (int i=0; i<16; i++)
00605 trgData.ZDC[i] = -1;
00606
00607 for (int i=0; i<240; i++)
00608 trgData.CTB[i] = -1;
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618 return 0 ;
00619 }
00620
00621
00622
00623
00624 int gl3Event::setup ( int mxHits, int mxTracks )
00625 {
00626
00627 if ( mxHits < 0 || mxHits > 1000000 ) {
00628 ftfLog(" gl3Event::setup: maxHits %d out of range \n", maxHits ) ;
00629 mxHits = 500000 ;
00630 }
00631
00632 if ( mxTracks < 0 || mxTracks > 1000000 ) {
00633 ftfLog(" gl3Event::setup: maxTracks %d out of range \n", maxTracks );
00634 mxTracks = 50000 ;
00635 }
00636
00637
00638 maxHits = mxHits ;
00639 maxTracks = mxTracks ;
00640 maxTracksSector = maxTracks*2/ NSECTORS ;
00641 hit = new gl3Hit[maxHits] ;
00642 track = new gl3Track[maxTracks] ;
00643 trackIndex = new int[maxTracksSector*NSECTORS];
00644
00645
00646
00647 nMergedTracks = 0 ;
00648
00649 para.nPhiTrackPlusOne = para.nPhiTrack + 1 ;
00650 para.nEtaTrackPlusOne = para.nEtaTrack + 1 ;
00651
00652
00653
00654 para.phiSliceTrack = (para.phiMaxTrack - para.phiMinTrack)/para.nPhiTrack;
00655 para.etaSliceTrack = (para.etaMaxTrack - para.etaMinTrack)/para.nEtaTrack;
00656
00657 int nTrackVolumes = para.nPhiTrackPlusOne* para.nEtaTrackPlusOne ;
00658 trackContainer = new FtfContainer[nTrackVolumes];
00659 if(trackContainer == NULL) {
00660 ftfLog ( "Problem with memory allocation... exiting\n") ;
00661 return 1 ;
00662 }
00663 para.primaries = 1 ;
00664 para.ptMinHelixFit = 1.e60 ;
00665
00666 nTracks = 0 ;
00667
00668
00669
00670
00671 minNoOfHitsOnTrackUsedForVertexCalc=14;
00672 minMomUsedForVertexCalc=0.25;
00673
00674
00675
00676
00677
00678
00679 hVz = new gl3Histo ( "Vertex_Vz", "Vertex_Vz", 400, -200., 200. ) ;
00680
00681
00682
00683 hVx = new gl3Histo ( "Vertex_Vx", "Vertex_Vx", 100,-10,10);
00684
00685
00686
00687
00688 hVy = new gl3Histo ( "Vertex_Vy", "Vertex_Vy", 100,-10,10);
00689
00690
00691
00692
00693 return 0 ;
00694 }
Generated on Sun Mar 15 04:50:50 2009 for StRoot by
1.3.7