]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/AliITSclusterSSD.cxx
Transition to NewIO
[u/mrichter/AliRoot.git] / ITS / AliITSclusterSSD.cxx
CommitLineData
ee86d557 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
88cb7938 16/* $Id$ */
ee86d557 17
4ae5bbc4 18#include <Riostream.h>
ee86d557 19#include "TArrayI.h"
20#include "TClonesArray.h"
e8189707 21#include "AliITSdigit.h"
b0f5e3fc 22#include "AliITSclusterSSD.h"
23
24ClassImp(AliITSclusterSSD)
25
ee86d557 26//______________________________________________________________________
27AliITSclusterSSD::AliITSclusterSSD(){
28 // default constructor
b0f5e3fc 29
ee86d557 30 fSide = kTRUE;
31 fDigits = 0;
32 fNDigits = 0;
33 fDigitsIndex = 0;
34 fNCrosses = 0;
35 fTotalSignal = -1;
36 fNTracks = -1;
37 fLeftNeighbour = kFALSE;
38 fRightNeighbour = kFALSE;
39 fCrossedClusterIndexes = 0;
40 fConsumed=kFALSE;
b0f5e3fc 41}
ee86d557 42//______________________________________________________________________
43AliITSclusterSSD::AliITSclusterSSD(Int_t ndigits, Int_t *DigitIndexes,
44 TObjArray *Digits, Bool_t side){
45 // non-default constructor
b0f5e3fc 46
ee86d557 47 fNDigits = ndigits;
48 fDigits = Digits;
49 fSide = side;
50 fDigitsIndex = new TArrayI(fNDigits,DigitIndexes );
51 fNCrosses = 0;
52 fCrossedClusterIndexes = new TArrayI(300);
53 fLeftNeighbour = kFALSE;
54 fRightNeighbour = kFALSE;
55 fTotalSignal =-1;
56 fNTracks = -1;
57 fConsumed=kFALSE;
b0f5e3fc 58}
ee86d557 59//______________________________________________________________________
60AliITSclusterSSD::~AliITSclusterSSD(){
61 // destructor
f239b2fe 62
ee86d557 63 delete fDigitsIndex;
64 delete fCrossedClusterIndexes;
65}
66//______________________________________________________________________
67AliITSclusterSSD::AliITSclusterSSD(const AliITSclusterSSD &OneSCluster){
68 // copy constructor
b0f5e3fc 69
ee86d557 70 if (this == &OneSCluster) return;
71 fNDigits = OneSCluster.fNDigits;
72 fSide=OneSCluster.fSide;
73 fDigits=OneSCluster.fDigits;
74 fDigitsIndex = new TArrayI(fNDigits);
75 fLeftNeighbour = OneSCluster.fLeftNeighbour;
76 fRightNeighbour = OneSCluster.fRightNeighbour;
77 fTotalSignal =-1;
78 fNTracks = -1;
79 fNCrosses = OneSCluster.fNCrosses;
80 fConsumed = OneSCluster.fConsumed;
81 Int_t i;
82 for (i = 0; i< fNCrosses ; i++){
83 fCrossedClusterIndexes[i] = OneSCluster.fCrossedClusterIndexes[i];
84 }
85 for (i = 0; i< fNDigits ; i++){
86 fDigitsIndex[i]=OneSCluster.fDigitsIndex[i];
87 }
88 return;
89}
90//______________________________________________________________________
91AliITSclusterSSD& AliITSclusterSSD::operator=(const AliITSclusterSSD
92 &OneSCluster){
93 // assignment operator
f239b2fe 94
ee86d557 95 if (this == &OneSCluster) return *this;
96 fNDigits = OneSCluster.fNDigits;
97 fSide=OneSCluster.fSide;
98 fDigits=OneSCluster.fDigits;
99 fDigitsIndex = new TArrayI(fNDigits);
100 fLeftNeighbour = OneSCluster.fLeftNeighbour;
101 fRightNeighbour = OneSCluster.fRightNeighbour;
102 fTotalSignal =-1;
103 fNTracks = -1;
104 fNCrosses = OneSCluster.fNCrosses;
105 fConsumed = OneSCluster.fConsumed;
106 Int_t i;
107 for (i = 0; i< fNCrosses ; i++){
108 fCrossedClusterIndexes[i] = OneSCluster.fCrossedClusterIndexes[i];
109 }
110 for (i = 0; i< fNDigits ; i++){
111 fDigitsIndex[i]=OneSCluster.fDigitsIndex[i];
112 }
113 return *this;
114}
115//______________________________________________________________________
116Int_t AliITSclusterSSD::SplitCluster(Int_t where, Int_t *outdigits){
117 //This methods generate data necessery to make new object of this class
118 //I choosen this way, because methods TClonesArray::Add* dont work
119 //so I have to use constraction: new (a[i]) Creator(params...);
120 //where 'a' is a TClonesArray
121 //This method generate params - see AliITSmoduleSSD::SplitCluster;
122 Int_t tmp = fNDigits;
123 Int_t ind = 0;
b0f5e3fc 124
b0f5e3fc 125 outdigits[ind++]=(*fDigitsIndex)[where];
ee86d557 126 //coping border strip (it is shared by this two clusters)
127 for (Int_t i = (where+1); i < tmp; i++) {
128 outdigits[ind++]=(*fDigitsIndex)[i];
129 //"moving" strips from this to the new one
130 (*fDigitsIndex)[i]=-1;
131 fNDigits--; //deleting strips from this cluster
132 }
133 return ind;
b0f5e3fc 134}
ee86d557 135//______________________________________________________________________
136Int_t AliITSclusterSSD::GetDigitStripNo(Int_t digit){
137 // return strip no of a digit
138 if (digit<0) return -1;
139 return (digit>(fNDigits-1)) ? -1 :
140 ((AliITSdigitSSD*)(fDigits->At((*fDigitsIndex)[digit])))->GetStripNumber();
b0f5e3fc 141}
ee86d557 142//______________________________________________________________________
143Int_t AliITSclusterSSD::GetDigitSignal(Int_t digit){
144 // returns digit signal
145 Int_t index,signal;
146 if (digit<0||digit>=fNDigits) return -1;
147 index = (*fDigitsIndex)[digit];
148 signal = ((AliITSdigitSSD*)(fDigits->At(index)))->GetSignal();
149 /*
150 if(signal>1.e5) printf("GetDigitSignal: digit %d index %d signal %d\n",
151 digit,index, signal);
152 */
153 return signal;
b0f5e3fc 154}
ee86d557 155//______________________________________________________________________
156void AliITSclusterSSD::AddCross(Int_t clIndex){
157 // add cluster cross to list of cluster crosses
766ef0c8 158
ee86d557 159 (*fCrossedClusterIndexes)[fNCrosses++] = clIndex;
b0f5e3fc 160}
ee86d557 161//______________________________________________________________________
162Int_t AliITSclusterSSD::GetCross(Int_t crIndex){
163 // return crossing cluster
b0f5e3fc 164
ee86d557 165 return ((crIndex>-1)&&(crIndex<fNCrosses))?(*fCrossedClusterIndexes)[crIndex]:-1;
b0f5e3fc 166}
ee86d557 167//______________________________________________________________________
168Double_t AliITSclusterSSD::CentrOfGravity(){
169 // return center of gravity of the cluster
170 Float_t ret=0;
b0f5e3fc 171
ee86d557 172 if (fLeftNeighbour) ret+=(GetDigitStripNo(0)*0.5*GetDigitSignal(0));
173 else ret+=(GetDigitStripNo(0)*GetDigitSignal(0));
174 if (fRightNeighbour) ret+=(GetDigitStripNo(fNDigits -1)*0.5*GetDigitSignal(fNDigits -1));
175 else ret+=(GetDigitStripNo(fNDigits -1)*GetDigitSignal(fNDigits-1));
176 for (Int_t i=1;i<fNDigits-1;i++){
177 ret +=GetDigitStripNo(i)*GetDigitSignal(i);
178 }// end for i
b0f5e3fc 179
ee86d557 180 if (fTotalSignal<0) GetTotalSignal();
b0f5e3fc 181
182 return (ret/fTotalSignal);
183}
ee86d557 184//______________________________________________________________________
185Float_t AliITSclusterSSD::GetTotalSignal(){
186 // return total signal
766ef0c8 187
ee86d557 188 if(fTotalSignal <0){
189 fTotalSignal=0;
190 if (fNDigits ==1) {
191 fTotalSignal = (Float_t)GetDigitSignal(0);
192 //printf("1 digit: signal %d \n",GetDigitSignal(0));
193 return fTotalSignal;
194 }
195 if (fLeftNeighbour) fTotalSignal += (Float_t)(0.5*GetDigitSignal(0));
196 else fTotalSignal += (Float_t) GetDigitSignal(0);
197 //printf("GetTotalSignal :i DigitSignal %d %d \n",0,GetDigitSignal(0));
198 if (fRightNeighbour) fTotalSignal += (Float_t)(0.5*GetDigitSignal(
199 fNDigits -1));
b0f5e3fc 200 else fTotalSignal += (Float_t)GetDigitSignal(fNDigits-1);
ee86d557 201 //printf("GetTotalSignal :i DigitSignal %d %d \n",fNDigits -1,GetDigitSignal(fNDigits -1));
202 for (Int_t i = 1;i<fNDigits -1;i++){
203 fTotalSignal += (Float_t)GetDigitSignal(i);
204 //printf("GetTotalSignal :i DigitSignal %d %d \n",i,GetDigitSignal(i));
b0f5e3fc 205 }
ee86d557 206 //printf("GetTotalSignal: fNDigits %d fTotalSignal %.0f \n",fNDigits,fTotalSignal);
b0f5e3fc 207 }
ee86d557 208 return fTotalSignal;
b0f5e3fc 209}
ee86d557 210//______________________________________________________________________
211Float_t AliITSclusterSSD::GetTotalSignalError(){
212 // return the error on the signal
213 Float_t err =0;
214 for (Int_t i =1; i<fNDigits -1; i++){
215 err+=0.1*GetDigitSignal(i);
b0f5e3fc 216 }
ee86d557 217 if (GetLeftNeighbour()){
218 err+=GetDigitSignal(0);
219 }else{
220 err+=0.1*GetDigitSignal(0);
221 }
222 if (GetRightNeighbour()){
223 err+=GetDigitSignal(fNDigits -1);
224 }else{
225 err+=0.1*GetDigitSignal(fNDigits -1);
226 }
227 return err;
b0f5e3fc 228}
ee86d557 229//______________________________________________________________________
230void AliITSclusterSSD::DelCross(Int_t index){
231 // remove cross clusters from the list of cross clusters
232 Int_t i,j; //iterators
b0f5e3fc 233
ee86d557 234 for (i =0;i<fNCrosses;i++){
235 if ((*fCrossedClusterIndexes)[i] == index){
236 for (j=i;j<fNCrosses-1;j++){
237 (*fCrossedClusterIndexes)[j]=(*fCrossedClusterIndexes)[j+1];
238 }
239 fNCrosses--;
240 return;
241 }
242 }
b0f5e3fc 243}
ee86d557 244//______________________________________________________________________
245Int_t *AliITSclusterSSD::GetTracks(Int_t &nt){
246 // return the track number of the cluster
f8d9a5b8 247 Int_t ntrk = GetDigit(0)->GetNTracks();
248 Int_t ndig = GetNumOfDigits();
249 Int_t *idig = new Int_t[ndig];
250 Int_t *sdig = new Int_t[ndig];
251 Int_t *itrk = new Int_t[ndig*ntrk];
252 Int_t i,j,k,l,trk;
253 Bool_t b;
254
255 for(i=0;i<ndig;i++){idig[i] = i;sdig[i] = GetDigit(i)->GetSignal();}
256 TMath::Sort(ndig,sdig,idig,kTRUE);
257 for(i=0;i<ndig*ntrk;i++) itrk[i] = -3;
258 j = k = l = 0;
259 for(i=0;i<ndig;i++){ // fill itrk with track numbers in order of digit size
260 j = idig[i];
261 for(k=0;k<ntrk;k++) if((trk = GetDigit(j)->GetTrack(k))>=0) {
262 itrk[l] = trk;
263 l++;
264 } // end for k/if
265 } // end for i
266 for(i=0;i<10;i++) fTrack[i] = -3;
267 fTrack[0] = itrk[0]; // first element
268 k = 1;
269 b = kTRUE;
270 for(i=1;i<l;i++){
271 for(j=0;j<k;j++) if(fTrack[j]==itrk[i]) b = kFALSE;
272 if(b){fTrack[k] = itrk[i]; k++;}
273 if(k>9) break;
274 } // end for i
275 nt = k;
276
277 delete[] idig;
278 delete[] sdig;
279 delete[] itrk;
280
281 return fTrack;
282/*
ee86d557 283 Int_t *tidx=0;
284 Int_t i, j,n;
285 Int_t bit =0;
286 Int_t ntracks=0;
287 nt=0;
b0f5e3fc 288
ee86d557 289 for (i=0;i<10;i++) fTrack[i] = -3;
b0f5e3fc 290
ee86d557 291 //cout<<"GetTrack start -------: fNDigits ="<<fNDigits<<endl;
b0f5e3fc 292
ee86d557 293 for (i = 0; i<fNDigits; i++) {
294 tidx = GetDigit(i)->GetTracks();
295 n = GetDigit(i)->GetNTracks();
296 for (j = 0; j<n && j<10;j++) {
297 if (tidx[j] >= 0) {
298 if(ntracks == 0){
299 fTrack[ntracks] = tidx[j];
300 ntracks++;
301 }else if(tidx[j] != fTrack[ntracks-1]){
302 ntracks++;
303 if(ntracks > 9) {
304 bit = 1;
305 break;
306 } // end if ntracks > 9
307 fTrack[ntracks-1] = tidx[j];
308 } // end if ntracke == 0
309 } // end if tidx[j] >=0
310 } // 3-tracks loop for the digit
311 if(bit == 1) break;
312 } // digit loop
f239b2fe 313
ee86d557 314 SetNTracks(ntracks);
315 nt = ntracks;
316 return &(fTrack[0]);
f8d9a5b8 317*/
b0f5e3fc 318}
ee86d557 319//______________________________________________________________________
320Double_t AliITSclusterSSD::GetPosition(){
321 // return position of the cluster
322 Float_t ret;
b0f5e3fc 323
ee86d557 324 switch(fNDigits){
325 case 1:
326 ret = GetDigitStripNo(0);
327 break;
328 case 2:
329 ret = EtaAlgorithm();
330 break;
331 default:
332 ret = CentrOfGravity();
333 }
334 return ret;
b0f5e3fc 335}
ee86d557 336//______________________________________________________________________
337Double_t AliITSclusterSSD::EtaAlgorithm(){
338 // algorithm for determing cluster position
339 if (fNDigits != 2) return -1;
b0f5e3fc 340
ee86d557 341 Int_t strip1 = GetDigit(0)->GetStripNumber();
342 Int_t strip2 = GetDigit(1)->GetStripNumber();
343 Int_t signal1 = GetDigit(0)->GetSignal();
344 Int_t signal2 = GetDigit(1)->GetSignal();
b0f5e3fc 345
ee86d557 346 Double_t eta;
b0f5e3fc 347
348
ee86d557 349 if (strip1<strip2){
350 eta = ((Double_t)signal2)/((Double_t)(signal1+signal2));
351 if (eta<0.04) return strip1;
352 if (eta>0.96) return strip2;
353 return (strip1 + 0.43478261*eta + 0.2826087);
354 } else{
355 eta = ((Double_t)signal1)/((Double_t)(signal1+signal2));
356 if (eta<0.04) return strip2;
357 if (eta>0.96) return strip1;
358 return (strip2 + 0.43478261*eta + 0.2826087);
359 }
b0f5e3fc 360}
ee86d557 361//______________________________________________________________________
362Double_t AliITSclusterSSD::GetPositionError(){
363 // return the position error
364 return (GetNumOfDigits()+1)/2;
b0f5e3fc 365}
ee86d557 366//______________________________________________________________________
367Bool_t AliITSclusterSSD::IsCrossingWith(Int_t idx){
368 // return the cluster to which he crosses
b0f5e3fc 369
ee86d557 370 for (Int_t i =0; i< fNCrosses;i++){
371 if (GetCross(i) == idx) return kTRUE;
372 }
373 return kFALSE;
b0f5e3fc 374}