]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/AliITSpList.cxx
Radiator to Pad goes static.
[u/mrichter/AliRoot.git] / ITS / AliITSpList.cxx
CommitLineData
2134176d 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/* $Id$ */
16
17#include <stdio.h>
18#include <stdlib.h>
4ae5bbc4 19#include <Riostream.h>
2134176d 20#include <TObjArray.h>
21#include <TRandom.h>
22#include <TMath.h>
23
24#include "AliITSpList.h"
25
26//______________________________________________________________________
27
28ClassImp(AliITSpList);
29//______________________________________________________________________
30AliITSpList::AliITSpList(){
31 // Default constructor
c7d528c6 32 // Inputs:
33 // none.
34 // Outputs:
35 // none.
36 // Return:
37 // A zeroed/empty AliITSpList class.
2134176d 38
39 fNi = 0;
40 fNj = 0;
41 fa = 0;
42}
43//______________________________________________________________________
44AliITSpList::AliITSpList(Int_t imax,Int_t jmax){
45 // Standard constructor
c7d528c6 46 // Inputs:
47 // none.
48 // Outputs:
49 // none.
50 // Return:
51 // A setup AliITSpList class.
2134176d 52
53 fNi = imax;
54 fNj = jmax;
9ce4d38b 55 fEnteries = 0;
2134176d 56 fa = new TObjArray(fNi*fNj); // elements are zeroed by
57 // TObjArray creator
58}
59//______________________________________________________________________
60AliITSpList::~AliITSpList(){
61 // Default destructor
c7d528c6 62 // Inputs:
63 // none.
64 // Outputs:
65 // none.
66 // Return:
67 // a properly destroyed class
2134176d 68
69 for(Int_t i=0;i<GetMaxIndex();i++) if(fa->At(i)!=0){
c7d528c6 70 delete fa->At(i);
71 fa->AddAt(0,i); // zero content
2134176d 72 } // end for i && if
73 fNi = 0;
74 fNj = 0;
75 delete fa;
76 fa = 0;
9ce4d38b 77 fEnteries = 0;
2134176d 78}
79//______________________________________________________________________
80void AliITSpList::ClearMap(){
81 // Delete all AliITSpListItems and zero TObjArray.
c7d528c6 82 // Inputs:
83 // none.
84 // Outputs:
85 // none.
86 // Return:
87 // A zeroed AliITSpList class.
2134176d 88
9ce4d38b 89 fa->Delete();
cab0142f 90 /*
91 for(Int_t i=0;i<GetMaxIndex();i++) if(fa->At(i)!=0){
92 delete fa->At(i);
93 fa->AddAt(0,i); // zero content
94 } // end for i && if
95 */
9ce4d38b 96 fEnteries = 0;
2134176d 97}
98//______________________________________________________________________
99void AliITSpList::DeleteHit(Int_t i,Int_t j){
100 // Delete a particular AliITSpListItems and zero TObjArray.
c7d528c6 101 // Inputs:
102 // Int_t i Row number
103 // Int_t j Columns number
104 // Outputs:
105 // none.
106 // Return:
107 // none.
2134176d 108 Int_t k = GetIndex(i,j);
109
110 if(fa->At(k)!=0){
c7d528c6 111 delete fa->At(k);
112 fa->AddAt(0,k); // zero content
2134176d 113 } // end for i && if
9ce4d38b 114 if(k==fEnteries-1) fEnteries--;
2134176d 115}
116//______________________________________________________________________
117AliITSpList& AliITSpList::operator=(const AliITSpList &source){
118 // = operator
c7d528c6 119 // Inputs:
120 // const AliITSpList &source A AliITSpList object.
121 // Outputs:
122 // none.
123 // Return:
124 // A copied AliITSpList object.
2134176d 125
126 if(this == &source) return *this;
127
128 if(this->fa!=0){ // if this->fa exists delete it first.
c7d528c6 129 for(Int_t i=0;i<GetMaxIndex();i++) if(fa->At(i)!=0){
130 delete fa->At(i);
131 fa->AddAt(0,i); // zero content
132 } // end for i && if
133 delete this->fa;
2134176d 134 } // end if this->fa!=0
135 this->fNi = source.fNi;
136 this->fNj = source.fNj;
137 this->fa = new TObjArray(*(source.fa));
9ce4d38b 138 this->fEnteries = source.fEnteries;
2134176d 139
140 return *this;
141}
142//______________________________________________________________________
ac74f489 143AliITSpList::AliITSpList(AliITSpList &source) : AliITSMap(source){
2134176d 144 // Copy operator
c7d528c6 145 // Inputs:
146 // AliITSpList &source A AliITSpList Object
147 // Outputs:
148 // none.
149 // Return:
150 // A copied AliITSpList object
2134176d 151
152 *this = source;
153}
154//______________________________________________________________________
c7d528c6 155void AliITSpList::AddItemTo(Int_t fileIndex, AliITSpListItem *pl) {
156 // Adds the contents of pl to the list with track number off set given by
157 // fileIndex.
158 // Creates the AliITSpListItem if needed.
159 // Inputs:
160 // Int_t fileIndex track number offset value
161 // AliITSpListItem *pl an AliITSpListItem to be added to this class.
162 // Outputs:
163 // none.
164 // Return:
165 // none.
166 Int_t index = pl->GetIndex();
167
168 if( fa->At( index ) == 0 ) { // most create AliITSpListItem
169 fa->AddAt(new AliITSpListItem(-2,-1,pl->GetModule(),index,0.0),index);
170 } // end if
171
cab0142f 172 ((AliITSpListItem*)(fa->At(index)))->AddTo( fileIndex,pl);
9ce4d38b 173 if(index>=fEnteries) fEnteries = index +1;
c7d528c6 174}
175//______________________________________________________________________
2134176d 176void AliITSpList::AddSignal(Int_t i,Int_t j,Int_t trk,Int_t ht,Int_t mod,
c7d528c6 177 Double_t signal){
2134176d 178 // Adds a Signal value to the TObjArray at i,j. Creates the AliITSpListItem
179 // if needed.
c7d528c6 180 // Inputs:
181 // Int_t i Row number for this signal
182 // Int_t j Column number for this signal
183 // Int_t trk Track number creating this signal
184 // Int_t ht Hit number creating this signal
185 // Int_t mod The module where this signal is in
186 // Double_t signal The signal (ionization)
187 // Outputs:
188 // none.
189 // Return:
190 // none.
9ce4d38b 191 Int_t index = GetIndex(i,j);
2134176d 192
9ce4d38b 193 if(GetpListItem(index)==0){ // most create AliITSpListItem
cab0142f 194 fa->AddAt(new AliITSpListItem(trk,ht,mod,index,signal),index);
2134176d 195 }else{ // AliITSpListItem exists, just add signal to it.
9ce4d38b 196 GetpListItem(index)->AddSignal(trk,ht,mod,index,signal);
2134176d 197 } // end if
9ce4d38b 198 if(index>=fEnteries) fEnteries = index +1;
2134176d 199}
200//______________________________________________________________________
201void AliITSpList::AddNoise(Int_t i,Int_t j,Int_t mod,Double_t noise){
202 // Adds a noise value to the TObjArray at i,j. Creates the AliITSpListItem
203 // if needed.
c7d528c6 204 // Inputs:
205 // Int_t i Row number for this noise
206 // Int_t j Column number for this noise
207 // Double_t noise The noise signal value.
208 // Outputs:
209 // none.
210 // Return:
211 // none.
9ce4d38b 212 Int_t index = GetIndex(i,j);
2134176d 213
9ce4d38b 214 if(GetpListItem(index)==0){ // most create AliITSpListItem
215 fa->AddAt(new AliITSpListItem(mod,index,noise),index);
2134176d 216 }else{ // AliITSpListItem exists, just add signal to it.
9ce4d38b 217 GetpListItem(index)->AddNoise(mod,index,noise);
2134176d 218 } // end if
9ce4d38b 219 if(index>=fEnteries) fEnteries = index +1;
2134176d 220}
221//______________________________________________________________________
222
223ClassImp(AliITSpListItem)
224//______________________________________________________________________
225AliITSpListItem::AliITSpListItem(){
226 // Default constructor
c7d528c6 227 // Inputs:
228 // none.
229 // Outputs:
230 // none.
231 // Return:
232 // A zeroed/empty AliITSpListItem class.
2134176d 233
234 fmodule = -1;
235 findex = -1;
236 for(Int_t i=0;i<this->fkSize;i++){
c7d528c6 237 this->fTrack[i] = -2;
238 this->fHits[i] = -1;
239 this->fSignal[i] = 0.0;
2134176d 240 } // end if i
241 fTsignal = 0.0;
242 fNoise = 0.0;
cab0142f 243 fSignalAfterElect = 0.0;
2134176d 244}
245//______________________________________________________________________
246AliITSpListItem::AliITSpListItem(Int_t module,Int_t index,Double_t noise){
247 // Standard noise constructor
c7d528c6 248 // Inputs:
249 // Int_t module The module where this noise occurred
250 // Int_t index The cell index where this noise occurred
251 // Double_t noise The value of the noise.
252 // Outputs:
253 // none.
254 // Return:
255 // A setup and noise filled AliITSpListItem class.
2134176d 256
257 this->fmodule = module;
258 this->findex = index;
259 for(Int_t i=0;i<this->fkSize;i++){
c7d528c6 260 this->fTrack[i] = -2;
261 this->fSignal[i] = 0.0;
262 this->fHits[i] = -1;
2134176d 263 } // end if i
264 this->fTsignal = 0.0;
cab0142f 265 this->fSignalAfterElect = 0.0;
2134176d 266 this->fNoise = noise;
267}
268//______________________________________________________________________
269AliITSpListItem::AliITSpListItem(Int_t track,Int_t hit,Int_t module,
c7d528c6 270 Int_t index,Double_t signal){
2134176d 271 // Standard signal constructor
c7d528c6 272 // Inputs:
273 // Int_t track The track number which produced this signal
274 // Int_t hit The hit number which produced this signal
275 // Int_t module The module where this signal occurred
276 // Int_t index The cell index where this signal occurred
277 // Double_t signal The value of the signal (ionization)
278 // Outputs:
279 // none.
280 // Return:
281 // A setup and signal filled AliITSpListItem class.
2134176d 282
283 this->fmodule = module;
284 this->findex = index;
285 this->fTrack[0] = track;
286 this->fHits[0] = hit;
287 this->fSignal[0] = signal;
288 for(Int_t i=1;i<this->fkSize;i++){
c7d528c6 289 this->fTrack[i] = -2;
290 this->fSignal[i] = 0.0;
291 this->fHits[i] = -1;
2134176d 292 } // end if i
293 this->fTsignal = signal;
294 this->fNoise = 0.0;
cab0142f 295 this->fSignalAfterElect = 0.0;
2134176d 296}
297//______________________________________________________________________
298AliITSpListItem::~AliITSpListItem(){
c7d528c6 299 // Destructor
300 // Inputs:
301 // none.
302 // Outputs:
303 // none.
304 // Return:
305 // A properly destroyed AliITSpListItem class.
54657caf 306
2134176d 307}
308//______________________________________________________________________
309AliITSpListItem& AliITSpListItem::operator=(const AliITSpListItem &source){
310 // = operator
c7d528c6 311 // Inputs:
312 // AliITSpListItem &source A AliITSpListItem Object
313 // Outputs:
314 // none.
315 // Return:
316 // A copied AliITSpListItem object
f8d9a5b8 317 Int_t i;
2134176d 318
319 if(this == &source) return *this;
320
321 this->fmodule = source.fmodule;
322 this->findex = source.findex;
f8d9a5b8 323 for(i=0;i<this->fkSize;i++){
c7d528c6 324 this->fTrack[i] = source.fTrack[i];
325 this->fSignal[i] = source.fSignal[i];
326 this->fHits[i] = source.fHits[i];
2134176d 327 } // end if i
328 this->fTsignal = source.fTsignal;
329 this->fNoise = source.fNoise;
cab0142f 330 this->fSignalAfterElect = source.fSignalAfterElect;
d86f531c 331 /*
332 cout <<"this fTrack[0-9]=";
333 for(i=0;i<this->fkSize;i++) cout <<this->fTrack[i]<<",";
334 cout <<" fHits[0-9]=";
335 for(i=0;i<this->fkSize;i++) cout <<this->fHits[i]<<",";
336 cout <<" fSignal[0-9]=";
337 for(i=0;i<this->fkSize;i++) cout <<this->fSignal[i]<<",";
338 cout << endl;
339 cout <<"source fTrack[0-9]=";
340 for(i=0;i<this->fkSize;i++) cout <<source.fTrack[i]<<",";
341 cout <<" fHits[0-9]=";
342 for(i=0;i<this->fkSize;i++) cout <<source.fHits[i]<<",";
343 cout <<" fSignal[0-9]=";
344 for(i=0;i<this->fkSize;i++) cout <<source.fSignal[i]<<",";
345 cout << endl;
346 */
2134176d 347 return *this;
348}
349//______________________________________________________________________
ac74f489 350AliITSpListItem::AliITSpListItem(AliITSpListItem &source) : TObject(source){
2134176d 351 // Copy operator
c7d528c6 352 // Inputs:
353 // AliITSpListItem &source A AliITSpListItem Object
354 // Outputs:
355 // none.
356 // Return:
357 // A copied AliITSpListItem object
2134176d 358
359 *this = source;
360}
361//______________________________________________________________________
362void AliITSpListItem::AddSignal(Int_t track,Int_t hit,Int_t module,
c7d528c6 363 Int_t index,Double_t signal){
364 // Adds this track number and signal to the pList and orders them
365 // Inputs:
366 // Int_t track The track number which produced this signal
367 // Int_t hit The hit number which produced this signal
368 // Int_t module The module where this signal occurred
369 // Int_t index The cell index where this signal occurred
370 // Double_t signal The value of the signal (ionization)
371 // Outputs:
372 // none.
373 // Return:
374 // none.
2134176d 375 Int_t i,j,trk,hts;
376 Double_t sig;
377 Bool_t flg=kFALSE;
378
379 if(findex!=index || fmodule!=module)
c7d528c6 380 Warning("AddSignal","index=%d != findex=%d or module=%d != fmodule=%d",
381 index,findex,module,fmodule);
2134176d 382 fTsignal += signal; // Keep track of sum signal.
cab0142f 383
d86f531c 384 // for(i=0;i<fkSize;i++) if( track==fTrack[i] && hit==fHits[i] ){
385 for(i=0;i<fkSize;i++) if( track==fTrack[i] ){
c7d528c6 386 fSignal[i] += signal;
387 flg = kTRUE;
2134176d 388 } // end for i & if.
f8d9a5b8 389 //cout << "track="<<track<<endl;
c7d528c6 390 if(flg){ // resort arrays.
391 for(i=1;i<fkSize;i++){
392 j = i;
393 while(j>0 && fSignal[j]>fSignal[j-1]){
394 trk = fTrack[j-1];
395 hts = fHits[j-1];
396 sig = fSignal[j-1];
397 fTrack[j-1] = fTrack[j];
398 fHits[j-1] = fHits[j];
399 fSignal[j-1] = fSignal[j];
400 fTrack[j] = trk;
401 fHits[j] = hts;
402 fSignal[j] = sig;
f8d9a5b8 403 //cout << "#fTrack["<<j-1<<"]="<<fTrack[j-1]<< " fTrack["<<
404 // j<<"]="<<fTrack[j]<<endl;
c7d528c6 405 j--;
406 } // end while
407 } // end if i
408 return;
409 } // end if added to existing and resorted array
9176630b 410
ab5aed76 411 // new entry add it in order.
412 // if this signal is <= smallest then don't add it.
413 if(signal <= fSignal[fkSize-1]) return;
414 for(i=fkSize-2;i>=0;i--){
c7d528c6 415 if(signal > fSignal[i]){
416 fSignal[i+1] = fSignal[i];
417 fTrack[i+1] = fTrack[i];
418 fHits[i+1] = fHits[i];
419 }else{
420 fSignal[i+1] = signal;
421 fTrack[i+1] = track;
422 fHits[i+1] = hit;
423 return; // put it in the right place, now exit.
424 } // end if
f8d9a5b8 425 //cout << "$fTrack["<<i+1<<"]="<<fTrack[i+1]<< " fTrack["<<i<<"]="
426 //<<fTrack[i]<< " fHits["<<i+1<<"]="<<fHits[i+1]<< " fHits["<<i<<"]="
427 //<<fHits[i]<< " fSignal["<<i+1<<"]="<<fSignal[i+1]<< " fSignal["<<i
428 //<<"]="<<fSignal[i]<<endl;
ab5aed76 429 } // end if; end for i
430 // Still haven't found the right place. Must be at top of list.
431 fSignal[0] = signal;
432 fTrack[0] = track;
433 fHits[0] = hit;
f8d9a5b8 434 //cout << "$fTrack["<<0<<"]="<<fTrack[0]<<" fHits["<<0<<"]="<<fHits[0]
435 //<<" fSignal["<<0<<"]="<<fSignal[0]<<endl;
ab5aed76 436 return;
2134176d 437}
438//______________________________________________________________________
439void AliITSpListItem::AddNoise(Int_t module,Int_t index,Double_t noise){
c7d528c6 440 // Adds noise to this existing list.
441 // Inputs:
442 // Int_t module The module where this noise occurred
443 // Int_t index The cell index where this noise occurred
444 // Double_t noise The value of the noise.
445 // Outputs:
446 // none.
447 // Return:
448 // none.
2134176d 449
450 if(findex!=index || fmodule!=module)
cab0142f 451 Warning("AddNoise","index=%d != findex=%d or module=%d != fmodule=%d",
c7d528c6 452 index,findex,module,fmodule);
2134176d 453 fNoise += noise; // Keep track of sum signal.
454}
455//______________________________________________________________________
cab0142f 456void AliITSpListItem::AddSignalAfterElect(Int_t module,Int_t index,Double_t signal){
457 // Adds signal after electronics to this existing list.
458 // Inputs:
459 // Int_t module The module where this noise occurred
460 // Int_t index The cell index where this noise occurred
461 // Double_t signal The value of the signal.
462 // Outputs:
463 // none.
464 // Return:
465 // none.
466
467 if(findex!=index || fmodule!=module)
468 Warning("AddSignalAfterElect","index=%d != findex=%d or module=%d "
469 "!= fmodule=%d",index,findex,module,fmodule);
470 fSignalAfterElect += signal; // Keep track of sum signal.
471}
472//______________________________________________________________________
473void AliITSpListItem::Add(AliITSpListItem *pl){
474 // Adds the contents of pl to this
475 // pl could come from different module and index
476 // Inputs:
477 // AliITSpListItem *pl an AliITSpListItem to be added to this class.
478 // Outputs:
479 // none.
480 // Return:
481 // none.
482 Int_t i;
483 Double_t sig = 0.0;
484 Double_t sigT = 0.0;
485
486 for(i=0;i<pl->GetNsignals();i++){
487 sig = pl->GetSignal(i);
488 if( sig <= 0.0 ) break; // no more signals
489 AddSignal(pl->GetTrack(i),pl->GetHit(i),fmodule,findex,sig);
490 sigT += sig;
491 } // end for i
492 fTsignal += (pl->fTsignal - sigT);
493 fNoise += pl->fNoise;
494 return;
495}
496//______________________________________________________________________
2134176d 497void AliITSpListItem::AddTo(Int_t fileIndex,AliITSpListItem *pl){
498 // Adds the contents of pl to this with track number off set given by
499 // fileIndex.
c7d528c6 500 // Inputs:
501 // Int_t fileIndex track number offset value
502 // AliITSpListItem *pl an AliITSpListItem to be added to this class.
503 // Outputs:
504 // none.
505 // Return:
506 // none.
2134176d 507 Int_t i,trk;
cab0142f 508 Double_t sig = 0.0;
2134176d 509
cab0142f 510 Int_t module = pl->GetModule();
511 Int_t index = pl->GetIndex();
c7d528c6 512 for(i=0;i<pl->GetNsignals();i++){
cab0142f 513 sig = pl->GetSignal(i);
514 if( sig <= 0.0 ) break; // no more signals
c7d528c6 515 trk = pl->GetTrack(i);
cab0142f 516 trk += fileIndex;
517 AddSignal(trk,pl->GetHit(i),module,index,sig);
2134176d 518 } // end for i
cab0142f 519 fSignalAfterElect += (pl->fSignalAfterElect + pl->fNoise - fNoise);
520 fNoise = pl->fNoise;
2134176d 521 return;
522}
523//______________________________________________________________________
524Int_t AliITSpListItem::ShiftIndex(Int_t in,Int_t trk){
c7d528c6 525 // Shift an index number to occupy the upper four bits. No longer used.
526 // Inputs:
527 // Int_t in The file number
528 // Int_t trk The track number
529 // Outputs:
530 // none.
531 // Return:
532 // Int_t The track number with the file number in the upper bits.
2134176d 533 Int_t si = sizeof(Int_t) * 8;
cab0142f 534 UInt_t uin,utrk; // use UInt_t to avoid interger overflow-> goes negative.
2134176d 535
536 uin = in;
537 utrk = trk;
538 for(Int_t i=0;i<si-4;i++) uin *= 2;
539 uin += utrk;
540 in = uin;
541 return in;
542}
543//______________________________________________________________________
544void AliITSpListItem::Print(ostream *os){
545 //Standard output format for this class
c7d528c6 546 // Inputs:
547 // ostream *os The output stream
548 // Outputs:
549 // none.
550 // Return:
551 // none.
2134176d 552 Int_t i;
553
554 *os << fmodule <<","<<findex<<",";
555 *os << fkSize <<",";
556 for(i=0;i<fkSize;i++) *os << fTrack[i] <<",";
557 for(i=0;i<fkSize;i++) *os << fHits[i] <<",";
558 for(i=0;i<fkSize;i++) *os << fSignal[i] <<",";
cab0142f 559 *os << fTsignal <<","<< fNoise << "," << fSignalAfterElect;
2134176d 560}
561//______________________________________________________________________
562void AliITSpListItem::Read(istream *is){
563 // Standard output streaming function.
c7d528c6 564 // Inputs:
565 // istream *is The input stream
566 // Outputs:
567 // none.
568 // Return:
569 // none.
2134176d 570 Int_t i,iss;
571
572 *is >> fmodule >> findex;
573 *is >> iss; // read in fkSize
574 for(i=0;i<fkSize&&i<iss;i++) *is >> fTrack[i];
575 for(i=0;i<fkSize&&i<iss;i++) *is >> fHits[i];
576 for(i=0;i<fkSize&&i<iss;i++) *is >> fSignal[i];
cab0142f 577 *is >> fTsignal >> fNoise >> fSignalAfterElect;
2134176d 578}
579//______________________________________________________________________
580ostream &operator<<(ostream &os,AliITSpListItem &source){
581 // Standard output streaming function.
c7d528c6 582 // Inputs:
583 // ostream &os The output stream
584 // AliITSpListItem &source The AliITSpListItem object to be written out.
585 // Outputs:
586 // none.
587 // Return:
588 // ostream The output stream
2134176d 589
590 source.Print(&os);
591 return os;
592}
593//______________________________________________________________________
594istream &operator>>(istream &os,AliITSpListItem &source){
595 // Standard output streaming function.
c7d528c6 596 // Inputs:
597 // istream os The input stream
598 // AliITSpListItem &source The AliITSpListItem object to be inputted
599 // Outputs:
600 // none.
601 // Return:
602 // istream The input stream.
2134176d 603
604 source.Read(&os);
605 return os;
606}
c7d528c6 607