#include "AliLog.h"
#include "AliTOFGeometry.h"
#include "AliTOFSDigit.h"
ClassImp(AliTOFSDigit)
AliTOFSDigit::AliTOFSDigit():
fSector(-1),
fPlate(-1),
fStrip(-1),
fPadx(-1),
fPadz(-1),
fNDigits(0),
fTdc(0x0),
fAdc(0x0),
fTracks(0x0)
{
}
AliTOFSDigit::AliTOFSDigit(Int_t tracknum, Int_t * const vol,Int_t * const digit):
TObject(),
fSector(-1),
fPlate(-1),
fStrip(-1),
fPadx(-1),
fPadz(-1),
fNDigits(0),
fTdc(0x0),
fAdc(0x0),
fTracks(0x0)
{
fSector = vol[0];
fPlate = vol[1];
fStrip = vol[2];
fPadx = vol[3];
fPadz = vol[4];
fNDigits = 1;
fTdc = new TArrayI(fNDigits);
(*fTdc)[0] = digit[0];
fAdc = new TArrayI(fNDigits);
(*fAdc)[0] = digit[1];
fTracks = new TArrayI(kMAXDIGITS*fNDigits);
(*fTracks)[0] = tracknum;
for (Int_t i = 1; i <kMAXDIGITS*fNDigits; i++) {
(*fTracks)[i] = -1;
}
}
AliTOFSDigit::AliTOFSDigit(const AliTOFSDigit & digit):
TObject(digit),
fSector(digit.fSector),
fPlate(digit.fPlate),
fStrip(digit.fStrip),
fPadx(digit.fPadx),
fPadz(digit.fPadz),
fNDigits(digit.fNDigits),
fTdc(0x0),
fAdc(0x0),
fTracks(0x0)
{
fTdc = new TArrayI(*digit.fTdc);
fAdc = new TArrayI(*digit.fAdc);
fTracks = new TArrayI(*digit.fTracks);
}
AliTOFSDigit& AliTOFSDigit::operator=(const AliTOFSDigit & digit)
{
if (this == &digit)
return *this;
TObject::operator=(digit);
fSector = digit.fSector;
fPlate = digit.fPlate;
fStrip = digit.fStrip;
fPadx = digit.fPadx;
fPadz = digit.fPadz;
fNDigits = digit.fNDigits;
fTdc = digit.fTdc;
fAdc = digit.fAdc;
fTracks = digit.fTracks;
return *this;
}
AliTOFSDigit::AliTOFSDigit(Int_t sector, Int_t plate, Int_t strip, Int_t padx,
Int_t padz, Int_t tdc, Int_t adc):
fSector(sector),
fPlate(plate),
fStrip(strip),
fPadx(padx),
fPadz(padz),
fNDigits(1),
fTdc(0x0),
fAdc(0x0),
fTracks(0x0)
{
fTdc = new TArrayI(fNDigits);
(*fTdc)[0] = tdc;
fAdc = new TArrayI(fNDigits);
(*fAdc)[0] = adc;
fTracks = new TArrayI(kMAXDIGITS*fNDigits);
for (Int_t i = 0; i <kMAXDIGITS*fNDigits; i++) {
(*fTracks)[i] = -1;
}
}
void AliTOFSDigit::GetLocation(Int_t *Loc) const
{
Loc[0]=fSector;
Loc[1]=fPlate;
Loc[2]=fStrip;
Loc[3]=fPadx;
Loc[4]=fPadz;
}
void AliTOFSDigit::Update(Float_t tdcbin, Int_t tdc, Int_t adc, Int_t track)
{
Int_t sameTime = -1;
Float_t tdcwindow = AliTOFGeometry::DeadTime()/tdcbin;
for (Int_t i = 0; i < fNDigits; i++) {
if (TMath::Abs(tdc-fTdc->At(i)) < tdcwindow) {
sameTime = i;
break;
}
}
if (sameTime >= 0) {
(*fAdc)[sameTime] += adc;
if (track!=-1) {
for (Int_t iTrack=0; iTrack<kMAXDIGITS; iTrack++) {
if (track==(*fTracks)[sameTime*kMAXDIGITS+iTrack]) break;
if ((*fTracks)[sameTime*kMAXDIGITS+iTrack] == -1) {
(*fTracks)[sameTime*kMAXDIGITS+iTrack] = track;
break;
}
if (iTrack == kMAXDIGITS-1) {
AliDebug(1,Form("Update: Many different tracks in the same TOF pad"
" (%2d %1d %2d %1d %2d)\n",
fSector,fPlate,fStrip,fPadz,fPadx));
}
}
}
} else {
fNDigits++;
fTdc->Set(fNDigits);
(*fTdc)[fNDigits-1] = tdc;
fAdc->Set(fNDigits);
(*fAdc)[fNDigits-1] = adc;
fTracks->Set(fNDigits*kMAXDIGITS);
(*fTracks)[(fNDigits-1)*kMAXDIGITS] = track;
for (Int_t i = 1; i <kMAXDIGITS; i++)
(*fTracks)[(fNDigits-1)*kMAXDIGITS+i] = -1;
}
}
void AliTOFSDigit::Update(AliTOFSDigit * const sdig)
{
Float_t tdcbin = AliTOFGeometry::TdcBinWidth();
Int_t track = -1;
Int_t adc = -1;
Int_t tdc = -1;
Int_t nlocations = sdig->GetNDigits();
for (Int_t j = 0; j < nlocations; j++) {
tdc = (Int_t)sdig->GetTdc(j);
adc = (Int_t)sdig->GetAdc(j);
for (Int_t iTrack = 0; iTrack<kMAXDIGITS; iTrack++) {
track = sdig->GetTrack(j,iTrack);
Update(tdcbin, tdc, adc, track);
}
}
}
AliTOFSDigit::~AliTOFSDigit()
{
delete fTdc;
delete fAdc;
delete fTracks;
}
Int_t AliTOFSDigit::GetTotPad() const
{
Int_t pad = AliTOFGeometry::NpadZ()*fPadx + fPadz;
Int_t before=0;
switch(fPlate){
case 0:
break;
case 1:
before = AliTOFGeometry::NStripC();
break;
case 2:
before = AliTOFGeometry::NStripB() + AliTOFGeometry::NStripC();
break;
case 3:
before = AliTOFGeometry::NStripA() + AliTOFGeometry::NStripB() + AliTOFGeometry::NStripC();
break;
case 4:
before = AliTOFGeometry::NStripA() + 2*AliTOFGeometry::NStripB() + AliTOFGeometry::NStripC();
break;
}
Int_t strip = fStrip + before;
Int_t padTot = AliTOFGeometry::NpadXStrip()*strip + pad;
return padTot;
}