]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDmodule.cxx
Initial check-in of the model classes for User module
[u/mrichter/AliRoot.git] / TRD / AliTRDmodule.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 ///////////////////////////////////////////////////////////////////////////////
17 //                                                                           //
18 //                                                                           //
19 //  TRD 6-chambers stack                                                     //
20 //                                                                           //
21 //                                                                           //
22 ///////////////////////////////////////////////////////////////////////////////
23
24 #include <TObject.h>
25
26 #include "AliLog.h"
27
28 #include "AliTRDgeometry.h"
29 #include "AliTRDmodule.h"
30 #include "AliTRDltuTracklet.h"
31 #include "AliTRDgtuTrack.h"
32 #include "AliTRDtrigParam.h"
33 #include "AliTRDzmaps.h"
34
35 ClassImp(AliTRDmodule)
36
37 //_____________________________________________________________________________
38 AliTRDmodule::AliTRDmodule()
39   :TObject() 
40   ,fXprojPlane(0)
41   ,fField(0)
42   ,fTracklets(NULL)
43   ,fTracks(NULL)
44   ,fDeltaY(0)
45   ,fDeltaS(0)
46   ,fLTUtrk(0)
47   ,fGTUtrk(0)
48 {
49   //
50   // AliTRDmodule default constructor
51   //
52
53 }
54
55 //_____________________________________________________________________________
56 AliTRDmodule::AliTRDmodule(AliTRDtrigParam *trigp) 
57   :TObject()
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())
64   ,fLTUtrk(0)
65   ,fGTUtrk(0)
66 {
67   //
68   // AliTRDmodule constructor
69   //
70
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;
76       }
77     }
78   }
79
80 }
81
82 //_____________________________________________________________________________
83 AliTRDmodule::AliTRDmodule(const AliTRDmodule &m)
84   :TObject(m)
85   ,fXprojPlane(m.fXprojPlane)
86   ,fField(m.fField)
87   ,fTracklets(NULL)
88   ,fTracks(NULL)
89   ,fDeltaY(m.fDeltaY)
90   ,fDeltaS(m.fDeltaS)
91   ,fLTUtrk(NULL)
92   ,fGTUtrk(NULL)
93 {
94   //
95   // AliTRDmodule copy constructor
96   //
97
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;
103       }
104     }
105   }
106
107 }
108
109 //_____________________________________________________________________________
110 AliTRDmodule::~AliTRDmodule()
111 {
112   //
113   // Destructor
114   //
115
116 }
117
118 //_____________________________________________________________________________
119 AliTRDmodule &AliTRDmodule::operator=(const AliTRDmodule &m)
120 {
121   //
122   // Assignment operator
123   //
124
125   if (this != &m) ((AliTRDmodule &) m).Copy(*this); 
126   return *this;
127
128 }
129
130 //_____________________________________________________________________________
131 void AliTRDmodule::Copy(TObject &m) const
132 {
133   //
134   // copy function
135   //
136
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;
145
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;
151       }
152     }
153   }
154
155 }
156
157 //_____________________________________________________________________________
158 void AliTRDmodule::Reset() 
159 {
160   //
161   // Reset the tracks and tracklets in the module
162   //
163
164   ResetTracklets();
165   ResetTracks();
166
167   fLTUtrk    = 0;
168   fGTUtrk    = 0;
169   fTracklets = new TObjArray(400);
170   fTracks    = new TObjArray(400);
171
172 }
173
174 //_____________________________________________________________________________
175 void AliTRDmodule::ResetTracks() 
176 {
177   // 
178   // Reset the tracks in the module
179   //
180
181   if (fTracks) {
182
183     AliTRDgtuTrack *trk;
184     for (Int_t i = 0; i < GetNtracks(); i++) {
185       
186       trk = GetTrack(i);
187       trk->Reset();
188       
189     }
190
191     fTracks->Delete();
192
193   }
194
195 }
196
197 //_____________________________________________________________________________
198 AliTRDgtuTrack *AliTRDmodule::GetTrack(Int_t pos) const
199 {
200   //
201   // Return track at position "pos"
202   //
203
204   if (fTracks == 0) {
205     return 0;
206   }
207
208   void *trk = fTracks->UncheckedAt(pos);
209   if (trk == 0) {
210     return 0;
211   }
212
213   return (AliTRDgtuTrack *) trk;
214
215 }
216
217 //_____________________________________________________________________________
218 void AliTRDmodule::RemoveTrack(Int_t pos)
219 {
220   //
221   // Remove the track at position "pos"
222   //
223
224   if (fTracks == 0) {
225     return;
226   }
227
228   fTracks->RemoveAt(pos);
229   fTracks->Compress();
230
231 }
232
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) 
237 {
238   // 
239   // Add a tracklet to this track
240   //
241   
242   fLTUtrk = new AliTRDltuTracklet(det,row,rowz,slope,offset,time,ncl,label,q);
243   Tracklets()->Add(fLTUtrk);
244
245 }
246
247 //_____________________________________________________________________________
248 AliTRDltuTracklet *AliTRDmodule::GetTracklet(Int_t pos) const
249 {
250   //
251   // Get the tracklet at position "pos"
252   //
253
254   if (fTracklets == 0) {
255     return 0;
256   }
257
258   void *trk = fTracklets->UncheckedAt(pos);
259   if (trk == 0) {
260     return 0;
261   }
262
263   return (AliTRDltuTracklet *) trk;
264
265 }
266
267 //_____________________________________________________________________________
268 void AliTRDmodule::RemoveTracklet(Int_t pos)
269 {
270   //
271   // Remove the tracklet at position "pos"
272   //
273
274   if (fTracklets == 0) {
275     return;
276   }
277
278   fTracklets->RemoveAt(pos);
279   fTracklets->Compress();
280
281 }
282
283 //_____________________________________________________________________________
284 void AliTRDmodule::RemoveMultipleTracklets()
285 {
286   //
287   // Remove multiple found tracklets
288   //
289
290   Float_t offDiffMin = 0.5;  // [cm]
291
292   AliTRDltuTracklet *trk;
293   Int_t   det1, det2, row1, row2, ncl1, ncl2, label1, label2;
294   Float_t off1, off2;
295   Int_t   itrk = 0;
296   while (itrk < (GetNtracklets() - 1)) {
297
298     trk    = GetTracklet(itrk);
299     det1   = trk->GetDetector();
300     row1   = trk->GetRow();
301     off1   = trk->GetOffset();
302     ncl1   = trk->GetNclusters();
303     label1 = trk->GetLabel();
304
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();
311
312     if ((det1 == det2) && (row1 == row2)) {
313       if ((off2 - off1) < offDiffMin) {
314         if (ncl1 < ncl2) {
315           RemoveTracklet(itrk  );
316         }    
317         else {
318           RemoveTracklet(itrk+1);
319         }
320       }
321     }
322
323     itrk++;
324
325   }
326
327 }
328
329 //_____________________________________________________________________________
330 void AliTRDmodule::SortZ(Int_t cha)
331 {
332   //
333   // Match tracklets in the x-z plane (pad row sorting)
334   //
335
336   InitZLUT();
337
338   AliTRDltuTracklet *trk;
339   Int_t row, pla, det;
340
341   for (Int_t iTrk = 0; iTrk < GetNtracklets(); iTrk++) {
342
343     trk = GetTracklet(iTrk);
344     row = trk->GetRow();
345     det = trk->GetDetector();
346     pla = trk->GetPlane(det);
347
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]++;
352       }
353     }
354
355   }
356
357 }
358
359 //_____________________________________________________________________________
360 void AliTRDmodule::InitZLUT()
361 {
362   //
363   // Initialize the pad row sorting look-up-table
364   //
365
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;
371       }
372     }
373   }
374
375 }
376
377 //_____________________________________________________________________________
378 void AliTRDmodule::FindTracks() 
379 {
380   //
381   // Find tracks from tracklets
382   //
383
384   for (Int_t iZchan = 0; iZchan < kNsubZchan; iZchan++) {
385     FindTracksCombi(iZchan);
386   }
387
388 }
389
390 //_____________________________________________________________________________
391 void AliTRDmodule::FindTracksCombi(Int_t zchan) 
392 {
393   //
394   // Find tracks by pure combinatorics...
395   //
396   
397   static Int_t trkTrack[12];
398   
399   Int_t   nTracklets;
400   Int_t   nPlanes;
401   Int_t   ntrk1;
402   Int_t   trkId1;
403   Int_t   ntrk2;
404   Int_t   trkId2;
405
406   Float_t y1;
407   Float_t y1min;
408   Float_t y1max;
409   Float_t s1;
410   Float_t z1;
411   Float_t s1min;
412   Float_t s1max;
413   Float_t y2;
414   Float_t s2;
415   Float_t z2;
416
417   AliTRDltuTracklet *trk1;
418   AliTRDltuTracklet *trk2;
419   AliTRDltuTracklet *trk ;
420
421   Bool_t isPlane[kNplan];
422
423   for (Int_t iPlan1 = 0; iPlan1 < kNplan; iPlan1++) {
424
425     ntrk1 = fZnchan[iPlan1][zchan];
426
427     for (Int_t iTrk1 = 0; iTrk1 < ntrk1; iTrk1++) {
428
429       for (Int_t iPlan = 0; iPlan < kNplan; iPlan++) {
430         isPlane[iPlan] = kFALSE;
431       }
432
433       trkId1 = fZtrkid[iPlan1][iTrk1][zchan];
434
435       nTracklets = 0;
436       for (Int_t iList = 0; iList < kNmaxTrk; iList++) {
437         trkTrack[iList] = -1;
438       }
439       trkTrack[nTracklets++] = trkId1;
440
441       isPlane[iPlan1] = kTRUE;
442
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);      
451
452       for (Int_t iPlan2 = 0; iPlan2 < kNplan; iPlan2++) {
453
454         if (iPlan2 == iPlan1) continue;
455
456         ntrk2 = fZnchan[iPlan2][zchan];
457
458         for (Int_t iTrk2 = 0; iTrk2 < ntrk2; iTrk2++) {
459
460           trkId2 = fZtrkid[iPlan2][iTrk2][zchan];
461
462           if (trkId2 == trkId1) continue;
463
464           trk2 = GetTracklet(trkId2);
465           y2   = trk2->GetYproj(fXprojPlane);
466           s2   = trk2->GetSlope();
467           z2   = trk2->GetZproj(fXprojPlane);
468
469           if ((y1min < y2 && y2 < y1max) && 
470               (s1min < s2 && s2 < s1max)) {
471
472             if (nTracklets >= kNmaxTrk) {
473               AliWarning("Too many tracklets for this track.");
474             }    
475             else {
476               trkTrack[nTracklets++] = trkId2;
477               isPlane[iPlan2] = kTRUE;
478             }
479
480           }
481
482         }  // end trk 2
483
484       }  // end plan 2
485
486       nPlanes = 0;
487       for (Int_t iPlan = 0; iPlan < kNplan; iPlan++) {
488         nPlanes += (Int_t) isPlane[iPlan];
489       }
490       
491       if (nPlanes >= 4) {
492
493         Int_t cha1, cha2, npoints1, npoints2;
494         for (Int_t iList = 0; iList < (nTracklets - 1); iList++) {
495
496           if (trkTrack[iList] == -1 || trkTrack[iList+1] == -1) continue;
497           trk1 = GetTracklet(trkTrack[iList  ]);
498           trk2 = GetTracklet(trkTrack[iList+1]);
499
500           cha1 = trk1->GetDetector();
501           cha2 = trk2->GetDetector();
502           if (cha1 != cha2) continue;
503
504           npoints1 = trk1->GetNclusters();
505           npoints2 = trk2->GetNclusters();
506
507           if (npoints1 == npoints2) {
508             trkTrack[iList] = -1;
509           } 
510           else {
511             if (npoints1 > npoints2) trkTrack[iList+1] = -1;
512             if (npoints1 < npoints2) trkTrack[iList  ] = -1;
513           }
514
515         }
516
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);
522         }
523         fGTUtrk->Track(fXprojPlane,fField);
524         AddTrack();
525
526       }
527            
528     }  // end trk 1
529
530   }  // end plan 1
531
532 }
533
534 //_____________________________________________________________________________
535 void AliTRDmodule::AddTrack() 
536 {
537   //
538   // Add a found track to the module
539   //
540   
541   Tracks()->Add(fGTUtrk);
542
543 }
544
545 //_____________________________________________________________________________
546 void AliTRDmodule::RemoveMultipleTracks()
547 {
548   //
549   // Remove multiple found tracks
550   //
551
552   AliTRDgtuTrack *trk1;
553   AliTRDgtuTrack *trk2;
554
555   Float_t yproj1;
556   Float_t yproj2;
557   Float_t alpha1;
558   Float_t alpha2;
559   Int_t   ntrk1;
560   Int_t   ntrk2;
561   Int_t   iTrack = 0;
562
563   while (iTrack < (GetNtracks()-1)) {
564
565     trk1   = GetTrack(iTrack  );
566     trk2   = GetTrack(iTrack+1);
567
568     ntrk1  = trk1->GetNtracklets();
569     yproj1 = trk1->GetYproj();
570     alpha1 = trk1->GetSlope();
571     ntrk2  = trk2->GetNtracklets();
572     yproj2 = trk2->GetYproj();
573     alpha2 = trk2->GetSlope();
574
575     if ((TMath::Abs(yproj1-yproj2) < fDeltaY) && 
576         (TMath::Abs(alpha1-alpha2) < fDeltaS)) {
577       if (ntrk1 < ntrk2) {
578         RemoveTrack(iTrack  );
579       } 
580       else {
581         RemoveTrack(iTrack+1);
582       }
583     } 
584     else {
585       iTrack++;
586     }
587     
588   }
589
590 }
591
592 //_____________________________________________________________________________
593 TObjArray *AliTRDmodule::Tracklets() 
594
595   //
596   // Returns the list of tracklets
597   //
598
599   if (!fTracklets) {
600     fTracklets = new TObjArray(400); 
601   }
602
603   return fTracklets; 
604
605 }
606
607 //_____________________________________________________________________________
608 void AliTRDmodule::ResetTracklets() 
609 {
610   //
611   // Resets the list of tracklets
612   //
613  
614   if (fTracklets) {
615     fTracklets->Delete();
616   } 
617
618 }
619
620 //_____________________________________________________________________________
621 void AliTRDmodule::SortTracklets()  
622 {
623   //
624   // Sorts the list of tracklets
625   //
626
627   if (fTracklets) {
628     fTracklets->Sort();
629   }
630  
631 }
632
633 //_____________________________________________________________________________
634 Int_t AliTRDmodule::GetNtracklets() const 
635 {
636   //
637   // Returns the number of tracklets
638   //
639
640   if (fTracklets) {
641     return fTracklets->GetEntriesFast();
642   }
643
644   return 0;
645
646 }
647
648 //_____________________________________________________________________________
649 TObjArray *AliTRDmodule::Tracks() 
650 {
651   //
652   // Returns the list of tracks
653   //
654  
655   if (!fTracks) {
656     fTracks = new TObjArray(400);
657   }
658  
659   return fTracks; 
660
661 }
662
663 //_____________________________________________________________________________
664 void AliTRDmodule::SortTracks()  
665
666   //
667   // Sort the list of tracks
668   //
669
670   if (fTracks) {
671     fTracks->Sort();
672   } 
673
674 }
675
676 //_____________________________________________________________________________
677 Int_t AliTRDmodule::GetNtracks() const 
678 {
679   //
680   // Returns the number of tracks
681   //
682
683   if (fTracks) {
684     return fTracks->GetEntriesFast();
685   }
686
687   return 0;
688
689 }