#include <TMath.h>
#include "AliLog.h"
#include "AliITSUSDigit.h"
ClassImp(AliITSUSDigit)
using std::istream;
using std::swap;
using namespace TMath;
AliITSUSDigit::AliITSUSDigit()
: fChip(0)
,fNTracks(0)
,fROCycle(0)
,fTsignal(0.0)
,fNoise(0.0)
,fSignalAfterElect(0.0)
{
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)
{
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)
{
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)
{
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)
{
for(Int_t i=kBuffSize;i--;) {
fTrack[i] = source.fTrack[i];
fSignal[i] = source.fSignal[i];
fHits[i] = source.fHits[i];
}
}
void AliITSUSDigit::AddSignal(Int_t track,Int_t hit,Double_t signal)
{
Int_t i,j;
Bool_t flg=kFALSE;
if (Abs(signal)>2147483647.0) {
AliWarning(Form("Too big or too small signal value %f",signal));
signal = Sign((Double_t)2147483647,signal);
}
fTsignal += signal;
for (i=fNTracks;i--;) {
if ( track==fTrack[i] ) {
fSignal[i] += signal;
flg = kTRUE;
break;
}
}
if (flg) {
if (fNTracks>1) {
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--;
}
}
}
return;
}
if (fNTracks==(kBuffSize-1) && signal<=fSignal[kBuffSize-1]) return;
for (i=fNTracks;i--;) {
if (signal > fSignal[i]) {
if (i<kBuffSize-2) {
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;
}
}
fSignal[0] = signal;
fTrack[0] = track;
fHits[0] = hit;
fNTracks++;
return;
}
void AliITSUSDigit::Add(const AliITSUSDigit *pl)
{
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;
}
fTsignal += (pl->fTsignal - sigT);
fNoise += pl->fNoise;
return;
}
void AliITSUSDigit::AddTo(Int_t fileIndex,const AliITSUSDigit *pl)
{
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)
{
for (int i=GetNTracks();i--;) fTrack[i] += fileIndex;
}
Int_t AliITSUSDigit::Compare(const TObject* obj) const
{
if (GetUniqueID()<obj->GetUniqueID()) return -1;
if (GetUniqueID()>obj->GetUniqueID()) return 1;
return 0;
}
void AliITSUSDigit::Print(Option_t*) const
{
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");
}