ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2004, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
#include <TMath.h>
#include "AliLog.h"
#include "AliITSUSDigit.h"
ClassImp(AliITSUSDigit)

using std::istream;
using std::swap;
using namespace TMath;

// Addapted from ITS/AliITSpListItem, ruben.shahoyan@cern.ch

//______________________________________________________________________
AliITSUSDigit::AliITSUSDigit() 
: fChip(0)
  ,fNTracks(0)
  ,fROCycle(0)
  ,fTsignal(0.0)
  ,fNoise(0.0)
  ,fSignalAfterElect(0.0)
{
  // Default constructor
  for (int i=kBuffSize;i--;) {
    fTrack[i] = -2;
    fHits[i] = -1;
    fSignal[i] = 0;
  }
}

//______________________________________________________________________
AliITSUSDigit::AliITSUSDigit(UInt_t chip,UInt_t index,Double_t noise,Int_t roCycle) 
  :fChip(chip)
  ,fNTracks(0)
  ,fROCycle(roCycle)
  ,fTsignal(0.0)
  ,fNoise(noise)
  ,fSignalAfterElect(0.0)
{
  // Standard noise constructor
  SetUniqueID(index);
  for (int i=kBuffSize;i--;) {
    fTrack[i] = -2;
    fHits[i] = -1;
    fSignal[i] = 0;
  }
}

//______________________________________________________________________
AliITSUSDigit::AliITSUSDigit(Int_t track,Int_t hit,UInt_t chip,UInt_t index,Double_t signal,Int_t roCycle)
  :fChip(chip)
  ,fNTracks(1)
  ,fROCycle(roCycle)
  ,fTsignal(signal)
  ,fNoise(0.0)
  ,fSignalAfterElect(0.0)
{
  // Standard signal constructor
  // Inputs:
  //    Int_t track     The track number which produced this signal
  //    Int_t hit       The hit number which produced this signal
  //    Int_t chip    The chip where this signal occurred
  //    Int_t index     The cell index where this signal occurred
  //    Double_t signal The value of the signal (ionization)
  //    Int_t roCycle   Read-Out cycle
  SetUniqueID(index);
  fTrack[0]  = track;
  fHits[0]   = hit;
  fSignal[0] = signal;
  for (int i=1;i<kBuffSize;i++) {
    fTrack[i] = -2;
    fHits[i] = -1;
    fSignal[i] = 0;
  }
}

//______________________________________________________________________
AliITSUSDigit& AliITSUSDigit::operator=(const AliITSUSDigit &source)
{
  // = operator
  if (&source!=this) {
    this->~AliITSUSDigit();
    new(this) AliITSUSDigit(source);
  }
  return *this;
  //
}

//______________________________________________________________________
AliITSUSDigit::AliITSUSDigit(const AliITSUSDigit &source) 
  :TObject(source)
  ,fChip(source.fChip)
  ,fNTracks(source.fNTracks)
  ,fROCycle(source.fROCycle)
  ,fTsignal(source.fTsignal)
  ,fNoise(source.fNoise)
  ,fSignalAfterElect(source.fSignalAfterElect)
{
  // Copy operator
  for(Int_t i=kBuffSize;i--;) {
    fTrack[i]  = source.fTrack[i];
    fSignal[i] = source.fSignal[i];
    fHits[i]   = source.fHits[i];
  } // end if i
  //
}

//______________________________________________________________________
void AliITSUSDigit::AddSignal(Int_t track,Int_t hit,Double_t signal)
{
  // Adds this track number and signal to the pList and orders them
  // Inputs:
  //    Int_t track     The track number which produced this signal
  //    Int_t hit       The hit number which produced this signal
  //    Int_t chip    The chip where this signal occurred
  //    Int_t index     The cell index where this signal occurred
  //    Double_t signal The value of the signal (ionization)
  Int_t    i,j;
  Bool_t   flg=kFALSE;
  //
  if (Abs(signal)>2147483647.0) {
    //PH 2147483647 is the max. integer
    //PH This apparently is a problem which needs investigation
    AliWarning(Form("Too big or too small signal value %f",signal));
    signal = Sign((Double_t)2147483647,signal);
  }
  //
  fTsignal += signal; // Keep track of sum signal.
  for (i=fNTracks;i--;) {
    if ( track==fTrack[i]  ) {
      fSignal[i] += signal;
      flg = kTRUE;
      break;
    } // end for i & if.
  }
  //
  if (flg) {
    if (fNTracks>1) { // resort arrays.  
      for (i=1;i<fNTracks;i++) {
	j = i;
	while(j>0 && fSignal[j]>fSignal[j-1]) {
	  std::swap(fTrack[j-1],fTrack[j]);
	  std::swap(fHits[j-1] ,fHits[j]);
	  std::swap(fSignal[j-1],fSignal[j]);
	  j--;
	} // end while
      } // end if i
    } // end if added to existing and resorted array
    return;
  }
  //
  // new entry add it in order.
  if (fNTracks==(kBuffSize-1) && signal<=fSignal[kBuffSize-1]) return;   // if this signal is <= smallest then don't add it.
  //
  for (i=fNTracks;i--;) {
    if (signal > fSignal[i]) { // shift smaller signals to the end of the list
      if (i<kBuffSize-2) {     // (if there is a space...)
	fSignal[i+1] = fSignal[i];
	fTrack[i+1]  = fTrack[i];
	fHits[i+1]   = fHits[i];
      }
    } else {
      fSignal[i+1] = signal;
      fTrack[i+1]  = track;
      fHits[i+1]   = hit;
      if (fNTracks<kBuffSize-1) fNTracks++;
      return; // put it in the right place, now exit.
    } //  end if
  } // end if; end for i
  //
  // Still haven't found the right place. Must be at top of list.
  fSignal[0] = signal;
  fTrack[0]  = track;
  fHits[0]   = hit;
  fNTracks++;
  return;
}

