StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
gl3Event.cxx
1 //:>------------------------------------------------------------------
2 //: FILE: gl3Event.cc
3 //: HISTORY:
4 //: 3 dec 1999 version 1.00
5 //: 8 apr 2000 include modifications form Clemens
6 //: 6 jul 2000 add St_l3_Coordinate_Transformer
7 //: 12 jul 2000 merge tracks using parameters at closest
8 //: approach (from sl3) and them extrapolate
9 //: them to inner most hit for consumers down the line
10 //: 13 aug 2000 replace trackMerging with maxSectorNForTrackMerging
11 //:Jens Berger 03 jul 2001 makeVertex added: calcs vertex of the event
12 //:<------------------------------------------------------------------
13 #include "Stl3Util/gl3/gl3Event.h"
14 
15 #include "Stl3Util/base/realcc.h"
16 #include "Stl3Util/base/FtfLog.h"
17 
18 //####################################################################
19 // Constructor and Destructor
20 //####################################################################
21 
22 gl3Event::gl3Event(int mxHits, int mxTracks,
24 {
25  hit = NULL;
26  track = NULL;
27  busy = 0;
28 
29  trackContainer = 0;
30  trackIndex = 0;
31  hitProcessing = 0;
32  maxSectorNForTrackMerging = 1000000;
33  coordinateTransformer = inTrans;
34  setup( mxHits, mxTracks );
35  resetEvent();
36 };
37 
38 
39 gl3Event::~gl3Event( )
40 {
41  if ( hit != 0 ) delete[] hit ;
42  if ( track != 0 ) delete[] track;
43  if ( trackContainer != 0 ) delete[] trackContainer;
44  if ( trackIndex != 0 ) delete[] trackIndex ;
45 };
46 
47 
48 
49 
50 //####################################################################
51 // Setters and getters
52 //####################################################################
53 gl3Track* gl3Event::getTrack ( int n ) {
54  if ( n < 0 || n > nTracks ) {
55  fprintf ( stderr, " %d track index out of range \n", n );
56  return NULL;
57  }
58  return &(track[n]);
59 }
60 
61 
62 gl3Hit* gl3Event::getHit ( int n ) {
63  if ( n < 0 || n > nHits ) {
64  fprintf ( stderr, " %d hit index out of range \n", n );
65  return NULL;
66  }
67  return &(hit[n]);
68 }
69 
70 gl3Sector* gl3Event::getSector ( int n ) {
71  if ( n < 0 || n > NSECTORS ) {
72  fprintf ( stderr, " %d sector index out of range \n", n );
73  return NULL;
74  }
75  return &(sectorInfo[n]);
76 }
77 
78 
79 int gl3Event::getTrgCmd()
80 {
81  return trgData.trgCmd;
82 };
83 
84 int gl3Event::getTrgWord()
85 {
86  return trgData.trgWord;
87 };
88 
89 int gl3Event::getZDC(int n)
90 {
91  return trgData.ZDC[n];
92 };
93 
94 int gl3Event::getCTB(int n)
95 {
96  return trgData.CTB[n];
97 };
98 
99 
100 //####################################################################
101 // addTracks: take a pointer to the local_tracks of a sector and
102 // (possibly) merge them with the cuurently known tracks
103 //####################################################################
104 void gl3Event::addTracks ( short sector, int nTrk, local_track* localTrack ) {
105  //
106  gl3Track* lTrack = &(track[nTracks]) ;
107  local_track *trk = localTrack ;
108  int indexStore = -1 ;
109  //
110  int idTrack ;
111  for ( int i = 0 ; i < nTrk ; i++ ) {
112  lTrack->set ( sector, trk ) ;
113  lTrack->id = sector * 1000 + abs(trk->id) ;
114  lTrack->para = &para ;
115  lTrack->sector = sector ;
116  idTrack = trk->id ;
117  //
118  // Check where to store relation orig track<->final track
119  // but only if requested
120  //
121  if ( hitProcessing ) {
122  indexStore = -1 ;
123  if ( abs(idTrack) < maxTracksSector )
124  indexStore = (sector-1)*maxTracksSector + abs(idTrack) ;
125  else {
126  ftfLog ( " gl3Event::addTracks: max number of tracks per Sector reached %d reached\n",
127  idTrack ) ;
128  }
129  }
130  //
131  // if id from buffer is negative track is mergable
132  //
133  gl3Track* fatterTrack = 0 ;
134  if ( maxSectorNForTrackMerging > nTrk && idTrack < 0 ) {
135 
136  fatterTrack = lTrack->merge ( trackContainer ) ;
137  if ( fatterTrack ) {
138  //ftfLog ( "gl3Event: track merged !!! \n" ) ;
139  if ( hitProcessing && indexStore > 0 ) {
140  trackIndex[indexStore] =
141  ((char *)fatterTrack - (char *)track )/sizeof(gl3Track)+1;
142  }
143  trk++ ;
144  nMergedTracks++ ;
145  continue ;
146  }
147  nMergableTracks++ ;
148  }
149 
150  // Store new track in trackIndex array
151  if ( hitProcessing && indexStore > 0 )
152  trackIndex[indexStore] = nTracks + 1;
153 
154  // Increment counters
155  lTrack++ ;
156  nTracks++ ;
157  trk++ ;
158  if ( nTracks+1 >= maxTracks ) {
159  ftfLog ( " gl3Event::addTracks: max number of tracks %d reached, sector: %i nrSectorTracks: %i\n", maxTracks, sector, nTrk ) ;
160  nTracks-- ;
161  lTrack--;
162  break;
163  }
164  }
165 }
166 
167 
168 
169 //####################################################################
170 // fillTracks: fill the gl3Tracks into the L3_GTD
171 //####################################################################
172 int gl3Event::fillTracks ( int maxBytes, char* buffer, unsigned int token ){
173  //
174  // Check enough space
175  //
176  int nBytesNeeded = sizeof(L3_GTD) + (nTracks-1) * sizeof(global_track) ;
177  if ( nBytesNeeded > maxBytes ) {
178  ftfLog ( " gl3Event::writeTracks: %d bytes needed less than max = %d \n",
179  nBytesNeeded, maxBytes ) ;
180  return 0 ;
181  }
182 
183  L3_GTD* head = (L3_GTD *)buffer ;
184 
185  head->nHits = nHits ;
186  head->xVert = 0 ; // each sector has a different vertex???
187  head->yVert = 0 ;
188  head->zVert = 0 ;
189  // bankHeader
190  //
191  memcpy(head->bh.bank_type,CHAR_L3_GTD,8);
192  head->bh.bank_id = 1;
193  head->bh.format_ver = DAQ_RAW_FORMAT_VERSION ;
194  head->bh.byte_order = DAQ_RAW_FORMAT_ORDER ;
195  head->bh.format_number = 0;
196  head->bh.token = token;
197  head->bh.w9 = DAQ_RAW_FORMAT_WORD9;
198  head->bh.crc = 0; //don't know yet....
199  head->bh.length = (sizeof(struct L3_GTD)
200  + (nTracks-1) * sizeof(struct global_track))/4 ;
201 
202 
203  //
204  // Loop over tracks now
205  //
206  global_track* oTrack = (global_track *)head->track ;
207  int counter = 0 ;
208  for ( int i = 0 ; i < nTracks ; i++ ) {
209  if ( fabs(track[i].z0) > 205 ) {
210  // ftfLog ( "gl3Event:fillTracks: problem id %d z0 %f \n",
211  // track[i].id, track[i].z0 ) ;
212  nBadTracks++ ;
213  continue ;
214  }
215  oTrack->id = track[i].id ;
216  oTrack->flag = track[i].flag ;
217  oTrack->innerMostRow = track[i].innerMostRow ;
218  oTrack->outerMostRow = track[i].outerMostRow ;
219  oTrack->nHits = track[i].nHits ;
220  oTrack->ndedx = track[i].nDedx ;
221  oTrack->q = track[i].q ;
222  oTrack->chi2[0] = track[i].chi2[0] ;
223  oTrack->chi2[1] = track[i].chi2[1] ;
224  oTrack->dedx = track[i].dedx ;
225  oTrack->pt = track[i].pt ;
226  oTrack->phi0 = track[i].phi0 ;
227  oTrack->r0 = track[i].r0 ;
228  oTrack->z0 = track[i].z0 ;
229  oTrack->psi = track[i].psi ;
230  oTrack->tanl = track[i].tanl ;
231  oTrack->length = track[i].length ;
232  oTrack->dpt = track[i].dpt ;
233  oTrack->dpsi = track[i].dpsi ;
234  oTrack->dz0 = track[i].dz0 ;
235  oTrack->dtanl = track[i].dtanl ;
236  oTrack++ ;
237  counter++ ;
238  }
239  head->nTracks = counter ;
240  //
241  // return number of bytes
242  //
243  return ((char *)oTrack-buffer) ;
244 }
245 
246 
247 //####################################################################
248 // readEventDescriptor: get token, trigger command and trigger word
249 // from the EventDescriptor received with the
250 // "announce token"
251 //####################################################################
252 int gl3Event::readEventDescriptor( EventDescriptor *descr )
253 {
254  if (!descr) {
255  ftfLog("gl3Event::readEventDescriptor: got NULL pointer");
256  return 0;
257  }
258 
259  trgData.trgCmd = ((descr->TRG_DAQ_cmds) & 0xf0) >> 4;
260  trgData.trgWord = descr->TRG_word;
261 
262  return 0;
263 }
264 
265 
266 
267 //####################################################################
268 // readL3Data: read the L3 contributions for an event. Currently
269 // includes TPC data, but SVT and FTPC data will also
270 // be in this data block at some time.
271 //####################################################################
272 int gl3Event::readL3Data( L3_P* header )
273 {
274 
275  char* buffer = (char *)header;
276  //L3_P* header = (L3_P *)buffer ;
277 
278  int length, offset ;
279  char* trackPointer ;
280  char* hitPointer ;
281 
282  resetEvent ( );
283  int i ;
284  L3_SECP* sectorP ;
285  for ( i = 0 ; i < NSECTORS ; i++ ) {
286  length = header->sector[i].len ;
287 
288  if ( length==0 ) continue ;
289 
290  offset = 4 * header->sector[i].off ;
291  sectorP = (L3_SECP *)&(buffer[offset]);
292  trackPointer = (char *)sectorP + sectorP->trackp.off * 4 ;
293  int nSectorTracks = readSectorTracks ( trackPointer ) ;
294 
295  if ( nSectorTracks < 0 ) {
296  ftfLog("gl3Event:readEvent: error reading tracks, sector %d \n",
297  i+1);
298  return -1 ;
299  }
300 
301  if ( hitProcessing && sectorP->sl3clusterp.off ) {
302  hitPointer = (char *)sectorP + sectorP->sl3clusterp.off * 4 ;
303  readSectorHits ( hitPointer, nSectorTracks ) ;
304  }
305 
306 
307 
308  }
309 
310  makeVertex();
311 
312 
313 #ifdef EVENTDISPLAY
314  // For best merging (as least as 7/12/00) tracks
315  // are passed from sl3 to gl3 at point of closest approach
316  // the event viewer wants them(at least for now) at
317  // inner most point so we extrapolate to inner most hit radius
318 
319  double radius ;
320 
321  for ( int i = 0 ; i < nTracks ; i++ ) {
322 
323  radius = coordinateTransformer->
324  GetRadialDistanceAtRow(track[i].innerMostRow-1) ;
325 
326  track[i].updateToRadius ( radius ) ;
327 
328  // If track outside of TPC move radius since row
329  // radius is equal or larger than DistanceAtRow
330  if ( fabs(track[i].z0) > 205 ) track[i].updateToRadius ( radius+5. ) ;
331  if ( fabs(track[i].z0) > 205 ) {
332  ftfLog ( "gl3Event:: problem after extrapolation id %d z0 %f\n",
333  track[i].id, track[i].z0 ) ;
334  }
335  }
336 #endif
337  //
338  // declare event as busy
339  //
340  busy = 1 ;
341 
342  return 0 ;
343 }
344 
345 
346 //####################################################################
347 // readTrgData: Read the data provided by L[0-2] trigger. Mainly
348 // interesting for CTB and ZDC data.
349 //####################################################################
350 int gl3Event::readTrgData(TrgSumData* trgSum, RawTrgDet* rawTrg)
351 {
352  if (trgSum != NULL) {
353  // Get the ZDC data
354  for (int i=0; i<16; i++) {
355  trgData.ZDC[i] = trgSum->DSM.ZDC[i];
356  }
357  }
358 
359  if (rawTrg != NULL) {
360 
361  // Read the CTB data
362  // The data is delivered in 16 chunks of 16 bytes, but
363  // the last byte of each chunk does not contain CTB
364  // information, thus the 15*16 bytes of slat information
365  // will be packed into an array[240].
366  for (int chunk=0; chunk<16; chunk++) {
367  for (int slat=0; slat<15; slat++) {
368  trgData.CTB[15*chunk + slat] =
369  rawTrg->CTB[16*chunk + slat];
370  }
371  }
372  }
373 
374  return 0;
375 }
376 
377 
378 //####################################################################
379 // readSectorHits: does what you expect
380 //####################################################################
381 int gl3Event::readSectorHits ( char* buffer, int nSectorTracks ){
382  L3_SECCD* head = (L3_SECCD *)buffer ;
383  //
384  // Check coordinate transformer is there
385  //
386  if ( !coordinateTransformer ) {
387  ftfLog("gl3Event::readSectorHits: there is not Coordinate Transformer \n");
388  return 0 ;
389  }
390 
391 
392  //
393  // Check bank header type
394  //
395  if ( strncmp(head->bh.bank_type,CHAR_L3_SECCD,8) ) {
396  ftfLog ( "gl3Event::readSectorHits: wrong bank type %s\n",
397  head->bh.bank_type ) ;
398  ftfLog ( " right bank type %s \n", CHAR_L3_SECCD ) ;
399  return 0 ;
400  }
401  int sector = head->bh.bank_id;
402  int nSectorHits = head->nrClusters_in_sector ;
403 
404  //
405  // Check number of hits
406  //
407  if ( nHits + nSectorHits > maxHits ) {
408  ftfLog("gl3Event:readSectorHits: not enough space for hits in sector %d\n",
409  sector ) ;
410  ftfLog ( " maxHits %d nSectorHits %d nHits %d \n", maxHits,
411  nSectorHits, nHits ) ;
412  return 0 ;
413  }
414 
415  l3_cluster* cluster = (l3_cluster *)head->cluster ;
416  l3_cluster* hitP ;
417  gl3Hit* gHitP = 0 ;
418 
419  for ( int i = 0 ; i < nSectorHits ; i++ ) {
420  hitP = &(cluster[i]) ;
421  //
422  // Only if hits are going to be used for analysis unpack them
423  //
424  if ( hitProcessing > 1 ) {
425  gHitP = &(hit[nHits+i]);
426  gHitP->set (coordinateTransformer, sector, hitP);
427  }
428  //
429  // Now logic to reset trackId in hits
430  // This is to take care of track merging
431  //
432  int trkId = hitP->trackId ;
433  if ( trkId < 0 || trkId > nSectorTracks ) {
434  ftfLog ( "gl3Event:readSectorHits: %d wrong track id in hit of sector %d \n",
435  trkId, sector ) ;
436  continue ;
437  }
438  int indexStore = (sector-1)*maxTracksSector+trkId ;
439  if ( indexStore < 0 || indexStore > NSECTORS*maxTracksSector ) {
440  ftfLog ( "gl3Event:readSectorHits: %d wrong indexStore\n",
441  indexStore ) ;
442  continue ;
443  }
444  int index = trackIndex[indexStore] - 1 ;
445  if ( index < 0 || index > nTracks ) continue ;
446  //
447  // Only if hits are gonig to be used the
448  // linked lists are set
449  //
450  if ( hitProcessing > 1 ) {
451  if ( track[index].firstHit == 0 )
452  track[index].firstHit = (void *)gHitP ;
453  else
454  ((gl3Hit *)(track[index].lastHit))->nextHit = (void *)gHitP ;
455  track[index].lastHit = (void *)gHitP ;
456  gHitP->trackId = track[index].id ;
457  }
458  //
459  // Modify trackId of clusters got from sl3
460  //
461  hitP->trackId = track[index].id ;
462  // ftfLog ( "hit trackId %d \n", track[index].id ) ;
463 
464  }
465  nHits += nSectorHits ;
466 
467  return nSectorHits ;
468 }
469 
470 
471 //####################################################################
472 // readSectorTracks: guess what it dows ;)
473 // fills some general info and calls addTracks()
474 //####################################################################
475 int gl3Event::readSectorTracks ( char* buffer ){
476 
477  struct L3_SECTP *head = (struct L3_SECTP *)buffer ;
478 
479  if ( strncmp(head->bh.bank_type,CHAR_L3_SECTP,8) ) {
480  ftfLog ( "gl3Event::readSectorTracks, wrong bank type %s\n",
481  head->bh.bank_type ) ;
482  return -1 ;
483  }
484 
485  int sector = head->bh.bank_id ;
486  if ( sector < 0 || sector > NSECTORS ) {
487  ftfLog ( " gl3Event::readSector: %d wrong sector \n", sector ) ;
488  return 1 ;
489  }
490 
491  gl3Sector* sectorP = &(sectorInfo[sector-1]) ;
492  sectorP->filled = 1 ;
493  sectorP->nHits = head->nHits ;
494  sectorP->nTracks = head->nTracks ;
495  sectorP->cpuTime = head->cpuTime ;
496  sectorP->realTime = head->realTime ;
497  sectorP->xVert = float(head->xVert)/1000000 ;
498  sectorP->yVert = float(head->yVert)/1000000 ;
499  sectorP->zVert = float(head->zVert)/1000000 ;
500  sectorP->rVert = ::sqrt((double)( sectorP->xVert*sectorP->xVert +
501  sectorP->yVert*sectorP->yVert)) ;
502  sectorP->phiVert = atan2((double)sectorP->yVert,(double)sectorP->xVert) ;
503  if ( sectorP->phiVert < 0 ) sectorP->phiVert += 2. * M_PI ;
504 
505  //sectorP->print();
506  //
507  // Set vertex parameters for track merging
508  //
509  para.xVertex = sectorP->xVert ;
510  para.yVertex = sectorP->yVert ;
511  para.zVertex = sectorP->zVert ;
512  para.rVertex = sectorP->rVert ;
513  para.phiVertex = sectorP->phiVert ;
514  //
515  char* pointer = head->banks[0].off * 4 + buffer ;
516  int nSectorTracks ;
517  //
518  if ( (head->banks[0].len > 0) && (head->bh.format_number > 0) ) {
519  // ftfLog ( "banks[0].len %d\n", head->banks[0].len ) ;
520  nSectorTracks = (4 * head->banks[0].len - sizeof(struct bankHeader))
521  /sizeof(struct local_track);
522  }
523  else nSectorTracks = 0 ;
524  //
525  // Add tracks
526  //
527  if ( nSectorTracks > 0 ) {
528  struct L3_LTD* headerLocal = (struct L3_LTD*)pointer ;
529  local_track* localTrack = headerLocal->track ;
530  addTracks ( sector, nSectorTracks, localTrack ) ;
531  }
532 
533  //
534  return sectorP->nTracks ;
535 }
536 
537 
538 //####################################################################
539 // Reconstruct the vertex and store it in gl3Event::vertex
540 //####################################################################
541 void gl3Event::makeVertex (){
542  // debug
543  //printf ( "doing gl3Vertex process!!!\n");
544 
545  // init
546  //short sector = 0 ;
547  gl3Track* gTrack ;
548  Ftf3DHit closestHit ;
549 
550  hVz->Reset();
551  hVx->Reset();
552  hVy->Reset();
553 
554  vertex.Setxyz(0.0,0.0,0.0);
555 
556 
557  for(int iter = 0 ; iter<1; iter++ ) {
558  // loop over gtracks
559  for(int trkcnt = 0 ; trkcnt<getNTracks(); trkcnt++ ) {
560  gTrack = getTrack(trkcnt);
561 
562  // acept only tracks with nHits more then minNoOfHitsOnTrack
563  if ( gTrack->nHits > minNoOfHitsOnTrackUsedForVertexCalc &&
564  gTrack->pt > minMomUsedForVertexCalc) {
565  // bad bad bad baby! Wouldn't it be nicer to use Vx and Vz!
566  closestHit = gTrack->closestApproach(getVertex().Getx(),
567  getVertex().Gety());
568  // fill histos with the coordinates of the closest point to x=y=0
569  hVz->Fill(closestHit.z,1.0);
570  hVx->Fill(closestHit.x,1.0);
571  hVy->Fill(closestHit.y,1.0);
572  }
573  } // for(int trkcnt = 0 ; trkcnt<event->getNTracks(); trkcnt++ )
574 
575  // get and set the weighted mean
576  vertex.Setxyz(hVx->getWeightedMean(6.0),
577  hVy->getWeightedMean(6.0),
578  hVz->getWeightedMean(4.0));
579 
580  } //for(int iter = 0 ; iter<2; iter++ )
581 
582 }
583 
584 //####################################################################
585 //
586 //####################################################################
587 int gl3Event::resetEvent ( ){
588  nHits = 0 ;
589  nTracks = 0 ;
590  nMergedTracks = 0 ;
591  nMergableTracks = 0 ;
592  nBadTracks = 0 ;
593  busy = 0 ;
594 
595  // Reset tracks
596  memset(trackContainer, 0,
597  para.nPhiTrackPlusOne*para.nEtaTrackPlusOne*sizeof(FtfContainer));
598 
599  // Reset hits
600  if ( hitProcessing )
601  memset ( trackIndex, 0, maxTracksSector*NSECTORS*sizeof(int) ) ;
602 
603  // Reset trigger data
604  for (int i=0; i<16; i++)
605  trgData.ZDC[i] = -1;
606 
607  for (int i=0; i<240; i++)
608  trgData.CTB[i] = -1;
609 
610  /*
611  for ( int i = 0 ; i < nTracks ; i++ ) {
612  track[i].firstHit = 0 ;
613  track[i].lastHit = 0 ;
614  track[i].nextTrack = 0 ;
615  }
616  */
617 
618  return 0 ;
619 }
620 
621 //####################################################################
622 //
623 //####################################################################
624 int gl3Event::setup ( int mxHits, int mxTracks )
625 {
626 
627  if ( mxHits < 0 || mxHits > 1000000 ) {
628  ftfLog(" gl3Event::setup: maxHits %d out of range \n", maxHits ) ;
629  mxHits = 500000 ;
630  }
631 
632  if ( mxTracks < 0 || mxTracks > 1000000 ) {
633  ftfLog(" gl3Event::setup: maxTracks %d out of range \n", maxTracks );
634  mxTracks = 50000 ;
635  }
636 
637 
638  maxHits = mxHits ;
639  maxTracks = mxTracks ;
640  maxTracksSector = maxTracks*2/ NSECTORS ;
641  hit = new gl3Hit[maxHits] ;
642  track = new gl3Track[maxTracks] ;
643  trackIndex = new int[maxTracksSector*NSECTORS];
644  //
645  // Merging variables
646  //
647  nMergedTracks = 0 ;
648 
649  para.nPhiTrackPlusOne = para.nPhiTrack + 1 ;
650  para.nEtaTrackPlusOne = para.nEtaTrack + 1 ;
651  //-----------------------------------------------------------------------
652  // If needed calculate track area dimensions
653  //-----------------------------------------------------------------------
654  para.phiSliceTrack = (para.phiMaxTrack - para.phiMinTrack)/para.nPhiTrack;
655  para.etaSliceTrack = (para.etaMaxTrack - para.etaMinTrack)/para.nEtaTrack;
656 
657  int nTrackVolumes = para.nPhiTrackPlusOne* para.nEtaTrackPlusOne ;
658  trackContainer = new FtfContainer[nTrackVolumes];
659  if(trackContainer == NULL) {
660  ftfLog ( "Problem with memory allocation... exiting\n") ;
661  return 1 ;
662  }
663  para.primaries = 1 ;
664  para.ptMinHelixFit = 1.e60 ;
665 
666  nTracks = 0 ;
667 
668  //-----------------------------------------------------------------------
669  // for vertex calc
670  //-----------------------------------------------------------------------
671  minNoOfHitsOnTrackUsedForVertexCalc=14; // points
672  minMomUsedForVertexCalc=0.25; // GeV
673 
674  //char hid[50] ;
675  //char title[100] ;
676 
677  //strcpy ( hid, "Vertex_Vz" ) ;
678  //strcpy ( title, "Vertex_Vz" ) ;
679  hVz = new gl3Histo ( "Vertex_Vz", "Vertex_Vz", 400, -200., 200. ) ;
680 
681  //strcpy ( hid, "Vertex_Vx" ) ;
682  //strcpy ( title, "Vertex_Vx" ) ;
683  hVx = new gl3Histo ( "Vertex_Vx", "Vertex_Vx", 100,-10,10);
684  //hVx = new gl3Histo ( hid, title, 100,-10,10);
685 
686  //strcpy ( hid, "Vertex_Vy" ) ;
687  //strcpy ( title, "Vertex_Vy" ) ;
688  hVy = new gl3Histo ( "Vertex_Vy", "Vertex_Vy", 100,-10,10);
689  //hVy = new gl3Histo ( hid, title, 100,-10,10);
690 
691  // -----------------------------------------------------------------------
692 
693  return 0 ;
694 }
void set(short sectorIn, local_track *trk)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Definition: gl3Track.h:62
int Reset()
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Definition: gl3Histo.cxx:121
Definition: gl3Hit.h:24
void addTracks(bool cuts=false)
Add tracks to the list of the rendered objects from current MuDst event.
Definition: EdMu.C:161
int Fill(double x, double weight=1)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ...
Definition: gl3Histo.cxx:53