1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 ///////////////////////////////////////////////////
20 // Reconstructed track
26 ///////////////////////////////////////////////////
28 #include "AliMUONTrack.h"
30 #include "AliMUONTrackParam.h"
31 #include "AliMUONHitForRec.h"
32 #include "AliMUONSegment.h"
33 #include "AliMUONTriggerTrack.h"
34 #include "AliMUONConstants.h"
38 #include <Riostream.h> // for cout
41 #include <TObjArray.h>
43 #include <stdlib.h> // for exit()
45 ClassImp(AliMUONTrack) // Class implementation in ROOT context
47 //__________________________________________________________________________
48 AliMUONTrack::AliMUONTrack()
50 fTrackParamAtVertex(),
51 fTrackParamAtHit(0x0),
55 fMatchTrigger(kFALSE),
56 fChi2MatchTrigger(0.),
59 // Default constructor
62 //__________________________________________________________________________
63 AliMUONTrack::AliMUONTrack(AliMUONSegment* BegSegment, AliMUONSegment* EndSegment)
65 fTrackParamAtVertex(),
66 fTrackParamAtHit(0x0),
70 fMatchTrigger(kFALSE),
71 fChi2MatchTrigger(0.),
74 // Constructor from two Segment's
76 fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);
77 fHitForRecAtHit = new TClonesArray("AliMUONHitForRec",10);
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
88 //__________________________________________________________________________
89 AliMUONTrack::AliMUONTrack(AliMUONSegment* Segment, AliMUONHitForRec* HitForRec)
91 fTrackParamAtVertex(),
92 fTrackParamAtHit(0x0),
96 fMatchTrigger(kFALSE),
97 fChi2MatchTrigger(0.),
100 // Constructor from one Segment and one HitForRec
102 fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);
103 fHitForRecAtHit = new TClonesArray("AliMUONHitForRec",10);
105 AddTrackParamAtHit(0,Segment->GetHitForRec1());
106 AddTrackParamAtHit(0,Segment->GetHitForRec2());
107 AddTrackParamAtHit(0,HitForRec);
108 fTrackParamAtHit->Sort(); // sort TrackParamAtHit according to increasing Z
111 //__________________________________________________________________________
112 AliMUONTrack::~AliMUONTrack()
115 if (fTrackParamAtHit) {
116 // delete the TClonesArray of pointers to TrackParam
117 delete fTrackParamAtHit;
118 fTrackParamAtHit = NULL;
121 if (fHitForRecAtHit) {
122 // delete the TClonesArray of pointers to HitForRec
123 delete fHitForRecAtHit;
124 fHitForRecAtHit = NULL;
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)
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));
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));
163 //__________________________________________________________________________
164 AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& theMUONTrack)
167 // check assignement to self
168 if (this == &theMUONTrack)
171 // base class assignement
172 TObject::operator=(theMUONTrack);
174 fTrackParamAtVertex = theMUONTrack.fTrackParamAtVertex;
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));
189 // necessary to make a copy of the objects and not only the pointers in TClonesArray.
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));
200 fNTrackHits = theMUONTrack.fNTrackHits;
201 fFitFMin = theMUONTrack.fFitFMin;
202 fMatchTrigger = theMUONTrack.fMatchTrigger;
203 fChi2MatchTrigger = theMUONTrack.fChi2MatchTrigger;
204 fTrackID = theMUONTrack.fTrackID;
209 //__________________________________________________________________________
210 void AliMUONTrack::AddTrackParamAtHit(AliMUONTrackParam *trackParam, AliMUONHitForRec *hitForRec)
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);
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);
225 //__________________________________________________________________________
226 void AliMUONTrack::AddHitForRecAtHit(const AliMUONHitForRec *hitForRec)
228 if (!fHitForRecAtHit)
229 fHitForRecAtHit = new TClonesArray("AliMUONHitForRec",10);
232 AliFatal("AliMUONTrack::AddHitForRecAtHit: hitForRec == NULL");
234 new ((*fHitForRecAtHit)[fHitForRecAtHit->GetEntriesFast()]) AliMUONHitForRec(*hitForRec);
237 //__________________________________________________________________________
238 Bool_t* AliMUONTrack::CompatibleTrack(AliMUONTrack * Track, Double_t Sigma2Cut) const
240 // Return kTRUE/kFALSE for each chamber if hit is compatible or not
241 TClonesArray *hitArray, *thisHitArray;
242 AliMUONHitForRec *hit, *thisHit;
245 Float_t deltaZMax = 1.; // 1 cm
247 Bool_t *nCompHit = new Bool_t[AliMUONConstants::NTrackingCh()];
249 for ( Int_t ch = 0; ch < AliMUONConstants::NTrackingCh(); ch++) {
250 nCompHit[ch] = kFALSE;
253 thisHitArray = this->GetHitForRecAtHit();
255 hitArray = Track->GetHitForRecAtHit();
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;
276 //__________________________________________________________________________
277 Int_t AliMUONTrack::HitsInCommon(AliMUONTrack* Track) const
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
299 //__________________________________________________________________________
300 void AliMUONTrack::RecursiveDump(void) const
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;
308 for (Int_t trackHitIndex = 0; trackHitIndex < fNTrackHits; trackHitIndex++) {
309 trackParamAtHit = (AliMUONTrackParam*) ((*fTrackParamAtHit)[trackHitIndex]);
311 cout << "TrackParamAtHit: " << trackParamAtHit << " (index: " << trackHitIndex << ")" << endl;
312 trackParamAtHit->Dump();
313 hitForRec = trackParamAtHit->GetHitForRecPtr();
315 cout << "HitForRec: " << hitForRec << endl;
321 //_____________________________________________-
322 void AliMUONTrack::Print(Option_t* opt) const
325 // Printing Track information
326 // "full" option for printing all the information about the track
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");
341 cout << "<AliMUONTrack>";
342 GetTrackParamAtHit()->First()->Print("");