Conding conventions violation and Doxygen comments (Philippe Pillot)
[u/mrichter/AliRoot.git] / MUON / AliMUONTrack.cxx
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 //
20 // Reconstructed track
21 // in
22 // ALICE
23 // dimuon
24 // spectrometer
25 //
26 ///////////////////////////////////////////////////
27
28 #include <stdlib.h> // for exit()
29 #include <Riostream.h>
30
31 #include "AliMUONTrack.h"
32
33 #include "AliMUONTrackParam.h" 
34 #include "AliMUONHitForRec.h" 
35 #include "AliMUONSegment.h" 
36 #include "AliMUONConstants.h"
37
38 #include "AliLog.h"
39
40 #include <TMath.h>
41
42 ClassImp(AliMUONTrack) // Class implementation in ROOT context
43
44 //__________________________________________________________________________
45 AliMUONTrack::AliMUONTrack()
46   : TObject(),
47     fTrackParamAtVertex(),
48     fTrackParamAtHit(0x0),
49     fHitForRecAtHit(0x0),
50     fNTrackHits(0),
51     fFitFMin(-1.),
52     fMatchTrigger(kFALSE),
53     fChi2MatchTrigger(0.),
54     fTrackID(0)
55 {
56   /// Default constructor
57 }
58
59   //__________________________________________________________________________
60 AliMUONTrack::AliMUONTrack(AliMUONSegment* BegSegment, AliMUONSegment* EndSegment)
61   : TObject(),
62     fTrackParamAtVertex(),
63     fTrackParamAtHit(0x0),
64     fHitForRecAtHit(0x0),
65     fNTrackHits(0),
66     fFitFMin(-1.),
67     fMatchTrigger(kFALSE),
68     fChi2MatchTrigger(0.),
69     fTrackID(0)
70 {
71   /// Constructor from two Segment's
72
73   fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);
74   fHitForRecAtHit = new TClonesArray("AliMUONHitForRec",10);
75   
76   if (BegSegment) { //AZ
77     AddTrackParamAtHit(0,BegSegment->GetHitForRec1());
78     AddTrackParamAtHit(0,BegSegment->GetHitForRec2());
79     AddTrackParamAtHit(0,EndSegment->GetHitForRec1());
80     AddTrackParamAtHit(0,EndSegment->GetHitForRec2());
81     fTrackParamAtHit->Sort(); // sort TrackParamAtHit according to increasing Z
82   }
83 }
84
85   //__________________________________________________________________________
86 AliMUONTrack::AliMUONTrack(AliMUONSegment* Segment, AliMUONHitForRec* HitForRec)
87   : TObject(),
88     fTrackParamAtVertex(),
89     fTrackParamAtHit(0x0),
90     fHitForRecAtHit(0x0),
91     fNTrackHits(0),
92     fFitFMin(-1.),
93     fMatchTrigger(kFALSE),
94     fChi2MatchTrigger(0.),
95     fTrackID(0)
96 {
97   /// Constructor from one Segment and one HitForRec
98
99   fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);
100   fHitForRecAtHit = new TClonesArray("AliMUONHitForRec",10);
101   
102   AddTrackParamAtHit(0,Segment->GetHitForRec1());
103   AddTrackParamAtHit(0,Segment->GetHitForRec2());
104   AddTrackParamAtHit(0,HitForRec);
105   fTrackParamAtHit->Sort(); // sort TrackParamAtHit according to increasing Z
106 }
107
108   //__________________________________________________________________________
109 AliMUONTrack::~AliMUONTrack()
110 {
111   /// Destructor
112   if (fTrackParamAtHit) {
113     // delete the TClonesArray of pointers to TrackParam
114     delete fTrackParamAtHit;
115     fTrackParamAtHit = NULL;
116   }
117
118   if (fHitForRecAtHit) {
119     // delete the TClonesArray of pointers to HitForRec
120     delete fHitForRecAtHit;
121     fHitForRecAtHit = NULL;
122   }
123 }
124
125   //__________________________________________________________________________
126 AliMUONTrack::AliMUONTrack (const AliMUONTrack& theMUONTrack)
127   : TObject(theMUONTrack),
128     fTrackParamAtVertex(theMUONTrack.fTrackParamAtVertex),
129     fTrackParamAtHit(0x0),
130     fHitForRecAtHit(0x0),
131     fNTrackHits(theMUONTrack.fNTrackHits),
132     fFitFMin(theMUONTrack.fFitFMin),
133     fMatchTrigger(theMUONTrack.fMatchTrigger),
134     fChi2MatchTrigger(theMUONTrack.fChi2MatchTrigger),
135     fTrackID(theMUONTrack.fTrackID)
136 {
137   ///copy constructor
138   Int_t maxIndex = 0;
139   
140   // necessary to make a copy of the objects and not only the pointers in TClonesArray.
141   if (theMUONTrack.fTrackParamAtHit) {
142     maxIndex = (theMUONTrack.fTrackParamAtHit)->GetEntriesFast();
143     fTrackParamAtHit  =  new TClonesArray("AliMUONTrackParam",maxIndex);
144     for (Int_t index = 0; index < maxIndex; index++) {
145       new ((*fTrackParamAtHit)[index]) AliMUONTrackParam(*(AliMUONTrackParam*)theMUONTrack.fTrackParamAtHit->At(index));
146     }
147   }  
148
149   // necessary to make a copy of the objects and not only the pointers in TClonesArray.
150   if (theMUONTrack.fHitForRecAtHit) {
151     maxIndex = (theMUONTrack.fHitForRecAtHit)->GetEntriesFast();
152     fHitForRecAtHit  =  new TClonesArray("AliMUONHitForRec",maxIndex);
153     for (Int_t index = 0; index < maxIndex; index++) {
154       new ((*fHitForRecAtHit)[index]) AliMUONHitForRec(*(AliMUONHitForRec*)theMUONTrack.fHitForRecAtHit->At(index));
155     }
156   }  
157
158 }
159
160   //__________________________________________________________________________
161 AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& theMUONTrack)
162 {
163   /// Asignment operator
164   // check assignement to self
165   if (this == &theMUONTrack)
166     return *this;
167
168   // base class assignement
169   TObject::operator=(theMUONTrack);
170
171   fTrackParamAtVertex = theMUONTrack.fTrackParamAtVertex;
172
173   Int_t maxIndex = 0;
174   
175   // necessary to make a copy of the objects and not only the pointers in TClonesArray.
176   fTrackParamAtHit = 0;
177   if (theMUONTrack.fTrackParamAtHit) {
178     fTrackParamAtHit  =  new TClonesArray("AliMUONTrackParam",10);
179     maxIndex = (theMUONTrack.fTrackParamAtHit)->GetEntriesFast();
180     for (Int_t index = 0; index < maxIndex; index++) {
181       new ((*fTrackParamAtHit)[fTrackParamAtHit->GetEntriesFast()])
182         AliMUONTrackParam(*(AliMUONTrackParam*)(theMUONTrack.fTrackParamAtHit)->At(index));
183     }
184   }  
185
186   // necessary to make a copy of the objects and not only the pointers in TClonesArray.
187   fHitForRecAtHit = 0;
188   if (theMUONTrack.fHitForRecAtHit) {
189     fHitForRecAtHit  =  new TClonesArray("AliMUONHitForRec",10);
190     maxIndex = (theMUONTrack.fHitForRecAtHit)->GetEntriesFast();
191     for (Int_t index = 0; index < maxIndex; index++) {
192       new ((*fHitForRecAtHit)[fHitForRecAtHit->GetEntriesFast()])
193         AliMUONHitForRec(*(AliMUONHitForRec*)(theMUONTrack.fHitForRecAtHit)->At(index));
194     }
195   }  
196   
197   fNTrackHits         =  theMUONTrack.fNTrackHits;
198   fFitFMin            =  theMUONTrack.fFitFMin;
199   fMatchTrigger       =  theMUONTrack.fMatchTrigger;
200   fChi2MatchTrigger   =  theMUONTrack.fChi2MatchTrigger;
201   fTrackID            =  theMUONTrack.fTrackID;
202
203   return *this;
204 }
205
206   //__________________________________________________________________________
207 void AliMUONTrack::AddTrackParamAtHit(AliMUONTrackParam *trackParam, AliMUONHitForRec *hitForRec) 
208 {
209   /// Add TrackParamAtHit if "trackParam" != NULL else create empty TrackParamAtHit
210   /// Update link to HitForRec if "hitForRec" != NULL
211   if (!fTrackParamAtHit) {
212     fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);  
213     fNTrackHits = 0;
214   }
215   AliMUONTrackParam* trackParamAtHit;
216   if (trackParam) trackParamAtHit = new ((*fTrackParamAtHit)[fNTrackHits]) AliMUONTrackParam(*trackParam);
217   else trackParamAtHit = new ((*fTrackParamAtHit)[fNTrackHits]) AliMUONTrackParam();
218   if (hitForRec) trackParamAtHit->SetHitForRecPtr(hitForRec);
219   fNTrackHits++;
220 }
221
222   //__________________________________________________________________________
223 void AliMUONTrack::AddHitForRecAtHit(const AliMUONHitForRec *hitForRec) 
224 {
225   /// Add hitForRec to the array of hitForRec at hit
226   if (!fHitForRecAtHit)
227     fHitForRecAtHit = new TClonesArray("AliMUONHitForRec",10); 
228   
229   if (!hitForRec)
230     AliFatal("AliMUONTrack::AddHitForRecAtHit: hitForRec == NULL");
231   
232   new ((*fHitForRecAtHit)[fHitForRecAtHit->GetEntriesFast()]) AliMUONHitForRec(*hitForRec);
233 }
234
235   //__________________________________________________________________________
236 Bool_t* AliMUONTrack::CompatibleTrack(AliMUONTrack * Track, Double_t Sigma2Cut) const
237 {
238   /// Return kTRUE/kFALSE for each chamber if hit is compatible or not 
239   TClonesArray *hitArray, *thisHitArray;
240   AliMUONHitForRec *hit, *thisHit;
241   Int_t chamberNumber;
242   Float_t deltaZ;
243   Float_t deltaZMax = 1.; // 1 cm
244   Float_t chi2 = 0;
245   Bool_t *nCompHit = new Bool_t[AliMUONConstants::NTrackingCh()]; 
246
247   for ( Int_t ch = 0; ch < AliMUONConstants::NTrackingCh(); ch++) {
248     nCompHit[ch] = kFALSE;
249   }
250
251   thisHitArray = this->GetHitForRecAtHit();
252
253   hitArray =  Track->GetHitForRecAtHit();
254
255   for (Int_t iHthis = 0; iHthis < thisHitArray->GetEntriesFast(); iHthis++) {
256     thisHit = (AliMUONHitForRec*) thisHitArray->At(iHthis);
257     chamberNumber = thisHit->GetChamberNumber();
258     if (chamberNumber < 0 || chamberNumber > AliMUONConstants::NTrackingCh()) continue; 
259     nCompHit[chamberNumber] = kFALSE;
260     for (Int_t iH = 0; iH < hitArray->GetEntriesFast(); iH++) {
261       hit = (AliMUONHitForRec*) hitArray->At(iH);
262       deltaZ = TMath::Abs(thisHit->GetZ() - hit->GetZ());
263       chi2 = thisHit->NormalizedChi2WithHitForRec(hit,Sigma2Cut); // set cut to 4 sigmas
264       if (chi2 < 3. && deltaZ < deltaZMax) {
265         nCompHit[chamberNumber] = kTRUE;
266         break;
267       }
268     }  
269   }
270   
271   return nCompHit;
272 }
273
274   //__________________________________________________________________________
275 Int_t AliMUONTrack::HitsInCommon(AliMUONTrack* Track) const
276 {
277   /// Returns the number of hits in common between the current track ("this")
278   /// and the track pointed to by "Track".
279   Int_t hitsInCommon = 0;
280   AliMUONTrackParam *trackParamAtHit1, *trackParamAtHit2;
281   // Loop over hits of first track
282   trackParamAtHit1 = (AliMUONTrackParam*) this->fTrackParamAtHit->First();
283   while (trackParamAtHit1) {
284     // Loop over hits of second track
285     trackParamAtHit2 = (AliMUONTrackParam*) Track->fTrackParamAtHit->First();
286     while (trackParamAtHit2) {
287       // Increment "hitsInCommon" if both TrackParamAtHits point to the same HitForRec
288       if ((trackParamAtHit1->GetHitForRecPtr()) == (trackParamAtHit2->GetHitForRecPtr())) hitsInCommon++;
289       trackParamAtHit2 = (AliMUONTrackParam*) Track->fTrackParamAtHit->After(trackParamAtHit2);
290     } // trackParamAtHit2
291     trackParamAtHit1 = (AliMUONTrackParam*) this->fTrackParamAtHit->After(trackParamAtHit1);
292   } // trackParamAtHit1
293   return hitsInCommon;
294 }
295
296   //__________________________________________________________________________
297 void AliMUONTrack::RecursiveDump(void) const
298 {
299   /// Recursive dump of AliMUONTrack, i.e. with dump of TrackParamAtHit's and attached HitForRec's
300   AliMUONTrackParam *trackParamAtHit;
301   AliMUONHitForRec *hitForRec;
302   cout << "Recursive dump of Track: " << this << endl;
303   // Track
304   this->Dump();
305   for (Int_t trackHitIndex = 0; trackHitIndex < fNTrackHits; trackHitIndex++) {
306     trackParamAtHit = (AliMUONTrackParam*) ((*fTrackParamAtHit)[trackHitIndex]);
307     // TrackHit
308     cout << "TrackParamAtHit: " << trackParamAtHit << " (index: " << trackHitIndex << ")" << endl;
309     trackParamAtHit->Dump();
310     hitForRec = trackParamAtHit->GetHitForRecPtr();
311     // HitForRec
312     cout << "HitForRec: " << hitForRec << endl;
313     hitForRec->Dump();
314   }
315   return;
316 }
317   
318 //_____________________________________________-
319 void AliMUONTrack::Print(Option_t* opt) const
320 {
321   /// Printing Track information 
322   /// "full" option for printing all the information about the track
323   TString sopt(opt);
324   sopt.ToUpper();
325  
326   if ( sopt.Contains("FULL") ) { 
327     cout << "<AliMUONTrack> No.Clusters=" << setw(2)   << GetNTrackHits() << 
328       //      ", Bending P="<< setw(8) << setprecision(5)      << 1./GetInverseBendingMomentum() << 
329       //", NonBendSlope=" << setw(8) << setprecision(5)  << GetNonBendingSlope()*180./TMath::Pi() <<
330       //", BendSlope=" << setw(8) << setprecision(5)     << GetBendingSlope()*180./TMath::Pi() <<
331       ", Match2Trig=" << setw(1) << GetMatchTrigger()  << 
332       ", Chi2-tracking-trigger=" << setw(8) << setprecision(5) <<  GetChi2MatchTrigger() << endl ;
333     GetTrackParamAtHit()->First()->Print("full");
334   }
335   else {
336     cout << "<AliMUONTrack>";
337     GetTrackParamAtHit()->First()->Print("");
338
339   }
340     
341 }