#include "TMath.h"
#include "AliPHOSDigit.h"
#include "AliLog.h"
ClassImp(AliPHOSDigit)
AliPHOSDigit::AliPHOSDigit() :
AliDigitNew(),
fIsLG(0),
fNprimary(0),
fPrimary(0x0),
fEnergy(0.),
fTime(0.),
fTimeR(0.),
fNSamplesHG(0),
fNSamplesLG(0),
fSamplesHG(0),
fSamplesLG(0)
{
}
AliPHOSDigit::AliPHOSDigit(Int_t primary, Int_t id, Int_t digEnergy, Float_t time, Int_t index) :
fIsLG(0),
fNprimary(0),
fPrimary(0),
fEnergy(0.f),
fTime(0.f),
fTimeR(0.f),
fNSamplesHG(0),
fNSamplesLG(0),
fSamplesHG(0),
fSamplesLG(0)
{
fAmp = digEnergy ;
fEnergy = 0 ;
fTime = time ;
fTimeR = fTime ;
fId = id ;
fIndexInList = index ;
if( primary != -1){
fNprimary = 1 ;
fPrimary = new Int_t[fNprimary] ;
fPrimary[0] = primary ;
}
else{
fNprimary = 0 ;
fPrimary = 0 ;
}
}
AliPHOSDigit::AliPHOSDigit(Int_t primary, Int_t id, Float_t energy, Float_t time, Int_t index) :
fIsLG(0),
fNprimary(0),
fPrimary(0),
fEnergy(0.f),
fTime(0.f),
fTimeR(0.f),
fNSamplesHG(0),
fNSamplesLG(0),
fSamplesHG(0),
fSamplesLG(0)
{
fAmp = 0 ;
fEnergy = energy ;
fTime = time ;
fTimeR = fTime ;
fId = id ;
fIndexInList = index ;
if( primary != -1){
fNprimary = 1 ;
fPrimary = new Int_t[fNprimary] ;
fPrimary[0] = primary ;
}
else{
fNprimary = 0 ;
fPrimary = 0 ;
}
}
AliPHOSDigit::AliPHOSDigit(const AliPHOSDigit & digit) :
AliDigitNew(digit),
fIsLG(digit.fIsLG),
fNprimary(digit.fNprimary),
fPrimary(0),
fEnergy(digit.fEnergy),
fTime(digit.fTime),
fTimeR(digit.fTimeR),
fNSamplesHG(0),
fNSamplesLG(0),
fSamplesHG(0),
fSamplesLG(0)
{
if(fNprimary){
fPrimary = new Int_t[fNprimary] ;
for (Int_t i = 0; i < fNprimary ; i++)
fPrimary[i] = digit.fPrimary[i] ;
}
else
fPrimary = 0 ;
fAmp = digit.fAmp ;
fId = digit.fId;
fIndexInList = digit.fIndexInList ;
}
AliPHOSDigit & AliPHOSDigit::operator = (const AliPHOSDigit &)
{
Fatal("operator =", "not implemented");
return *this;
}
AliPHOSDigit::~AliPHOSDigit()
{
if (fPrimary) delete [] fPrimary ;
if (fSamplesHG) delete [] fSamplesHG;
if (fSamplesLG) delete [] fSamplesLG;
}
void AliPHOSDigit::Clear(const Option_t*)
{
delete[] fSamplesHG; fSamplesHG = NULL ;
delete[] fSamplesLG; fSamplesLG = NULL ;
delete[] fPrimary; fPrimary = NULL ;
}
Int_t AliPHOSDigit::Compare(const TObject * obj) const
{
Int_t rv ;
AliPHOSDigit * digit = (AliPHOSDigit *)obj ;
Int_t iddiff = fId - digit->GetId() ;
if ( iddiff > 0 )
rv = 1 ;
else if ( iddiff < 0 )
rv = -1 ;
else
rv = 0 ;
return rv ;
}
Int_t AliPHOSDigit::GetPrimary(Int_t index) const
{
Int_t rv = -1 ;
if ( index <= fNprimary && index > 0){
rv = fPrimary[index-1] ;
}
return rv ;
}
void AliPHOSDigit::SetALTROSamplesHG(Int_t nSamplesHG, Int_t *samplesHG)
{
fNSamplesHG = nSamplesHG;
if (fSamplesHG) delete [] fSamplesHG;
fSamplesHG = new UShort_t[fNSamplesHG];
UShort_t i;
for (i=0; i<fNSamplesHG; i++) {
fSamplesHG[i] = samplesHG[i];
}
}
void AliPHOSDigit::SetALTROSamplesLG(Int_t nSamplesLG, Int_t *samplesLG)
{
fNSamplesLG = nSamplesLG;
if (fSamplesLG) delete [] fSamplesLG;
fSamplesLG = new UShort_t[fNSamplesLG];
UShort_t i;
for (i=0; i<fNSamplesLG; i++) {
fSamplesLG[i] = samplesLG[i];
}
}
void AliPHOSDigit::Print(const Option_t *) const
{
TString line = Form("PHOS digit: E=%.3f, Id=%d, Time=%.3e, TimeR=%.3e, NPrim=%d, nHG=%d, nLG=%d \n",
fEnergy,fId,fTime,fTimeR,fNprimary,fNSamplesHG,fNSamplesLG);
line += "\tList of primaries: ";
for (Int_t index = 0; index <fNprimary; index ++ )
line += Form(" %d ",fPrimary[index]);
line += "\n";
line += "\tSamples HG: ";
for (Int_t i = 0; i <fNSamplesHG; i++)
line += Form(" %d ",fSamplesHG[i]);
line += "\n";
line += "\tSamples LG: ";
for (Int_t i = 0; i <fNSamplesLG; i++)
line += Form(" %d ",fSamplesLG[i]);
line += "\n";
AliDebug(2,line);
}
void AliPHOSDigit::ShiftPrimary(Int_t shift)
{
for(Int_t index = 0; index <fNprimary; index ++ ){
fPrimary[index]+= shift ;
}
}
Bool_t AliPHOSDigit::operator==(AliPHOSDigit const & digit) const
{
if ( fId == digit.fId )
return kTRUE ;
else
return kFALSE ;
}
AliPHOSDigit& AliPHOSDigit::operator+=(AliPHOSDigit const & digit)
{
if(digit.fNprimary>0){
Int_t *tmp = new Int_t[fNprimary+digit.fNprimary] ;
if(fAmp < digit.fAmp || fEnergy < digit.fEnergy){
for (Int_t index = 0 ; index < digit.fNprimary ; index++)
tmp[index]=(digit.fPrimary)[index] ;
for (Int_t index = 0 ; index < fNprimary ; index++)
tmp[index+digit.fNprimary]=fPrimary[index] ;
}
else{
for (Int_t index = 0 ; index < fNprimary ; index++)
tmp[index]=fPrimary[index] ;
for (Int_t index = 0 ; index < digit.fNprimary ; index++)
tmp[index+fNprimary]=(digit.fPrimary)[index] ;
}
if(fPrimary)
delete []fPrimary ;
fPrimary = tmp ;
}
fNprimary+=digit.fNprimary ;
fAmp += digit.fAmp ;
fEnergy += digit.fEnergy ;
if(fTime > digit.fTime)
fTime = digit.fTime ;
fTimeR = fTime ;
UShort_t i;
if (digit.fNSamplesHG > fNSamplesHG) {
UShort_t newNSamplesHG = digit.fNSamplesHG;
UShort_t *newSamplesHG = new UShort_t[newNSamplesHG];
for (i=0; i<newNSamplesHG; i++) {
if (i<fNSamplesHG)
newSamplesHG[i] = TMath::Max(1023,fSamplesHG[i] + (digit.fSamplesHG)[i]);
else
newSamplesHG[i] = (digit.fSamplesHG)[i];
}
delete [] fSamplesHG;
fSamplesHG = new UShort_t[newNSamplesHG];
for (i=0; i<newNSamplesHG; i++) {
fSamplesHG[i] = newSamplesHG[i];
}
delete [] newSamplesHG;
}
else {
for (i=0; i<fNSamplesHG; i++)
fSamplesHG[i] = TMath::Max(1023,fSamplesHG[i] + (digit.fSamplesHG)[i]);
}
if (digit.fNSamplesLG > fNSamplesLG) {
UShort_t newNSamplesLG = digit.fNSamplesLG;
UShort_t *newSamplesLG = new UShort_t[newNSamplesLG];
for (i=0; i<newNSamplesLG; i++) {
if (i<fNSamplesLG)
newSamplesLG[i] = TMath::Max(1023,fSamplesLG[i] + (digit.fSamplesLG)[i]);
else
newSamplesLG[i] = (digit.fSamplesLG)[i];
}
delete [] fSamplesLG;
fSamplesLG = new UShort_t[newNSamplesLG];
for (i=0; i<newNSamplesLG; i++) {
fSamplesLG[i] = newSamplesLG[i];
}
delete [] newSamplesLG;
}
else {
for (i=0; i<fNSamplesLG; i++)
fSamplesLG[i] = TMath::Max(1023,fSamplesLG[i] + (digit.fSamplesLG)[i]);
}
fIsLG=fIsLG||digit.fIsLG ;
return *this ;
}
AliPHOSDigit& AliPHOSDigit::operator *= (Float_t factor)
{
Float_t tempo = static_cast<Float_t>(fAmp) ;
tempo *= factor ;
fAmp = static_cast<Int_t>(TMath::Ceil(tempo)) ;
return *this ;
}
ostream& operator << ( ostream& out , const AliPHOSDigit & digit)
{
digit.Warning("operator <<", "Implement differently") ;
return out ;
}