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 **************************************************************************/
16 ///////////////////////////////////////////////////////////////////////////////
19 // TRD 6-chambers stack //
22 ///////////////////////////////////////////////////////////////////////////////
28 #include "AliTRDgeometry.h"
29 #include "AliTRDmodule.h"
30 #include "AliTRDltuTracklet.h"
31 #include "AliTRDgtuTrack.h"
32 #include "AliTRDtrigParam.h"
33 #include "AliTRDzmaps.h"
35 ClassImp(AliTRDmodule)
37 //_____________________________________________________________________________
38 AliTRDmodule::AliTRDmodule()
50 // AliTRDmodule default constructor
55 //_____________________________________________________________________________
56 AliTRDmodule::AliTRDmodule(AliTRDtrigParam *trigp)
58 ,fXprojPlane(trigp->GetXprojPlane())
59 ,fField(trigp->GetField())
60 ,fTracklets(new TObjArray(400))
61 ,fTracks(new TObjArray(400))
62 ,fDeltaY(trigp->GetDeltaY())
63 ,fDeltaS(trigp->GetDeltaS())
68 // AliTRDmodule constructor
71 for (Int_t iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
72 for (Int_t i = 0; i < kNsubZchan; i++) {
73 fZnchan[iPlan][i] = 0;
74 for (Int_t j = 0; j < kNmaxZchan; j++) {
75 fZtrkid[iPlan][j][i] = -1;
82 //_____________________________________________________________________________
83 AliTRDmodule::AliTRDmodule(const AliTRDmodule &m)
85 ,fXprojPlane(m.fXprojPlane)
95 // AliTRDmodule copy constructor
98 for (Int_t iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
99 for (Int_t i = 0; i < kNsubZchan; i++) {
100 ((AliTRDmodule &) m).fZnchan[iPlan][i] = 0;
101 for (Int_t j = 0; j < kNmaxZchan; j++) {
102 ((AliTRDmodule &) m).fZtrkid[iPlan][j][i] = -1;
109 //_____________________________________________________________________________
110 AliTRDmodule::~AliTRDmodule()
118 //_____________________________________________________________________________
119 AliTRDmodule &AliTRDmodule::operator=(const AliTRDmodule &m)
122 // Assignment operator
125 if (this != &m) ((AliTRDmodule &) m).Copy(*this);
130 //_____________________________________________________________________________
131 void AliTRDmodule::Copy(TObject &m) const
137 ((AliTRDmodule &) m).fXprojPlane = fXprojPlane;
138 ((AliTRDmodule &) m).fField = fField;
139 ((AliTRDmodule &) m).fTracklets = NULL;
140 ((AliTRDmodule &) m).fTracks = NULL;
141 ((AliTRDmodule &) m).fDeltaY = fDeltaY;
142 ((AliTRDmodule &) m).fDeltaS = fDeltaS;
143 ((AliTRDmodule &) m).fLTUtrk = NULL;
144 ((AliTRDmodule &) m).fGTUtrk = NULL;
146 for (Int_t iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
147 for (Int_t i = 0; i < kNsubZchan; i++) {
148 ((AliTRDmodule &) m).fZnchan[iPlan][i] = 0;
149 for (Int_t j = 0; j < kNmaxZchan; j++) {
150 ((AliTRDmodule &) m).fZtrkid[iPlan][j][i] = -1;
157 //_____________________________________________________________________________
158 void AliTRDmodule::Reset()
161 // Reset the tracks and tracklets in the module
169 fTracklets = new TObjArray(400);
170 fTracks = new TObjArray(400);
174 //_____________________________________________________________________________
175 void AliTRDmodule::ResetTracks()
178 // Reset the tracks in the module
184 for (Int_t i = 0; i < GetNtracks(); i++) {
197 //_____________________________________________________________________________
198 AliTRDgtuTrack *AliTRDmodule::GetTrack(Int_t pos) const
201 // Return track at position "pos"
208 void *trk = fTracks->UncheckedAt(pos);
213 return (AliTRDgtuTrack *) trk;
217 //_____________________________________________________________________________
218 void AliTRDmodule::RemoveTrack(Int_t pos)
221 // Remove the track at position "pos"
228 fTracks->RemoveAt(pos);
233 //_____________________________________________________________________________
234 void AliTRDmodule::AddTracklet(Int_t det, Int_t row, Float_t rowz, Float_t slope
235 , Float_t offset, Float_t time, Int_t ncl
236 , Int_t label, Float_t q)
239 // Add a tracklet to this track
242 fLTUtrk = new AliTRDltuTracklet(det,row,rowz,slope,offset,time,ncl,label,q);
243 Tracklets()->Add(fLTUtrk);
247 //_____________________________________________________________________________
248 AliTRDltuTracklet *AliTRDmodule::GetTracklet(Int_t pos) const
251 // Get the tracklet at position "pos"
254 if (fTracklets == 0) {
258 void *trk = fTracklets->UncheckedAt(pos);
263 return (AliTRDltuTracklet *) trk;
267 //_____________________________________________________________________________
268 void AliTRDmodule::RemoveTracklet(Int_t pos)
271 // Remove the tracklet at position "pos"
274 if (fTracklets == 0) {
278 fTracklets->RemoveAt(pos);
279 fTracklets->Compress();
283 //_____________________________________________________________________________
284 void AliTRDmodule::RemoveMultipleTracklets()
287 // Remove multiple found tracklets
290 Float_t offDiffMin = 0.5; // [cm]
292 AliTRDltuTracklet *trk;
293 Int_t det1, det2, row1, row2, ncl1, ncl2, label1, label2;
296 while (itrk < (GetNtracklets() - 1)) {
298 trk = GetTracklet(itrk);
299 det1 = trk->GetDetector();
300 row1 = trk->GetRow();
301 off1 = trk->GetOffset();
302 ncl1 = trk->GetNclusters();
303 label1 = trk->GetLabel();
305 trk = GetTracklet(itrk+1);
306 det2 = trk->GetDetector();
307 row2 = trk->GetRow();
308 off2 = trk->GetOffset();
309 ncl2 = trk->GetNclusters();
310 label2 = trk->GetLabel();
312 if ((det1 == det2) && (row1 == row2)) {
313 if ((off2 - off1) < offDiffMin) {
315 RemoveTracklet(itrk );
318 RemoveTracklet(itrk+1);
329 //_____________________________________________________________________________
330 void AliTRDmodule::SortZ(Int_t cha)
333 // Match tracklets in the x-z plane (pad row sorting)
338 AliTRDltuTracklet *trk;
341 for (Int_t iTrk = 0; iTrk < GetNtracklets(); iTrk++) {
343 trk = GetTracklet(iTrk);
345 det = trk->GetDetector();
346 pla = trk->GetPlane(det);
348 for (Int_t iZchan = 0; iZchan < kNsubZchan; iZchan++) {
349 if (fZChannelMap[cha][iZchan][pla][row] == 1) {
350 fZtrkid[pla][fZnchan[pla][iZchan]][iZchan] = iTrk;
351 fZnchan[pla][iZchan]++;
359 //_____________________________________________________________________________
360 void AliTRDmodule::InitZLUT()
363 // Initialize the pad row sorting look-up-table
366 for (Int_t iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
367 for (Int_t i = 0; i < kNsubZchan; i++) {
368 fZnchan[iPlan][i] = 0;
369 for (Int_t j = 0; j < kNmaxZchan; j++) {
370 fZtrkid[iPlan][j][i] = -1;
377 //_____________________________________________________________________________
378 void AliTRDmodule::FindTracks()
381 // Find tracks from tracklets
384 for (Int_t iZchan = 0; iZchan < kNsubZchan; iZchan++) {
385 FindTracksCombi(iZchan);
390 //_____________________________________________________________________________
391 void AliTRDmodule::FindTracksCombi(Int_t zchan)
394 // Find tracks by pure combinatorics...
397 static Int_t trkTrack[12];
417 AliTRDltuTracklet *trk1;
418 AliTRDltuTracklet *trk2;
419 AliTRDltuTracklet *trk ;
421 Bool_t isPlane[kNplan];
423 for (Int_t iPlan1 = 0; iPlan1 < kNplan; iPlan1++) {
425 ntrk1 = fZnchan[iPlan1][zchan];
427 for (Int_t iTrk1 = 0; iTrk1 < ntrk1; iTrk1++) {
429 for (Int_t iPlan = 0; iPlan < kNplan; iPlan++) {
430 isPlane[iPlan] = kFALSE;
433 trkId1 = fZtrkid[iPlan1][iTrk1][zchan];
436 for (Int_t iList = 0; iList < kNmaxTrk; iList++) {
437 trkTrack[iList] = -1;
439 trkTrack[nTracklets++] = trkId1;
441 isPlane[iPlan1] = kTRUE;
443 trk1 = GetTracklet(trkId1);
444 y1 = trk1->GetYproj(fXprojPlane);
445 y1min = y1 - fDeltaY;
446 y1max = y1 + fDeltaY;
447 s1 = trk1->GetSlope();
448 s1min = s1 - fDeltaS;
449 s1max = s1 + fDeltaS;
450 z1 = trk1->GetZproj(fXprojPlane);
452 for (Int_t iPlan2 = 0; iPlan2 < kNplan; iPlan2++) {
454 if (iPlan2 == iPlan1) continue;
456 ntrk2 = fZnchan[iPlan2][zchan];
458 for (Int_t iTrk2 = 0; iTrk2 < ntrk2; iTrk2++) {
460 trkId2 = fZtrkid[iPlan2][iTrk2][zchan];
462 if (trkId2 == trkId1) continue;
464 trk2 = GetTracklet(trkId2);
465 y2 = trk2->GetYproj(fXprojPlane);
466 s2 = trk2->GetSlope();
467 z2 = trk2->GetZproj(fXprojPlane);
469 if ((y1min < y2 && y2 < y1max) &&
470 (s1min < s2 && s2 < s1max)) {
472 if (nTracklets >= kNmaxTrk) {
473 AliWarning("Too many tracklets for this track.");
476 trkTrack[nTracklets++] = trkId2;
477 isPlane[iPlan2] = kTRUE;
487 for (Int_t iPlan = 0; iPlan < kNplan; iPlan++) {
488 nPlanes += (Int_t) isPlane[iPlan];
493 Int_t cha1, cha2, npoints1, npoints2;
494 for (Int_t iList = 0; iList < (nTracklets - 1); iList++) {
496 if (trkTrack[iList] == -1 || trkTrack[iList+1] == -1) continue;
497 trk1 = GetTracklet(trkTrack[iList ]);
498 trk2 = GetTracklet(trkTrack[iList+1]);
500 cha1 = trk1->GetDetector();
501 cha2 = trk2->GetDetector();
502 if (cha1 != cha2) continue;
504 npoints1 = trk1->GetNclusters();
505 npoints2 = trk2->GetNclusters();
507 if (npoints1 == npoints2) {
508 trkTrack[iList] = -1;
511 if (npoints1 > npoints2) trkTrack[iList+1] = -1;
512 if (npoints1 < npoints2) trkTrack[iList ] = -1;
517 fGTUtrk = new AliTRDgtuTrack();
518 for (Int_t iList = 0; iList < nTracklets; iList++) {
519 if (trkTrack[iList] == -1) continue;
520 trk = GetTracklet(trkTrack[iList]);
521 fGTUtrk->AddTracklet(trk);
523 fGTUtrk->Track(fXprojPlane,fField);
534 //_____________________________________________________________________________
535 void AliTRDmodule::AddTrack()
538 // Add a found track to the module
541 Tracks()->Add(fGTUtrk);
545 //_____________________________________________________________________________
546 void AliTRDmodule::RemoveMultipleTracks()
549 // Remove multiple found tracks
552 AliTRDgtuTrack *trk1;
553 AliTRDgtuTrack *trk2;
563 while (iTrack < (GetNtracks()-1)) {
565 trk1 = GetTrack(iTrack );
566 trk2 = GetTrack(iTrack+1);
568 ntrk1 = trk1->GetNtracklets();
569 yproj1 = trk1->GetYproj();
570 alpha1 = trk1->GetSlope();
571 ntrk2 = trk2->GetNtracklets();
572 yproj2 = trk2->GetYproj();
573 alpha2 = trk2->GetSlope();
575 if ((TMath::Abs(yproj1-yproj2) < fDeltaY) &&
576 (TMath::Abs(alpha1-alpha2) < fDeltaS)) {
578 RemoveTrack(iTrack );
581 RemoveTrack(iTrack+1);
592 //_____________________________________________________________________________
593 TObjArray *AliTRDmodule::Tracklets()
596 // Returns the list of tracklets
600 fTracklets = new TObjArray(400);
607 //_____________________________________________________________________________
608 void AliTRDmodule::ResetTracklets()
611 // Resets the list of tracklets
615 fTracklets->Delete();
620 //_____________________________________________________________________________
621 void AliTRDmodule::SortTracklets()
624 // Sorts the list of tracklets
633 //_____________________________________________________________________________
634 Int_t AliTRDmodule::GetNtracklets() const
637 // Returns the number of tracklets
641 return fTracklets->GetEntriesFast();
648 //_____________________________________________________________________________
649 TObjArray *AliTRDmodule::Tracks()
652 // Returns the list of tracks
656 fTracks = new TObjArray(400);
663 //_____________________________________________________________________________
664 void AliTRDmodule::SortTracks()
667 // Sort the list of tracks
676 //_____________________________________________________________________________
677 Int_t AliTRDmodule::GetNtracks() const
680 // Returns the number of tracks
684 return fTracks->GetEntriesFast();