3 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
4 //*-- Copyright © ASV
8 #include "AliL3Logging.h"
9 #include "AliL3HoughTrack.h"
10 #include "AliL3Transform.h"
12 //_____________________________________________________________
15 // Track class for Hough tracklets
17 ClassImp(AliL3HoughTrack)
20 AliL3HoughTrack::AliL3HoughTrack()
35 AliL3HoughTrack::~AliL3HoughTrack()
40 void AliL3HoughTrack::Set(AliL3Track *track)
43 AliL3HoughTrack *tpt = (AliL3HoughTrack*)track;
44 SetTrackParameters(tpt->GetKappa(),tpt->GetPsi(),tpt->GetWeight());
45 SetEtaIndex(tpt->GetEtaIndex());
46 SetEta(tpt->GetEta());
47 SetTgl(tpt->GetTgl());
48 SetPsi(tpt->GetPsi());
49 SetCenterX(tpt->GetCenterX());
50 SetCenterY(tpt->GetCenterY());
51 SetFirstPoint(tpt->GetFirstPointX(),tpt->GetFirstPointY(),tpt->GetFirstPointZ());
52 SetLastPoint(tpt->GetLastPointX(),tpt->GetLastPointY(),tpt->GetLastPointZ());
53 SetCharge(tpt->GetCharge());
54 SetRowRange(tpt->GetFirstRow(),tpt->GetLastRow());
55 SetSlice(tpt->GetSlice());
59 fWeight = tpt->GetWeight();
60 fDLine = tpt->GetDLine();
61 fPsiLine = tpt->GetPsiLine();
62 SetNHits(tpt->GetWeight());
63 SetRowRange(tpt->GetFirstRow(),tpt->GetLastRow());
69 Int_t AliL3HoughTrack::Compare(const AliL3Track *tpt) const
71 AliL3HoughTrack *track = (AliL3HoughTrack*)tpt;
72 if(track->GetWeight() < GetWeight()) return 1;
73 if(track->GetWeight() > GetWeight()) return -1;
77 void AliL3HoughTrack::SetEta(Double_t f)
79 //Set eta, and calculate fTanl, which is the tan of dipangle
82 Double_t theta = 2*atan(exp(-1.*fEta));
83 Double_t dipangle = AliL3Transform::Pi()/2 - theta;
84 Double_t tgl = tan(dipangle);
88 void AliL3HoughTrack::CalculateHelix()
93 void AliL3HoughTrack::UpdateToFirstRow()
95 //Update the track parameters to the point where track cross
98 //Get the crossing point with the first padrow:
100 if(!GetCrossingPoint(GetFirstRow(),xyz))
101 LOG(AliL3Log::kWarning,"AliL3HoughTrack::UpdateToFirstRow()","Track parameters")
102 <<AliL3Log::kDec<<"Track does not cross padrow "<<GetFirstRow()<<" centerx "
103 <<GetCenterX()<<" centery "<<GetCenterY()<<" Radius "<<GetRadius()<<" tgl "<<GetTgl()<<ENDLOG;
105 //printf("Track with eta %f tgl %f crosses at x %f y %f z %f on padrow %d\n",GetEta(),GetTgl(),xyz[0],xyz[1],xyz[2],GetFirstRow());
106 //printf("Before: first %f %f %f tgl %f center %f %f charge %d\n",GetFirstPointX(),GetFirstPointY(),GetFirstPointZ(),GetTgl(),GetCenterX(),GetCenterY(),GetCharge());
108 Double_t radius = sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1]);
110 //Get the track parameters
113 Double_t x0 = GetR0() * cos(GetPhi0()) ;
114 Double_t y0 = GetR0() * sin(GetPhi0()) ;
116 Double_t rc = GetRadius();//fabs(GetPt()) / ( BFACT * AliL3Transform::GetBField() ) ;
117 Double_t tPhi0 = GetPsi() + GetCharge() * 0.5 * pi / fabs(GetCharge()) ;
118 Double_t xc = GetCenterX();//x0 - rc * cos(tPhi0) ;
119 Double_t yc = GetCenterY();//y0 - rc * sin(tPhi0) ;
121 //Check helix and cylinder intersect
122 Double_t fac1 = xc*xc + yc*yc ;
123 Double_t sfac = sqrt( fac1 ) ;
125 if ( fabs(sfac-rc) > radius || fabs(sfac+rc) < radius ) {
126 LOG(AliL3Log::kError,"AliL3HoughTrack::UpdateToFirstRow","Tracks")<<AliL3Log::kDec<<
127 "Track does not intersect"<<ENDLOG;
132 Double_t fac2 = (radius*radius + fac1 - rc*rc) / (2.00 * radius * sfac ) ;
133 Double_t phi = atan2(yc,xc) + GetCharge()*acos(fac2) ;
134 Double_t td = atan2(radius*sin(phi) - yc,radius*cos(phi) - xc) ;
137 if ( td < 0 ) td = td + 2. * pi ;
138 Double_t deltat = fmod((-GetCharge()*td + GetCharge()*tPhi0),2*pi) ;
139 if ( deltat < 0. ) deltat += 2. * pi ;
140 if ( deltat > 2.*pi ) deltat -= 2. * pi ;
141 Double_t z = GetZ0() + rc * GetTgl() * deltat ;
144 Double_t xExtra = radius * cos(phi) ;
145 Double_t yExtra = radius * sin(phi) ;
147 Double_t tPhi = atan2(yExtra-yc,xExtra-xc);
149 //if ( tPhi < 0 ) tPhi += 2. * M_PI ;
151 Double_t tPsi = tPhi - GetCharge() * 0.5 * pi / fabs(GetCharge()) ;
152 if ( tPsi > 2. * pi ) tPsi -= 2. * pi ;
153 if ( tPsi < 0. ) tPsi += 2. * pi ;
155 //And finally, update the track parameters
160 SetFirstPoint(xyz[0],xyz[1],z);
161 //printf("After: first %f %f %f tgl %f center %f %f charge %d\n",GetFirstPointX(),GetFirstPointY(),GetFirstPointZ(),GetTgl(),GetCenterX(),GetCenterY(),GetCharge());
163 //printf("First point set %f %f %f\n",xyz[0],xyz[1],z);
165 //Also, set the coordinates of the point where track crosses last padrow:
166 GetCrossingPoint(GetLastRow(),xyz);
167 SetLastPoint(xyz[0],xyz[1],xyz[2]);
168 //printf("last point %f %f %f\n",xyz[0],xyz[1],xyz[2]);
171 void AliL3HoughTrack::SetTrackParameters(Double_t kappa,Double_t eangle,Int_t weight)
177 Double_t pt = fabs(BFACT*AliL3Transform::GetBField()/kappa);
179 Double_t radius = 1/fabs(kappa);
181 SetFirstPoint(0,0,0);
182 SetPsi(eangle); //Psi = emission angle when first point is vertex
183 SetPhi0(0); //not defined for vertex reference point
185 Double_t charge = -1.*kappa;
186 SetCharge((Int_t)copysign(1.,charge));
187 Double_t trackPhi0 = GetPsi() + charge*0.5*AliL3Transform::Pi()/fabs(charge);
188 Double_t xc = GetFirstPointX() - GetRadius() * cos(trackPhi0) ;
189 Double_t yc = GetFirstPointY() - GetRadius() * sin(trackPhi0) ;
192 SetNHits(1); //just for the trackarray IO
196 void AliL3HoughTrack::SetLineParameters(Double_t psi,Double_t D,Int_t weight,Int_t *rowrange,Int_t ref_row)
198 //Initialize a track piece, not yet a track
199 //Used in case of straight line transformation
201 //Transform line parameters to coordinate system of slice:
204 D = D + fTransform->Row2X(ref_row)*cos(psi);
210 SetRowRange(rowrange[0],rowrange[1]);
215 void AliL3HoughTrack::SetBestMCid(Int_t mcid,Double_t min_dist)
218 if(min_dist < fMinDist)
226 void AliL3HoughTrack::GetLineCrossingPoint(Int_t padrow,Double_t *xy)
232 printf("AliL3HoughTrack::GetLineCrossingPoint : Track is not a line\n");
236 Double_t xhit = fTransform->Row2X(padrow);
237 Double_t a = -1/tan(fPsiLine);
238 Double_t b = fDLine/sin(fPsiLine);
240 Double_t yhit = a*xhit + b;
247 Double_t AliL3HoughTrack::GetCrossingAngle(Int_t padrow)
249 //Calculate the crossing angle between track and given padrow.
253 printf("AliL3HoughTrack::GetCrossingAngle : Track is not a helix\n");
259 printf("Track is not given in local coordinates\n");
264 if(!GetCrossingPoint(padrow,xyz))
265 printf("AliL3HoughTrack::GetCrossingPoint : Track does not cross line!!\n");
268 //Convert center of curvature to local coordinates:
269 //Float_t xyz_coc[3] = {GetCenterX(),GetCenterY(),0};
270 //fTransform->Global2Local(xyz_coc,slice);
272 //Take the dot product of the tangent vector of the track, and
273 //vector perpendicular to the padrow.
276 //tangent[1] = (xyz[0] - xyz_coc[0])/GetRadius();
277 //tangent[0] = -1.*(xyz[1] - xyz_coc[1])/GetRadius();
278 tangent[1] = (xyz[0] - GetCenterX())/GetRadius();
279 tangent[0] = -1.*(xyz[1] - GetCenterY())/GetRadius();
281 Double_t perp_padrow[2] = {1,0}; //locally in slice
283 Double_t cos_beta = fabs(tangent[0]*perp_padrow[0] + tangent[1]*perp_padrow[1]);
284 return acos(cos_beta);
288 Bool_t AliL3HoughTrack::GetCrossingPoint(Int_t padrow,Float_t *xyz)
290 //Assumes the track is given in local coordinates
294 printf("AliL3HoughTrack::GetCrossingPoint : Track is not a helix\n");
301 printf("GetCrossingPoint: Track is given on global coordinates\n");
305 Double_t xHit = fTransform->Row2X(padrow);
307 //xyz[0] = fTransform->Row2X(padrow);
309 Double_t aa = (xHit - GetCenterX())*(xHit - GetCenterX());
310 Double_t r2 = GetRadius()*GetRadius();
314 Double_t aa2 = sqrt(r2 - aa);
315 Double_t y1 = GetCenterY() + aa2;
316 Double_t y2 = GetCenterY() - aa2;
318 if(fabs(y2) < fabs(y1)) xyz[1] = y2;
319 xyz[2] = 0; //only consider transverse plane
325 Bool_t AliL3HoughTrack::GetCrossingPoint(Int_t slice,Int_t padrow,Float_t *xyz)
327 //Calculate the crossing point in transverse plane of this track and given
328 //padrow (y = a*x + b). Point is given in local coordinates in slice.
329 //Assumes the track is given in global coordinates.
333 printf("AliL3HoughTrack::GetCrossingPoint : Track is not a helix\n");
340 printf("GetCrossingPoint: Track is given in local coordintes!!!\n");
344 Double_t padrowradii = fTransform->Row2X(padrow);
347 Float_t rotation_angle = (slice*20)*ToRad;
350 cs = cos(rotation_angle);
351 sn = sin(rotation_angle);
353 Double_t a = -1.*cs/sn;
354 Double_t b = padrowradii/sn;
356 Double_t ycPrime = GetCenterY() - b ;
357 Double_t aa = ( 1. + a * a ) ;
358 Double_t bb = -2. * ( GetCenterX() + a * ycPrime ) ;
359 Double_t cc = ( GetCenterX() * GetCenterX() + ycPrime * ycPrime - GetRadius() * GetRadius() ) ;
361 Double_t racine = bb * bb - 4. * aa * cc ;
362 if ( racine < 0 ) return false ;
363 Double_t rootRacine = sqrt(racine) ;
365 Double_t oneOverA = 1./aa;
369 Double_t x1 = 0.5 * oneOverA * ( -1. * bb + rootRacine ) ;
370 Double_t y1 = a * x1 + b ;
371 Double_t r1 = sqrt(x1*x1+y1*y1);
375 Double_t x2 = 0.5 * oneOverA * ( -1. * bb - rootRacine ) ;
376 Double_t y2 = a * x2 + b ;
377 Double_t r2 = sqrt(x2*x2+y2*y2);
379 // Choose close to (0,0)
396 fTransform->Global2Local(xyz,slice);