Update of tracking code provided by Sergei
[u/mrichter/AliRoot.git] / TRD / AliTRDcluster.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 $Log$
18 Revision 1.4  2001/05/07 08:08:05  cblume
19 Update of TRD code
20
21 Revision 1.3  2000/12/08 16:07:02  cblume
22 Update of the tracking by Sergei
23
24 Revision 1.2  2000/10/06 16:49:46  cblume
25 Made Getters const
26
27 Revision 1.1.2.1  2000/09/22 14:47:52  cblume
28 Add the tracking code
29
30 */
31
32 #include "AliTRDcluster.h"
33 #include "AliTRDgeometry.h"
34 #include "AliTRDrecPoint.h"
35
36 ClassImp(AliTRDcluster)
37  
38
39 //_____________________________________________________________________________
40   AliTRDcluster::AliTRDcluster(const AliTRDrecPoint &p):AliCluster()
41 {
42   //
43   // Constructor from AliTRDrecPoint
44   //
45
46   fDetector   = p.GetDetector();
47   fTimeBin    = p.GetLocalTimeBin();
48
49   fTracks[0]  = p.GetTrackIndex(0);
50   fTracks[1]  = p.GetTrackIndex(1);
51   fTracks[2]  = p.GetTrackIndex(2);
52
53   fQ          = p.GetEnergy();
54
55   fY          = p.GetY();
56   fZ          = p.GetZ();
57   fSigmaY2    = p.GetSigmaY2();
58   fSigmaZ2    = p.GetSigmaZ2();  
59
60   fSigmaY2    = 0.2;
61   fSigmaZ2    = 5.;  
62
63 }
64
65 //_____________________________________________________________________________
66 AliTRDcluster::AliTRDcluster(const AliTRDcluster &c):AliCluster()
67 {
68   //
69   // Copy constructor 
70   //
71
72   fTracks[0]  = c.GetLabel(0);
73   fTracks[1]  = c.GetLabel(1);
74   fTracks[2]  = c.GetLabel(2);
75
76   fY          = c.GetY();
77   fZ          = c.GetZ();
78   fSigmaY2    = c.GetSigmaY2();
79   fSigmaZ2    = c.GetSigmaZ2();  
80
81   fDetector   = c.GetDetector();
82   fTimeBin    = c.GetLocalTimeBin();
83   fQ          = c.GetQ();
84
85 }
86
87 //_____________________________________________________________________________
88 void AliTRDcluster::AddTrackIndex(Int_t *track)
89 {
90   //
91   // Adds track index. Currently assumed that track is an array of
92   // size 9, and up to 3 track indexes are stored in fTracks[3].
93   // Indexes are sorted according to:
94   //  1) index of max number of appearances is stored first
95   //  2) if two or more indexes appear equal number of times, the lowest
96   //     ones are stored first;
97   //
98
99   const Int_t size = 9;
100
101   Int_t entries[size][2], i, j, index;
102
103   Bool_t index_added;
104
105   for (i=0; i<size; i++) {
106     entries[i][0]=-1;
107     entries[i][1]=0;
108   }                                 
109
110   for (Int_t k=0; k<size; k++) {
111     index=track[k];
112     index_added=kFALSE; j=0;
113     if (index >= 0) {
114       while ( (!index_added) && ( j < size ) ) {
115         if ((entries[j][0]==index) || (entries[j][1]==0)) {
116           entries[j][0]=index;
117           entries[j][1]=entries[j][1]+1;
118           index_added=kTRUE;
119         }
120         j++;
121       }
122     }
123   }             
124
125   // sort by number of appearances and index value
126   Int_t swap=1, tmp0, tmp1;
127   while ( swap > 0) {
128     swap=0;
129     for(i=0; i<(size-1); i++) {
130       if ((entries[i][0] >= 0) && (entries[i+1][0] >= 0)) {
131         if ((entries[i][1] < entries[i+1][1]) ||
132             ((entries[i][1] == entries[i+1][1]) &&
133              (entries[i][0] > entries[i+1][0]))) {
134                tmp0=entries[i][0];
135                tmp1=entries[i][1];
136                entries[i][0]=entries[i+1][0];
137                entries[i][1]=entries[i+1][1];
138                entries[i+1][0]=tmp0;
139                entries[i+1][1]=tmp1;
140                swap++;
141         }
142       }
143     }
144   }               
145
146   // set track indexes
147   for(i=0; i<3; i++) SetLabel(entries[i][0],i);
148
149   return;
150
151 }          
152