//______________________________________________________________________
void AliITSUSDigit::Add(const AliITSUSDigit *pl)
{
  // Adds the contents of pl to this
  // pl could come from different chip and index 
  Double_t sigT = 0.0;
  for(int i=pl->GetNTracks();i--;) {
    double sig = pl->GetSignal(i); 
    AddSignal(pl->GetTrack(i),pl->GetHit(i),sig);
    sigT += sig;
  } // end for i
  fTsignal += (pl->fTsignal - sigT);
  fNoise   += pl->fNoise;
  return;
  //
}

//______________________________________________________________________
void AliITSUSDigit::AddTo(Int_t fileIndex,const AliITSUSDigit *pl) 
{
  // Adds the contents of pl to this with track number off set given by
  // fileIndex.
  // Inputs:
  //    Int_t fileIndex      track number offset value
  //    AliITSUSDigit *pl  an AliITSUSDigit to be added to this class.
  //
  for (int i=pl->GetNTracks();i--;) AddSignal(pl->GetTrack(i)+fileIndex,pl->GetHit(i),pl->GetSignal(i));
  fSignalAfterElect += (pl->fSignalAfterElect + pl->fNoise - fNoise);
  fNoise = pl->fNoise;
}

//______________________________________________________________________
void AliITSUSDigit::ShiftIndices(Int_t fileIndex)
{
  // Shift track numbers
  //
  for (int i=GetNTracks();i--;) fTrack[i] += fileIndex;
}

//______________________________________________________________________
Int_t AliITSUSDigit::Compare(const TObject* obj) const
{
  // compare objects
  if (GetUniqueID()<obj->GetUniqueID()) return -1;
  if (GetUniqueID()>obj->GetUniqueID()) return  1;
  return 0;
}

