3 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliHLTTPCStandardIncludes.h"
9 #include "AliHLTTPCLogging.h"
10 #include "AliHLTTPCVertex.h"
11 #include "AliHLTTPCConfMapTrack.h"
12 #include "AliHLTTPCConfMapPoint.h"
13 #include "AliHLTTPCTrackArray.h"
14 #include "AliHLTTPCTransform.h"
15 #include "AliHLTTPCConfMapper.h"
17 /** \class AliHLTTPCConfMapper
19 //_____________________________________________________________
20 // AliHLTTPCConfMapper
22 // Conformal mapping base class
27 ClassImp(AliHLTTPCConfMapper)
29 Double_t AliHLTTPCConfMapper::pi=3.14159265358979323846;
30 Double_t AliHLTTPCConfMapper::twopi=2*pi;
31 Double_t AliHLTTPCConfMapper::todeg=180./pi;
33 AliHLTTPCConfMapper::AliHLTTPCConfMapper()
41 fBench = (Bool_t)true;
42 fVertexConstraint = (Bool_t)true;
48 AliHLTTPCConfMapper::~AliHLTTPCConfMapper()
67 void AliHLTTPCConfMapper::InitVolumes()
70 //Allocate volumes, set conformal coordinates and pointers.
72 //Should be done after setting the track parameters
74 fNumRowSegmentPlusOne = AliHLTTPCTransform::GetNRows();//NumRows[0]; //Maximum 32.
75 fNumPhiSegmentPlusOne = fNumPhiSegment+1;
76 fNumEtaSegmentPlusOne = fNumEtaSegment+1;
77 fNumPhiEtaSegmentPlusOne = fNumPhiSegmentPlusOne*fNumEtaSegmentPlusOne;
78 fBounds = fNumRowSegmentPlusOne * fNumPhiSegmentPlusOne * fNumEtaSegmentPlusOne;
81 if(fVolume) delete [] fVolume;
82 if(fRow) delete [] fRow;
84 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCConfMapper::InitVolumes","Memory")<<AliHLTTPCLog::kDec<<
85 "Allocating "<<fBounds*sizeof(AliHLTTPCConfMapContainer)<<" Bytes to fVolume"<<ENDLOG;
86 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCConfMapper::InitVolumes","Memory")<<AliHLTTPCLog::kDec<<
87 "Allocating "<<fNumRowSegmentPlusOne*sizeof(AliHLTTPCConfMapContainer)<<" Bytes to fRow"<<ENDLOG;
89 fVolume = new AliHLTTPCConfMapContainer[fBounds];
90 fRow = new AliHLTTPCConfMapContainer[fNumRowSegmentPlusOne];
92 memset(fVolume,0,fBounds*sizeof(AliHLTTPCConfMapContainer));
93 memset(fRow,0,fNumRowSegmentPlusOne*sizeof(AliHLTTPCConfMapContainer));
95 //Int_t max_num_of_tracks = 2000;
96 //Int_t max_num_of_hits = 120000;
97 Int_t max_num_of_tracks = 3500;
98 Int_t max_num_of_hits = 200000;
105 fHit = new AliHLTTPCConfMapPoint[max_num_of_hits];
106 fTrack = new AliHLTTPCTrackArray("AliHLTTPCConfMapTrack",max_num_of_tracks);
109 void AliHLTTPCConfMapper::InitSector(Int_t sector,Int_t *rowrange,Float_t *etarange)
110 { //sector means slice here
111 //Initialize tracker for tracking in a given sector.
112 //Resets track and hit arrays.
113 //Here it is also possible to specify a subsector, by defining
114 //rowrange[0]=innermost row;
115 //rowrange[1]=outermostrow;
116 //Finally you can specify etaslices to save time (assuming a good seed from TRD...)
118 //Define tracking area:
121 fRowMin = rowrange[0];
122 fRowMax = rowrange[1];
124 else //complete sector
127 fRowMax = AliHLTTPCTransform::GetNRows() - 1;
131 fEtaMin = etarange[0];
132 fEtaMax = sector < 18 ? etarange[1] : -etarange[1];
137 fEtaMax = sector < 18 ? 0.9 : -0.9;
140 //Set the angles to sector 2:
142 fPhiMin = -1.*90/todeg;//fParam->GetAngle(sector) - 10/todeg;
143 fPhiMax = 90./todeg;//fParam->GetAngle(sector) + 10/todeg;
145 fPhiMin = -1.*10/todeg;//fParam->GetAngle(sector) - 10/todeg;
146 fPhiMax = 10./todeg;//fParam->GetAngle(sector) + 10/todeg;
150 fMainVertexTracks = 0;
152 fEtaHitsOutOfRange=0;
153 fPhiHitsOutOfRange=0;
155 fNumRowSegment = fRowMax - fRowMin; //number of rows to be considered by tracker
156 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCConfMapper::InitSector","B-field")
157 <<"Tracker initializing with a magnetic field of "<<AliHLTTPCTransform::GetBField()<<ENDLOG;
162 Bool_t AliHLTTPCConfMapper::ReadHits(UInt_t count, AliHLTTPCSpacePointData* hits )
164 Int_t nhit=(Int_t)count;
165 for(Int_t i=0;i<nhit;i++)
167 fHit[fClustersUnused].Reset();
168 fHit[fClustersUnused].ReadHits(&(hits[i]));
171 // for (Int_t i=0;i<nhit;i++)
174 // fHit[i].ReadHits(&(hits[i]));
176 // fClustersUnused += nhit;
177 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCConfMapper::ReadHits","#hits")
178 <<AliHLTTPCLog::kDec<<"hit_counter: "<<nhit<<" count: "<<count<<ENDLOG;
183 void AliHLTTPCConfMapper::SetPointers()
185 //Check if there are not enough clusters to make a track in this sector
186 //Can happen in pp events.
187 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper:SetPointers","Tracking")<< "==================== UNUSED CLUSTERS="<< fClustersUnused <<ENDLOG;
188 if(fClustersUnused < fMinPoints[fVertexConstraint])
191 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::SetPointers","Tracking")<< "--------> fMaxPhi=" << fMaxPhi << " fMaxEta="<< fMaxEta << ENDLOG;
193 //Reset detector volumes
194 memset(fVolume,0,fBounds*sizeof(AliHLTTPCConfMapContainer));
195 memset(fRow,0,fNumRowSegmentPlusOne*sizeof(AliHLTTPCConfMapContainer));
197 Float_t phiSlice = (fPhiMax-fPhiMin)/fNumPhiSegment;
198 Float_t etaSlice = (fEtaMax-fEtaMin)/fNumEtaSegment;
200 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::SetPointers","Parameters") << "min=" << fEtaMin <<" max=" << fEtaMax <<" fNumEtaSegment=" <<fNumEtaSegment << ENDLOG;
201 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::SetPointers","Parameters") << "min=" << fPhiMin <<" max=" << fPhiMax <<" fNumEtaSegment=" <<fNumPhiSegment << ENDLOG;
203 Int_t local_counter=0;
204 for(Int_t j=0; j<fClustersUnused; j++)
206 //AliHLTTPCConfMapPoint *thisHit = (AliHLTTPCConfMapPoint*)fHit->At(j);
207 AliHLTTPCConfMapPoint *thisHit = &(fHit[j]);
209 thisHit->Setup(fVertex);
211 Int_t localrow = thisHit->GetPadRow();
213 if(localrow < fRowMin || localrow > fRowMax)
217 thisHit->phiIndex=(Int_t)((thisHit->GetPhi()-fPhiMin)/phiSlice +1);
219 if(thisHit->phiIndex<1 || thisHit->phiIndex>fNumPhiSegment)
221 //cout << j<< "||Phiindex: " << thisHit->phiIndex << " | " << thisHit->GetPhi() << " PHIMIN=" << fPhiMin << endl;
222 fPhiHitsOutOfRange++;
226 thisHit->etaIndex=(Int_t)((thisHit->GetEta()-fEtaMin)/etaSlice + 1);
227 if(thisHit->etaIndex<1 || thisHit->etaIndex>fNumEtaSegment)
229 if (thisHit->etaIndex<1) LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::SetPointers","Parameters") << " ----1-----" << ENDLOG;
230 if (thisHit->etaIndex>fNumEtaSegment) {
231 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::SetPointers","Parameters") << "INDEX=" << thisHit->etaIndex << " fNumEtaSegment=" <<fNumEtaSegment << ENDLOG;
232 // cout << j<< "||Etaindex: " << thisHit->etaIndex << " | " << thisHit->GetEta() << " ETAMIN=" << fEtaMin << endl;
234 fEtaHitsOutOfRange++;
239 volumeIndex = (localrow-fRowMin)*fNumPhiEtaSegmentPlusOne+thisHit->phiIndex*fNumEtaSegmentPlusOne+thisHit->etaIndex;
241 if(fVolume[volumeIndex].first == NULL)
242 fVolume[volumeIndex].first = (void *)thisHit;
244 ((AliHLTTPCConfMapPoint *)fVolume[volumeIndex].last)->nextVolumeHit=thisHit;
245 fVolume[volumeIndex].last = (void *)thisHit;
248 if(fRow[(localrow-fRowMin)].first == NULL)
249 fRow[(localrow-fRowMin)].first = (void *)thisHit;
251 ((AliHLTTPCConfMapPoint *)(fRow[(localrow-fRowMin)].last))->nextRowHit = thisHit;
252 fRow[(localrow-fRowMin)].last = (void *)thisHit;
255 if(fClustersUnused>0 && local_counter==0)
256 LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::SetPointers","Parameters")
257 <<AliHLTTPCLog::kDec<<"No points passed to track finder, hits out of range: "
258 <<fEtaHitsOutOfRange+fPhiHitsOutOfRange<<ENDLOG;
260 Int_t hits_accepted=fClustersUnused-(fEtaHitsOutOfRange+fPhiHitsOutOfRange);
261 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCConfMapper::SetPointers","Setup")
262 <<"Setup finished, hits out of range: "<<fEtaHitsOutOfRange+fPhiHitsOutOfRange
263 <<" hits accepted "<<hits_accepted<<ENDLOG;
266 void AliHLTTPCConfMapper::MainVertexTracking_a()
268 //Tracking with vertex constraint.
270 if(!fParamSet[(Int_t)kTRUE])
272 LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::MainVertexTracking","Parameters")<<AliHLTTPCLog::kDec<<
273 "Tracking parameters not set!"<<ENDLOG;
277 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::MainVertexTracking","Tracking")<< "USE MAINVERTEX TRACKING - ENTER A"<<ENDLOG;
278 Double_t initCpuTime,cpuTime;
279 initCpuTime = CpuTime();
282 SetVertexConstraint(true);
283 cpuTime = CpuTime() - initCpuTime;
285 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCConfMapper::MainVertexTracking_a","Timing")
286 <<AliHLTTPCLog::kDec<<"Setup finished in "<<cpuTime*1000<<" ms"<<ENDLOG;
287 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::MainVertexTracking","Tracking")<< "USE MAINVERTEX TRACKING - LEAVE A"<<ENDLOG;
290 void AliHLTTPCConfMapper::MainVertexTracking_b()
292 //Tracking with vertex constraint.
293 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::MainVertexTracking","Tracking")<< "USE MAINVERTEX TRACKING - ENTER B"<<ENDLOG;
294 if(!fParamSet[(Int_t)kTRUE])
296 LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::MainVertexTracking","Parameters")<<AliHLTTPCLog::kDec<<
297 "Tracking parameters not set!"<<ENDLOG;
300 Double_t initCpuTime,cpuTime;
301 initCpuTime = CpuTime();
305 cpuTime = CpuTime() - initCpuTime;
307 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCConfMapper::MainVertexTracking_b","Timing")
308 <<AliHLTTPCLog::kDec<<"Main Tracking finished in "<<cpuTime*1000<<" ms"<<ENDLOG;
309 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::MainVertexTracking","Tracking")<< "USE MAINVERTEX TRACKING - LEAVE B"<<ENDLOG;
312 void AliHLTTPCConfMapper::MainVertexTracking()
314 //Tracking with vertex constraint.
315 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::MainVertexTracking","Tracking")<< "USE MAINVERTEX TRACKING - ENTER"<<ENDLOG;
316 if(!fParamSet[(Int_t)kTRUE])
318 LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::MainVertexTracking","Parameters")<<AliHLTTPCLog::kDec<<
319 "Tracking parameters not set!"<<ENDLOG;
323 Double_t initCpuTime,cpuTime;
324 initCpuTime = CpuTime();
327 SetVertexConstraint(true);
331 cpuTime = CpuTime() - initCpuTime;
333 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCConfMapper::MainVertexTracking","Timing")<<AliHLTTPCLog::kDec<<
334 "Tracking finished in "<<cpuTime*1000<<" ms"<<ENDLOG;
335 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::MainVertexTracking","Tracking")<< "USE MAINVERTEX TRACKING - LEAVE"<<ENDLOG;
339 void AliHLTTPCConfMapper::NonVertexTracking()
341 //Tracking with no vertex constraint. This should be called after doing MainVertexTracking,
342 //in order to do tracking on the remaining clusters.
343 //The conformal mapping is now done with respect to the first cluster
344 //assosciated with this track.
345 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::NonVertexTracking","Tracking")<< "USE NONVERTEX TRACKING - ENTER"<<ENDLOG;
346 if(!fParamSet[(Int_t)kFALSE])
348 LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::NonVertexTracking","Parameters")<<AliHLTTPCLog::kDec<<
349 "Tracking parameters not set!"<<ENDLOG;
353 SetVertexConstraint(false);
355 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCConfMapper::NonVertexTracking","ntracks")<<AliHLTTPCLog::kDec<<
356 "Number of nonvertex tracks found: "<<(nTracks-fMainVertexTracks)<<ENDLOG;
358 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::NonVertexTracking","Tracking")<< "USE NONVERTEX TRACKING - LEAVE"<<ENDLOG;
362 void AliHLTTPCConfMapper::MainVertexSettings(Int_t trackletlength, Int_t tracklength,
363 Int_t rowscopetracklet, Int_t rowscopetrack,
364 Double_t maxphi,Double_t maxeta)
366 //Settings for main vertex tracking. The cuts are:
367 //TrackletLength: #hits on segment, before trying to build a track
368 //TrackLength: Minimum hits on a track
369 //RowScopeTracklet: Row search range for segments
370 //RowScopeTrack: Row search range for tracks
372 SetTrackletLength(trackletlength,(Bool_t)true);
373 SetRowScopeTracklet(rowscopetracklet, (Bool_t) true);
374 SetRowScopeTrack(rowscopetrack, (Bool_t) true);
375 SetMinPoints(tracklength,(Bool_t)true);
381 void AliHLTTPCConfMapper::NonVertexSettings(Int_t trackletlength, Int_t tracklength,
382 Int_t rowscopetracklet, Int_t rowscopetrack)
384 SetTrackletLength(trackletlength,(Bool_t)false);
385 SetRowScopeTracklet(rowscopetracklet, (Bool_t)false);
386 SetRowScopeTrack(rowscopetrack, (Bool_t)false);
387 SetMinPoints(tracklength,(Bool_t)false);
388 SetParamDone(kFALSE);
391 void AliHLTTPCConfMapper::SetTrackCuts(Double_t hitChi2Cut, Double_t goodHitChi2, Double_t trackChi2Cut,Int_t maxdist,Bool_t vertexconstraint)
393 //Settings for tracks. The cuts are:
394 //HitChi2Cut: Maximum hit chi2
395 //goodHitChi2: Chi2 to stop look for next hit
396 //trackChi2Cut: Maximum track chi2
397 //maxdist: Maximum distance between two clusters when forming segments
399 SetHitChi2Cut(hitChi2Cut,vertexconstraint);
400 SetGoodHitChi2(goodHitChi2,vertexconstraint);
401 SetTrackChi2Cut(trackChi2Cut,vertexconstraint);
402 SetMaxDist(maxdist,vertexconstraint);
405 void AliHLTTPCConfMapper::SetTrackletCuts(Double_t maxangle,Double_t goodDist, Bool_t vertex_constraint)
407 //Sets cuts of tracklets. Right now this is only:
408 //maxangle: Maximum angle when forming segments (if trackletlength > 2)
411 SetMaxAngleTracklet(maxangle, vertex_constraint);
414 void AliHLTTPCConfMapper::ClusterLoop()
416 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::Clusterloop","Tracking")<< "USE CLUSTERLOOP NVT - ENTER"<<ENDLOG;
417 //Loop over hits, starting at outermost padrow, and trying to build segments.
419 //Check if there are not enough clusters to make a track in this sector
420 //Can happen in pp events.
421 if(fClustersUnused < fMinPoints[fVertexConstraint])
423 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::Clusterloop","Tracking")<< "USE CLUSTERLOOP NVT - 0"<<ENDLOG;
424 Int_t row_segm,lastrow = fRowMin + fMinPoints[fVertexConstraint];
425 AliHLTTPCConfMapPoint *hit;
427 //Loop over rows, and try to create tracks from the hits.
428 //Starts at the outermost row, and loops as long as a track can be build, due to length.
429 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::Clusterloop","Tracking")<< "USE CLUSTERLOOP: row_sgm="<< row_segm << " fRowMax="<< fRowMax << "lastrow="
430 // << lastrow << ENDLOG;
431 for(row_segm = fRowMax; row_segm >= lastrow; row_segm--)
433 if(fRow[(row_segm-fRowMin)].first && ((AliHLTTPCConfMapPoint*)fRow[(row_segm-fRowMin)].first)->GetPadRow() < fRowMin + 1){
436 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::Clusterloop","Tracking")<< "USE CLUSTERLOOP NVT - xxx= "<< fRow[(row_segm-fRowMin)].first << ENDLOG;
438 for(hit = (AliHLTTPCConfMapPoint*)fRow[(row_segm-fRowMin)].first; hit!=0; hit=hit->nextRowHit)
440 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::Clusterloop","Tracking")<< "USE CLUSTERLOOP NVT - www" << ENDLOG;
441 if(hit->GetUsage() == true){
442 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::Clusterloop","Tracking")<< "USE CLUSTERLOOP NVT - 2"<<ENDLOG;
446 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::Clusterloop","Tracking")<< "=================== CALL CREATE TRACK : HITNUMMER:"<< hit->GetHitNumber() << ENDLOG;
451 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::Clusterloop","Tracking")<< "USE CLUSTERLOOP NVT - LEAVE"<<ENDLOG;
456 void AliHLTTPCConfMapper::CreateTrack(AliHLTTPCConfMapPoint *hit)
458 //Tries to create a track from the initial hit given by ClusterLoop()
460 AliHLTTPCConfMapPoint *closest_hit = NULL;
461 AliHLTTPCConfMapTrack *track = NULL;
464 Int_t tracks = nTracks;
467 track = (AliHLTTPCConfMapTrack*)fTrack->NextTrack();
469 //reset hit parameters:
472 UInt_t *trackhitnumber = track->GetHitNumbers();
474 //set conformal coordinates if we are looking for non vertex tracks
475 if(!fVertexConstraint)
477 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::Create Track","Tracking")<< "====== 1 =====" << ENDLOG;
478 hit->SetAllCoord(hit);
481 //fill fit parameters of initial track:
482 track->UpdateParam(hit); //here the number of hits is incremented.
483 trackhitnumber[track->GetNumberOfPoints()-1] = hit->GetHitNumber();
487 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::CreateTrack","Tracking")<< "=========== OK 0 === " << ENDLOG;
488 for(point=1; point<fTrackletLength[fVertexConstraint]; point++)
490 if((closest_hit = GetNextNeighbor(hit)))
492 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::CreateTrack","Tracking")<< "=========== OK 0 01 === " << ENDLOG;
493 // Calculate track length in sz plane
494 dx = ((AliHLTTPCConfMapPoint*)closest_hit)->GetX() - ((AliHLTTPCConfMapPoint*)hit)->GetX();
495 dy = ((AliHLTTPCConfMapPoint*)closest_hit)->GetY() - ((AliHLTTPCConfMapPoint*)hit)->GetY();
496 //track->fLength += (Double_t)sqrt ( dx * dx + dy * dy ) ;
497 Double_t length = track->GetLength()+(Double_t)sqrt ( dx * dx + dy * dy );
498 track->SetLength(length);
500 //closest_hit->SetS(track->fLength);
501 closest_hit->SetS(track->GetLength());
503 //update fit parameters
504 track->UpdateParam(closest_hit);
505 trackhitnumber[track->GetNumberOfPoints()-1] = closest_hit->GetHitNumber();
511 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::CreateTrack","Tracking")<< "=========== OK 0 02 === " << ENDLOG;
512 //closest hit does not exist:
513 track->DeleteCandidate();
514 fTrack->RemoveLast();
516 point = fTrackletLength[fVertexConstraint];
519 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::CreateTrack","Tracking")<< "=========== OK 1 === " << ENDLOG;
520 //tracklet is long enough to be extended to a track
521 if(track->GetNumberOfPoints() == fTrackletLength[fVertexConstraint])
523 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::CreateTrack","Tracking")<< "=========== OK 100 === " << ENDLOG;
524 track->SetProperties(true);
526 if(TrackletAngle(track) > fMaxAngleTracklet[fVertexConstraint])
527 {//proof if the first points seem to be a beginning of a track
528 track->SetProperties(false);
529 track->DeleteCandidate();
530 fTrack->RemoveLast();
534 else//good tracklet ->proceed, follow the trackfit
538 //define variables to keep the total chi:
539 Double_t xyChi2 = track->fChiSq[0];
540 Double_t szChi2 = track->fChiSq[1];
542 for(point = fTrackletLength[fVertexConstraint]; point <= fNumRowSegment; point++)
544 track->fChiSq[0] = fHitChi2Cut[fVertexConstraint];
545 closest_hit = GetNextNeighbor((AliHLTTPCConfMapPoint*)track->lastHit,track);
551 Double_t lxyChi2 = track->fChiSq[0]-track->fChiSq[1];
553 closest_hit->xyChi2 = lxyChi2;
555 //update track length:
556 //track->fLength = closest_hit->GetS();
557 track->SetLength(closest_hit->GetS());
558 szChi2 += track->fChiSq[1];
559 closest_hit->szChi2 = track->fChiSq[1];
561 track->UpdateParam(closest_hit);
562 trackhitnumber[track->GetNumberOfPoints()-1] = closest_hit->GetHitNumber();
564 //add closest hit to track
565 closest_hit->SetUsage(true);
566 closest_hit->SetTrackNumber(tracks-1);
572 //closest hit does not exist
573 point = fNumRowSegment; //continue with next hit in segment
579 track->fChiSq[0] = xyChi2;
580 track->fChiSq[1] = szChi2;
581 Double_t normalized_chi2 = (track->fChiSq[0]+track->fChiSq[1])/track->GetNumberOfPoints();
582 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::CreateTrack","Tracking")<< "=========== OK 2 === " << ENDLOG;
583 //remove tracks with not enough points already now
584 if(track->GetNumberOfPoints() < fMinPoints[fVertexConstraint] || normalized_chi2 > fTrackChi2Cut[fVertexConstraint])
586 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::CreateTrack","Tracking")<< "=#=#=#=#=#=#=#=#=#=#= BAD =#=#= " << ENDLOG;
587 track->SetProperties(false);
589 track->DeleteCandidate();
590 fTrack->RemoveLast();
596 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::CreateTrack","Tracking")<< "=========== OK === " << ENDLOG;
597 fClustersUnused -= track->GetNumberOfPoints();
598 track->ComesFromMainVertex(fVertexConstraint);
599 //mark track as main vertex track or not
600 track->SetSector(2); //only needed for testing purposes.
601 track->SetRowRange(fRowMin,fRowMax);
603 if(fVertexConstraint)
610 // if (nTracks > 0) LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::CreateTrack","Tracking")<< "########### number of tracks:"<< nTracks << ENDLOG;
614 AliHLTTPCConfMapPoint *AliHLTTPCConfMapper::GetNextNeighbor(AliHLTTPCConfMapPoint *start_hit,
615 AliHLTTPCConfMapTrack *track)
617 //When forming segments: Finds closest hit to input hit
618 //When forming tracks: Find closest hit to track fit.
619 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 0 #####" << ENDLOG;
620 Double_t dist,closest_dist = fMaxDist[fVertexConstraint];
622 AliHLTTPCConfMapPoint *hit = NULL;
623 AliHLTTPCConfMapPoint *closest_hit = NULL;
631 Int_t max_row = start_hit->GetPadRow()-1;
634 if(track) //finding hit close to trackfit
636 min_row = start_hit->GetPadRow()-fRowScopeTrack[fVertexConstraint];
640 min_row = start_hit->GetPadRow()-fRowScopeTracklet[fVertexConstraint];
644 Int_t loop_eta[25] = {0,0,0,-1,-1,-1,1,1,1, 0,0,-1,-1,1,1,-2,-2,-2,-2,-2,2,2,2,2,2};
645 Int_t loop_phi[25] = {0,-1,1,0,-1,1,0,-1,1, -2,2,-2,2,-2,2,-2,-1,0,1,2,-2,-1,0,1,2};
647 if(min_row < fRowMin)
649 if(max_row < fRowMin)
650 return 0; //reached the last padrow under consideration
653 {// LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx1 #####" << ENDLOG;
655 for(sub_row_segm=max_row; sub_row_segm>=min_row; sub_row_segm--)
657 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx2 #####" << ENDLOG;
658 //loop over subsegments, in the order defined above.
659 for(Int_t i=0; i<9; i++)
661 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx3 #####" << ENDLOG;
662 sub_phi_segm = start_hit->phiIndex + loop_phi[i];
663 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx4 #####" << ENDLOG;
664 if(sub_phi_segm < 0 || sub_phi_segm >= fNumPhiSegment)
668 sub_phi_segm += fNumPhiSegment;
670 else if(sub_phi_segm >=fNumPhiSegment)
671 sub_phi_segm -= fNumPhiSegment;
673 //loop over sub eta segments
675 sub_eta_segm = start_hit->etaIndex + loop_eta[i];
676 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx5 #####" << ENDLOG;
677 if(sub_eta_segm < 0 || sub_eta_segm >=fNumEtaSegment)
678 continue;//segment exceeds bounds->skip it
680 //loop over hits in this sub segment:
681 volumeIndex= (sub_row_segm-fRowMin)*fNumPhiEtaSegmentPlusOne +
682 sub_phi_segm*fNumEtaSegmentPlusOne + sub_eta_segm;
683 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx6 #####" << ENDLOG;
686 LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNextNeighbor","Memory")<<AliHLTTPCLog::kDec<<
687 "VolumeIndex error "<<volumeIndex<<ENDLOG;
689 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx6a #####" << ENDLOG;
690 for(hit = (AliHLTTPCConfMapPoint*)fVolume[volumeIndex].first;
691 hit!=0; hit = hit->nextVolumeHit)
693 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx7 #####" << ENDLOG;
695 {//hit was not used before
696 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx8 #####" << ENDLOG;
697 //set conformal mapping if looking for nonvertex tracks:
698 if(!fVertexConstraint)
700 hit->SetAllCoord(start_hit);
702 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx9 #####" << ENDLOG;
703 if(track)//track search - look for nearest neighbor to extrapolated track
705 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx10 #####" << ENDLOG;
706 // --JMT---------------------- MODIFY --------------------------------------------------------------------------
707 if (fVertexConstraint) {
708 if(!VerifyRange(start_hit,hit))
713 if(!VerifyRange(start_hit,hit))
716 // --JMT---------------------- MODIFY --------------------------------------------------------------------------
717 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx11 #####" << ENDLOG;
718 test_hit = EvaluateHit(start_hit,hit,track);
719 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx12 #####" << ENDLOG;
720 if(test_hit == 0){//chi2 not good enough, keep looking
721 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 0x1x0 #####" << ENDLOG;
724 else if(test_hit==2){//chi2 good enough, return it
725 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 0x2x0 #####" << ENDLOG;
728 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 0x3x0 #####" << ENDLOG;
729 closest_hit = hit;//chi2 acceptable, but keep looking
734 else //tracklet search, look for nearest neighbor
736 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx-100 #####" << ENDLOG;
737 if((dist=CalcDistance(start_hit,hit)) < closest_dist)
739 // --JMT---------------------- MODIFY --------------------------------------------------------------------------
740 if (fVertexConstraint) {
741 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx-101 #####" << ENDLOG;
742 if(!VerifyRange(start_hit,hit)){
743 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx-102 #####" << ENDLOG;
748 if(!VerifyRange(start_hit,hit))
751 // --JMT---------------------- MODIFY --------------------------------------------------------------------------
754 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx-103 #####" << ENDLOG;
755 //if this hit is good enough, return it:
756 if(closest_dist < fGoodDist){
757 //LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx-104 #####" << ENDLOG;
762 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 00xxxxxxxxxxxxx-105 #####" << ENDLOG;
763 continue;//sub hit was farther away than a hit before
768 }//hit not used before
770 else continue; //sub hit was used before
772 }//loop over hits in sub segment ------------END 6A
774 }//loop over sub segments
782 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::GetNExtNeighbor","Tracking")<< "###### 0000 #####" << ENDLOG;
783 if(closest_hit)// && closest_dist < mMaxDist)
789 Int_t AliHLTTPCConfMapper::EvaluateHit(AliHLTTPCConfMapPoint *start_hit,AliHLTTPCConfMapPoint *hit,AliHLTTPCConfMapTrack *track)
791 //Check if space point gives a fit with acceptable chi2.
793 Double_t temp,dxy,lchi2,dx,dy,slocal,dsz,lszChi2;
794 temp = (track->a2Xy*hit->GetXprime()-hit->GetYprime()+track->a1Xy);
795 dxy = temp*temp/(track->a2Xy*track->a2Xy + 1.);
798 lchi2 = (dxy*hit->GetXYWeight());
800 if(lchi2 > track->fChiSq[0])//chi2 was worse than before.
803 //calculate s and the distance hit-line
804 dx = start_hit->GetX()-hit->GetX();
805 dy = start_hit->GetY()-hit->GetY();
806 //slocal = track->fLength+sqrt(dx*dx+dy*dy);
807 slocal = track->GetLength()+sqrt(dx*dx+dy*dy);
809 temp = (track->a2Sz*slocal-hit->GetZ()+track->a1Sz);
810 dsz = temp*temp/(track->a2Sz*track->a2Sz+1);
813 lszChi2 = dsz*hit->GetZWeight();
817 //check whether chi2 is better than previous one:
818 if(lchi2 < track->fChiSq[0])
820 track->fChiSq[0] = lchi2;
821 track->fChiSq[1] = lszChi2;
825 //if chi2 good enough, stop here:
826 if(lchi2 < fGoodHitChi2[fVertexConstraint])
836 Double_t AliHLTTPCConfMapper::CalcDistance(const AliHLTTPCConfMapPoint *hit1,const AliHLTTPCConfMapPoint *hit2) const
838 //Return distance between two clusters, defined by Pablo
840 Double_t phi_diff = fabs( hit1->GetPhi() - hit2->GetPhi() );
841 if (phi_diff > pi) phi_diff = twopi - phi_diff;
843 return todeg*fabs((Float_t)((hit1->GetPadRow() - hit2->GetPadRow()) * (phi_diff + fabs( hit1->GetEta() - hit2->GetEta()))));
846 Bool_t AliHLTTPCConfMapper::VerifyRange(const AliHLTTPCConfMapPoint *hit1,const AliHLTTPCConfMapPoint *hit2) const
848 //Check if the hit are within reasonable range in phi and eta
849 Double_t dphi,deta;//maxphi=0.1,maxeta=0.1;
850 dphi = fabs(hit1->GetPhi() - hit2->GetPhi());
851 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::VerifyRange","Tracking")<< "|||||||||||||||||||||||||< phi1=" << hit1->GetPhi() << " phi2="<< hit2->GetPhi()
852 // << " dphi=" << dphi << " maxphi=" << fMaxPhi << "twopi=" << twopi << ENDLOG;
854 if(dphi > pi) dphi = fabs(twopi - dphi);
857 if(dphi > fMaxPhi) return false;
859 deta = fabs(hit1->GetEta() - hit2->GetEta());
861 // LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::VerifyRange","Tracking")<< "|||||||||||||||||||||||||< eta1=" << hit1->GetEta() << " eta2="<< hit2->GetEta()
862 // << " deta=" << deta << " maxeta=" << fMaxEta << ENDLOG;
864 if(deta > fMaxEta) return false;
870 Double_t AliHLTTPCConfMapper::TrackletAngle(AliHLTTPCConfMapTrack *track,Int_t n) const
872 // Returns the angle 'between' the last three points (started at point number n) on this track.
874 if(n > track->GetNumberOfPoints())
875 n = track->GetNumberOfPoints();
883 Double_t angle1,angle2;
885 for(track->StartLoop(); track->LoopDone(); track->GetNextHit())
887 AliHLTTPCConfMapPoint *p = (AliHLTTPCConfMapPoint*)track->currentHit;
888 if( (n-1) == counter)
893 else if( (n-2) == counter)
898 else if( (n-3) == counter)
906 angle1 = atan2(x2[1]-x3[1],x2[0]-x3[0]);
907 angle2 = atan2(x1[1]-x2[1],x1[0]-x2[0]);
909 return fabs(angle1-angle2);
914 Double_t angle1,angle2;
915 TObjArray *hits = track->GetHits();
917 if (n > track->GetNumberOfPoints()) {
918 n = track->GetNumberOfPoints();
925 x1[0] = ((AliHLTTPCConfMapPoint *)hits->At(n-2))->GetX() - ((AliHLTTPCConfMapPoint *)hits->At(n-3))->GetX();
926 x1[1] = ((AliHLTTPCConfMapPoint *)hits->At(n-2))->GetY() - ((AliHLTTPCConfMapPoint *)hits->At(n-3))->GetY();
928 x2[0] = ((AliHLTTPCConfMapPoint *)hits->At(n-1))->GetX() - ((AliHLTTPCConfMapPoint *)hits->At(n-2))->GetX();
929 x2[1] = ((AliHLTTPCConfMapPoint *)hits->At(n-1))->GetY() - ((AliHLTTPCConfMapPoint *)hits->At(n-2))->GetY();
931 angle1 = atan2(x1[1],x1[0]);
932 angle2 = atan2(x2[1],x1[0]);
933 return fabs(angle1-angle2);
937 Int_t AliHLTTPCConfMapper::FillTracks()
939 //Fill track parameters. Which basically means do a fit of helix in real space,
940 //which should be done in order to get nice tracks.
942 Int_t num_of_tracks = nTracks;
943 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCConfMapper::FillTracks","nTracks")<<AliHLTTPCLog::kDec<< " Number of found tracks: "<<nTracks<<ENDLOG;
947 LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::FillTracks","nTracks")<<AliHLTTPCLog::kDec<<" No tracks found!!"<<ENDLOG;
952 for(int i=0; i<num_of_tracks; i++)
954 AliHLTTPCConfMapTrack *track = (AliHLTTPCConfMapTrack*)fTrack->GetTrack(i);
955 track->Fill(fVertex,fMaxDca);
956 LOG(AliHLTTPCLog::kError,"AliHLTTPCConfMapper::Filltracks","TEST")<< "====C====== r=" << track->GetRadius() << ENDLOG;
962 Double_t AliHLTTPCConfMapper::CpuTime()
964 //Return the Cputime in seconds.
966 gettimeofday( &tv, NULL );
967 return tv.tv_sec+(((Double_t)tv.tv_usec)/1000000.);
968 //return (Double_t)(clock()) / CLOCKS_PER_SEC;