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 <stdlib.h> // for exit()
29 #include <Riostream.h>
31 #include "AliMUONTrack.h"
33 #include "AliMUONTrackParam.h"
34 #include "AliMUONHitForRec.h"
35 #include "AliMUONSegment.h"
36 #include "AliMUONConstants.h"
43 ClassImp(AliMUONTrack) // Class implementation in ROOT context
46 //__________________________________________________________________________
47 AliMUONTrack::AliMUONTrack()
49 fTrackParamAtVertex(),
50 fTrackParamAtHit(0x0),
54 fMatchTrigger(kFALSE),
55 fChi2MatchTrigger(0.),
58 /// Default constructor
61 //__________________________________________________________________________
62 AliMUONTrack::AliMUONTrack(AliMUONSegment* BegSegment, AliMUONSegment* EndSegment)
64 fTrackParamAtVertex(),
65 fTrackParamAtHit(0x0),
69 fMatchTrigger(kFALSE),
70 fChi2MatchTrigger(0.),
73 /// Constructor from two Segment's
75 fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);
76 fHitForRecAtHit = new TClonesArray("AliMUONHitForRec",10);
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
87 //__________________________________________________________________________
88 AliMUONTrack::AliMUONTrack(AliMUONSegment* Segment, AliMUONHitForRec* HitForRec)
90 fTrackParamAtVertex(),
91 fTrackParamAtHit(0x0),
95 fMatchTrigger(kFALSE),
96 fChi2MatchTrigger(0.),
99 /// Constructor from one Segment and one HitForRec
101 fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);
102 fHitForRecAtHit = new TClonesArray("AliMUONHitForRec",10);
104 AddTrackParamAtHit(0,Segment->GetHitForRec1());
105 AddTrackParamAtHit(0,Segment->GetHitForRec2());
106 AddTrackParamAtHit(0,HitForRec);
107 fTrackParamAtHit->Sort(); // sort TrackParamAtHit according to increasing Z
110 //__________________________________________________________________________
111 AliMUONTrack::~AliMUONTrack()
114 if (fTrackParamAtHit) {
115 // delete the TClonesArray of pointers to TrackParam
116 delete fTrackParamAtHit;
117 fTrackParamAtHit = NULL;
120 if (fHitForRecAtHit) {
121 // delete the TClonesArray of pointers to HitForRec
122 delete fHitForRecAtHit;
123 fHitForRecAtHit = NULL;
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)
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));
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));
162 //__________________________________________________________________________
163 AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& theMUONTrack)
165 /// Asignment operator
166 // check assignement to self
167 if (this == &theMUONTrack)
170 // base class assignement
171 TObject::operator=(theMUONTrack);
173 fTrackParamAtVertex = theMUONTrack.fTrackParamAtVertex;
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));
188 // necessary to make a copy of the objects and not only the pointers in TClonesArray.
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));
199 fNTrackHits = theMUONTrack.fNTrackHits;
200 fFitFMin = theMUONTrack.fFitFMin;
201 fMatchTrigger = theMUONTrack.fMatchTrigger;
202 fChi2MatchTrigger = theMUONTrack.fChi2MatchTrigger;
203 fTrackID = theMUONTrack.fTrackID;
208 //__________________________________________________________________________
209 void AliMUONTrack::AddTrackParamAtHit(AliMUONTrackParam *trackParam, AliMUONHitForRec *hitForRec)
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);
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);
224 //__________________________________________________________________________
225 void AliMUONTrack::AddHitForRecAtHit(const AliMUONHitForRec *hitForRec)
227 /// Add hitForRec to the array of hitForRec at hit
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 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
298 //__________________________________________________________________________
299 void AliMUONTrack::RecursiveDump(void) const
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;
307 for (Int_t trackHitIndex = 0; trackHitIndex < fNTrackHits; trackHitIndex++) {
308 trackParamAtHit = (AliMUONTrackParam*) ((*fTrackParamAtHit)[trackHitIndex]);
310 cout << "TrackParamAtHit: " << trackParamAtHit << " (index: " << trackHitIndex << ")" << endl;
311 trackParamAtHit->Dump();
312 hitForRec = trackParamAtHit->GetHitForRecPtr();
314 cout << "HitForRec: " << hitForRec << endl;
320 //_____________________________________________-
321 void AliMUONTrack::Print(Option_t* opt) const
323 /// Printing Track information
324 /// "full" option for printing all the information about the track
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");
338 cout << "<AliMUONTrack>";
339 GetTrackParamAtHit()->First()->Print("");