]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGCF/FEMTOSCOPY/AliFemto/AliFemtoTrack.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / PWGCF / FEMTOSCOPY / AliFemto / AliFemtoTrack.cxx
1 ///////////////////////////////////////////////////////////////////////////
2 //                                                                       //
3 // AliFemtoTrack: main class holding all the necessary information       //
4 // about a track (before the identification) that is required during     //
5 // femtoscopic analysis. This class is filled with information from the  //
6 // input stream by the reader. A particle has a link back to the Track   //
7 // it was created from, so we do not copy the information.               //
8 //                                                                       //
9 ///////////////////////////////////////////////////////////////////////////
10
11 #include "AliFemtoTrack.h" 
12 #ifndef __NO_STAR_DEPENDENCE_ALLOWED__
13 #ifdef __ROOT__
14 #include "StEvent/StEnumerations.h"
15 #include "AliFemtoAihongPid.h"
16 #include "StEventUtilities/StuProbabilityPidAlgorithm.h"
17 #endif
18 #endif
19
20 #include "SystemOfUnits.h"   // has "tesla" in it
21 //#include "AliFemtoParticleTypes.h"
22 //#include "AliFemtoTTreeEvent.h" 
23 //#include "AliFemtoTTreeTrack.h" 
24
25 AliFemtoTrack::AliFemtoTrack():
26   fCharge(0),
27   fPidProbElectron(0),
28   fPidProbPion(0),
29   fPidProbKaon(0),
30   fPidProbProton(0),
31   fPidProbMuon(0),
32   fTrackId(0),
33   fTofPionTime(-100000.0),
34   fTofKaonTime(-100000.0),
35   fTofProtonTime(-100000.0),
36   fP(0,0,0),
37   fPt(0),
38   fInnerMomentum(0),
39   fHelix(),
40   fFlags(0),
41   fLabel(0),
42   fImpactD(0),
43   fImpactDprim(-10000.0),
44   fImpactDweak(-10000.0),
45   fImpactDmat(-10000.0),
46   fImpactZ(0),
47   fCdd(0),
48   fCdz(0),
49   fCzz(0),
50   fITSchi2(0),       
51   fITSncls(0),        
52   fTPCchi2(0),       
53   fTPCncls(0),       
54   fTPCnclsF(0),      
55   fTPCsignal(0),
56   fTPCsignalN(0),    
57   fTPCsignalS(0),
58   fVTOF(0),
59   fNSigmaTPCPi(0),
60   fNSigmaTPCK(0),
61   fNSigmaTPCP(0),
62   fNSigmaTPCE(0),
63   fNSigmaTOFPi(0),
64   fNSigmaTOFK(0),
65   fNSigmaTOFP(0),
66   fNSigmaTOFE(0),
67   fSigmaToVertex(0),
68   fClusters(159),
69   fShared(159),
70   fNominalTpcEntrancePoint(0,0,0),
71   fNominalTpcExitPoint(0,0,0),
72   fXatDCA(0),
73   fYatDCA(0),
74   fZatDCA(0),
75   fHiddenInfo(0),
76   fTrueMomentum(0),  // True (simulated) momentum
77   fEmissionPoint(0), // Emission point coordinates
78   fPDGPid(0),        // True PID of the particle
79   fMass(0),          // True particle mass
80   fGlobalEmissionPoint(0)
81 {
82   // Default constructor
83   fHiddenInfo = NULL;
84   fKinkIndexes[0] = 0;
85   fKinkIndexes[1] = 0;
86   fKinkIndexes[2] = 0;
87
88   for(int i=0;i<6;i++) {
89     fHasPointOnITS[i]=false;
90   }
91
92   for(int i=0;i<9;i++)
93     {
94       fNominalTpcPoints[i].SetX(0);
95       fNominalTpcPoints[i].SetY(0);
96       fNominalTpcPoints[i].SetZ(0);
97     }
98   //  cout << "Created track " << this << endl;
99 }
100
101
102 AliFemtoTrack::AliFemtoTrack(const AliFemtoTrack& t) :
103   fCharge(0),
104   fPidProbElectron(0),
105   fPidProbPion(0),
106   fPidProbKaon(0),
107   fPidProbProton(0),
108   fPidProbMuon(0),
109   fTrackId(0),
110   fTofPionTime(-100000.0),
111   fTofKaonTime(-100000.0),
112   fTofProtonTime(-100000.0),
113   fP(0,0,0),
114   fPt(0),
115   fInnerMomentum(0),
116   fHelix(),
117   fFlags(0),
118   fLabel(0),
119   fImpactD(0),
120   fImpactDprim(-10000.0),
121   fImpactDweak(-10000.0),
122   fImpactDmat(-10000.0),
123   fImpactZ(0),
124   fCdd(0),
125   fCdz(0),
126   fCzz(0),
127   fITSchi2(0),       
128   fITSncls(0),        
129   fTPCchi2(0),       
130   fTPCncls(0),       
131   fTPCnclsF(0),      
132   fTPCsignal(0),
133   fTPCsignalN(0),    
134   fTPCsignalS(0),
135   fVTOF(0),
136   fNSigmaTPCPi(0),
137   fNSigmaTPCK(0),
138   fNSigmaTPCP(0),
139   fNSigmaTPCE(0),
140   fNSigmaTOFPi(0),
141   fNSigmaTOFK(0),
142   fNSigmaTOFP(0),
143   fNSigmaTOFE(0),
144   fSigmaToVertex(0),
145   fClusters(159),
146   fShared(159),
147   fNominalTpcEntrancePoint(0,0,0),
148   fNominalTpcExitPoint(0,0,0),
149   fXatDCA(0),
150   fYatDCA(0),
151   fZatDCA(0),
152   fHiddenInfo(0),
153   fTrueMomentum(0),  // True (simulated) momentum
154   fEmissionPoint(0), // Emission point coordinates
155   fPDGPid(0),        // True PID of the particle
156   fMass(0),          // True particle mass
157   fGlobalEmissionPoint(0)
158  { 
159    // copy constructor
160   fCharge = t.fCharge;
161   fPidProbElectron = t.fPidProbElectron;
162   fPidProbPion = t.fPidProbPion;
163   fPidProbKaon = t.fPidProbKaon;
164   fPidProbProton = t.fPidProbProton;
165   fPidProbMuon=t.fPidProbMuon;
166   fTofPionTime=t.fTofPionTime;
167   fTofKaonTime=t.fTofKaonTime;
168   fTofProtonTime=t.fTofProtonTime;
169   fP = t.fP;
170   fPt = t.fPt;
171   fInnerMomentum = t.fInnerMomentum;
172   fHelix = t.fHelix;
173   fTrackId = t.fTrackId;
174   fFlags=t.fFlags;
175   fLabel=t.fLabel;
176   fImpactD=t.fImpactD;
177   fImpactDprim=t.fImpactDprim;
178   fImpactDweak=t.fImpactDweak;
179   fImpactDmat=t.fImpactDmat;
180   fImpactZ=t.fImpactZ;
181   fCdd=t.fCdd;
182   fCdz=t.fCdz;
183   fCzz=t.fCzz;
184   fITSchi2=t.fITSchi2;       
185   fITSncls=t.fITSncls;        
186   fTPCchi2=t.fTPCchi2;       
187   fTPCncls=t.fTPCncls;       
188   fTPCnclsF=t.fTPCnclsF;      
189   fTPCsignal=t.fTPCsignal;
190   fTPCsignalN=t.fTPCsignalN;    
191   fTPCsignalS=t.fTPCsignalS;  
192   fVTOF=t.fVTOF;
193   fNSigmaTPCPi=t.fNSigmaTPCPi;
194   fNSigmaTPCK=t.fNSigmaTPCK;
195   fNSigmaTPCP=t.fNSigmaTPCP;
196   fNSigmaTPCE=t.fNSigmaTPCE;
197   fNSigmaTOFPi=t.fNSigmaTOFPi;
198   fNSigmaTOFK=t.fNSigmaTOFK;
199   fNSigmaTOFP=t.fNSigmaTOFP;
200   fNSigmaTOFE=t.fNSigmaTOFE;
201   fSigmaToVertex=t.fSigmaToVertex;
202   fClusters=t.fClusters;
203   fShared=t.fShared;
204   fNominalTpcEntrancePoint=t.fNominalTpcEntrancePoint;
205   fNominalTpcExitPoint=t.fNominalTpcExitPoint;
206   if (t.ValidHiddenInfo())
207     fHiddenInfo = t.GetHiddenInfo()->Clone();
208   else 
209     fHiddenInfo = NULL;
210   fKinkIndexes[0] = t.fKinkIndexes[0];
211   fKinkIndexes[1] = t.fKinkIndexes[1];
212   fKinkIndexes[2] = t.fKinkIndexes[2];
213
214   fXatDCA=t.fXatDCA;
215   fYatDCA=t.fYatDCA;
216   fZatDCA=t.fZatDCA;
217
218   for(int i=0;i<9;i++)
219     fNominalTpcPoints[i] = t.fNominalTpcPoints[i];
220
221
222   fTrueMomentum = new AliFemtoThreeVector();
223   if(t.fTrueMomentum){
224     fTrueMomentum->SetX(t.fTrueMomentum->x());
225     fTrueMomentum->SetY(t.fTrueMomentum->y());
226     fTrueMomentum->SetZ(t.fTrueMomentum->z());}
227
228   fEmissionPoint = new AliFemtoLorentzVector();
229   if(t.fEmissionPoint){
230     fEmissionPoint->SetX(t.fEmissionPoint->x());
231     fEmissionPoint->SetY(t.fEmissionPoint->y());
232     fEmissionPoint->SetZ(t.fEmissionPoint->z());
233     fEmissionPoint->SetT(t.fEmissionPoint->e());
234   }
235
236   fPDGPid = t.fPDGPid;
237   fMass = t.fMass;
238  
239   fGlobalEmissionPoint = new AliFemtoThreeVector();
240   if(t.fGlobalEmissionPoint){
241     fGlobalEmissionPoint->SetX(t.fGlobalEmissionPoint->x());
242     fGlobalEmissionPoint->SetY(t.fGlobalEmissionPoint->y());
243     fGlobalEmissionPoint->SetZ(t.fGlobalEmissionPoint->z());
244     //fGlobalEmissionPoint->SetT(t.fGlobalEmissionPoint->e());
245     //  cout << "Created track " << this << endl;
246   }
247 }
248
249 AliFemtoTrack& AliFemtoTrack::operator=(const AliFemtoTrack& aTrack)
250 {
251   // assignment operator
252   if (this == &aTrack)
253     return *this;
254   fCharge = aTrack.fCharge;
255   fPidProbElectron = aTrack.fPidProbElectron;
256   fPidProbPion = aTrack.fPidProbPion;
257   fPidProbKaon = aTrack.fPidProbKaon;
258   fPidProbProton = aTrack.fPidProbProton;
259   fPidProbMuon=aTrack.fPidProbMuon;
260   fTofPionTime=aTrack.fTofPionTime;
261   fTofKaonTime=aTrack.fTofKaonTime;
262   fTofProtonTime=aTrack.fTofProtonTime;
263   fP = aTrack.fP;
264   fPt = aTrack.fPt;
265   fInnerMomentum = aTrack.fInnerMomentum;
266   fHelix = aTrack.fHelix;
267   fTrackId = aTrack.fTrackId;
268   fFlags=aTrack.fFlags;
269   fLabel=aTrack.fLabel;
270   fImpactD=aTrack.fImpactD;
271   fImpactDprim=aTrack.fImpactDprim;
272   fImpactDweak=aTrack.fImpactDweak;
273   fImpactDmat=aTrack.fImpactDmat;
274   fImpactZ=aTrack.fImpactZ;
275   fCdd=aTrack.fCdd;
276   fCdz=aTrack.fCdz;
277   fCzz=aTrack.fCzz;
278   fITSchi2=aTrack.fITSchi2;       
279   fITSncls=aTrack.fITSncls;        
280   fTPCchi2=aTrack.fTPCchi2;       
281   fTPCncls=aTrack.fTPCncls;       
282   fTPCnclsF=aTrack.fTPCnclsF;
283   fTPCsignal=aTrack.fTPCsignal;
284   fTPCsignalN=aTrack.fTPCsignalN;    
285   fTPCsignalS=aTrack.fTPCsignalS;  
286   fVTOF=aTrack.fVTOF;    
287   fNSigmaTPCPi=aTrack.fNSigmaTPCPi;    
288   fNSigmaTPCK=aTrack.fNSigmaTPCK;    
289   fNSigmaTPCP=aTrack.fNSigmaTPCP;    
290   fNSigmaTPCE=aTrack.fNSigmaTPCE;    
291   fNSigmaTOFPi=aTrack.fNSigmaTOFPi;    
292   fNSigmaTOFK=aTrack.fNSigmaTOFK;    
293   fNSigmaTOFP=aTrack.fNSigmaTOFP;    
294   fNSigmaTOFE=aTrack.fNSigmaTOFE;    
295   fClusters=aTrack.fClusters;
296   fShared=aTrack.fShared;
297   fNominalTpcEntrancePoint=aTrack.fNominalTpcEntrancePoint;
298   fNominalTpcExitPoint=aTrack.fNominalTpcExitPoint;
299   fKinkIndexes[0] = aTrack.fKinkIndexes[0];
300   fKinkIndexes[1] = aTrack.fKinkIndexes[1];
301   fKinkIndexes[2] = aTrack.fKinkIndexes[2];
302   //fTrueMomentum = aTrack.fTrueMomentum;
303   //fEmissionPoint(0), // Emission point coordinates
304   //fPDGPid(0),        // True PID of the particle
305   //  fGlobalEmissionPoint(0)
306   fMass = aTrack.fMass;
307   fPDGPid = aTrack.fPDGPid;
308
309   for(int i=0;i<6;i++) {
310     fHasPointOnITS[i]=false;
311   }
312
313   fXatDCA=aTrack.fXatDCA;
314   fYatDCA=aTrack.fYatDCA;
315   fZatDCA=aTrack.fZatDCA;
316
317   for(int i=0;i<9;i++)
318     fNominalTpcPoints[i] = aTrack.fNominalTpcPoints[i];
319
320   if (ValidHiddenInfo())
321     delete fHiddenInfo;
322   if (aTrack.ValidHiddenInfo())
323     fHiddenInfo = aTrack.GetHiddenInfo()->Clone();
324   else 
325     fHiddenInfo = NULL;
326
327
328   if(!fTrueMomentum && aTrack.fTrueMomentum)
329     fTrueMomentum = new AliFemtoThreeVector();
330   if(aTrack.fTrueMomentum){
331     fTrueMomentum->SetX(aTrack.fTrueMomentum->x());
332     fTrueMomentum->SetY(aTrack.fTrueMomentum->y());
333     fTrueMomentum->SetZ(aTrack.fTrueMomentum->z());}
334
335   if(!fEmissionPoint && aTrack.fEmissionPoint) 
336     fEmissionPoint = new AliFemtoLorentzVector();
337   if(aTrack.fEmissionPoint){
338     fEmissionPoint->SetX(aTrack.fEmissionPoint->x());
339     fEmissionPoint->SetY(aTrack.fEmissionPoint->y());
340     fEmissionPoint->SetZ(aTrack.fEmissionPoint->z());
341     fEmissionPoint->SetT(aTrack.fEmissionPoint->e());
342   }
343  
344   if(!fGlobalEmissionPoint && aTrack.fGlobalEmissionPoint)
345     fGlobalEmissionPoint = new AliFemtoThreeVector();
346   if(aTrack.fGlobalEmissionPoint){
347     fGlobalEmissionPoint->SetX(aTrack.fGlobalEmissionPoint->x());
348     fGlobalEmissionPoint->SetY(aTrack.fGlobalEmissionPoint->y());
349     fGlobalEmissionPoint->SetZ(aTrack.fGlobalEmissionPoint->z());
350     //fGlobalEmissionPoint->SetT(t.fGlobalEmissionPoint->e());
351     //  cout << "Created track " << this << endl;
352   }
353
354   return *this;
355 }
356
357 void AliFemtoTrack::SetCharge(const short& ch){fCharge=ch;}
358
359 void AliFemtoTrack::SetPidProbElectron(const float& x){fPidProbElectron = x;}
360 void AliFemtoTrack::SetPidProbPion(const float& x){fPidProbPion = x;}
361 void AliFemtoTrack::SetPidProbKaon(const float& x){fPidProbKaon = x;}
362 void AliFemtoTrack::SetPidProbProton(const float& x){fPidProbProton = x;}
363 void AliFemtoTrack::SetPidProbMuon(const float& x){fPidProbMuon = x;}
364 void AliFemtoTrack::SetTofExpectedTimes(const float& tpi, const float& tkn, const float& tpr){fTofPionTime = tpi; fTofKaonTime = tkn; fTofProtonTime = tpr; }
365  
366 void AliFemtoTrack::SetP(const AliFemtoThreeVector& p){fP = p;}
367 void AliFemtoTrack::SetPt(const float& pt){fPt = pt;} 
368 void AliFemtoTrack::SetInnerMomentum(const float& x){fInnerMomentum = x;} 
369 void AliFemtoTrack::SetHelix(const AliFmPhysicalHelixD& h){fHelix = h;}
370 void AliFemtoTrack::SetTrackId(const int & id) { fTrackId=id;}
371 void AliFemtoTrack::SetFlags(const long int &flags) {fFlags=flags;}
372 void AliFemtoTrack::SetLabel(const int &label) {fLabel=label;}
373 void AliFemtoTrack::SetImpactD(const float& aImpactD){fImpactD=aImpactD;}
374
375 void AliFemtoTrack::SetImpactDprim(const float& aImpactDprim){fImpactDprim=aImpactDprim;}
376 void AliFemtoTrack::SetImpactDweak(const float& aImpactDweak){fImpactDweak=aImpactDweak;}
377 void AliFemtoTrack::SetImpactDmat(const float& aImpactDmat){fImpactDmat=aImpactDmat;}
378
379 void AliFemtoTrack::SetImpactZ(const float& aImpactZ){fImpactZ=aImpactZ;}
380 void AliFemtoTrack::SetCdd(const float& aCdd){fCdd=aCdd;}
381 void AliFemtoTrack::SetCdz(const float& aCdz){fCdz=aCdz;}
382 void AliFemtoTrack::SetCzz(const float& aCzz){fCzz=aCzz;}
383 void AliFemtoTrack::SetITSchi2(const float& aITSchi2){fITSchi2=aITSchi2;}    
384 void AliFemtoTrack::SetITSncls(const int& aITSncls){fITSncls=aITSncls;}     
385 void AliFemtoTrack::SetTPCchi2(const float& aTPCchi2){fTPCchi2=aTPCchi2;}       
386 void AliFemtoTrack::SetTPCncls(const int& aTPCncls){fTPCncls=aTPCncls;}       
387 void AliFemtoTrack::SetTPCnclsF(const short& aTPCnclsF){fTPCnclsF=aTPCnclsF;}      
388 void AliFemtoTrack::SetTPCsignal(const float& aTPCsig){fTPCsignal=aTPCsig;}
389 void AliFemtoTrack::SetTPCsignalN(const short& aTPCsignalN){fTPCsignalN=aTPCsignalN;}    
390 void AliFemtoTrack::SetTPCsignalS(const float& aTPCsignalS){fTPCsignalS=aTPCsignalS;} 
391 void AliFemtoTrack::SetVTOF(const float& aVTOF){fVTOF=aVTOF;}
392 void AliFemtoTrack::SetNSigmaTPCPi(const float& aNSigmaTPCPi){fNSigmaTPCPi=aNSigmaTPCPi;}
393 void AliFemtoTrack::SetNSigmaTPCK(const float& aNSigmaTPCK){fNSigmaTPCK=aNSigmaTPCK;}
394 void AliFemtoTrack::SetNSigmaTPCP(const float& aNSigmaTPCP){fNSigmaTPCP=aNSigmaTPCP;}
395 void AliFemtoTrack::SetNSigmaTPCE(const float& aNSigmaTPCE){fNSigmaTPCE=aNSigmaTPCE;}
396 void AliFemtoTrack::SetNSigmaTOFPi(const float& aNSigmaTOFPi){fNSigmaTOFPi=aNSigmaTOFPi;}
397 void AliFemtoTrack::SetNSigmaTOFK(const float& aNSigmaTOFK){fNSigmaTOFK=aNSigmaTOFK;}
398 void AliFemtoTrack::SetNSigmaTOFP(const float& aNSigmaTOFP){fNSigmaTOFP=aNSigmaTOFP;}
399 void AliFemtoTrack::SetNSigmaTOFE(const float& aNSigmaTOFE){fNSigmaTOFE=aNSigmaTOFE;}
400 void AliFemtoTrack::SetSigmaToVertex(const float& aSigma){fSigmaToVertex=aSigma;} 
401
402 void AliFemtoTrack::SetXatDCA(const double& x) {fXatDCA=x;}
403 void AliFemtoTrack::SetYatDCA(const double& x) {fYatDCA=x;}
404 void AliFemtoTrack::SetZatDCA(const double& x) {fZatDCA=x;}
405
406
407 short AliFemtoTrack::Charge() const {return fCharge;}  
408 AliFemtoThreeVector AliFemtoTrack::P() const {return fP;}
409 float AliFemtoTrack::Pt() const {return fPt;}            
410 float AliFemtoTrack::InnerMomentum() const {return fInnerMomentum;}   
411 const AliFmPhysicalHelixD& AliFemtoTrack::Helix() const {return fHelix;}
412 int AliFemtoTrack::TrackId() const { return fTrackId; }
413 long int AliFemtoTrack::Flags() const {return fFlags;}
414 int AliFemtoTrack::Label()const {return fLabel;}
415 float AliFemtoTrack::ImpactD()const{return fImpactD;}
416
417 float AliFemtoTrack::ImpactDprim()const{return fImpactDprim;}
418 float AliFemtoTrack::ImpactDweak()const{return fImpactDweak;}
419 float AliFemtoTrack::ImpactDmat()const{return fImpactDmat;}
420
421 float AliFemtoTrack::ImpactZ()const{return fImpactZ;}
422 float AliFemtoTrack::Cdd() const{return fCdd;}
423 float AliFemtoTrack::Cdz() const{return fCdz;}
424 float AliFemtoTrack::Czz() const{return fCzz;} 
425 float AliFemtoTrack::ITSchi2() const{return fITSchi2;}    
426 int   AliFemtoTrack::ITSncls() const{return fITSncls;}     
427 float AliFemtoTrack::TPCchi2() const{return fTPCchi2;}       
428 int   AliFemtoTrack::TPCncls() const{return fTPCncls;}       
429 short AliFemtoTrack::TPCnclsF() const{return fTPCnclsF;}      
430 float AliFemtoTrack::TPCsignal() const{return fTPCsignal;}
431 short AliFemtoTrack::TPCsignalN() const{return fTPCsignalN;}    
432 float AliFemtoTrack::TPCsignalS() const{return fTPCsignalS;} 
433 float AliFemtoTrack::VTOF() const{return fVTOF;}
434 float AliFemtoTrack::NSigmaTPCPi() const{return fNSigmaTPCPi;}
435 float AliFemtoTrack::NSigmaTPCK() const{return fNSigmaTPCK;}
436 float AliFemtoTrack::NSigmaTPCP() const{return fNSigmaTPCP;}
437 float AliFemtoTrack::NSigmaTPCE() const{return fNSigmaTPCE;}
438 float AliFemtoTrack::NSigmaTOFPi() const{return fNSigmaTOFPi;}
439 float AliFemtoTrack::NSigmaTOFK() const{return fNSigmaTOFK;}
440 float AliFemtoTrack::NSigmaTOFP() const{return fNSigmaTOFP;}
441 float AliFemtoTrack::NSigmaTOFE() const{return fNSigmaTOFE;}
442 float AliFemtoTrack::SigmaToVertex() const{return fSigmaToVertex;} 
443 float AliFemtoTrack::TOFpionTime() const{return fTofPionTime;}
444 float AliFemtoTrack::TOFkaonTime() const{return fTofKaonTime;}
445 float AliFemtoTrack::TOFprotonTime() const{return fTofProtonTime;}
446
447 double AliFemtoTrack::XatDCA() const {return fXatDCA;}
448 double AliFemtoTrack::YatDCA() const {return fYatDCA;}
449 double AliFemtoTrack::ZatDCA() const {return fZatDCA;}
450
451 void AliFemtoTrack::SetHiddenInfo(AliFemtoHiddenInfo* aHiddenInfo) {fHiddenInfo=aHiddenInfo;}
452 bool AliFemtoTrack::ValidHiddenInfo() const { if (fHiddenInfo) return true; else return false; }
453 AliFemtoHiddenInfo* AliFemtoTrack::GetHiddenInfo() const {return fHiddenInfo;}
454   
455 AliFemtoTrack::~AliFemtoTrack()
456 {
457   // destructor
458   if (fHiddenInfo)
459     delete fHiddenInfo;
460
461   if(fTrueMomentum) delete fTrueMomentum;
462   if(fEmissionPoint) delete fEmissionPoint;
463   if(fGlobalEmissionPoint) delete fGlobalEmissionPoint;
464
465
466   //  cout << "Deleted track " << this << endl;
467 }
468
469 const TBits& AliFemtoTrack::TPCclusters() const {return fClusters;}
470 const TBits& AliFemtoTrack::TPCsharing()  const {return fShared;}
471
472 void AliFemtoTrack::SetTPCcluster(const short& aNBit, const Bool_t& aValue)
473 {
474   fClusters.SetBitNumber(aNBit, aValue);
475 }
476
477 void AliFemtoTrack::SetTPCshared(const short& aNBit, const Bool_t& aValue)
478 {
479   fShared.SetBitNumber(aNBit, aValue);
480 }
481
482 void AliFemtoTrack::SetTPCClusterMap(const TBits& aBits)
483 {
484   fClusters = aBits;
485 }
486 void AliFemtoTrack::SetTPCSharedMap(const TBits& aBits)
487 {
488   fShared = aBits;
489 }
490
491 void AliFemtoTrack::SetKinkIndexes(int points[3])
492 {
493   // Transfer the Kink indices
494   fKinkIndexes[0] = points[0];
495   fKinkIndexes[1] = points[1];
496   fKinkIndexes[2] = points[2];
497 }
498
499 void AliFemtoTrack::SetITSHitOnLayer(int i, bool val)
500 {
501   // Transfer ITS hit
502   fHasPointOnITS[i] = val;
503 }
504
505
506 int  AliFemtoTrack::KinkIndex(int aIndex) const
507 {
508   // Return Kink index
509   if ((aIndex <3) && (aIndex>=0))
510     return fKinkIndexes[aIndex];
511   else
512     return 0;
513 }
514
515 bool AliFemtoTrack::HasPointOnITSLayer(int aIndex) const
516 {
517   // Return if i-th ITS layer had a hit for this track
518   if ((aIndex <6) && (aIndex>=0))
519     return fHasPointOnITS[aIndex];
520   else
521     return false;
522 }
523
524 // void AliFemtoTrack::SetXTPC(const AliFemtoThreeVector& aXTPC)
525 // {
526 //   fXTPC = aXTPC;
527 // }
528
529 // void AliFemtoTrack::SetXTPC(double *aXTPC)
530 // {
531 //   fXTPC.setX(aXTPC[0]);
532 //   fXTPC.setY(aXTPC[1]);
533 //   fXTPC.setZ(aXTPC[2]);
534 // }
535
536 // AliFemtoThreeVector AliFemtoTrack::XTPC() const
537 // {
538 //   return fXTPC;
539 // }
540
541 const AliFemtoThreeVector& AliFemtoTrack::NominalTpcExitPoint() const
542 {
543   return fNominalTpcExitPoint;
544 }
545
546 const AliFemtoThreeVector& AliFemtoTrack::NominalTpcPoint(int i) const
547 {
548   if(i<0)
549     return fNominalTpcPoints[0];
550   if(i>8)
551     return fNominalTpcPoints[8];
552   return fNominalTpcPoints[i];
553 }
554
555 const AliFemtoThreeVector& AliFemtoTrack::NominalTpcEntrancePoint() const
556 {
557   return fNominalTpcEntrancePoint;
558 }
559
560 void AliFemtoTrack::SetNominalTPCEntrancePoint(const AliFemtoThreeVector& aXTPC)
561 {
562   fNominalTpcEntrancePoint = aXTPC;
563 }
564 void AliFemtoTrack::SetNominalTPCEntrancePoint(double *aXTPC)
565 {
566   // Store the nominal TPC entrance point
567   fNominalTpcEntrancePoint.SetX(aXTPC[0]);
568   fNominalTpcEntrancePoint.SetY(aXTPC[1]);
569   fNominalTpcEntrancePoint.SetZ(aXTPC[2]);
570 }
571
572 void AliFemtoTrack::SetNominalTPCPoints(double **aXTPC)
573 {
574   // Store the nominal TPC points
575   for(int i=0;i<9;i++)
576     {
577       fNominalTpcPoints[i].SetX(aXTPC[i][0]);
578       fNominalTpcPoints[i].SetY(aXTPC[i][1]);
579       fNominalTpcPoints[i].SetZ(aXTPC[i][2]);
580     }
581 }
582
583 void AliFemtoTrack::SetNominalTPCExitPoint(const AliFemtoThreeVector& aXTPC)
584 {
585   fNominalTpcExitPoint = aXTPC;
586 }
587 void AliFemtoTrack::SetNominalTPCExitPoint(double *aXTPC)
588 {
589   // Store the nominal TPC exit point
590   fNominalTpcExitPoint.SetX(aXTPC[0]);
591   fNominalTpcExitPoint.SetY(aXTPC[1]);
592   fNominalTpcExitPoint.SetZ(aXTPC[2]);
593 }
594
595
596
597
598 //_____________________________________________
599 AliFemtoThreeVector   *AliFemtoTrack::GetTrueMomentum() const
600 {
601   return fTrueMomentum;
602 }
603 //_____________________________________________
604 AliFemtoLorentzVector *AliFemtoTrack::GetEmissionPoint() const
605 {
606   return fEmissionPoint;
607 }
608 //_____________________________________________
609 Int_t                  AliFemtoTrack::GetPDGPid() const
610 {
611   return fPDGPid;
612 }
613 //_____________________________________________
614 Double_t                  AliFemtoTrack::GetMass() const
615 {
616   return fMass;
617 }
618 //_____________________________________________
619 void                   AliFemtoTrack::SetTrueMomentum(AliFemtoThreeVector *aMom)
620 {
621   // Set momentum from vector
622   if (fTrueMomentum) {
623     fTrueMomentum->SetX(aMom->x());
624     fTrueMomentum->SetY(aMom->y());
625     fTrueMomentum->SetZ(aMom->z());
626   }
627   else {
628     fTrueMomentum = new AliFemtoThreeVector(*aMom);
629   }
630 }
631 //_____________________________________________
632 void                   AliFemtoTrack::SetTrueMomentum(const AliFemtoThreeVector& aMom)
633 {
634   // Set momentum from vector
635   if (fTrueMomentum) {
636     fTrueMomentum->SetX(aMom.x());
637     fTrueMomentum->SetY(aMom.y());
638     fTrueMomentum->SetZ(aMom.z());
639   }
640   else {
641     fTrueMomentum = new AliFemtoThreeVector();
642     *fTrueMomentum = aMom;
643   }
644 }
645 //_____________________________________________
646 void                   AliFemtoTrack::SetTrueMomentum(Double_t aPx, Double_t aPy, Double_t aPz)
647 {
648   // Set momentum from components
649   if (!fTrueMomentum) fTrueMomentum = new AliFemtoThreeVector();
650     fTrueMomentum->SetX(aPx);
651     fTrueMomentum->SetY(aPy);
652     fTrueMomentum->SetZ(aPz);
653 }
654 //_____________________________________________
655 void                   AliFemtoTrack::SetEmissionPoint(AliFemtoLorentzVector *aPos)
656 {
657   // Set position from vector
658   if (fEmissionPoint) {
659     fEmissionPoint->SetX(aPos->px());
660     fEmissionPoint->SetY(aPos->py());
661     fEmissionPoint->SetZ(aPos->pz());
662     fEmissionPoint->SetT(aPos->e());
663   }
664   else {
665     fEmissionPoint = new AliFemtoLorentzVector(*aPos);
666   }
667 }
668 //_____________________________________________
669 void                   AliFemtoTrack::SetEmissionPoint(const AliFemtoLorentzVector& aPos)
670 {
671   // Set position from vector
672   if (fEmissionPoint) {
673     fEmissionPoint->SetX(aPos.px());
674     fEmissionPoint->SetY(aPos.py());
675     fEmissionPoint->SetZ(aPos.pz());
676     fEmissionPoint->SetT(aPos.e());
677   }
678   else {
679     fEmissionPoint = new AliFemtoLorentzVector();
680     *fEmissionPoint = aPos;
681   }
682 }
683 //_____________________________________________
684 void                   AliFemtoTrack::SetPDGPid(Int_t aPid)
685 {
686   fPDGPid = aPid;
687 }
688 //_____________________________________________
689 void                   AliFemtoTrack::SetMass(Double_t aMass)
690 {
691   fMass = aMass;
692 }
693 //_____________________________________________
694 void                   AliFemtoTrack::SetEmissionPoint(Double_t aRx, Double_t aRy, Double_t aRz, Double_t aT)
695 {
696   // Set position from components
697   if (fEmissionPoint) {
698     fEmissionPoint->SetX(aRx);
699     fEmissionPoint->SetY(aRy);
700     fEmissionPoint->SetZ(aRz);
701     fEmissionPoint->SetT(aT);
702   }
703   else {
704     fEmissionPoint = new AliFemtoLorentzVector(aRx, aRy, aRz, aT); 
705   }
706 }
707
708 //_____________________________________________
709 AliFemtoThreeVector *AliFemtoTrack::GetGlobalEmissionPoint() const
710 {
711   return fGlobalEmissionPoint;
712 }
713 //_____________________________________________
714 void                   AliFemtoTrack::SetGlobalEmissionPoint(const AliFemtoThreeVector& aPos)
715 {
716   // set position from vector
717   if (fGlobalEmissionPoint) {
718     fGlobalEmissionPoint->SetX(aPos.x());
719     fGlobalEmissionPoint->SetY(aPos.y());
720     fGlobalEmissionPoint->SetZ(aPos.z());
721   }
722   else {
723     fGlobalEmissionPoint = new AliFemtoThreeVector();
724     *fGlobalEmissionPoint = aPos;
725   }
726 }
727 //_____________________________________________
728 void                   AliFemtoTrack::SetGlobalEmissionPoint(Double_t aRx, Double_t aRy, Double_t aRz)
729 {
730   // Set position from components
731   if (fGlobalEmissionPoint) {
732     fGlobalEmissionPoint->SetX(aRx);
733     fGlobalEmissionPoint->SetY(aRy);
734     fGlobalEmissionPoint->SetZ(aRz);
735   }
736   else {
737     fGlobalEmissionPoint = new AliFemtoThreeVector(aRx, aRy, aRz); 
738   }
739 }
740 //_______________________