//______________________________________________________________________
void AliITSUSDigit::Print(Option_t*) const 
{
  // print itself
  printf("Mod: %4d Index:%7d Ntr:%2d | TotSignal:%.2e Noise:%.2e ROCycle: %d|",
	 fChip,GetUniqueID(),fNTracks,fTsignal,fNoise,fROCycle);
  for (int i=0;i<fNTracks;i++) printf("%d(%.2e) |",fTrack[i],fSignal[i]); printf("\n");
}
 AliITSUSDigit.cxx:1
 AliITSUSDigit.cxx:2
 AliITSUSDigit.cxx:3
 AliITSUSDigit.cxx:4
 AliITSUSDigit.cxx:5
 AliITSUSDigit.cxx:6
 AliITSUSDigit.cxx:7
 AliITSUSDigit.cxx:8
 AliITSUSDigit.cxx:9
 AliITSUSDigit.cxx:10
 AliITSUSDigit.cxx:11
 AliITSUSDigit.cxx:12
 AliITSUSDigit.cxx:13
 AliITSUSDigit.cxx:14
 AliITSUSDigit.cxx:15
 AliITSUSDigit.cxx:16
 AliITSUSDigit.cxx:17
 AliITSUSDigit.cxx:18
 AliITSUSDigit.cxx:19
 AliITSUSDigit.cxx:20
 AliITSUSDigit.cxx:21
 AliITSUSDigit.cxx:22
 AliITSUSDigit.cxx:23
 AliITSUSDigit.cxx:24
 AliITSUSDigit.cxx:25
 AliITSUSDigit.cxx:26
 AliITSUSDigit.cxx:27
 AliITSUSDigit.cxx:28
 AliITSUSDigit.cxx:29
 AliITSUSDigit.cxx:30
 AliITSUSDigit.cxx:31
 AliITSUSDigit.cxx:32
 AliITSUSDigit.cxx:33
 AliITSUSDigit.cxx:34
 AliITSUSDigit.cxx:35
 AliITSUSDigit.cxx:36
 AliITSUSDigit.cxx:37
 AliITSUSDigit.cxx:38
 AliITSUSDigit.cxx:39
 AliITSUSDigit.cxx:40
 AliITSUSDigit.cxx:41
 AliITSUSDigit.cxx:42
 AliITSUSDigit.cxx:43
 AliITSUSDigit.cxx:44
 AliITSUSDigit.cxx:45
 AliITSUSDigit.cxx:46
 AliITSUSDigit.cxx:47
 AliITSUSDigit.cxx:48
 AliITSUSDigit.cxx:49
 AliITSUSDigit.cxx:50
 AliITSUSDigit.cxx:51
 AliITSUSDigit.cxx:52
 AliITSUSDigit.cxx:53
 AliITSUSDigit.cxx:54
 AliITSUSDigit.cxx:55
 AliITSUSDigit.cxx:56
 AliITSUSDigit.cxx:57
 AliITSUSDigit.cxx:58
 AliITSUSDigit.cxx:59
 AliITSUSDigit.cxx:60
 AliITSUSDigit.cxx:61
 AliITSUSDigit.cxx:62
 AliITSUSDigit.cxx:63
 AliITSUSDigit.cxx:64
 AliITSUSDigit.cxx:65
 AliITSUSDigit.cxx:66
 AliITSUSDigit.cxx:67
 AliITSUSDigit.cxx:68
 AliITSUSDigit.cxx:69
 AliITSUSDigit.cxx:70
 AliITSUSDigit.cxx:71
 AliITSUSDigit.cxx:72
 AliITSUSDigit.cxx:73
 AliITSUSDigit.cxx:74
 AliITSUSDigit.cxx:75
 AliITSUSDigit.cxx:76
 AliITSUSDigit.cxx:77
 AliITSUSDigit.cxx:78
 AliITSUSDigit.cxx:79
 AliITSUSDigit.cxx:80
 AliITSUSDigit.cxx:81
 AliITSUSDigit.cxx:82
 AliITSUSDigit.cxx:83
 AliITSUSDigit.cxx:84
 AliITSUSDigit.cxx:85
 AliITSUSDigit.cxx:86
 AliITSUSDigit.cxx:87
 AliITSUSDigit.cxx:88
 AliITSUSDigit.cxx:89
 AliITSUSDigit.cxx:90
 AliITSUSDigit.cxx:91
 AliITSUSDigit.cxx:92
 AliITSUSDigit.cxx:93
 AliITSUSDigit.cxx:94
 AliITSUSDigit.cxx:95
 AliITSUSDigit.cxx:96
 AliITSUSDigit.cxx:97
 AliITSUSDigit.cxx:98
 AliITSUSDigit.cxx:99
 AliITSUSDigit.cxx:100
 AliITSUSDigit.cxx:101
 AliITSUSDigit.cxx:102
 AliITSUSDigit.cxx:103
 AliITSUSDigit.cxx:104
 AliITSUSDigit.cxx:105
 AliITSUSDigit.cxx:106
 AliITSUSDigit.cxx:107
 AliITSUSDigit.cxx:108
 AliITSUSDigit.cxx:109
 AliITSUSDigit.cxx:110
 AliITSUSDigit.cxx:111
 AliITSUSDigit.cxx:112
 AliITSUSDigit.cxx:113
 AliITSUSDigit.cxx:114
 AliITSUSDigit.cxx:115
 AliITSUSDigit.cxx:116
 AliITSUSDigit.cxx:117
 AliITSUSDigit.cxx:118
 AliITSUSDigit.cxx:119
 AliITSUSDigit.cxx:120
 AliITSUSDigit.cxx:121
 AliITSUSDigit.cxx:122
 AliITSUSDigit.cxx:123
 AliITSUSDigit.cxx:124
 AliITSUSDigit.cxx:125
 AliITSUSDigit.cxx:126
 AliITSUSDigit.cxx:127
 AliITSUSDigit.cxx:128
 AliITSUSDigit.cxx:129
 AliITSUSDigit.cxx:130
 AliITSUSDigit.cxx:131
 AliITSUSDigit.cxx:132
 AliITSUSDigit.cxx:133
 AliITSUSDigit.cxx:134
 AliITSUSDigit.cxx:135
 AliITSUSDigit.cxx:136
 AliITSUSDigit.cxx:137
 AliITSUSDigit.cxx:138
 AliITSUSDigit.cxx:139
 AliITSUSDigit.cxx:140
 AliITSUSDigit.cxx:141
 AliITSUSDigit.cxx:142
 AliITSUSDigit.cxx:143
 AliITSUSDigit.cxx:144
 AliITSUSDigit.cxx:145
 AliITSUSDigit.cxx:146
 AliITSUSDigit.cxx:147
 AliITSUSDigit.cxx:148
 AliITSUSDigit.cxx:149
 AliITSUSDigit.cxx:150
 AliITSUSDigit.cxx:151
 AliITSUSDigit.cxx:152
 AliITSUSDigit.cxx:153
 AliITSUSDigit.cxx:154
 AliITSUSDigit.cxx:155
 AliITSUSDigit.cxx:156
 AliITSUSDigit.cxx:157
 AliITSUSDigit.cxx:158
 AliITSUSDigit.cxx:159
 AliITSUSDigit.cxx:160
 AliITSUSDigit.cxx:161
 AliITSUSDigit.cxx:162
 AliITSUSDigit.cxx:163
 AliITSUSDigit.cxx:164
 AliITSUSDigit.cxx:165
 AliITSUSDigit.cxx:166
 AliITSUSDigit.cxx:167
 AliITSUSDigit.cxx:168
 AliITSUSDigit.cxx:169
 AliITSUSDigit.cxx:170
 AliITSUSDigit.cxx:171
 AliITSUSDigit.cxx:172
 AliITSUSDigit.cxx:173
 AliITSUSDigit.cxx:174
 AliITSUSDigit.cxx:175
 AliITSUSDigit.cxx:176
 AliITSUSDigit.cxx:177
 AliITSUSDigit.cxx:178
 AliITSUSDigit.cxx:179
 AliITSUSDigit.cxx:180
 AliITSUSDigit.cxx:181
 AliITSUSDigit.cxx:182
 AliITSUSDigit.cxx:183
 AliITSUSDigit.cxx:184
 AliITSUSDigit.cxx:185
 AliITSUSDigit.cxx:186
 AliITSUSDigit.cxx:187
 AliITSUSDigit.cxx:188
 AliITSUSDigit.cxx:189
 AliITSUSDigit.cxx:190
 AliITSUSDigit.cxx:191
 AliITSUSDigit.cxx:192
 AliITSUSDigit.cxx:193
 AliITSUSDigit.cxx:194
 AliITSUSDigit.cxx:195
 AliITSUSDigit.cxx:196
 AliITSUSDigit.cxx:197
 AliITSUSDigit.cxx:198
 AliITSUSDigit.cxx:199
 AliITSUSDigit.cxx:200
 AliITSUSDigit.cxx:201
 AliITSUSDigit.cxx:202
 AliITSUSDigit.cxx:203
 AliITSUSDigit.cxx:204
 AliITSUSDigit.cxx:205
 AliITSUSDigit.cxx:206
 AliITSUSDigit.cxx:207
 AliITSUSDigit.cxx:208
 AliITSUSDigit.cxx:209
 AliITSUSDigit.cxx:210
 AliITSUSDigit.cxx:211
 AliITSUSDigit.cxx:212
 AliITSUSDigit.cxx:213
 AliITSUSDigit.cxx:214
 AliITSUSDigit.cxx:215
 AliITSUSDigit.cxx:216
 AliITSUSDigit.cxx:217
 AliITSUSDigit.cxx:218
 AliITSUSDigit.cxx:219
 AliITSUSDigit.cxx:220
 AliITSUSDigit.cxx:221
 AliITSUSDigit.cxx:222
 AliITSUSDigit.cxx:223
 AliITSUSDigit.cxx:224
 AliITSUSDigit.cxx:225
 AliITSUSDigit.cxx:226
 AliITSUSDigit.cxx:227
 AliITSUSDigit.cxx:228
 AliITSUSDigit.cxx:229
 AliITSUSDigit.cxx:230
 AliITSUSDigit.cxx:231
 AliITSUSDigit.cxx:232
 AliITSUSDigit.cxx:233
 AliITSUSDigit.cxx:234
 AliITSUSDigit.cxx:235
 AliITSUSDigit.cxx:236
 AliITSUSDigit.cxx:237
 AliITSUSDigit.cxx:238
 AliITSUSDigit.cxx:239
 AliITSUSDigit.cxx:240
 AliITSUSDigit.cxx:241
 AliITSUSDigit.cxx:242
 AliITSUSDigit.cxx:243
 AliITSUSDigit.cxx:244
 AliITSUSDigit.cxx:245
 AliITSUSDigit.cxx:246