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];
399 Int_t nTracklets, nPlanes;
400 Int_t ntrk1, trkId1, ntrk2, trkId2;
401 Float_t y1, y1min, y1max, s1, z1, s1min, s1max, y2, s2, z2;
402 AliTRDltuTracklet *trk1;
403 AliTRDltuTracklet *trk2;
404 AliTRDltuTracklet *trk ;
406 Bool_t isPlane[kNplan];
408 for (Int_t iPlan1 = 0; iPlan1 < kNplan; iPlan1++) {
410 ntrk1 = fZnchan[iPlan1][zchan];
412 for (Int_t iTrk1 = 0; iTrk1 < ntrk1; iTrk1++) {
414 for (Int_t iPlan = 0; iPlan < kNplan; iPlan++) {
415 isPlane[iPlan] = kFALSE;
418 trkId1 = fZtrkid[iPlan1][iTrk1][zchan];
421 for (Int_t iList = 0; iList < kNmaxTrk; iList++) {
422 trkTrack[iList] = -1;
424 trkTrack[nTracklets++] = trkId1;
426 isPlane[iPlan1] = kTRUE;
428 trk1 = GetTracklet(trkId1);
429 y1 = trk1->GetYproj(fXprojPlane);
430 y1min = y1 - fDeltaY;
431 y1max = y1 + fDeltaY;
432 s1 = trk1->GetSlope();
433 s1min = s1 - fDeltaS;
434 s1max = s1 + fDeltaS;
435 z1 = trk1->GetZproj(fXprojPlane);
437 for (Int_t iPlan2 = 0; iPlan2 < kNplan; iPlan2++) {
439 if (iPlan2 == iPlan1) continue;
441 ntrk2 = fZnchan[iPlan2][zchan];
443 for (Int_t iTrk2 = 0; iTrk2 < ntrk2; iTrk2++) {
445 trkId2 = fZtrkid[iPlan2][iTrk2][zchan];
447 if (trkId2 == trkId1) continue;
449 trk2 = GetTracklet(trkId2);
450 y2 = trk2->GetYproj(fXprojPlane);
451 s2 = trk2->GetSlope();
452 z2 = trk2->GetZproj(fXprojPlane);
454 if ((y1min < y2 && y2 < y1max) &&
455 (s1min < s2 && s2 < s1max)) {
457 if (nTracklets >= kNmaxTrk) {
458 AliWarning("Too many tracklets for this track.");
461 trkTrack[nTracklets++] = trkId2;
462 isPlane[iPlan2] = kTRUE;
472 for (Int_t iPlan = 0; iPlan < kNplan; iPlan++) {
473 nPlanes += (Int_t) isPlane[iPlan];
478 Int_t cha1, cha2, npoints1, npoints2;
479 for (Int_t iList = 0; iList < (nTracklets - 1); iList++) {
481 if (trkTrack[iList] == -1 || trkTrack[iList+1] == -1) continue;
482 trk1 = GetTracklet(trkTrack[iList ]);
483 trk2 = GetTracklet(trkTrack[iList+1]);
485 cha1 = trk1->GetDetector();
486 cha2 = trk2->GetDetector();
487 if (cha1 != cha2) continue;
489 npoints1 = trk1->GetNclusters();
490 npoints2 = trk2->GetNclusters();
492 if (npoints1 == npoints2) {
493 trkTrack[iList] = -1;
496 if (npoints1 > npoints2) trkTrack[iList+1] = -1;
497 if (npoints1 < npoints2) trkTrack[iList ] = -1;
502 fGTUtrk = new AliTRDgtuTrack();
503 for (Int_t iList = 0; iList < nTracklets; iList++) {
504 if (trkTrack[iList] == -1) continue;
505 trk = GetTracklet(trkTrack[iList]);
506 fGTUtrk->AddTracklet(trk);
508 fGTUtrk->Track(fXprojPlane,fField);
519 //_____________________________________________________________________________
520 void AliTRDmodule::AddTrack()
523 // Add a found track to the module
526 Tracks()->Add(fGTUtrk);
530 //_____________________________________________________________________________
531 void AliTRDmodule::RemoveMultipleTracks()
534 // Remove multiple found tracks
537 AliTRDgtuTrack *trk1;
538 AliTRDgtuTrack *trk2;
540 Float_t yproj1, yproj2, alpha1, alpha2;
544 while (iTrack < (GetNtracks()-1)) {
546 trk1 = GetTrack(iTrack );
547 trk2 = GetTrack(iTrack+1);
549 ntrk1 = trk1->GetNtracklets();
550 yproj1 = trk1->GetYproj();
551 alpha1 = trk1->GetSlope();
552 ntrk2 = trk2->GetNtracklets();
553 yproj2 = trk2->GetYproj();
554 alpha2 = trk2->GetSlope();
556 if ((TMath::Abs(yproj1-yproj2) < fDeltaY) &&
557 (TMath::Abs(alpha1-alpha2) < fDeltaS)) {
559 RemoveTrack(iTrack );
562 RemoveTrack(iTrack+1);
573 //_____________________________________________________________________________
574 TObjArray* AliTRDmodule::Tracklets()
577 // Returns the list of tracklets
581 fTracklets = new TObjArray(400);
588 //_____________________________________________________________________________
589 void AliTRDmodule::ResetTracklets()
592 // Resets the list of tracklets
596 fTracklets->Delete();
601 //_____________________________________________________________________________
602 void AliTRDmodule::SortTracklets()
605 // Sorts the list of tracklets
614 //_____________________________________________________________________________
615 Int_t AliTRDmodule::GetNtracklets() const
618 // Returns the number of tracklets
622 return fTracklets->GetEntriesFast();
629 //_____________________________________________________________________________
630 TObjArray* AliTRDmodule::Tracks()
633 // Returns the list of tracks
637 fTracks = new TObjArray(400);
644 //_____________________________________________________________________________
645 void AliTRDmodule::SortTracks()
648 // Sort the list of tracks
657 //_____________________________________________________________________________
658 Int_t AliTRDmodule::GetNtracks() const
661 // Returns the number of tracks
665 return fTracks->GetEntriesFast();