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 ///////////////////////////////////////////////////////////////////////////////
29 #include "AliTRDgeometry.h"
30 #include "AliTRDmodule.h"
31 #include "AliTRDltuTracklet.h"
32 #include "AliTRDgtuTrack.h"
33 #include "AliTRDtrigParam.h"
34 #include "AliTRDzmaps.h"
36 ClassImp(AliTRDmodule)
38 //_____________________________________________________________________________
39 AliTRDmodule::AliTRDmodule()
43 ,fTracklets(new TObjArray(400))
44 ,fTracks(new TObjArray(400))
51 // AliTRDmodule default constructor
54 fXprojPlane = AliTRDtrigParam::Instance()->GetXprojPlane();
55 fDeltaY = AliTRDtrigParam::Instance()->GetDeltaY();
56 fDeltaS = AliTRDtrigParam::Instance()->GetDeltaS();
58 // The magnetic field strength
59 Double_t x[3] = { 0.0, 0.0, 0.0 };
61 gAlice->Field(x,b); // b[] is in kilo Gauss
62 fField = b[2] * 0.1; // Tesla
64 for (Int_t iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
65 for (Int_t i = 0; i < kNsubZchan; i++) {
66 fZnchan[iPlan][i] = 0;
67 for (Int_t j = 0; j < kNmaxZchan; j++) {
68 fZtrkid[iPlan][j][i] = -1;
75 //_____________________________________________________________________________
76 AliTRDmodule::AliTRDmodule(const AliTRDmodule &m)
78 ,fXprojPlane(m.fXprojPlane)
88 // AliTRDmodule copy constructor
91 for (Int_t iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
92 for (Int_t i = 0; i < kNsubZchan; i++) {
93 ((AliTRDmodule &) m).fZnchan[iPlan][i] = 0;
94 for (Int_t j = 0; j < kNmaxZchan; j++) {
95 ((AliTRDmodule &) m).fZtrkid[iPlan][j][i] = -1;
102 //_____________________________________________________________________________
103 AliTRDmodule::~AliTRDmodule()
111 //_____________________________________________________________________________
112 AliTRDmodule &AliTRDmodule::operator=(const AliTRDmodule &m)
115 // Assignment operator
118 if (this != &m) ((AliTRDmodule &) m).Copy(*this);
123 //_____________________________________________________________________________
124 void AliTRDmodule::Copy(TObject &m) const
130 ((AliTRDmodule &) m).fXprojPlane = fXprojPlane;
131 ((AliTRDmodule &) m).fField = fField;
132 ((AliTRDmodule &) m).fTracklets = NULL;
133 ((AliTRDmodule &) m).fTracks = NULL;
134 ((AliTRDmodule &) m).fDeltaY = fDeltaY;
135 ((AliTRDmodule &) m).fDeltaS = fDeltaS;
136 ((AliTRDmodule &) m).fLTUtrk = NULL;
137 ((AliTRDmodule &) m).fGTUtrk = NULL;
139 for (Int_t iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
140 for (Int_t i = 0; i < kNsubZchan; i++) {
141 ((AliTRDmodule &) m).fZnchan[iPlan][i] = 0;
142 for (Int_t j = 0; j < kNmaxZchan; j++) {
143 ((AliTRDmodule &) m).fZtrkid[iPlan][j][i] = -1;
150 //_____________________________________________________________________________
151 void AliTRDmodule::Reset()
154 // Reset the tracks and tracklets in the module
162 fTracklets = new TObjArray(400);
163 fTracks = new TObjArray(400);
167 //_____________________________________________________________________________
168 void AliTRDmodule::ResetTracks()
171 // Reset the tracks in the module
177 for (Int_t i = 0; i < GetNtracks(); i++) {
190 //_____________________________________________________________________________
191 AliTRDgtuTrack *AliTRDmodule::GetTrack(Int_t pos) const
194 // Return track at position "pos"
201 void *trk = fTracks->UncheckedAt(pos);
206 return (AliTRDgtuTrack *) trk;
210 //_____________________________________________________________________________
211 void AliTRDmodule::RemoveTrack(Int_t pos)
214 // Remove the track at position "pos"
221 fTracks->RemoveAt(pos);
226 //_____________________________________________________________________________
227 void AliTRDmodule::AddTracklet(Int_t det, Int_t row, Float_t rowz, Float_t slope
228 , Float_t offset, Float_t time, Int_t ncl
229 , Int_t label, Float_t q)
232 // Add a tracklet to this track
235 fLTUtrk = new AliTRDltuTracklet(det,row,rowz,slope,offset,time,ncl,label,q);
236 Tracklets()->Add(fLTUtrk);
240 //_____________________________________________________________________________
241 AliTRDltuTracklet *AliTRDmodule::GetTracklet(Int_t pos) const
244 // Get the tracklet at position "pos"
247 if (fTracklets == 0) {
251 void *trk = fTracklets->UncheckedAt(pos);
256 return (AliTRDltuTracklet *) trk;
260 //_____________________________________________________________________________
261 void AliTRDmodule::RemoveTracklet(Int_t pos)
264 // Remove the tracklet at position "pos"
267 if (fTracklets == 0) {
271 fTracklets->RemoveAt(pos);
272 fTracklets->Compress();
276 //_____________________________________________________________________________
277 void AliTRDmodule::RemoveMultipleTracklets()
280 // Remove multiple found tracklets
283 Float_t offDiffMin = 0.5; // [cm]
285 AliTRDltuTracklet *trk;
286 Int_t det1, det2, row1, row2, ncl1, ncl2, label1, label2;
289 while (itrk < (GetNtracklets() - 1)) {
291 trk = GetTracklet(itrk);
292 det1 = trk->GetDetector();
293 row1 = trk->GetRow();
294 off1 = trk->GetOffset();
295 ncl1 = trk->GetNclusters();
296 label1 = trk->GetLabel();
298 trk = GetTracklet(itrk+1);
299 det2 = trk->GetDetector();
300 row2 = trk->GetRow();
301 off2 = trk->GetOffset();
302 ncl2 = trk->GetNclusters();
303 label2 = trk->GetLabel();
305 if ((det1 == det2) && (row1 == row2)) {
306 if ((off2 - off1) < offDiffMin) {
308 RemoveTracklet(itrk );
311 RemoveTracklet(itrk+1);
322 //_____________________________________________________________________________
323 void AliTRDmodule::SortZ(Int_t cha)
326 // Match tracklets in the x-z plane (pad row sorting)
331 AliTRDltuTracklet *trk;
334 for (Int_t iTrk = 0; iTrk < GetNtracklets(); iTrk++) {
336 trk = GetTracklet(iTrk);
338 det = trk->GetDetector();
339 pla = trk->GetPlane(det);
341 for (Int_t iZchan = 0; iZchan < kNsubZchan; iZchan++) {
342 if (fZChannelMap[cha][iZchan][pla][row] == 1) {
343 fZtrkid[pla][fZnchan[pla][iZchan]][iZchan] = iTrk;
344 fZnchan[pla][iZchan]++;
352 //_____________________________________________________________________________
353 void AliTRDmodule::InitZLUT()
356 // Initialize the pad row sorting look-up-table
359 for (Int_t iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
360 for (Int_t i = 0; i < kNsubZchan; i++) {
361 fZnchan[iPlan][i] = 0;
362 for (Int_t j = 0; j < kNmaxZchan; j++) {
363 fZtrkid[iPlan][j][i] = -1;
370 //_____________________________________________________________________________
371 void AliTRDmodule::FindTracks()
374 // Find tracks from tracklets
377 for (Int_t iZchan = 0; iZchan < kNsubZchan; iZchan++) {
378 FindTracksCombi(iZchan);
383 //_____________________________________________________________________________
384 void AliTRDmodule::FindTracksCombi(Int_t zchan)
387 // Find tracks by pure combinatorics...
390 static Int_t trkTrack[12];
410 AliTRDltuTracklet *trk1;
411 AliTRDltuTracklet *trk2;
412 AliTRDltuTracklet *trk ;
414 Bool_t isPlane[kNplan];
416 for (Int_t iPlan1 = 0; iPlan1 < kNplan; iPlan1++) {
418 ntrk1 = fZnchan[iPlan1][zchan];
420 for (Int_t iTrk1 = 0; iTrk1 < ntrk1; iTrk1++) {
422 for (Int_t iPlan = 0; iPlan < kNplan; iPlan++) {
423 isPlane[iPlan] = kFALSE;
426 trkId1 = fZtrkid[iPlan1][iTrk1][zchan];
429 for (Int_t iList = 0; iList < kNmaxTrk; iList++) {
430 trkTrack[iList] = -1;
432 trkTrack[nTracklets++] = trkId1;
434 isPlane[iPlan1] = kTRUE;
436 trk1 = GetTracklet(trkId1);
437 y1 = trk1->GetYproj(fXprojPlane);
438 y1min = y1 - fDeltaY;
439 y1max = y1 + fDeltaY;
440 s1 = trk1->GetSlope();
441 s1min = s1 - fDeltaS;
442 s1max = s1 + fDeltaS;
443 z1 = trk1->GetZproj(fXprojPlane);
445 for (Int_t iPlan2 = 0; iPlan2 < kNplan; iPlan2++) {
447 if (iPlan2 == iPlan1) continue;
449 ntrk2 = fZnchan[iPlan2][zchan];
451 for (Int_t iTrk2 = 0; iTrk2 < ntrk2; iTrk2++) {
453 trkId2 = fZtrkid[iPlan2][iTrk2][zchan];
455 if (trkId2 == trkId1) continue;
457 trk2 = GetTracklet(trkId2);
458 y2 = trk2->GetYproj(fXprojPlane);
459 s2 = trk2->GetSlope();
460 z2 = trk2->GetZproj(fXprojPlane);
462 if ((y1min < y2 && y2 < y1max) &&
463 (s1min < s2 && s2 < s1max)) {
465 if (nTracklets >= kNmaxTrk) {
466 AliWarning("Too many tracklets for this track.");
469 trkTrack[nTracklets++] = trkId2;
470 isPlane[iPlan2] = kTRUE;
480 for (Int_t iPlan = 0; iPlan < kNplan; iPlan++) {
481 nPlanes += (Int_t) isPlane[iPlan];
486 Int_t cha1, cha2, npoints1, npoints2;
487 for (Int_t iList = 0; iList < (nTracklets - 1); iList++) {
489 if (trkTrack[iList] == -1 || trkTrack[iList+1] == -1) continue;
490 trk1 = GetTracklet(trkTrack[iList ]);
491 trk2 = GetTracklet(trkTrack[iList+1]);
493 cha1 = trk1->GetDetector();
494 cha2 = trk2->GetDetector();
495 if (cha1 != cha2) continue;
497 npoints1 = trk1->GetNclusters();
498 npoints2 = trk2->GetNclusters();
500 if (npoints1 == npoints2) {
501 trkTrack[iList] = -1;
504 if (npoints1 > npoints2) trkTrack[iList+1] = -1;
505 if (npoints1 < npoints2) trkTrack[iList ] = -1;
510 fGTUtrk = new AliTRDgtuTrack();
511 for (Int_t iList = 0; iList < nTracklets; iList++) {
512 if (trkTrack[iList] == -1) continue;
513 trk = GetTracklet(trkTrack[iList]);
514 fGTUtrk->AddTracklet(trk);
516 fGTUtrk->Track(fXprojPlane,fField);
527 //_____________________________________________________________________________
528 void AliTRDmodule::AddTrack()
531 // Add a found track to the module
534 Tracks()->Add(fGTUtrk);
538 //_____________________________________________________________________________
539 void AliTRDmodule::RemoveMultipleTracks()
542 // Remove multiple found tracks
545 AliTRDgtuTrack *trk1;
546 AliTRDgtuTrack *trk2;
556 while (iTrack < (GetNtracks()-1)) {
558 trk1 = GetTrack(iTrack );
559 trk2 = GetTrack(iTrack+1);
561 ntrk1 = trk1->GetNtracklets();
562 yproj1 = trk1->GetYproj();
563 alpha1 = trk1->GetSlope();
564 ntrk2 = trk2->GetNtracklets();
565 yproj2 = trk2->GetYproj();
566 alpha2 = trk2->GetSlope();
568 if ((TMath::Abs(yproj1-yproj2) < fDeltaY) &&
569 (TMath::Abs(alpha1-alpha2) < fDeltaS)) {
571 RemoveTrack(iTrack );
574 RemoveTrack(iTrack+1);
585 //_____________________________________________________________________________
586 TObjArray *AliTRDmodule::Tracklets()
589 // Returns the list of tracklets
593 fTracklets = new TObjArray(400);
600 //_____________________________________________________________________________
601 void AliTRDmodule::ResetTracklets()
604 // Resets the list of tracklets
608 fTracklets->Delete();
613 //_____________________________________________________________________________
614 void AliTRDmodule::SortTracklets()
617 // Sorts the list of tracklets
626 //_____________________________________________________________________________
627 Int_t AliTRDmodule::GetNtracklets() const
630 // Returns the number of tracklets
634 return fTracklets->GetEntriesFast();
641 //_____________________________________________________________________________
642 TObjArray *AliTRDmodule::Tracks()
645 // Returns the list of tracks
649 fTracks = new TObjArray(400);
656 //_____________________________________________________________________________
657 void AliTRDmodule::SortTracks()
660 // Sort the list of tracks
669 //_____________________________________________________________________________
670 Int_t AliTRDmodule::GetNtracks() const
673 // Returns the number of tracks
677 return fTracks->GetEntriesFast();