3 // Author: Anders Vestbo <mailto:vestbo$fi.uib.no>
4 //*-- Copyright © ASV
10 #include "AliL3ModelTrack.h"
11 #include "AliL3Transform.h"
13 //_____________________________________________________________
18 ClassImp(AliL3ModelTrack)
20 AliL3ModelTrack::AliL3ModelTrack()
32 AliL3ModelTrack::~AliL3ModelTrack()
46 void AliL3ModelTrack::Init(Int_t slice,Int_t patch)
51 Int_t nrows = AliL3Transform::GetNRows(fPatch);
52 fClusters = new AliL3ClusterModel[nrows];
53 fPad = new Float_t[nrows];
54 fTime = new Float_t[nrows];
55 fTrackModel = new AliL3TrackModel;
56 fOverlap = new Int_t[nrows];
58 memset(fClusters,0,nrows*sizeof(AliL3ClusterModel));
59 memset(fPad,0,nrows*sizeof(Float_t));
60 memset(fTime,0,nrows*sizeof(Float_t));
61 memset(fTrackModel,0,sizeof(AliL3TrackModel));
62 for(Int_t i=0; i<nrows; i++)
68 fXYResidualQ = 0.01/AliL3Transform::GetPadPitchWidth(patch);
69 fZResidualQ = 0.01/AliL3Transform::GetPadPitchWidth(patch);
71 fXYWidthQ = 0.005/AliL3Transform::GetPadPitchWidth(patch);
72 fZWidthQ = 0.005/AliL3Transform::GetPadPitchWidth(patch);
76 void AliL3ModelTrack::SetCluster(Int_t row,Float_t fpad,Float_t ftime,Float_t charge,Float_t sigmaY2,Float_t sigmaZ2,Int_t npads)
78 Int_t index = row - AliL3Transform::GetFirstRow(fPatch);
79 if(index != fNClusters)
80 cout<<"AliL3ModelTrack::SetCluster() : Mismatch ; index: "<<index<<" nclusters "<<fNClusters<<endl;
82 if(index < 0 || index > AliL3Transform::GetNRows(fPatch))
84 cerr<<"AliL3ModelTrack::SetCluster() : Wrong index: "<<index<<" row "<<row<<endl;
87 AliL3ClusterModel *cl = GetClusterModel(row);
89 cl->fPresent = kFALSE;
93 cl->fDTime = (ftime - GetTimeHit(row))/fXYResidualQ;
94 cl->fDPad = (fpad - GetPadHit(row))/fZResidualQ;
95 cl->fDCharge = charge - fClusterCharge;
96 cl->fDSigmaY2 = (sigmaY2 - GetParSigmaY2(row))/fXYWidthQ;
97 cl->fDSigmaZ2 = (sigmaZ2 - GetParSigmaZ2(row))/fZWidthQ;
104 Int_t AliL3ModelTrack::CheckClustersQuality(UInt_t npads=3)
107 //Check the quality of clusters,- remove clusters with less than
109 //Returns the number of good clusters left.
113 for(Int_t i=AliL3Transform::GetFirstRow(fPatch); i<=AliL3Transform::GetLastRow(fPatch); i++)
115 AliL3ClusterModel *cl = GetClusterModel(i);
116 if(cl->fNPads < npads)
117 cl->fPresent = kFALSE;
125 void AliL3ModelTrack::FillModel()
127 //Fill the track structure
131 cerr<<"AliL3ModelTrack::FillModel() : No trackmodel "<<endl;
134 fTrackModel->fKappa = GetKappa();
135 fTrackModel->fFirstPointX = GetFirstPointX();
136 fTrackModel->fFirstPointY = GetFirstPointY();
137 fTrackModel->fFirstPointZ = GetFirstPointZ();
138 fTrackModel->fTgl = GetTgl();
139 fTrackModel->fPsi = GetPsi();
140 fTrackModel->fLength = (Short_t)GetLength();
141 fTrackModel->fClusterCharge = fClusterCharge;
142 fTrackModel->fNClusters = fNClusters;
146 void AliL3ModelTrack::FillTrack()
148 //Fill the track parameters from the structure.
152 cerr<<"AliL3ModelTrack::FillTrack() : No data!!"<<endl;
155 SetKappa(fTrackModel->fKappa);
156 SetCharge((-1*(Int_t)copysign(1.,GetKappa())));
157 SetFirstPoint(fTrackModel->fFirstPointX,fTrackModel->fFirstPointY,fTrackModel->fFirstPointZ);
158 SetTgl(fTrackModel->fTgl);
159 SetPsi(fTrackModel->fPsi);
160 SetLength(fTrackModel->fLength);
161 fClusterCharge=fTrackModel->fClusterCharge;
162 fNClusters = fTrackModel->fNClusters;
163 SetPt((BFACT*AliL3Transform::GetBField())/fabs(GetKappa()));
169 for(Int_t i=AliL3Transform::GetFirstRow(fPatch); i<=AliL3Transform::GetLastRow(fPatch); i++)
171 AliL3ClusterModel *cl = GetClusterModel(i);
173 GetCrossingPoint(i,hit);
174 AliL3Transform::Slice2Sector(fSlice,i,sector,row);
175 AliL3Transform::Local2Raw(hit,sector,row);
177 SetTimeHit(i,hit[2]);
181 void AliL3ModelTrack::SetPadHit(Int_t row,Float_t pad)
183 Int_t index = row-AliL3Transform::GetFirstRow(fPatch);
184 if(index < 0 || index > AliL3Transform::GetNRows(fPatch))
186 cerr<<"AliL3ModelTrack::SetPadHit() : Wrong index: "<<index<<endl;
193 void AliL3ModelTrack::SetTimeHit(Int_t row,Float_t time)
195 Int_t index = row-AliL3Transform::GetFirstRow(fPatch);
196 if(index < 0 || index > AliL3Transform::GetNRows(fPatch))
198 cerr<<"AliL3ModelTrack::SetTimeHit() : Wrong index: "<<index<<endl;
204 void AliL3ModelTrack::SetOverlap(Int_t row,Int_t id)
206 Int_t index = row-AliL3Transform::GetFirstRow(fPatch);
207 if(index < 0 || index > AliL3Transform::GetNRows(fPatch))
209 cerr<<"AliL3ModelTrack::SetOverlap() : Wrong index: "<<index<<endl;
215 Int_t AliL3ModelTrack::GetNPads(Int_t row)
217 AliL3ClusterModel *cl = GetClusterModel(row);
221 Bool_t AliL3ModelTrack::GetPad(Int_t row,Float_t &pad)
223 //(ftime - GetTimeHit(fNClusters))/fXYResidualQ;
224 //(fpad - GetPadHit(fNClusters))/fZResidualQ;
226 AliL3ClusterModel *cl = GetClusterModel(row);
227 pad = cl->fDPad*fXYResidualQ + GetPadHit(row);
229 return (Bool_t)cl->fPresent;
232 Bool_t AliL3ModelTrack::GetTime(Int_t row,Float_t &time)
234 AliL3ClusterModel *cl = GetClusterModel(row);
235 time = cl->fDTime*fZResidualQ + GetTimeHit(row);
237 return (Bool_t)cl->fPresent;
240 Bool_t AliL3ModelTrack::GetClusterCharge(Int_t row,Int_t &charge)
242 AliL3ClusterModel *cl = GetClusterModel(row);
243 charge = (Int_t)cl->fDCharge + fClusterCharge;
245 return (Bool_t)cl->fPresent;
248 Bool_t AliL3ModelTrack::GetXYWidth(Int_t row,Float_t &width)
250 AliL3ClusterModel *cl = GetClusterModel(row);
251 width = cl->fDSigmaY2*fXYWidthQ + GetParSigmaY2(row);
253 return (Bool_t)cl->fPresent;
256 Bool_t AliL3ModelTrack::GetZWidth(Int_t row,Float_t &width)
258 AliL3ClusterModel *cl = GetClusterModel(row);
259 width = cl->fDSigmaZ2*fZWidthQ + GetParSigmaZ2(row);
261 return (Bool_t)cl->fPresent;
264 Bool_t AliL3ModelTrack::GetPadResidual(Int_t row,Float_t &res)
266 AliL3ClusterModel *cl = GetClusterModel(row);
271 Bool_t AliL3ModelTrack::GetTimeResidual(Int_t row,Float_t &res)
273 AliL3ClusterModel *cl = GetClusterModel(row);
278 Bool_t AliL3ModelTrack::GetXYWidthResidual(Int_t row,Float_t &res)
280 AliL3ClusterModel *cl = GetClusterModel(row);
285 Bool_t AliL3ModelTrack::GetZWidthResidual(Int_t row,Float_t &res)
287 AliL3ClusterModel *cl = GetClusterModel(row);
292 Float_t AliL3ModelTrack::GetPadHit(Int_t row)
294 Int_t index = row-AliL3Transform::GetFirstRow(fPatch);
295 if(index < 0 || index > AliL3Transform::GetNRows(fPatch))
297 cerr<<"AliL3ModelTrack::GetPadHit() : Wrong index: "<<index<<" row "<<row<<endl;
303 Float_t AliL3ModelTrack::GetTimeHit(Int_t row)
305 Int_t index = row-AliL3Transform::GetFirstRow(fPatch);
306 if(index < 0 || index > AliL3Transform::GetNRows(fPatch))
308 cerr<<"AliL3ModelTrack::GetTimeHit() : Wrong index: "<<index<<" row "<<row<<endl;
314 Int_t AliL3ModelTrack::GetOverlap(Int_t row)
316 Int_t index = row-AliL3Transform::GetFirstRow(fPatch);
317 if(index < 0 || index > AliL3Transform::GetNRows(fPatch))
319 cerr<<"AliL3ModelTrack::GetOverlap() : Wrong index: "<<index<<endl;
322 return fOverlap[index];
325 AliL3ClusterModel *AliL3ModelTrack::GetClusterModel(Int_t row)
327 if(!fClusters) return 0;
328 Int_t index = row-AliL3Transform::GetFirstRow(fPatch);
329 if(index < 0 || index > AliL3Transform::GetNRows(fPatch))
331 cerr<<"AliL3ModelTrack::GetClusterModel() : Wrong index: "<<index<<endl;
334 return &fClusters[index];
337 void AliL3ModelTrack::Print()
341 cout<<"----Slice "<<fSlice<<" Patch "<<fPatch<<"----"<<endl;
342 cout<<"First point "<<GetFirstPointX()<<" "<<GetFirstPointY()<<" "<<GetFirstPointZ()<<endl;
343 cout<<"Last point "<<GetLastPointX()<<" "<<GetLastPointY()<<" "<<GetLastPointZ()<<endl;
344 cout<<"Pt "<<GetPt()<<" kappa "<<GetKappa()<<" tgl "<<GetTgl()<<" psi "<<GetPsi()<<" charge "<<GetCharge()<<endl;
345 cout<<"Center "<<GetCenterX()<<" "<<GetCenterY()<<endl<<endl;
346 cout<<"NHits "<<GetNClusters()<<endl;
347 cout<<"Clusters:"<<endl;
349 for(Int_t i=AliL3Transform::GetFirstRow(fPatch); i<=AliL3Transform::GetLastRow(fPatch); i++)
351 AliL3ClusterModel *cl = GetClusterModel(i);
354 cout<<i<<" Empty"<<" Padcrossing "<<GetPadHit(i)<<" Timecrossing "<<GetTimeHit(i)<<" ";
357 cout<<i<<" Dpad "<<cl->fDPad<<" Dtime "<<cl->fDTime<<" Dcharge "<<cl->fDCharge;
358 cout<<" DsigmaY2 "<<cl->fDSigmaY2<<" DsigmaZ2 "<<cl->fDSigmaZ2;
359 cout<<" Padcrossing "<<GetPadHit(i)<<" Timecrossing "<<GetTimeHit(i)<<" ";
360 cout<<"Number of pads "<<GetNPads(i)<<endl;
362 cout<<"Overlapping index "<<GetOverlap(i)<<endl;
366 Double_t AliL3ModelTrack::GetParSigmaY2(Int_t row)
368 //Calculate the expected cluster width, based on the track parameters and drift distance.
371 if(!GetTime(row,time) || !GetPad(row,pad))
376 AliL3Transform::Slice2Sector(fSlice,row,sector,padrow);
377 AliL3Transform::Raw2Local(xyz,sector,padrow,pad,time);
379 //Calculate the drift length:
382 drift = AliL3Transform::GetZLength() - xyz[2];
384 drift = AliL3Transform::GetZLength() + xyz[2];
386 Double_t prf = AliL3Transform::GetPRFSigma(fPatch);
387 Double_t diffT = AliL3Transform::GetDiffT();
388 Double_t padlength = AliL3Transform::GetPadLength(fPatch);
389 Double_t anode = AliL3Transform::GetAnodeWireSpacing();
390 Double_t beta = GetCrossingAngle(row);
392 Double_t sigmaY2 = prf*prf + diffT*diffT*drift + padlength*padlength*tan(beta)*tan(beta)/12 + anode*anode*pow( tan(beta)-0.15, 2)/12;
394 //Convert back to raw coordinates.
395 sigmaY2 = sigmaY2/pow(AliL3Transform::GetPadPitchWidth(fPatch),2);
399 Double_t AliL3ModelTrack::GetParSigmaZ2(Int_t row)
401 //Calculate the expected cluster width, based on the track parameters and drift distance.
404 if(!GetTime(row,time) || !GetPad(row,pad))
409 AliL3Transform::Slice2Sector(fSlice,row,sector,padrow);
410 AliL3Transform::Raw2Local(xyz,sector,padrow,pad,time);
412 //Calculate the drift length:
415 drift = AliL3Transform::GetZLength() - xyz[2];
417 drift = AliL3Transform::GetZLength() + xyz[2];
419 Double_t sigma0 = AliL3Transform::GetTimeSigma();
420 Double_t diffL = AliL3Transform::GetDiffL();
421 Double_t padlength = AliL3Transform::GetPadLength(fPatch);
422 Double_t tanl = GetTgl();
424 Double_t sigmaZ2 = sigma0*sigma0 + diffL*diffL*drift + padlength*padlength * tanl*tanl/12;
426 //Convert back to raw coodinates:
427 sigmaZ2 = sigmaZ2/pow(AliL3Transform::GetZWidth(),2);