#include "TMath.h"
#include "AliESDTrdTrack.h"
#include "AliESDTrdTracklet.h"
ClassImp(AliESDTrdTrack)
AliESDTrdTrack::AliESDTrdTrack():
AliVTrdTrack(),
fSector(-1),
fStack(-1),
fA(0),
fB(0),
fC(0),
fY(0),
fPID(0),
fLayerMask(0),
fFlags(0),
fFlagsTiming(0),
fReserved(0),
fTrackMatch(),
fLabel(-1)
{
for (int i=fgkNlayers;i--;) fTrackletIndex[i] = 0;
}
AliESDTrdTrack::AliESDTrdTrack(const AliESDTrdTrack& track):
AliVTrdTrack(track),
fSector(track.fSector),
fStack(track.fStack),
fA(track.fA),
fB(track.fB),
fC(track.fC),
fY(track.fY),
fPID(track.fPID),
fLayerMask(track.fLayerMask),
fFlags(track.fFlags),
fFlagsTiming(track.fFlagsTiming),
fReserved(track.fReserved),
fTrackMatch(track.fTrackMatch),
fLabel(track.fLabel)
{
for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
fTrackletIndex[iLayer] = track.fTrackletIndex[iLayer];
if (track.fTrackletRefs[iLayer].GetObject())
fTrackletRefs[iLayer] = track.fTrackletRefs[iLayer];
}
}
AliESDTrdTrack& AliESDTrdTrack::operator=(const AliESDTrdTrack& track)
{
if (this == &track)
return *this;
AliVTrdTrack::operator=(track);
fSector = track.fSector;
fStack = track.fStack;
fA = track.fA;
fB = track.fB;
fC = track.fC;
fPID = track.fPID;
fLayerMask = track.fLayerMask;
fFlags = track.fFlags;
fFlagsTiming = track.fFlagsTiming;
fReserved = track.fReserved;
fTrackMatch = track.fTrackMatch;
fLabel = track.fLabel;
for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
fTrackletIndex[iLayer] = track.fTrackletIndex[iLayer];
fTrackletRefs[iLayer] = track.fTrackletRefs[iLayer];
}
return *this;
}
void AliESDTrdTrack::Copy(TObject& obj) const
{
if(this==&obj)return;
AliESDTrdTrack *robj = dynamic_cast<AliESDTrdTrack*>(&obj);
if(!robj)return;
*robj = *this;
}
ULong64_t AliESDTrdTrack::GetTrackWord(Int_t ) const
{
ULong64_t trackWord = 1;
AppendBits(trackWord, 1, 0);
AppendBits(trackWord, 6, fLayerMask);
AppendBits(trackWord, 18, fA);
AppendBits(trackWord, 18, fB);
AppendBits(trackWord, 12, fC);
AppendBits(trackWord, 8, fPID);
return trackWord;
}
ULong64_t AliESDTrdTrack::GetExtendedTrackWord(Int_t ) const
{
ULong64_t trackWord = 0;
AppendBits(trackWord, 11, fFlags);
AppendBits(trackWord, 1, fFlagsTiming);
AppendBits(trackWord, 2, fReserved);
AppendBits(trackWord, 13, fY);
AppendBits(trackWord, 6, fTrackletIndex[5]);
AppendBits(trackWord, 6, fTrackletIndex[4]);
AppendBits(trackWord, 6, fTrackletIndex[3]);
AppendBits(trackWord, 6, fTrackletIndex[2]);
AppendBits(trackWord, 6, fTrackletIndex[1]);
AppendBits(trackWord, 6, fTrackletIndex[0]);
return trackWord;
}
Int_t AliESDTrdTrack::GetPt() const
{
const Int_t maskIdLut[64] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0,
-1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 2, -1, 3, 4, 5,
-1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1, 7, -1, 8, 9, 10,
-1, -1, -1, 11, -1, 12, 13, 14, -1, 15, 16, 17, 18, 19, 20, 21
};
const Int_t c1Lut[32] = {
-2371, -2474, -2474, -2474, -2563, -2448, -2578, -2578,
-2578, -2670, -2557, -2578, -2578, -2670, -2557, -2578,
-2670, -2557, -2763, -2557, -2644, -2523, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1
};
if (this->GetA() != 0) {
Int_t layerMaskId = maskIdLut[this->GetLayerMask()];
Int_t c1 = c1Lut[layerMaskId];
Int_t c1Ext = c1 << 8;
Int_t ptRawStage4 = c1Ext / ((this->GetA() >> 2) != 0 ? (this->GetA() >> 2) : 1 );
Int_t ptRawComb4 = ptRawStage4;
Int_t ptExtComb4 = (ptRawComb4 > 0) ? ptRawComb4 + 33 : ptRawComb4 - 30;
return -ptExtComb4/2;
}
else
return 0;
}
Int_t AliESDTrdTrack::Compare(const TObject* obj) const
{
if (this == obj)
return 0;
else if (TMath::Abs(Pt()) < TMath::Abs(((AliESDTrdTrack*)(obj))->Pt()))
return 1;
else
return -1;
}