Line data Source code
1 : /**************************************************************************
2 : * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 : * *
4 : * Author: The ALICE Off-line Project. *
5 : * Contributors are mentioned in the code where appropriate. *
6 : * *
7 : * Permission to use, copy, modify and distribute this software and its *
8 : * documentation strictly for non-commercial purposes is hereby granted *
9 : * without fee, provided that the above copyright notice appears in all *
10 : * copies and that both the copyright notice and this permission notice *
11 : * appear in the supporting documentation. The authors make no claims *
12 : * about the suitability of this software for any purpose. It is *
13 : * provided "as is" without express or implied warranty. *
14 : **************************************************************************/
15 :
16 : /* $Id$ */
17 :
18 : //-----------------------------------------------------------------------------
19 : // Class AliMFTTrack
20 : //-------------------
21 : // Description of an ALICE Standalone MFT track
22 : //-------------------
23 : // Contact author: raphael.tieulent@cern.ch
24 : //-----------------------------------------------------------------------------
25 :
26 : #include "TObjArray.h"
27 : #include "TMath.h"
28 :
29 : #include "AliLog.h"
30 :
31 : #include "AliMFTTrack.h"
32 : #include "AliMFTTrackParam.h"
33 : #include "AliMFTCATrack.h"
34 : #include "AliMFTCACell.h"
35 :
36 :
37 : /// \cond CLASSIMP
38 12 : ClassImp(AliMFTTrack); // Class implementation in ROOT context
39 : /// \endcond
40 :
41 :
42 : //=============================================================================================
43 :
44 0 : AliMFTTrack::AliMFTTrack():TObject(),
45 0 : fChi2(0.),
46 0 : fTrackParamAtCluster(NULL),
47 0 : fTrackParamAtVertex(NULL),
48 0 : fCATrack(NULL),
49 0 : fTrackID(-1),
50 0 : fP(0),
51 0 : fTheta(0),
52 0 : fPhi(0),
53 0 : fPt(0)
54 0 : {
55 : /// Default constructor
56 :
57 0 : }
58 :
59 : //=============================================================================================
60 :
61 0 : AliMFTTrack::AliMFTTrack(AliMFTCATrack *catrack):TObject(),
62 0 : fChi2(0.),
63 0 : fTrackParamAtCluster(new TObjArray(10)),
64 0 : fTrackParamAtVertex(NULL),
65 0 : fCATrack(catrack),
66 0 : fTrackID(-1),
67 0 : fP(0),
68 0 : fTheta(0),
69 0 : fPhi(0),
70 0 : fPt(0)
71 0 : {
72 0 : catrack->Print();
73 : /// Constructor from a AliMFTCATrack
74 0 : fTrackParamAtCluster->SetOwner(kTRUE);
75 :
76 0 : Int_t nCells = catrack->GetNcells();
77 : // Create Empty Track Parameter objects
78 : Double_t *caHit;
79 : AliMFTCACell * caCell;
80 0 : AliInfo(Form("Nb of Cells in the track = %d ",nCells));
81 0 : for (Int_t iCell = 0 ; iCell < nCells ; iCell++) {
82 0 : caCell = catrack->GetCell(iCell);
83 0 : caHit = caCell->GetHit2();
84 :
85 0 : AliMFTTrackParam trackParam;
86 0 : trackParam.SetInverseTransverseMomentum(1.e-6); // infinite momentum
87 0 : trackParam.SetClusterPos(caHit[0], caHit[1], caHit[2]);
88 :
89 0 : AddTrackParamAtCluster(trackParam);
90 :
91 0 : if(iCell==nCells-1) {
92 0 : AliMFTTrackParam trackParam2;
93 0 : caHit = caCell->GetHit1();
94 0 : trackParam2.SetInverseTransverseMomentum(1.e-6); // infinite momentum
95 0 : trackParam2.SetClusterPos(caHit[0], caHit[1], caHit[2]);
96 :
97 0 : AddTrackParamAtCluster(trackParam2);
98 0 : }
99 :
100 0 : }
101 :
102 0 : AliInfo(Form("Nb of Track param objects = %d ",fTrackParamAtCluster->GetEntries()));
103 0 : }
104 : //__________________________________________________________________________
105 : AliMFTTrack::AliMFTTrack(const AliMFTTrack& track)
106 0 : : TObject(track),
107 0 : fChi2(track.fChi2),
108 0 : fTrackParamAtCluster(NULL),
109 0 : fTrackParamAtVertex(NULL),
110 0 : fCATrack(track.fCATrack),
111 0 : fTrackID(track.fTrackID),
112 0 : fP(track.fP),
113 0 : fTheta(track.fTheta),
114 0 : fPhi(track.fPhi),
115 0 : fPt(track.fPt)
116 :
117 0 : {
118 : ///copy constructor
119 :
120 : // necessary to make a copy of the objects and not only the pointers in TObjArray.
121 0 : if (track.fTrackParamAtCluster) {
122 0 : fTrackParamAtCluster = new TObjArray(track.fTrackParamAtCluster->GetSize());
123 0 : fTrackParamAtCluster->SetOwner(kTRUE);
124 0 : for (Int_t i = 0; i < track.GetNClusters(); i++)
125 0 : fTrackParamAtCluster->AddLast(new AliMFTTrackParam(*static_cast<AliMFTTrackParam*>(track.fTrackParamAtCluster->UncheckedAt(i))));
126 0 : }
127 :
128 :
129 : // copy track parameters at vertex if any
130 0 : if (track.fTrackParamAtVertex) fTrackParamAtVertex = new AliMFTTrackParam(*(track.fTrackParamAtVertex));
131 :
132 0 : }
133 : //__________________________________________________________________________
134 : AliMFTTrack & AliMFTTrack::operator=(const AliMFTTrack& track)
135 : {
136 : /// Asignment operator
137 : // check assignement to self
138 0 : if (this == &track)
139 0 : return *this;
140 :
141 : // base class assignement
142 0 : TObject::operator=(track);
143 :
144 : // clear memory
145 0 : Clear();
146 :
147 : // necessary to make a copy of the objects and not only the pointers in TObjArray
148 0 : if (track.fTrackParamAtCluster) {
149 0 : fTrackParamAtCluster = new TObjArray(track.fTrackParamAtCluster->GetSize());
150 0 : fTrackParamAtCluster->SetOwner(kTRUE);
151 0 : for (Int_t i = 0; i < track.GetNClusters(); i++)
152 0 : fTrackParamAtCluster->AddLast(new AliMFTTrackParam(*static_cast<AliMFTTrackParam*>(track.fTrackParamAtCluster->UncheckedAt(i))));
153 0 : }
154 :
155 :
156 : // copy track parameters at vertex if any
157 0 : if (track.fTrackParamAtVertex) {
158 0 : if (fTrackParamAtVertex) *fTrackParamAtVertex = *(track.fTrackParamAtVertex);
159 0 : else fTrackParamAtVertex = new AliMFTTrackParam(*(track.fTrackParamAtVertex));
160 : }
161 :
162 0 : fChi2 = track.fChi2;
163 0 : fTrackID = track.fTrackID;
164 0 : fCATrack = track.fCATrack;
165 0 : fP=track.fP;
166 0 : fTheta=track.fTheta;
167 0 : fPhi=track.fPhi;
168 0 : fPt=track.fPt;
169 :
170 0 : return *this;
171 0 : }
172 :
173 : //=============================================================================================
174 :
175 :
176 0 : AliMFTTrack::~AliMFTTrack() {
177 :
178 0 : delete fTrackParamAtCluster;
179 0 : delete fTrackParamAtVertex;
180 0 : delete fCATrack;
181 :
182 0 : }
183 :
184 : //__________________________________________________________________________
185 : void AliMFTTrack::AddTrackParamAtCluster(const AliMFTTrackParam &trackParam)
186 : {
187 :
188 : // // check whether track parameters are given at the correct cluster z position
189 : // if (TMath::Abs(cluster.GetZ() - trackParam.GetZ())>1.e-5) { // AU
190 : // AliError("track parameters are given at a different z position than the one of the associated cluster");
191 : // return;
192 : // }
193 :
194 : // add parameters to the array of track parameters
195 0 : if (!fTrackParamAtCluster) {
196 0 : fTrackParamAtCluster = new TObjArray(10);
197 0 : fTrackParamAtCluster->SetOwner(kTRUE);
198 0 : }
199 0 : AliMFTTrackParam* trackParamAtCluster = new AliMFTTrackParam(trackParam);
200 0 : fTrackParamAtCluster->AddLast(trackParamAtCluster);
201 :
202 : // sort the array of track parameters
203 : // fTrackParamAtCluster->Sort();
204 0 : }
205 :
206 : //__________________________________________________________________________
207 : TObjArray* AliMFTTrack::GetTrackParamAtCluster() const
208 : {
209 : /// return array of track parameters at cluster (create it if needed)
210 0 : if (!fTrackParamAtCluster) {
211 0 : fTrackParamAtCluster = new TObjArray(10);
212 0 : fTrackParamAtCluster->SetOwner(kTRUE);
213 0 : }
214 0 : return fTrackParamAtCluster;
215 0 : }
216 :
217 : //__________________________________________________________________________
218 : Int_t AliMFTTrack::GetNDF() const
219 : {
220 : /// return the number of degrees of freedom
221 :
222 0 : Int_t ndf = 2 * GetNClusters() - 5;
223 0 : return (ndf > 0) ? ndf : 0;
224 : }
225 :
226 : //__________________________________________________________________________
227 : Double_t AliMFTTrack::GetNormalizedChi2() const
228 : {
229 : /// return the chi2 value divided by the number of degrees of freedom (or FLT_MAX if ndf <= 0)
230 :
231 0 : Double_t ndf = (Double_t) GetNDF();
232 0 : return (ndf > 0.) ? fChi2 / ndf : 1e6;
233 : }
234 :
235 : //_____________________________________________-
236 : void AliMFTTrack::Print(Option_t*) const
237 : {
238 : /// Printing Track information
239 :
240 0 : AliInfo(Form("Chi2 = %.1f", fChi2));
241 0 : AliInfo(Form("Chi2/ndf = %.2f", GetNormalizedChi2()));
242 0 : AliInfo(Form("No.Clusters = %d", GetNClusters()));
243 0 : AliInfo(Form("MC label = %d", fTrackID));
244 0 : if (fTrackParamAtCluster) fTrackParamAtCluster->Last()->Print("FULL");
245 0 : }
246 :
247 : //__________________________________________________________________________
248 : void AliMFTTrack::Clear(Option_t* /*opt*/)
249 : {
250 : /// Clear arrays
251 : // delete fTrackParamAtCluster; fTrackParamAtCluster = 0x0;
252 : // delete fTrackParamAtVertex; fTrackParamAtVertex = 0x0;
253 0 : }
254 :
255 :
256 :
|