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