4ee93923457c3e09af5e445f17d67c3c606bae88
[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 /// \cond CLASSIMP
43 ClassImp(AliMUONTrack) // Class implementation in ROOT context
44 /// \endcond
45
46 //__________________________________________________________________________
47 AliMUONTrack::AliMUONTrack()
48   : TObject(),
49     fTrackParamAtVertex(),
50     fTrackParamAtHit(0x0),
51     fHitForRecAtHit(0x0),
52     fNTrackHits(0),
53     fFitFMin(-1.),
54     fMatchTrigger(kFALSE),
55     fChi2MatchTrigger(0.),
56     fTrackID(0)
57 {
58   /// Default constructor
59 }
60
61   //__________________________________________________________________________
62 AliMUONTrack::AliMUONTrack(AliMUONSegment* BegSegment, AliMUONSegment* EndSegment)
63   : TObject(),
64     fTrackParamAtVertex(),
65     fTrackParamAtHit(0x0),
66     fHitForRecAtHit(0x0),
67     fNTrackHits(0),
68     fFitFMin(-1.),
69     fMatchTrigger(kFALSE),
70     fChi2MatchTrigger(0.),
71     fTrackID(0)
72 {
73   /// Constructor from two Segment's
74
75   fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);
76   fHitForRecAtHit = new TClonesArray("AliMUONHitForRec",10);
77   
78   if (BegSegment) { //AZ
79     AddTrackParamAtHit(0,BegSegment->GetHitForRec1());
80     AddTrackParamAtHit(0,BegSegment->GetHitForRec2());
81     AddTrackParamAtHit(0,EndSegment->GetHitForRec1());
82     AddTrackParamAtHit(0,EndSegment->GetHitForRec2());
83     fTrackParamAtHit->Sort(); // sort TrackParamAtHit according to increasing Z
84   }
85 }
86
87   //__________________________________________________________________________
88 AliMUONTrack::AliMUONTrack(AliMUONSegment* Segment, AliMUONHitForRec* HitForRec)
89   : TObject(),
90     fTrackParamAtVertex(),
91     fTrackParamAtHit(0x0),
92     fHitForRecAtHit(0x0),
93     fNTrackHits(0),
94     fFitFMin(-1.),
95     fMatchTrigger(kFALSE),
96     fChi2MatchTrigger(0.),
97     fTrackID(0)
98 {
99   /// Constructor from one Segment and one HitForRec
100
101   fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);
102   fHitForRecAtHit = new TClonesArray("AliMUONHitForRec",10);
103   
104   AddTrackParamAtHit(0,Segment->GetHitForRec1());
105   AddTrackParamAtHit(0,Segment->GetHitForRec2());
106   AddTrackParamAtHit(0,HitForRec);
107   fTrackParamAtHit->Sort(); // sort TrackParamAtHit according to increasing Z
108 }
109
110   //__________________________________________________________________________
111 AliMUONTrack::~AliMUONTrack()
112 {
113   /// Destructor
114   if (fTrackParamAtHit) {
115     // delete the TClonesArray of pointers to TrackParam
116     delete fTrackParamAtHit;
117     fTrackParamAtHit = NULL;
118   }
119
120   if (fHitForRecAtHit) {
121     // delete the TClonesArray of pointers to HitForRec
122     delete fHitForRecAtHit;
123     fHitForRecAtHit = NULL;
124   }
125 }
126
127   //__________________________________________________________________________
128 AliMUONTrack::AliMUONTrack (const AliMUONTrack& theMUONTrack)
129   : TObject(theMUONTrack),
130     fTrackParamAtVertex(theMUONTrack.fTrackParamAtVertex),
131     fTrackParamAtHit(0x0),
132     fHitForRecAtHit(0x0),
133     fNTrackHits(theMUONTrack.fNTrackHits),
134     fFitFMin(theMUONTrack.fFitFMin),
135     fMatchTrigger(theMUONTrack.fMatchTrigger),
136     fChi2MatchTrigger(theMUONTrack.fChi2MatchTrigger),
137     fTrackID(theMUONTrack.fTrackID)
138 {
139   ///copy constructor
140   Int_t maxIndex = 0;
141   
142   // necessary to make a copy of the objects and not only the pointers in TClonesArray.
143   if (theMUONTrack.fTrackParamAtHit) {
144     maxIndex = (theMUONTrack.fTrackParamAtHit)->GetEntriesFast();
145     fTrackParamAtHit  =  new TClonesArray("AliMUONTrackParam",maxIndex);
146     for (Int_t index = 0; index < maxIndex; index++) {
147       new ((*fTrackParamAtHit)[index]) AliMUONTrackParam(*(AliMUONTrackParam*)theMUONTrack.fTrackParamAtHit->At(index));
148     }
149   }  
150
151   // necessary to make a copy of the objects and not only the pointers in TClonesArray.
152   if (theMUONTrack.fHitForRecAtHit) {
153     maxIndex = (theMUONTrack.fHitForRecAtHit)->GetEntriesFast();
154     fHitForRecAtHit  =  new TClonesArray("AliMUONHitForRec",maxIndex);
155     for (Int_t index = 0; index < maxIndex; index++) {
156       new ((*fHitForRecAtHit)[index]) AliMUONHitForRec(*(AliMUONHitForRec*)theMUONTrack.fHitForRecAtHit->At(index));
157     }
158   }  
159
160 }
161
162   //__________________________________________________________________________
163 AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& theMUONTrack)
164 {
165   /// Asignment operator
166   // check assignement to self
167   if (this == &theMUONTrack)
168     return *this;
169
170   // base class assignement
171   TObject::operator=(theMUONTrack);
172
173   fTrackParamAtVertex = theMUONTrack.fTrackParamAtVertex;
174
175   Int_t maxIndex = 0;
176   
177   // necessary to make a copy of the objects and not only the pointers in TClonesArray.
178   fTrackParamAtHit = 0;
179   if (theMUONTrack.fTrackParamAtHit) {
180     fTrackParamAtHit  =  new TClonesArray("AliMUONTrackParam",10);
181     maxIndex = (theMUONTrack.fTrackParamAtHit)->GetEntriesFast();
182     for (Int_t index = 0; index < maxIndex; index++) {
183       new ((*fTrackParamAtHit)[fTrackParamAtHit->GetEntriesFast()])
184         AliMUONTrackParam(*(AliMUONTrackParam*)(theMUONTrack.fTrackParamAtHit)->At(index));
185     }
186   }  
187
188   // necessary to make a copy of the objects and not only the pointers in TClonesArray.
189   fHitForRecAtHit = 0;
190   if (theMUONTrack.fHitForRecAtHit) {
191     fHitForRecAtHit  =  new TClonesArray("AliMUONHitForRec",10);
192     maxIndex = (theMUONTrack.fHitForRecAtHit)->GetEntriesFast();
193     for (Int_t index = 0; index < maxIndex; index++) {
194       new ((*fHitForRecAtHit)[fHitForRecAtHit->GetEntriesFast()])
195         AliMUONHitForRec(*(AliMUONHitForRec*)(theMUONTrack.fHitForRecAtHit)->At(index));
196     }
197   }  
198   
199   fNTrackHits         =  theMUONTrack.fNTrackHits;
200   fFitFMin            =  theMUONTrack.fFitFMin;
201   fMatchTrigger       =  theMUONTrack.fMatchTrigger;
202   fChi2MatchTrigger   =  theMUONTrack.fChi2MatchTrigger;
203   fTrackID            =  theMUONTrack.fTrackID;
204
205   return *this;
206 }
207
208   //__________________________________________________________________________
209 void AliMUONTrack::AddTrackParamAtHit(AliMUONTrackParam *trackParam, AliMUONHitForRec *hitForRec) 
210 {
211   /// Add TrackParamAtHit if "trackParam" != NULL else create empty TrackParamAtHit
212   /// Update link to HitForRec if "hitForRec" != NULL
213   if (!fTrackParamAtHit) {
214     fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);  
215     fNTrackHits = 0;
216   }
217   AliMUONTrackParam* trackParamAtHit;
218   if (trackParam) trackParamAtHit = new ((*fTrackParamAtHit)[fNTrackHits]) AliMUONTrackParam(*trackParam);
219   else trackParamAtHit = new ((*fTrackParamAtHit)[fNTrackHits]) AliMUONTrackParam();
220   if (hitForRec) trackParamAtHit->SetHitForRecPtr(hitForRec);
221   fNTrackHits++;
222 }
223
224   //__________________________________________________________________________
225 void AliMUONTrack::AddHitForRecAtHit(const AliMUONHitForRec *hitForRec) 
226 {
227   /// Add hitForRec to the array of hitForRec at hit
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 between the current track ("this")
280   /// and the track pointed to by "Track".
281   Int_t hitsInCommon = 0;
282   AliMUONTrackParam *trackParamAtHit1, *trackParamAtHit2;
283   // Loop over hits of first track
284   trackParamAtHit1 = (AliMUONTrackParam*) this->fTrackParamAtHit->First();
285   while (trackParamAtHit1) {
286     // Loop over hits of second track
287     trackParamAtHit2 = (AliMUONTrackParam*) Track->fTrackParamAtHit->First();
288     while (trackParamAtHit2) {
289       // Increment "hitsInCommon" if both TrackParamAtHits point to the same HitForRec
290       if ((trackParamAtHit1->GetHitForRecPtr()) == (trackParamAtHit2->GetHitForRecPtr())) hitsInCommon++;
291       trackParamAtHit2 = (AliMUONTrackParam*) Track->fTrackParamAtHit->After(trackParamAtHit2);
292     } // trackParamAtHit2
293     trackParamAtHit1 = (AliMUONTrackParam*) this->fTrackParamAtHit->After(trackParamAtHit1);
294   } // trackParamAtHit1
295   return hitsInCommon;
296 }
297
298   //__________________________________________________________________________
299 void AliMUONTrack::RecursiveDump(void) const
300 {
301   /// Recursive dump of AliMUONTrack, i.e. with dump of TrackParamAtHit's and attached HitForRec's
302   AliMUONTrackParam *trackParamAtHit;
303   AliMUONHitForRec *hitForRec;
304   cout << "Recursive dump of Track: " << this << endl;
305   // Track
306   this->Dump();
307   for (Int_t trackHitIndex = 0; trackHitIndex < fNTrackHits; trackHitIndex++) {
308     trackParamAtHit = (AliMUONTrackParam*) ((*fTrackParamAtHit)[trackHitIndex]);
309     // TrackHit
310     cout << "TrackParamAtHit: " << trackParamAtHit << " (index: " << trackHitIndex << ")" << endl;
311     trackParamAtHit->Dump();
312     hitForRec = trackParamAtHit->GetHitForRecPtr();
313     // HitForRec
314     cout << "HitForRec: " << hitForRec << endl;
315     hitForRec->Dump();
316   }
317   return;
318 }
319   
320 //_____________________________________________-
321 void AliMUONTrack::Print(Option_t* opt) const
322 {
323   /// Printing Track information 
324   /// "full" option for printing all the information about the track
325   TString sopt(opt);
326   sopt.ToUpper();
327  
328   if ( sopt.Contains("FULL") ) { 
329     cout << "<AliMUONTrack> No.Clusters=" << setw(2)   << GetNTrackHits() << 
330       //      ", Bending P="<< setw(8) << setprecision(5)      << 1./GetInverseBendingMomentum() << 
331       //", NonBendSlope=" << setw(8) << setprecision(5)  << GetNonBendingSlope()*180./TMath::Pi() <<
332       //", BendSlope=" << setw(8) << setprecision(5)     << GetBendingSlope()*180./TMath::Pi() <<
333       ", Match2Trig=" << setw(1) << GetMatchTrigger()  << 
334       ", Chi2-tracking-trigger=" << setw(8) << setprecision(5) <<  GetChi2MatchTrigger() << endl ;
335     GetTrackParamAtHit()->First()->Print("full");
336   }
337   else {
338     cout << "<AliMUONTrack>";
339     GetTrackParamAtHit()->First()->Print("");
340
341   }
342     
343 }