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