2 //Author: Anders Strand Vestbo
3 //Last Modified: 15.12.2000
8 #include "AliL3ConfMapper.h"
10 #include "AliL3Logging.h"
11 #include "AliL3Transform.h"
12 #include "AliL3Vertex.h"
13 #include "AliL3ConfMapTrack.h"
14 #include "AliL3ConfMapPoint.h"
15 #include "AliL3TrackArray.h"
20 //Conformal mapping base class
22 ClassImp(AliL3ConfMapper)
24 Double_t AliL3ConfMapper::pi=3.14159265358979323846;
25 Double_t AliL3ConfMapper::twopi=2*pi;
26 Double_t AliL3ConfMapper::todeg=180./pi;
28 AliL3ConfMapper::AliL3ConfMapper()
37 fBench = (Bool_t)true;
38 fParamSet = (Bool_t)false;
39 fVertexConstraint = (Bool_t)true;
43 AliL3ConfMapper::~AliL3ConfMapper()
54 delete [] (Byte_t *)fHits;
65 void AliL3ConfMapper::InitSector(Int_t sector,Int_t *rowrange,Float_t *etarange)
67 //Initialize tracker for tracking in a given sector.
68 //Resets track and hit arrays.
69 //Here it is also possible to specify a subsector, by defining
70 //rowrange[0]=innermost row;
71 //rowrange[1]=outermostrow;
72 //Finally you can specify etaslices to save time (assuming a good seed from TRD...)
80 delete [] (Byte_t *)fHits;
88 //Define tracking area:
91 fRowMin = rowrange[0];
92 fRowMax = rowrange[1];
94 else //complete sector
101 fEtaMin = etarange[0];
102 fEtaMax = etarange[1];
107 fEtaMax = sector < 18 ? 0.9 : -0.9;
110 //Set the angles to sector 2:
111 fPhiMin = -1.*10/todeg;//fParam->GetAngle(sector) - 10/todeg;
112 fPhiMax = 10/todeg;//fParam->GetAngle(sector) + 10/todeg;
114 //rotation angles for sector 2:
115 //cos: 0.766044 sin: 0.642788
117 Int_t max_num_of_tracks = 3000;
118 Int_t max_num_of_hits = 90000;
119 // Int_t max_num_of_hits = 20000;
120 // Int_t max_num_of_tracks = 2000;
122 fHits= (AliL3ConfMapPoint **) new Byte_t[sizeof(AliL3ConfMapPoint *)*max_num_of_hits];
123 fHit = new AliL3ConfMapPoint[max_num_of_hits];
124 for(Int_t i=0;i<max_num_of_hits;i++){
127 fTrack = new AliL3TrackArray("AliL3ConfMapTrack",max_num_of_tracks);
132 fNumRowSegment = fRowMax - fRowMin; //number of rows to be considered by tracker
138 Bool_t AliL3ConfMapper::ReadHits(UInt_t count, AliL3SpacePointData* hits )
140 AliL3ConfMapPoint *thisHit = &(fHit[0]);
141 Int_t nhit=(Int_t)count;
142 for (Int_t i=0;i<nhit;i++){
144 // AliL3ConfMapPoint *thisHit = &(fHit[i]);
145 // AliL3ConfMapPoint *thisHit = fHits[i];
146 Int_t slice = (hits[i].fID>>25) & 0x7f;
147 thisHit->SetHitNumber(hits[i].fID);
148 thisHit->SetPadRow(hits[i].fPadRow);
149 thisHit->SetSector(slice);
150 thisHit->SetX(hits[i].fX);
151 thisHit->SetY(hits[i].fY);
152 thisHit->SetZ(hits[i].fZ);
153 thisHit->SetXerr(sqrt(hits[i].fXYErr));
154 thisHit->SetYerr(sqrt(hits[i].fXYErr));
155 thisHit->SetZerr(sqrt(hits[i].fZErr));
156 // thisHit->SetXerr(3.16227766016837941e-01);
157 // thisHit->SetYerr(3.16227766016837941e-01);
158 // thisHit->SetZerr(4.47213595499957928e-01);
161 // fHits[i]->ReadHits(&(hits[i]));
162 // thisHit->ReadHits(&(hits[i]));
165 fClustersUnused += nhit;
166 LOG(AliL3Log::kInformational,"AliL3ConfMapper::ReadHits","#hits")<<AliL3Log::kDec
167 <<"hit_counter: "<<nhit<<" count: "<<count<<ENDLOG;
173 void AliL3ConfMapper::SetPointers()
176 //Allocate volumes, set conformal coordinates and pointers.
177 fNumRowSegmentPlusOne = 174;//fNumRowSegment+1;
178 fNumPhiSegmentPlusOne = fNumPhiSegment+1;
179 fNumEtaSegmentPlusOne = fNumEtaSegment+1;
180 fNumPhiEtaSegmentPlusOne = fNumPhiSegmentPlusOne*fNumEtaSegmentPlusOne;
181 fBounds = fNumRowSegmentPlusOne * fNumPhiSegmentPlusOne * fNumEtaSegmentPlusOne;
184 if(fVolume) delete [] fVolume;
185 if(fRow) delete [] fRow;
187 LOG(AliL3Log::kInformational,"AliL3ConfMapper::SetPointers","Memory")<<AliL3Log::kDec<<
188 "Allocating "<<fBounds*sizeof(AliL3ConfMapContainer)<<" Bytes to fVolume"<<ENDLOG;
189 LOG(AliL3Log::kInformational,"AliL3ConfMapper::SetPointers","Memory")<<AliL3Log::kDec<<
190 "Allocating "<<fNumRowSegmentPlusOne*sizeof(AliL3ConfMapContainer)<<" Bytes to fRow"<<ENDLOG;
192 fVolume = new AliL3ConfMapContainer[fBounds];
193 fRow = new AliL3ConfMapContainer[fNumRowSegmentPlusOne];
195 //set volumes to zero:
196 memset(fVolume,0,fBounds*sizeof(AliL3ConfMapContainer));
197 memset(fRow,0,fNumRowSegmentPlusOne*sizeof(AliL3ConfMapContainer));
199 Float_t phiSlice = (fPhiMax-fPhiMin)/fNumPhiSegment;
200 Float_t etaSlice = (fEtaMax-fEtaMin)/fNumEtaSegment;
203 for(Int_t j=0; j<fClustersUnused; j++)
206 //AliL3ConfMapPoint *thisHit = (AliL3ConfMapPoint*)fHit->At(j);
207 // AliL3ConfMapPoint *thisHit = &(fHit[j]);
208 AliL3ConfMapPoint *thisHit = fHits[j];
210 thisHit->Setup(fVertex);
212 Int_t localrow = thisHit->GetPadRow();
215 thisHit->nextVolumeHit=thisHit->nextRowHit=0;
217 if(localrow < fRowMin || localrow > fRowMax)
222 thisHit->phiIndex=(Int_t)((thisHit->GetPhi()-fPhiMin)/phiSlice +1);
224 if(thisHit->phiIndex<1 || thisHit->phiIndex>fNumPhiSegment)
226 fPhiHitsOutOfRange++;
230 thisHit->etaIndex=(Int_t)((thisHit->GetEta()-fEtaMin)/etaSlice + 1);
231 if(thisHit->etaIndex<1 || thisHit->etaIndex>fNumEtaSegment)
233 fEtaHitsOutOfRange++;
237 //set volume pointers
238 volumeIndex = localrow*fNumPhiEtaSegmentPlusOne+thisHit->phiIndex*fNumEtaSegmentPlusOne+thisHit->etaIndex;
239 if(fVolume[volumeIndex].first == NULL)
240 fVolume[volumeIndex].first = (void *)thisHit;
242 ((AliL3ConfMapPoint *)fVolume[volumeIndex].last)->nextVolumeHit=thisHit;
243 fVolume[volumeIndex].last = (void *)thisHit;
247 if(fRow[localrow].first == NULL)
248 fRow[localrow].first = (void *)thisHit;
250 ((AliL3ConfMapPoint *)(fRow[localrow].last))->nextRowHit = thisHit;
251 fRow[localrow].last = (void *)thisHit;
257 void AliL3ConfMapper::MainVertexTracking_a()
259 //Tracking with vertex constraint.
263 LOG(AliL3Log::kError,"AliL3ConfMapper::MainVertexTracking","Parameters")<<AliL3Log::kDec<<
264 "Tracking parameters not set!"<<ENDLOG;
270 SetVertexConstraint(true);
273 void AliL3ConfMapper::MainVertexTracking_b()
275 //Tracking with vertex constraint.
279 LOG(AliL3Log::kError,"AliL3ConfMapper::MainVertexTracking","Parameters")<<AliL3Log::kDec<<
280 "Tracking parameters not set!"<<ENDLOG;
287 void AliL3ConfMapper::MainVertexTracking()
289 //Tracking with vertex constraint.
293 LOG(AliL3Log::kError,"AliL3ConfMapper::MainVertexTracking","Parameters")<<AliL3Log::kDec<<
294 "Tracking parameters not set!"<<ENDLOG;
298 Double_t initCpuTime,cpuTime;
299 initCpuTime = CpuTime();
302 SetVertexConstraint(true);
306 cpuTime = CpuTime() - initCpuTime;
308 LOG(AliL3Log::kInformational,"AliL3ConfMapper::MainVertexTracking","Timing")<<AliL3Log::kDec<<
309 "Tracking finished in "<<cpuTime*1000<<" ms"<<ENDLOG;
314 void AliL3ConfMapper::NonVertexTracking()
316 //Tracking with no vertex constraint. This should be called after doing MainVertexTracking,
317 //in order to do tracking on the remaining clusters.
318 //The conformal mapping is now done with respect to the first cluster
319 //assosciated with this track.
321 SetVertexConstraint(false);
323 LOG(AliL3Log::kInformational,"AliL3ConfMapper::NonVertexTracking","ntracks")<<AliL3Log::kDec<<
324 "Number of nonvertex tracks found: "<<nTracks-fMainVertexTracks<<ENDLOG;
329 void AliL3ConfMapper::MainVertexSettings(Int_t trackletlength, Int_t tracklength,
330 Int_t rowscopetracklet, Int_t rowscopetrack,
331 Double_t maxphi,Double_t maxeta)
333 //Settings for main vertex tracking. The cuts are:
334 //TrackletLength: #hits on segment, before trying to build a track
335 //TrackLength: Minimum hits on a track
336 //RowScopeTracklet: Row search range for segments
337 //RowScopeTrack: Row search range for tracks
339 SetTrackletLength(trackletlength,(Bool_t)true);
340 SetRowScopeTracklet(rowscopetracklet, (Bool_t) true);
341 SetRowScopeTrack(rowscopetrack, (Bool_t) true);
342 SetMinPoints(tracklength,(Bool_t)true);
348 void AliL3ConfMapper::NonVertexSettings(Int_t trackletlength, Int_t tracklength,
349 Int_t rowscopetracklet, Int_t rowscopetrack)
351 SetTrackletLength(trackletlength,(Bool_t)false);
352 SetRowScopeTracklet(rowscopetracklet, (Bool_t)false);
353 SetRowScopeTrack(rowscopetrack, (Bool_t)false);
354 SetMinPoints(tracklength,(Bool_t)false);
357 void AliL3ConfMapper::SetTrackCuts(Double_t hitChi2Cut, Double_t goodHitChi2, Int_t trackChi2Cut,Int_t maxdist)
359 //Settings for tracks. The cuts are:
360 //HitChi2Cut: Maximum hit chi2
361 //goodHitChi2: Chi2 to stop look for next hit
362 //trackChi2Cut: Maximum track chi2
363 //maxdist: Maximum distance between two clusters when forming segments
365 fHitChi2Cut = hitChi2Cut;
366 fGoodHitChi2 = goodHitChi2;
367 fTrackChi2Cut = trackChi2Cut;
371 void AliL3ConfMapper::SetTrackletCuts(Double_t maxangle,Double_t goodDist, Bool_t vertex_constraint)
373 //Sets cuts of tracklets. Right now this is only:
374 //maxangle: Maximum angle when forming segments (if trackletlength > 2)
377 SetMaxAngleTracklet(maxangle, vertex_constraint);
380 void AliL3ConfMapper::ClusterLoop()
382 //Loop over hits, starting at outermost padrow, and trying to build segments.
384 Int_t row_segm,lastrow = fRowMin + fMinPoints[fVertexConstraint];
385 AliL3ConfMapPoint *hit;
387 //Loop over rows, and try to create tracks from the hits.
388 //Starts at the outermost row, and loops as long as a track can be build, due to length.
390 for(row_segm = fRowMax; row_segm >= lastrow; row_segm--)
392 if(fRow[row_segm].first && ((AliL3ConfMapPoint*)fRow[row_segm].first)->GetPadRow() < fRowMin + 1)
394 for(hit = (AliL3ConfMapPoint*)fRow[row_segm].first; hit!=0; hit=hit->nextRowHit)
396 if(hit->GetUsage() == true)
407 void AliL3ConfMapper::CreateTrack(AliL3ConfMapPoint *hit)
409 //Tries to create a track from the initial hit given by ClusterLoop()
411 AliL3ConfMapPoint *closest_hit = NULL;
412 AliL3ConfMapTrack *track = NULL;
415 Int_t tracks = nTracks;
418 track = (AliL3ConfMapTrack*)fTrack->NextTrack();
420 //reset hit parameters:
423 UInt_t *trackhitnumber = track->GetHitNumbers();
425 //set conformal coordinates if we are looking for non vertex tracks
426 if(!fVertexConstraint)
428 hit->SetAllCoord(hit);
431 //fill fit parameters of initial track:
432 track->UpdateParam(hit); //here the number of hits is incremented.
433 trackhitnumber[track->GetNumberOfPoints()-1] = hit->GetHitNumber();
438 for(point=1; point<fTrackletLength[fVertexConstraint]; point++)
440 if((closest_hit = GetNextNeighbor(hit)))
443 // Calculate track length in sz plane
444 dx = ((AliL3ConfMapPoint*)closest_hit)->GetX() - ((AliL3ConfMapPoint*)hit)->GetX();
445 dy = ((AliL3ConfMapPoint*)closest_hit)->GetY() - ((AliL3ConfMapPoint*)hit)->GetY();
446 //track->fLength += (Double_t)sqrt ( dx * dx + dy * dy ) ;
447 Double_t length = track->GetLength()+(Double_t)sqrt ( dx * dx + dy * dy );
448 track->SetLength(length);
450 //closest_hit->SetS(track->fLength);
451 closest_hit->SetS(track->GetLength());
453 //update fit parameters
454 track->UpdateParam(closest_hit);
455 trackhitnumber[track->GetNumberOfPoints()-1] = closest_hit->GetHitNumber();
461 //closest hit does not exist:
462 track->DeleteCandidate();
463 fTrack->RemoveLast();
465 point = fTrackletLength[fVertexConstraint];
469 //tracklet is long enough to be extended to a track
470 if(track->GetNumberOfPoints() == fTrackletLength[fVertexConstraint])
473 track->SetProperties(true);
475 if(TrackletAngle(track) > fMaxAngleTracklet[fVertexConstraint])
476 {//proof if the first points seem to be a beginning of a track
478 track->SetProperties(false);
479 track->DeleteCandidate();
480 fTrack->RemoveLast();
484 else//good tracklet ->proceed, follow the trackfit
488 //define variables to keep the total chi:
489 Double_t xyChi2 = track->fChiSq[0];
490 Double_t szChi2 = track->fChiSq[1];
492 for(point = fTrackletLength[fVertexConstraint]; point <= fNumRowSegment; point++)
494 track->fChiSq[0] = fHitChi2Cut;
495 closest_hit = GetNextNeighbor((AliL3ConfMapPoint*)track->lastHit,track);
501 Double_t lxyChi2 = track->fChiSq[0]-track->fChiSq[1];
503 closest_hit->xyChi2 = lxyChi2;
505 //update track length:
506 //track->fLength = closest_hit->GetS();
507 track->SetLength(closest_hit->GetS());
508 szChi2 += track->fChiSq[1];
509 closest_hit->szChi2 = track->fChiSq[1];
511 track->UpdateParam(closest_hit);
512 trackhitnumber[track->GetNumberOfPoints()-1] = closest_hit->GetHitNumber();
514 //add closest hit to track
515 closest_hit->SetUsage(true);
516 closest_hit->SetTrackNumber(tracks-1);
522 //closest hit does not exist
523 point = fNumRowSegment; //continue with next hit in segment
529 track->fChiSq[0] = xyChi2;
530 track->fChiSq[1] = szChi2;
531 Double_t normalized_chi2 = (track->fChiSq[0]+track->fChiSq[1])/track->GetNumberOfPoints();
533 //remove tracks with not enough points already now
534 if(track->GetNumberOfPoints() < fMinPoints[fVertexConstraint] || normalized_chi2 > fTrackChi2Cut)
536 track->SetProperties(false);
538 track->DeleteCandidate();
539 fTrack->RemoveLast();
545 fClustersUnused -= track->GetNumberOfPoints();
546 track->ComesFromMainVertex(fVertexConstraint);
547 //mark track as main vertex track or not
548 track->SetSector(2); //only needed for testing purposes.
549 track->SetRowRange(fRowMin,fRowMax);
551 if(fVertexConstraint)
562 AliL3ConfMapPoint *AliL3ConfMapper::GetNextNeighbor(AliL3ConfMapPoint *start_hit,
563 AliL3ConfMapTrack *track)
565 //When forming segments: Finds closest hit to input hit
566 //When forming tracks: Find closest hit to track fit.
568 Double_t dist,closest_dist = fMaxDist;
570 AliL3ConfMapPoint *hit = NULL;
571 AliL3ConfMapPoint *closest_hit = NULL;
579 Int_t max_row = start_hit->GetPadRow()-1;
582 if(track) //finding hit close to trackfit
584 min_row = start_hit->GetPadRow()-fRowScopeTrack[fVertexConstraint];
588 min_row = start_hit->GetPadRow()-fRowScopeTracklet[fVertexConstraint];
592 Int_t loop_eta[9] = {0,0,0,-1,-1,-1,1,1,1};
593 Int_t loop_phi[9] = {0,-1,1,0,-1,1,0,-1,1};
595 if(min_row < fRowMin)
597 if(max_row < fRowMin)
598 return 0; //reached the last padrow under consideration
603 for(sub_row_segm=max_row; sub_row_segm>=min_row; sub_row_segm--)
605 //loop over subsegments, in the order defined above.
606 for(Int_t i=0; i<9; i++)
608 sub_phi_segm = start_hit->phiIndex + loop_phi[i];
611 sub_phi_segm += fNumPhiSegment;
613 else if(sub_phi_segm >=fNumPhiSegment)
614 sub_phi_segm -= fNumPhiSegment;
616 //loop over sub eta segments
618 sub_eta_segm = start_hit->etaIndex + loop_eta[i];
620 if(sub_eta_segm < 0 || sub_eta_segm >=fNumEtaSegment)
621 continue;//segment exceeds bounds->skip it
623 //loop over hits in this sub segment:
624 volumeIndex= sub_row_segm*fNumPhiEtaSegmentPlusOne +
625 sub_phi_segm*fNumEtaSegmentPlusOne + sub_eta_segm;
629 LOG(AliL3Log::kError,"AliL3ConfMapper::GetNextNeighbor","Memory")<<AliL3Log::kDec<<
630 "VolumeIndex error "<<volumeIndex<<ENDLOG;
633 for(hit = (AliL3ConfMapPoint*)fVolume[volumeIndex].first;
634 hit!=0; hit = hit->nextVolumeHit)
638 {//hit was not used before
640 //set conformal mapping if looking for nonvertex tracks:
641 if(!fVertexConstraint)
643 hit->SetAllCoord(start_hit);
646 if(track)//track search - look for nearest neighbor to extrapolated track
648 if(!VerifyRange(start_hit,hit))
651 test_hit = EvaluateHit(start_hit,hit,track);
653 if(test_hit == 0)//chi2 not good enough, keep looking
655 else if(test_hit==2)//chi2 good enough, return it
658 closest_hit = hit;//chi2 acceptable, but keep looking
662 else //tracklet search, look for nearest neighbor
665 if((dist=CalcDistance(start_hit,hit)) < closest_dist)
667 if(!VerifyRange(start_hit,hit))
672 //if this hit is good enough, return it:
673 if(closest_dist < fGoodDist)
677 continue;//sub hit was farther away than a hit before
681 }//hit not used before
683 else continue; //sub hit was used before
685 }//loop over hits in sub segment
687 }//loop over sub segments
694 if(closest_hit)// && closest_dist < mMaxDist)
700 Int_t AliL3ConfMapper::EvaluateHit(AliL3ConfMapPoint *start_hit,AliL3ConfMapPoint *hit,AliL3ConfMapTrack *track)
702 //Check if space point gives a fit with acceptable chi2.
704 Double_t temp,dxy,lchi2,dx,dy,slocal,dsz,lszChi2;
705 temp = (track->a2Xy*hit->GetXprime()-hit->GetYprime()+track->a1Xy);
706 dxy = temp*temp/(track->a2Xy*track->a2Xy + 1.);
709 lchi2 = (dxy*hit->GetXYWeight());
711 if(lchi2 > track->fChiSq[0])//chi2 was worse than before.
714 //calculate s and the distance hit-line
715 dx = start_hit->GetX()-hit->GetX();
716 dy = start_hit->GetY()-hit->GetY();
717 //slocal = track->fLength+sqrt(dx*dx+dy*dy);
718 slocal = track->GetLength()+sqrt(dx*dx+dy*dy);
720 temp = (track->a2Sz*slocal-hit->GetZ()+track->a1Sz);
721 dsz = temp*temp/(track->a2Sz*track->a2Sz+1);
724 lszChi2 = dsz*hit->GetZWeight();
728 //check whether chi2 is better than previous one:
729 if(lchi2 < track->fChiSq[0])
731 track->fChiSq[0] = lchi2;
732 track->fChiSq[1] = lszChi2;
736 //if chi2 good enough, stop here:
737 if(lchi2 < fGoodHitChi2)
747 Double_t AliL3ConfMapper::CalcDistance(const AliL3ConfMapPoint *hit1,const AliL3ConfMapPoint *hit2) const
749 //Return distance between two clusters, defined by Pablo
751 Double_t phi_diff = fabs( hit1->GetPhi() - hit2->GetPhi() );
752 if (phi_diff > pi) phi_diff = twopi - phi_diff;
754 return todeg*fabs(hit1->GetPadRow() - hit2->GetPadRow()) * (phi_diff + fabs( hit1->GetEta() - hit2->GetEta() ));
757 Bool_t AliL3ConfMapper::VerifyRange(const AliL3ConfMapPoint *hit1,const AliL3ConfMapPoint *hit2) const
759 //Check if the hit are within reasonable range in phi and eta
760 Double_t dphi,deta;//maxphi=0.1,maxeta=0.1;
761 dphi = fabs(hit1->GetPhi() - hit2->GetPhi());
762 if(dphi > pi) dphi = fabs(twopi - dphi);
763 if(dphi > fMaxPhi) return false;
765 deta = fabs(hit1->GetEta() - hit2->GetEta());
766 if(deta > fMaxEta) return false;
772 Double_t AliL3ConfMapper::TrackletAngle(const AliL3ConfMapTrack *track,Int_t n) const
774 // Returns the angle 'between' the last three points (started at point number n) on this track.
780 Double_t angle1,angle2;
781 TObjArray *hits = track->GetHits();
783 if (n > track->GetNumberOfPoints()) {
784 n = track->GetNumberOfPoints();
791 x1[0] = ((AliL3ConfMapPoint *)hits->At(n-2))->GetX() - ((AliL3ConfMapPoint *)hits->At(n-3))->GetX();
792 x1[1] = ((AliL3ConfMapPoint *)hits->At(n-2))->GetY() - ((AliL3ConfMapPoint *)hits->At(n-3))->GetY();
794 x2[0] = ((AliL3ConfMapPoint *)hits->At(n-1))->GetX() - ((AliL3ConfMapPoint *)hits->At(n-2))->GetX();
795 x2[1] = ((AliL3ConfMapPoint *)hits->At(n-1))->GetY() - ((AliL3ConfMapPoint *)hits->At(n-2))->GetY();
797 angle1 = atan2(x1[1],x1[0]);
798 angle2 = atan2(x2[1],x1[0]);
799 return fabs(angle1-angle2);
803 Int_t AliL3ConfMapper::FillTracks()
805 //Fill track parameters. Which basically means do a fit of helix in real space,
806 //which should be done in order to get nice tracks.
808 Int_t num_of_tracks = nTracks;
809 LOG(AliL3Log::kInformational,"AliL3ConfMapper::FillTracks","nTracks")<<AliL3Log::kDec<<
810 "Number of found tracks: "<<nTracks<<ENDLOG;
814 LOG(AliL3Log::kError,"AliL3ConfMapper::FillTracks","nTracks")<<AliL3Log::kDec<<
815 "No tracks found!!"<<ENDLOG;
820 for(int i=0; i<num_of_tracks; i++)
822 AliL3ConfMapTrack *track = (AliL3ConfMapTrack*)fTrack->GetTrack(i);
823 track->Fill(fVertex,fMaxDca);
829 Double_t AliL3ConfMapper::CpuTime()
831 //Return the Cputime in seconds.
833 return (Double_t)(clock()) / CLOCKS_PER_SEC;