#include "AliTRDarrayDictionary.h"
#include "AliTRDSignalIndex.h"
#include "AliTRDtrackletWord.h"
+#include "AliTRDtrackletMCM.h"
#include "AliESDTrdTrack.h"
#include "AliTreeLoader.h"
#include "AliLoader.h"
const Int_t AliTRDrawStream::fgkNtriggers = 12;
const UInt_t AliTRDrawStream::fgkDataEndmarker = 0x00000000;
const UInt_t AliTRDrawStream::fgkTrackletEndmarker = 0x10001000;
+const UInt_t AliTRDrawStream::fgkStackEndmarker[] = { 0xe0d01000, 0xe0d10000 };
const char* AliTRDrawStream::fgkErrorMessages[] = {
"Unknown error",
"Link monitor active",
- "Pretrigger counter mismatch",
+ "Event counter mismatch",
"not a TRD equipment (1024-1041)",
"Invalid Stack header",
"Invalid detector number",
"ADC check bits invalid",
"Missing ADC data",
"Missing expected ADC channels",
- "Missing MCM headers"
+ "Missing MCM headers",
+ "Missing TP data",
+ "CRC mismatch"
};
Int_t AliTRDrawStream::fgErrorDebugLevel[] = {
1,
2,
1,
- 1,
+ 0,
1,
1,
2,
1,
1,
- 1
+ 1,
+ 0,
+ 0
};
AliTRDrawStream::ErrorBehav_t AliTRDrawStream::fgErrorBehav[] = {
AliTRDrawStream::kTolerate,
AliTRDrawStream::kTolerate,
AliTRDrawStream::kTolerate,
+ AliTRDrawStream::kTolerate,
+ AliTRDrawStream::kTolerate,
AliTRDrawStream::kTolerate
};
AliTRDrawStream::AliTRDrawStream(AliRawReader *rawReader) :
- fStats(),
fStoreError(&AliTRDrawStream::ForgetError),
fRawReader(rawReader),
fDigitsManager(0x0),
fErrors(0x0),
fLastError(),
fErrorFlags(0),
+ fStats(),
fPayloadStart(0x0),
fPayloadCurr(0x0),
fPayloadSize(0),
fCurrTrgHeaderAvail(0),
fCurrTrgHeaderReadout(0),
fCurrTrkHeaderAvail(0),
+ fCurrStackEndmarkerAvail(0),
fCurrEvType(0),
fCurrTriggerEnable(0),
fCurrTriggerFired(0),
fCurrStackMask(0),
fCurrTrkHeaderIndexWord(0x0),
fCurrTrkHeaderSize(0x0),
+ fCurrTrkFlags(0x0),
fCurrTrgHeaderIndexWord(0x0),
fCurrTrgHeaderSize(0x0),
+ fCurrTrgFlags(0x0),
fCurrStackIndexWord(0x0),
fCurrStackHeaderSize(0x0),
fCurrStackHeaderVersion(0x0),
fCurrLinkMonitorFlags(0x0),
fCurrLinkDataTypeFlags(0x0),
fCurrLinkDebugFlags(0x0),
+ fCurrMatchFlagsSRAM(0),
+ fCurrMatchFlagsPostBP(0),
+ fCurrChecksumStack(),
+ fCurrChecksumSIU(0),
fCurrSpecial(-1),
fCurrMajor(-1),
fCurrMinor(-1),
fCurrTrkHeaderIndexWord = new UInt_t[fgkNstacks];
fCurrTrkHeaderSize = new UInt_t[fgkNstacks];
+ fCurrTrkFlags = new ULong64_t[fgkNsectors*fgkNstacks];
fCurrTrgHeaderIndexWord = new UInt_t[fgkNtriggers];
fCurrTrgHeaderSize = new UInt_t[fgkNtriggers];
+ fCurrTrgFlags = new UInt_t[fgkNsectors];
fCurrStackIndexWord = new UInt_t[fgkNstacks];
fCurrStackHeaderSize = new UInt_t[fgkNstacks];
fCurrStackHeaderVersion = new UInt_t[fgkNstacks];
fCurrLinkMonitorFlags = new UInt_t[fgkNstacks * fgkNlinks];
fCurrLinkDataTypeFlags = new UInt_t[fgkNstacks * fgkNlinks];
fCurrLinkDebugFlags = new UInt_t[fgkNstacks * fgkNlinks];
+ for (Int_t iSector = 0; iSector < fgkNsectors; iSector++)
+ fCurrTrgFlags[iSector] = 0;
for (Int_t i = 0; i < 100; i++)
fDumpMCM[i] = 0;
delete [] fCurrTrkHeaderIndexWord;
delete [] fCurrTrkHeaderSize;
+ delete [] fCurrTrkFlags;
delete [] fCurrTrgHeaderIndexWord;
delete [] fCurrTrgHeaderSize;
+ delete [] fCurrTrgFlags;
delete [] fCurrStackIndexWord;
delete [] fCurrStackHeaderSize;
delete [] fCurrStackHeaderVersion;
if ((fCurrLinkMask[fCurrSlot] & (1 << fCurrLink)) == 0)
continue;
+ Int_t size = 0;
+
fErrorFlags = 0;
// check for link monitor error flag
- if (fCurrLinkMonitorFlags[fCurrSlot*fgkNlinks + fCurrLink] != 0)
+ if (fCurrLinkMonitorFlags[fCurrSlot*fgkNlinks + fCurrLink] != 0) {
LinkError(kLinkMonitor);
+ if (fgErrorBehav[kLinkMonitor] == kTolerate)
+ size += ReadLinkData();
+ }
else
// read the data from one HC
- ReadLinkData();
+ size += ReadLinkData();
// read all data endmarkers
- SeekNextLink();
+ size += SeekNextLink();
}
+
+ // continue with next stack
+ SeekNextStack();
}
}
fCurrHC = (fCurrEquipmentId - kDDLOffset) * fgkNlinks * fgkNstacks +
fCurrSlot * fgkNlinks + fCurrLink;
- if (fCurrLinkMonitorFlags[fCurrSlot*fgkNlinks + fCurrLink] != 0)
+ if (fCurrLinkMonitorFlags[fCurrSlot*fgkNlinks + fCurrLink] != 0) {
LinkError(kLinkMonitor);
+ if (fgErrorBehav[kLinkMonitor] == kTolerate)
+ ReadLinkData();
+ }
else
// read the data from one HC
ReadLinkData();
fCurrLink++;
fCurrHC++;
if (fCurrLinkMask[fCurrSlot] & (1 << fCurrLink)) {
- ReadLinkData();
+ if (fCurrLinkMonitorFlags[fCurrSlot*fgkNlinks + fCurrLink] != 0) {
+ LinkError(kLinkMonitor);
+ if (fgErrorBehav[kLinkMonitor] == kTolerate)
+ ReadLinkData();
+ }
+ else {
+ ReadLinkData();
+ }
SeekNextLink();
}
}
- //??? to check
do {
- fCurrLink++;
- if (fCurrLink >= fgkNlinks) {
+ if ((fCurrStackMask & (1 << fCurrSlot)) == 0) {
fCurrLink = 0;
fCurrSlot++;
}
+ else {
+ fCurrLink++;
+ if (fCurrLink >= fgkNlinks) {
+ SeekNextStack();
+ fCurrLink = 0;
+ fCurrSlot++;
+ }
+ }
} while ((fCurrSlot < fgkNstacks) &&
(((fCurrStackMask & (1 << fCurrSlot)) == 0) ||
((fCurrLinkMask[fCurrSlot] & (1 << fCurrLink))) == 0));
return -1;
}
+ fCurrTrgFlags[fCurrEquipmentId-kDDLOffset] = 0;
+
fCurrSmHeaderSize = ((*fPayloadCurr) >> 16) & 0xffff;
fCurrSmHeaderVersion = ((*fPayloadCurr) >> 12) & 0xf;
fCurrTrackEnable = ((*fPayloadCurr) >> 6) & 0x1;
fCurrTrackletEnable = ((*fPayloadCurr) >> 5) & 0x1;
fCurrStackMask = ((*fPayloadCurr) ) & 0x1f;
fCurrHwRev = (fPayloadCurr[1] >> 12) & 0xffff;
+ fCurrStackEndmarkerAvail = 0;
switch (fCurrSmHeaderVersion) {
case 0xb:
fCurrTrkHeaderAvail = fCurrTrackEnable;
fCurrTriggerEnable = (fPayloadCurr[2] >> 8) & 0xfff;
fCurrTriggerFired = (fPayloadCurr[2] >> 20) & 0xfff;
+ fCurrTrgFlags[fCurrEquipmentId-kDDLOffset] = fCurrTriggerFired;
+ break;
+
+ case 0xd:
+ fCurrTrailerReadout = ((*fPayloadCurr) >> 10) & 0x1;
+ fCurrTrgHeaderAvail = 1;
+ fCurrTrgHeaderReadout = ((*fPayloadCurr) >> 9) & 0x1;
+ fCurrEvType = ((*fPayloadCurr) >> 7) & 0x3;
+ fCurrTrkHeaderAvail = fCurrTrackEnable;
+ fCurrTriggerEnable = (fPayloadCurr[2] >> 8) & 0xfff;
+ fCurrTriggerFired = (fPayloadCurr[2] >> 20) & 0xfff;
+ fCurrTrgFlags[fCurrEquipmentId-kDDLOffset] = fCurrTriggerFired;
+ fCurrStackEndmarkerAvail = 1;
break;
default:
// decode GTU track words
// this depends on the hardware revision of the SMU
- AliDebug(1, DumpRaw(Form("GTU tracks (hw rev %i)", fCurrHwRev),
+ Int_t sector = fCurrEquipmentId-kDDLOffset;
+
+ if ((sector < 0) || (sector > 17)) {
+ AliError(Form("Invalid sector %i for GTU tracks", sector));
+ return -1;
+ }
+
+ AliDebug(1, DumpRaw(Form("GTU tracks in sector %2i (hw rev %i)", sector, fCurrHwRev),
fPayloadCurr + 4, 10, 0xffe0ffff));
+ fCurrTrgFlags[sector] = 0;
+
if (fCurrHwRev < 1772) {
- UInt_t trackWord[2] = { 0, 0 };
+ UInt_t fastWord; // fast trigger word
+ ULong64_t trackWord = 0; // extended track word
Int_t stack = 0;
Int_t idx = 0;
for (UInt_t iWord = 4; iWord < fCurrSmHeaderSize; iWord++) {
- if (fPayloadCurr[iWord] == 0x10000000) {
+ if (fPayloadCurr[iWord] == 0x10000000) { // stack boundary marker
stack++;
idx = 0;
}
else {
if ((idx == 0) &&
((fPayloadCurr[iWord] & 0xfffff0f0) == 0x13370000)) {
- AliDebug(1, Form("stack %i: fast trigger word: 0x%08x", stack, fPayloadCurr[iWord]));
+ fastWord = fPayloadCurr[iWord];
+ fCurrTrgFlags[sector] |= 1 << (stack+11); // assume tracking done if fast word sent
+ AliDebug(1, Form("stack %i: fast trigger word: 0x%08x", stack, fastWord));
continue;
}
else if ((idx & 0x1) == 0x1) {
- trackWord[1] = fPayloadCurr[iWord];
- AliDebug(1,Form("track debug word: 0x%08x%08x", trackWord[1], trackWord[0]));
- // if (fTracks)
- // new ((*fTracks)[fTracks->GetEntriesFast()]) AliESDTrdTrack(0, 0, trackWord[0], trackWord[1], fCurrEquipmentId-kDDLOffset);
- }
+ trackWord |= ((ULong64_t) fPayloadCurr[iWord]) << 32;
+ AliDebug(1,Form("track debug word: 0x%016llx", trackWord));
+ if (fTracks) {
+ AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()])
+ AliESDTrdTrack();
+
+ trk->SetSector(sector);
+ trk->SetStack((trackWord >> 60) & 0x7);
+ trk->SetA(0);
+ trk->SetB(0);
+ trk->SetPID(0);
+ trk->SetLayerMask((trackWord >> 16) & 0x3f);
+ trk->SetTrackletIndex((trackWord >> 22) & 0x3f, 0);
+ trk->SetTrackletIndex((trackWord >> 28) & 0x3f, 1);
+ trk->SetTrackletIndex((trackWord >> 34) & 0x3f, 2);
+ trk->SetTrackletIndex((trackWord >> 40) & 0x3f, 3);
+ trk->SetTrackletIndex((trackWord >> 46) & 0x3f, 4);
+ trk->SetTrackletIndex((trackWord >> 52) & 0x3f, 5);
+
+ trk->SetFlags(0);
+ trk->SetReserved(0);
+ trk->SetLabel(-3);
+
+ Float_t pt = (((Int_t) (trackWord & 0xffff) ^ 0x8000) - 0x8000)/128.;
+ if (TMath::Abs(pt) > 0.1) {
+ trk->SetA((Int_t) (0.15*51625./100./pt / 160e-4 * 2));
+ }
+ }
+ }
else {
- trackWord[0] = fPayloadCurr[iWord];
+ trackWord = fPayloadCurr[iWord];
}
idx++;
}
}
}
else if (fCurrHwRev < 1804) {
- UInt_t trackWord[2] = { 0, 0 };
+ UInt_t fastWord; // fast trigger word
+ ULong64_t trackWord = 0; // extended track word
Int_t stack = 0;
Int_t idx = 0;
for (UInt_t iWord = 4; iWord < fCurrSmHeaderSize; iWord++) {
- if (fPayloadCurr[iWord] == 0xffe0ffff) {
+ if (fPayloadCurr[iWord] == 0xffe0ffff) { // stack boundary marker
stack++;
idx = 0;
}
else {
if ((idx == 0) &&
((fPayloadCurr[iWord] & 0xfffff0f0) == 0x13370000)) {
- AliDebug(1, Form("stack %i: fast trigger word: 0x%08x", stack, fPayloadCurr[iWord]));
+ fastWord = fPayloadCurr[iWord];
+ fCurrTrgFlags[sector] |= 1 << (stack+11); // assume tracking done if fast word sent
+ AliDebug(1, Form("stack %i: fast trigger word: 0x%08x", stack, fastWord));
continue;
}
else if ((idx & 0x1) == 0x1) {
- trackWord[1] = fPayloadCurr[iWord];
- AliDebug(1, Form("track debug word: 0x%08x%08x", trackWord[1], trackWord[0]));
- Float_t pt = (trackWord[0] & 0x8000) ? -1. * ((~(trackWord[0] & 0xffff)&0xffff) + 1)/128. : (trackWord[0] & 0xffff)/128.;
- AliDebug(1, Form("pt = %f", pt));
- // if (fTracks) {
- // AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()]) AliESDTrdTrack(0, 0, trackWord[0], trackWord[1], fCurrEquipmentId-kDDLOffset);
- // if (TMath::Abs(pt) > 0.1) {
- // trk->SetA((Int_t) (0.15*51625./100./pt / 160e-4 * 2));
- // }
- // trk->SetStack((trackWord[1] >> 28) & 0x7);
- // }
+ trackWord |= ((ULong64_t) fPayloadCurr[iWord]) << 32;
+ AliDebug(1, Form("track debug word: 0x%016llx", trackWord));
+ if (fTracks) {
+ AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()])
+ AliESDTrdTrack();
+
+ trk->SetSector(fCurrEquipmentId-kDDLOffset);
+ trk->SetStack((trackWord >> 60) & 0x7);
+ trk->SetA(0);
+ trk->SetB(0);
+ trk->SetPID(0);
+ trk->SetLayerMask((trackWord >> 16) & 0x3f);
+ trk->SetTrackletIndex((trackWord >> 22) & 0x3f, 0);
+ trk->SetTrackletIndex((trackWord >> 28) & 0x3f, 1);
+ trk->SetTrackletIndex((trackWord >> 34) & 0x3f, 2);
+ trk->SetTrackletIndex((trackWord >> 40) & 0x3f, 3);
+ trk->SetTrackletIndex((trackWord >> 46) & 0x3f, 4);
+ trk->SetTrackletIndex((trackWord >> 52) & 0x3f, 5);
+
+ trk->SetFlags(0);
+ trk->SetReserved(0);
+ trk->SetLabel(-3);
+
+ Float_t pt = (((Int_t) (trackWord & 0xffff) ^ 0x8000) - 0x8000)/128.;
+ if (TMath::Abs(pt) > 0.1) {
+ trk->SetA((Int_t) (-0.15*51625./100./pt / 160e-4 * 2));
+ }
+ }
}
else {
- trackWord[0] = fPayloadCurr[iWord];
+ trackWord = fPayloadCurr[iWord];
}
idx++;
}
}
}
else if (fCurrHwRev < 1819) {
- UInt_t trackWord[2];
+ UInt_t fastWord; // fast trigger word
+ ULong64_t trackWord = 0; // extended track word
Int_t stack = 0;
Int_t idx = 0;
for (UInt_t iWord = 4; iWord < fCurrSmHeaderSize; iWord++) {
- if (fPayloadCurr[iWord] == 0xffe0ffff) {
+ if (fPayloadCurr[iWord] == 0xffe0ffff) { // stack boundary marker
stack++;
idx = 0;
}
else {
if ((idx == 0) &&
((fPayloadCurr[iWord] & 0xfffff0f0) == 0x13370000)) {
- AliDebug(1, Form("stack %i: fast trigger word: 0x%08x", stack, fPayloadCurr[iWord]));
+ fastWord = fPayloadCurr[iWord];
+ if (fastWord & (1 << 13))
+ fCurrTrgFlags[sector] |= 1 << (stack+11);
+ AliDebug(1, Form("stack %i: fast trigger word: 0x%08x", stack, fastWord));
continue;
}
else if ((idx & 0x1) == 0x1) {
- trackWord[idx&0x1] = fPayloadCurr[iWord];
- AliDebug(1, Form("track debug word: 0x%08x%08x", trackWord[1], trackWord[0]));
- printf("%4i %2i %i ",
- fRawReader->GetEventIndex(),
- fCurrEquipmentId-kDDLOffset, (trackWord[1] >> 28) & 0x7);
- Float_t pt = (trackWord[0] & 0x8000) ? -1. * ((~(trackWord[0] & 0xffff)&0xffff) + 1)/128. : (trackWord[0] & 0xffff)/128.;
- printf("%+7.2f ", pt);
- printf("%i%i%i%i%i%i ", ((trackWord[0] >> 21) & 0x1),
- ((trackWord[0] >> 20) & 0x1),
- ((trackWord[0] >> 19) & 0x1),
- ((trackWord[0] >> 18) & 0x1),
- ((trackWord[0] >> 17) & 0x1),
- ((trackWord[0] >> 16) & 0x1));
- printf("0x%08x%08x\n", trackWord[1], trackWord[0]);
- // if (fTracks) {
- // AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()]) AliESDTrdTrack(0, 0, trackWord[0], trackWord[1], fCurrEquipmentId-kDDLOffset);
- // if (TMath::Abs(pt) > 0.1) {
- // trk->SetA((Int_t) (0.15*51625./100./pt / 160e-4 * 2));
- // }
- // trk->SetStack((trackWord[1] >> 28) & 0x7);
- // }
+ trackWord |= ((ULong64_t) fPayloadCurr[iWord]) << 32;
+ AliDebug(1, Form("track debug word: 0x%016llx", trackWord));
+
+ if (fTracks) {
+ AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()])
+ AliESDTrdTrack();
+
+ trk->SetSector(fCurrEquipmentId-kDDLOffset);
+ trk->SetStack((trackWord >> 60) & 0x7);
+ trk->SetA(0);
+ trk->SetB(0);
+ // trk->SetPt(((trackWord & 0xffff) ^ 0x8000) - 0x8000);
+ trk->SetPID(0);
+ trk->SetLayerMask((trackWord >> 16) & 0x3f);
+ trk->SetTrackletIndex((trackWord >> 22) & 0x3f, 0);
+ trk->SetTrackletIndex((trackWord >> 28) & 0x3f, 1);
+ trk->SetTrackletIndex((trackWord >> 34) & 0x3f, 2);
+ trk->SetTrackletIndex((trackWord >> 40) & 0x3f, 3);
+ trk->SetTrackletIndex((trackWord >> 46) & 0x3f, 4);
+ trk->SetTrackletIndex((trackWord >> 52) & 0x3f, 5);
+
+ trk->SetFlags(0);
+ trk->SetReserved(0);
+ trk->SetLabel(-3);
+
+ Float_t pt = (((Int_t) (trackWord & 0xffff) ^ 0x8000) - 0x8000)/128.;
+ if (TMath::Abs(pt) > 0.1) {
+ trk->SetA((Int_t) (0.15*51625./100./trk->Pt() / 160e-4 * 2));
+ }
+ }
}
else {
- trackWord[idx&0x1] = fPayloadCurr[iWord];
+ trackWord = fPayloadCurr[iWord];
}
idx++;
}
}
}
else if (fCurrHwRev < 1860) {
- AliError(Form("unsupported hardware rev %i", fCurrHwRev));
+ UInt_t fastWord; // fast trigger word
+ ULong64_t trackWord = 0; // extended track word
+ Int_t stack = 0;
+ Int_t idx = 0;
+ Bool_t upperWord = kFALSE;
+ Int_t word = 0;
+ for (UInt_t iWord = 4; iWord < fCurrSmHeaderSize; iWord++) {
+ if (fPayloadCurr[iWord] == 0xffe0ffff) { // stack boundary marker
+ stack++;
+ idx = 0;
+ upperWord = kFALSE;
+ }
+ else {
+ // assemble the 32-bit words out of 16-bit blocks
+ if (upperWord) {
+ word |= (fPayloadCurr[iWord] & 0xffff0000);
+ upperWord = kFALSE;
+ }
+ else {
+ // lower word is read first
+ word = (fPayloadCurr[iWord] & 0xffff0000) >> 16;
+ upperWord = kTRUE;
+ continue;
+ }
+
+ if ((word & 0xffff0008) == 0x13370008) {
+ fastWord = word;
+ AliDebug(1, Form("stack %i: fast track word: 0x%08x", stack, fastWord));
+ if (fastWord & (1 << 13))
+ fCurrTrgFlags[sector] |= 1 << (stack+11);
+ continue;
+ }
+ else if ((idx & 0x1) == 0x1) {
+ trackWord |= ((ULong64_t) word) << 32;
+ AliDebug(1, Form("track debug word: 0x%016llx", trackWord));
+ if (fTracks) {
+ AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()])
+ AliESDTrdTrack();
+
+ trk->SetSector(fCurrEquipmentId-kDDLOffset);
+ trk->SetStack((trackWord >> 60) & 0x7);
+ trk->SetA(0);
+ trk->SetB(0);
+ trk->SetPID(0);
+ trk->SetLayerMask((trackWord >> 16) & 0x3f);
+ trk->SetTrackletIndex((trackWord >> 22) & 0x3f, 0);
+ trk->SetTrackletIndex((trackWord >> 28) & 0x3f, 1);
+ trk->SetTrackletIndex((trackWord >> 34) & 0x3f, 2);
+ trk->SetTrackletIndex((trackWord >> 40) & 0x3f, 3);
+ trk->SetTrackletIndex((trackWord >> 46) & 0x3f, 4);
+ trk->SetTrackletIndex((trackWord >> 52) & 0x3f, 5);
+
+ trk->SetFlags(0);
+ trk->SetReserved(0);
+ trk->SetLabel(-3);
+
+ Float_t pt = (((Int_t) (trackWord & 0xffff) ^ 0x8000) - 0x8000)/128.;
+ if (TMath::Abs(pt) > 0.1) {
+ trk->SetA((Int_t) (0.15*51625./100./pt / 160e-4 * 2));
+ }
+ }
+ }
+ else {
+ trackWord = word;
+ }
+ idx++;
+ }
+ }
+
}
else {
- UInt_t trackWord[2] = { 0, 0 };
+ ULong64_t trackWord = 0; // this is the debug word
Int_t stack = 0;
Int_t idx = 0;
Bool_t upperWord = kFALSE;
}
else if ((word & 0xffff0010) == 0x13370010) {
AliDebug(1, Form("stack %i: tracking done word: 0x%08x", stack, word));
+ fCurrTrgFlags[sector] |= 1 << (stack+11);
continue;
}
else if ((idx & 0x1) == 0x1) {
- trackWord[1] = word;
- AliDebug(1, Form("track debug word: 0x%08x%08x", trackWord[1], trackWord[0]));
- // if (fTracks) {
- // AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()]) AliESDTrdTrack(0, 0, trackWord[0], trackWord[1], fCurrEquipmentId-kDDLOffset);
- // if (TMath::Abs(trk->GetPt()) > 0.1) {
- // trk->SetA((Int_t) (0.15*51625./100./trk->GetPt() / 160e-4 * 2));
- // }
- // trk->SetStack((trackWord[1] >> 28) & 0x7);
- // }
+ trackWord |= ((ULong64_t) word) << 32;
+ AliDebug(1, Form("track debug word: 0x%16llx", trackWord));
+ if (fTracks) {
+ AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()])
+ AliESDTrdTrack();
+ trk->SetSector(fCurrEquipmentId-kDDLOffset);
+ trk->SetStack((trackWord >> 60) & 0x7);
+ trk->SetA(0);
+ trk->SetB(0);
+ trk->SetPID(0);
+ trk->SetLayerMask((trackWord >> 16) & 0x3f);
+ trk->SetTrackletIndex((trackWord >> 22) & 0x3f, 0);
+ trk->SetTrackletIndex((trackWord >> 28) & 0x3f, 1);
+ trk->SetTrackletIndex((trackWord >> 34) & 0x3f, 2);
+ trk->SetTrackletIndex((trackWord >> 40) & 0x3f, 3);
+ trk->SetTrackletIndex((trackWord >> 46) & 0x3f, 4);
+ trk->SetTrackletIndex((trackWord >> 52) & 0x3f, 5);
+
+ trk->SetFlags(0);
+ trk->SetReserved(0);
+ trk->SetLabel(-3);
+
+ Float_t pt = (((Int_t) (trackWord & 0xffff) ^ 0x8000) - 0x8000)/128.;
+ if (TMath::Abs(pt) > 0.1) {
+ trk->SetA(-(Int_t) (0.15*51625./100./pt / 160e-4 * 2));
+ }
+ }
}
else {
- trackWord[0] = word;
+ trackWord = word;
}
idx++;
}
fCurrTrkHeaderIndexWord[stack] = *fPayloadCurr;
fCurrTrkHeaderSize[stack] = ((*fPayloadCurr) >> 16) & 0x3ff;
- fPayloadCurr++;
- AliDebug(1, Form("tracking header index word: 0x%08x, size: %i\n",
- fCurrTrkHeaderIndexWord[stack], fCurrTrkHeaderSize[stack]));
+ AliDebug(1, Form("tracking header index word: 0x%08x, size: %i (hw rev: %i)",
+ fCurrTrkHeaderIndexWord[stack], fCurrTrkHeaderSize[stack], fCurrHwRev));
+ Int_t trackingTime = *fPayloadCurr & 0x3ff;
+
+ fCurrTrgFlags[fCurrEquipmentId-kDDLOffset] |= ((fCurrTrkHeaderIndexWord[stack] >> 10) & 0x1) << (22 + stack);
+ fPayloadCurr++;
// data words
- UInt_t trackWord[2] = { 0, 0 };
+ ULong64_t trackWord = 0;
Int_t idx = 0;
- Bool_t upperWord = kFALSE;
- Int_t word = 0;
+ Int_t trackIndex = fTracks ? fTracks->GetEntriesFast() : -1;
+
for (UInt_t iWord = 0; iWord < fCurrTrkHeaderSize[stack]; iWord++) {
- // assemble the 32-bit words out of 16-bit blocks
- if (upperWord) {
- word |= (fPayloadCurr[iWord] & 0xffff0000);
- upperWord = kFALSE;
- }
- else {
- // lower word is read first
- word = (fPayloadCurr[iWord] & 0xffff0000) >> 16;
- upperWord = kTRUE;
- continue;
- }
- if ((word & 0xffff0008) == 0x13370008) {
- AliDebug(1, Form("stack %i: fast track word: 0x%08x", stack, word));
- continue;
- }
- else if ((word & 0xffff0010) == 0x13370010) {
- AliDebug(1, Form("stack %i: tracking done word: 0x%08x", stack, word));
- continue;
- }
- else if ((idx & 0x1) == 0x1) {
- trackWord[1] = word;
- AliDebug(1, Form("track debug word: 0x%08x%08x", trackWord[1], trackWord[0]));
- // if (fTracks) {
- // AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()]) AliESDTrdTrack(0, 0, trackWord[0], trackWord[1], fCurrEquipmentId-kDDLOffset);
- // if (TMath::Abs(trk->GetPt()) > 0.1) {
- // trk->SetA((Int_t) (0.15*51625./100./trk->GetPt() / 160e-4 * 2));
- // }
- // trk->SetStack((trackWord[1] >> 28) & 0x7);
- // }
+ if (!(idx & 0x1)) {
+ // first part of 64-bit word
+ trackWord = fPayloadCurr[iWord];
}
else {
- trackWord[0] = word;
+ trackWord |= ((ULong64_t) fPayloadCurr[iWord]) << 32;
+
+ if (trackWord & (1ul << 63)) {
+ if ((trackWord & (0x3ful << 56)) != 0) {
+ // track word
+ AliDebug(2, Form("track word: 0x%016llx", trackWord));
+
+ if (fTracks) {
+ AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()])
+ AliESDTrdTrack();
+
+ trk->SetSector(fCurrEquipmentId-kDDLOffset);
+ trk->SetLayerMask((trackWord >> 56) & 0x3f);
+ trk->SetA( (((trackWord >> 38) & 0x3ffff) ^ 0x20000) - 0x20000);
+ trk->SetB( (((trackWord >> 20) & 0x3ffff) ^ 0x20000) - 0x20000);
+ trk->SetC( (((trackWord >> 8) & 0xffff) ^ 0x8000) - 0x8000);
+ trk->SetPID((trackWord >> 0) & 0xff);
+ trk->SetStack(stack);
+ trk->SetLabel(-3);
+
+ // now compare the track word with the one generated from the ESD information
+ if (trackWord != trk->GetTrackWord(0)) {
+ AliError(Form("track word 0x%016llx does not match the read one 0x%016llx",
+ trk->GetTrackWord(0), trackWord));
+ }
+ }
+ }
+ else {
+ // done marker (so far only used to set trigger flag)
+ fCurrTrgFlags[fCurrEquipmentId-kDDLOffset] |= 1 << (27 + stack);
+ fCurrTrkFlags[(fCurrEquipmentId-kDDLOffset)*fgkNstacks + stack] = trackWord;
+
+ AliDebug(2, Form("tracking done marker: 0x%016llx, trigger flags: 0x%08x",
+ trackWord, fCurrTrgFlags[fCurrEquipmentId-kDDLOffset]));
+ AliDebug(2, Form("seg / stack / first / last / done / index : %i %i %lli %lli %lli %i",
+ fCurrEquipmentId - kDDLOffset, stack,
+ (trackWord >> 20) & 0x3ff,
+ (trackWord >> 10) & 0x3ff,
+ (trackWord >> 0) & 0x3ff,
+ trackingTime));
+ }
+ }
+ else {
+ // extended track word
+ AliDebug(2, Form("extended track word: 0x%016llx", trackWord));
+
+ if (fTracks) {
+ AliESDTrdTrack *trk = (AliESDTrdTrack*) (*fTracks)[trackIndex];
+
+ trk->SetFlags((trackWord >> 52) & 0x7ff);
+ trk->SetReserved((trackWord >> 49) & 0x7);
+ trk->SetY((trackWord >> 36) & 0x1fff);
+ trk->SetTrackletIndex((trackWord >> 0) & 0x3f, 0);
+ trk->SetTrackletIndex((trackWord >> 6) & 0x3f, 1);
+ trk->SetTrackletIndex((trackWord >> 12) & 0x3f, 2);
+ trk->SetTrackletIndex((trackWord >> 18) & 0x3f, 3);
+ trk->SetTrackletIndex((trackWord >> 24) & 0x3f, 4);
+ trk->SetTrackletIndex((trackWord >> 30) & 0x3f, 5);
+
+ if (trackWord != trk->GetExtendedTrackWord(0)) {
+ AliError(Form("extended track word 0x%016llx does not match the read one 0x%016llx",
+ trk->GetExtendedTrackWord(0), trackWord));
+ }
+
+ trackIndex++;
+ }
+ }
}
idx++;
}
AliDebug(1, Form("trigger index word %i: 0x%08x\n", iTrigger, *fPayloadCurr));
fCurrTrgHeaderIndexWord[iTrigger] = *fPayloadCurr;
fCurrTrgHeaderSize[iTrigger] = ((*fPayloadCurr) >> 16) & 0x3ff;
+ if (iTrigger == 7) {
+ // timeout trigger, use to extract tracking time
+ fCurrTrgFlags[fCurrEquipmentId-kDDLOffset] |= (*fPayloadCurr & 0x3ff) << 12;
+ }
+
fPayloadCurr++;
// data words
fPayloadCurr += fCurrTrgHeaderSize[iTrigger];
AliDebug(1, DumpRaw(Form("stack %i header", stack), fPayloadCurr, fCurrStackHeaderSize[stack]));
if (fPayloadCurr - fPayloadStart >= fPayloadSize - (Int_t) fCurrStackHeaderSize[stack]) {
- LinkError(kStackHeaderInvalid, "Stack index header aborted");
+ EquipmentError(kStackHeaderInvalid, "Stack index header %i aborted", stack);
+ // dumping stack header
+ AliError(DumpRaw(Form("stack %i header", stack), fPayloadCurr, fCurrStackHeaderSize[stack]));
+
return -1;
}
Int_t trailerSize = (trailerIndexWord >> 16) & 0xffff;
AliDebug(2, DumpRaw("GTU trailer", trailer, trailerSize+1));
// parse the trailer
+ if (trailerSize >= 4) {
+ // match flags from GTU
+ fCurrMatchFlagsSRAM = (trailer[1] >> 0) & 0x1f;
+ fCurrMatchFlagsPostBP = (trailer[1] >> 5) & 0x1f;
+ // individual checksums
+ fCurrChecksumStack[0] = (trailer[1] >> 16) & 0xffff;
+ fCurrChecksumStack[1] = (trailer[2] >> 0) & 0xffff;
+ fCurrChecksumStack[2] = (trailer[2] >> 16) & 0xffff;
+ fCurrChecksumStack[3] = (trailer[3] >> 0) & 0xffff;
+ fCurrChecksumStack[4] = (trailer[3] >> 16) & 0xffff;
+ fCurrChecksumSIU = trailer[4];
+
+ if ((fCurrMatchFlagsSRAM & fCurrStackMask) != fCurrStackMask)
+ EquipmentError(kCRCmismatch, "CRC mismatch SRAM: 0x%02x", fCurrMatchFlagsSRAM);
+ if ((fCurrMatchFlagsPostBP & fCurrStackMask) != fCurrStackMask)
+ EquipmentError(kCRCmismatch, "CRC mismatch BP: 0x%02x", fCurrMatchFlagsPostBP);
+
+ }
+ else {
+ LinkError(kUnknown, "Invalid GTU trailer");
+ }
}
else
EquipmentError(kUnknown, "trailer index marker mismatch");
if (fMarkers)
new ((*fMarkers)[fMarkers->GetEntriesFast()])
- AliTRDrawStreamError(-kHCactive, fCurrEquipmentId-kDDLOffset, fCurrStack, fCurrLink);
+ AliTRDrawStreamError(-kHCactive, fCurrEquipmentId-kDDLOffset, fCurrSlot, fCurrLink);
if (fErrorFlags & kDiscardHC)
return count;
- //??? add check whether tracklets are enabled
- count += ReadTracklets();
- if (fErrorFlags & kDiscardHC)
- return count;
+ if (fCurrTrackletEnable) {
+ count += ReadTracklets();
+ if (fErrorFlags & kDiscardHC)
+ return count;
+ }
AliDebug(1, DumpRaw("HC header", fPayloadCurr, 4, 0x00000000));
count += ReadHcHeader();
if (det > -1 && det < 540) {
- if ((fAdcArray = fDigitsManager->GetDigits(det))) {
- //fAdcArray->Expand();
- if (fAdcArray->GetNtime() != fCurrNtimebins)
- fAdcArray->Allocate(16, 144, fCurrNtimebins);
- }
- else {
- LinkError(kNoDigits);
- }
-
- if (!fDigitsParam) {
- fDigitsParam = fDigitsManager->GetDigitsParam();
- }
- if (fDigitsParam) {
- fDigitsParam->SetPretriggerPhase(det, fCurrPtrgPhase);
- fDigitsParam->SetNTimeBins(det, fCurrNtimebins);
- fDigitsParam->SetADCbaseline(det, 10);
- }
-
- if (fDigitsManager->UsesDictionaries()) {
- fDigitsManager->GetDictionary(det, 0)->Reset();
- fDigitsManager->GetDictionary(det, 1)->Reset();
- fDigitsManager->GetDictionary(det, 2)->Reset();
- }
-
- if ((fSignalIndex = fDigitsManager->GetIndexes(det))) {
- fSignalIndex->SetSM(fCurrSm);
- fSignalIndex->SetStack(fCurrStack);
- fSignalIndex->SetLayer(fCurrLayer);
- fSignalIndex->SetDetNumber(det);
- if (!fSignalIndex->IsAllocated())
- fSignalIndex->Allocate(16, 144, fCurrNtimebins);
- }
-
// ----- check which kind of data -----
if (fCurrMajor & 0x40) {
if ((fCurrMajor & 0x7) == 0x7) {
count += fPayloadCurr - startPos;
// feeding TRAP config
- AliTRDtrapConfig *trapcfg = AliTRDtrapConfig::Instance();
- trapcfg->ReadPackedConfig(fCurrHC, startPos, fPayloadCurr - startPos);
+// AliTRDtrapConfig *trapcfg = AliTRDcalibDB::Instance()->GetTrapConfig();
+// trapcfg->ReadPackedConfig(fCurrHC, startPos, fPayloadCurr - startPos);
}
else {
Int_t tpmode = fCurrMajor & 0x7;
AliDebug(1, Form("Checking testpattern (mode %i) data", tpmode));
- ReadTPData(tpmode);
+ count += ReadTPData(tpmode);
}
}
- else if (fCurrMajor & 0x20) {
- AliDebug(1, "This is a zs event");
- count += ReadZSData();
- }
else {
- AliDebug(1, "This is a nozs event");
- count += ReadNonZSData();
+ // reading real data
+ if (fDigitsManager) {
+ if ((fAdcArray = fDigitsManager->GetDigits(det))) {
+ //fAdcArray->Expand();
+ if (fAdcArray->GetNtime() != fCurrNtimebins)
+ fAdcArray->Allocate(16, 144, fCurrNtimebins);
+ }
+ else {
+ LinkError(kNoDigits);
+ }
+
+ if (!fDigitsParam) {
+ fDigitsParam = fDigitsManager->GetDigitsParam();
+ }
+ if (fDigitsParam) {
+ fDigitsParam->SetPretriggerPhase(det, fCurrPtrgPhase);
+ fDigitsParam->SetNTimeBins(det, fCurrNtimebins);
+ fDigitsParam->SetADCbaseline(det, 10);
+ }
+
+ if (fDigitsManager->UsesDictionaries()) {
+ fDigitsManager->GetDictionary(det, 0)->Reset();
+ fDigitsManager->GetDictionary(det, 1)->Reset();
+ fDigitsManager->GetDictionary(det, 2)->Reset();
+ }
+
+ if ((fSignalIndex = fDigitsManager->GetIndexes(det))) {
+ fSignalIndex->SetSM(fCurrSm);
+ fSignalIndex->SetStack(fCurrStack);
+ fSignalIndex->SetLayer(fCurrLayer);
+ fSignalIndex->SetDetNumber(det);
+ if (!fSignalIndex->IsAllocated())
+ fSignalIndex->Allocate(16, 144, fCurrNtimebins);
+ }
+
+ if (fCurrMajor & 0x20) {
+ AliDebug(1, "This is a zs event");
+ count += ReadZSData();
+ }
+ else {
+ AliDebug(1, "This is a nozs event");
+ count += ReadNonZSData();
+ }
+ }
+ else {
+ // just read until data endmarkers
+ while (fPayloadCurr - fPayloadStart < fPayloadSize &&
+ *fPayloadCurr != fgkDataEndmarker)
+ fPayloadCurr++;
+ }
}
}
else {
// evcnt checking missing
Int_t cpu = 0;
Int_t cpufromchannel[] = {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3};
+ Int_t evno = -1;
Int_t evcnt = 0;
Int_t count = 0;
Int_t mcmcount = -1;
fPayloadCurr - fPayloadStart < fPayloadSize - 1) {
// ----- Checking MCM Header -----
- AliDebug(2, Form("MCM header: 0x%08x", *fPayloadCurr));
+ AliDebug(2, DumpMcmHeader("MCM header: ", *fPayloadCurr));
+ UInt_t *startPosMCM = fPayloadCurr;
mcmcount++;
// ----- checking for proper readout order - ROB -----
+ fCurrRobPos = ROB(*fPayloadCurr);
if (GetROBReadoutPos(ROB(*fPayloadCurr) / 2) >= lastrobpos) {
+ if (GetROBReadoutPos(ROB(*fPayloadCurr) / 2) > lastrobpos)
+ lastmcmpos = -1;
lastrobpos = GetROBReadoutPos(ROB(*fPayloadCurr) / 2);
}
else {
ROBError(kPosUnexp, Form("#%i after #%i in readout order", GetROBReadoutPos(ROB(*fPayloadCurr) / 2), lastrobpos));
}
- fCurrRobPos = ROB(*fPayloadCurr);
// ----- checking for proper readout order - MCM -----
- if (GetMCMReadoutPos(MCM(*fPayloadCurr)) >= (lastmcmpos + 1) % 16) {
+ fCurrMcmPos = MCM(*fPayloadCurr);
+ if (GetMCMReadoutPos(MCM(*fPayloadCurr)) > lastmcmpos) {
lastmcmpos = GetMCMReadoutPos(MCM(*fPayloadCurr));
}
else {
MCMError(kPosUnexp, Form("#%i after #%i in readout order", GetMCMReadoutPos(MCM(*fPayloadCurr)), lastmcmpos));
}
- fCurrMcmPos = MCM(*fPayloadCurr);
+ if (EvNo(*fPayloadCurr) != evno) {
+ if (evno == -1) {
+ evno = EvNo(*fPayloadCurr);
+ }
+ else {
+ MCMError(kEvCntMismatch, "%i <-> %i", evno, EvNo(*fPayloadCurr));
+ }
+ }
fPayloadCurr++;
}
while (count < 10) {
+ if (*fPayloadCurr == fgkDataEndmarker) {
+ MCMError(kMissTpData);
+ return (fPayloadCurr - start);
+ }
+
if (channelcount % 2 == 0)
expword = 0x3;
else
}
diff = *fPayloadCurr ^ expword;
+ AliDebug(11, Form("Comparing ch %2i, word %2i (cpu %i): 0x%08x <-> 0x%08x",
+ channelcount, wordcount, cpu, *fPayloadCurr, expword));
+
if (diff != 0) {
MCMError(kTPmismatch,
- "Seen 0x%08x, expected 0x%08x, diff: 0x%08x (0x%02x)",
- *fPayloadCurr, expword, diff, 0xff & (diff | diff >> 8 | diff >> 16 | diff >> 24));;
+ "Seen 0x%08x, expected 0x%08x, diff: 0x%08x, 0x%04x, 0x%02x - word %2i (cpu %i, ch %i)",
+ *fPayloadCurr, expword, diff,
+ 0xffff & (diff | diff >> 16),
+ 0xff & (diff | diff >> 8 | diff >> 16 | diff >> 24),
+ wordcount, cpu, channelcount);;
}
fPayloadCurr++;
count++;
wordcount++;
+ if (*fPayloadCurr == fgkDataEndmarker)
+ return (fPayloadCurr - start);
}
channelcount++;
}
// continue with next MCM
+
+ if (IsDumping() && DumpingMCM(fCurrHC/2, fCurrRobPos, fCurrMcmPos)) {
+ AliInfo(DumpRaw(Form("Event %i: Det %3i ROB %i MCM %2i", fRawReader->GetEventIndex(), fCurrHC/2, fCurrRobPos, fCurrMcmPos),
+ startPosMCM, fPayloadCurr - startPosMCM));
+ }
+
}
return fPayloadCurr - start;
}
UInt_t *startPosMCM = fPayloadCurr;
// ----- checking for proper readout order - ROB -----
+ fCurrRobPos = ROB(*fPayloadCurr);
if (GetROBReadoutPos(ROB(*fPayloadCurr) / 2) >= lastrobpos) {
if (GetROBReadoutPos(ROB(*fPayloadCurr) / 2) > lastrobpos)
lastmcmpos = -1;
ROBError(kPosUnexp, Form("#%i after #%i and #%i in readout order",
GetROBReadoutPos(ROB(*fPayloadCurr) / 2), lastrobpos, GetROBReadoutPos(fCurrRobPos)));
}
- fCurrRobPos = ROB(*fPayloadCurr);
// ----- checking for proper readout order - MCM -----
+ fCurrMcmPos = MCM(*fPayloadCurr);
if (GetMCMReadoutPos(MCM(*fPayloadCurr)) > lastmcmpos) {
lastmcmpos = GetMCMReadoutPos(MCM(*fPayloadCurr));
}
MCMError(kPosUnexp, Form("#%i after #%i and #%i in readout order",
GetMCMReadoutPos(MCM(*fPayloadCurr)), lastmcmpos, GetMCMReadoutPos(fCurrMcmPos)));
}
- fCurrMcmPos = MCM(*fPayloadCurr);
if (EvNo(*fPayloadCurr) != evno) {
if (evno == -1)
evno = EvNo(*fPayloadCurr);
else {
- MCMError(kPtrgCntMismatch, "%i <-> %i", evno, EvNo(*fPayloadCurr));
+ MCMError(kEvCntMismatch, "%i <-> %i", evno, EvNo(*fPayloadCurr));
}
}
Int_t adccoloff = AdcColOffset(*fPayloadCurr);
Int_t row = Row(*fPayloadCurr);
fPayloadCurr++;
+ if ((row > 11) && (fCurrStack == 2)) {
+ MCMError(kUnknown, "Data in padrow > 11 for stack 2");
+ }
+
// ----- Reading ADC channels -----
AliDebug(2, DumpAdcMask("ADC mask: ", *fPayloadCurr));
}
adcwc = 0;
- AliDebug(3, Form("Now reading %i words for channel %2i", timebins / 3, channelno));
+ Int_t nADCwords = (timebins + 2) / 3;
+ AliDebug(3, Form("Now reading %i words for channel %2i", nADCwords, channelno));
Int_t adccol = adccoloff - channelno;
Int_t padcol = padcoloff - channelno;
// if (adccol < 3 || adccol > 165)
// AliInfo(Form("writing channel %i of det %3i %i:%2i to adcrow/-col: %i/%i padcol: %i",
// channelno, fCurrHC/2, fCurrRobPos, fCurrMcmPos, row, adccol, padcol));
- while (adcwc < timebins / 3 &&
- *(fPayloadCurr) != fgkDataEndmarker &&
- fPayloadCurr - fPayloadStart < fPayloadSize) {
+ while ((adcwc < nADCwords) &&
+ (*(fPayloadCurr) != fgkDataEndmarker) &&
+ (fPayloadCurr - fPayloadStart < fPayloadSize)) {
int check = 0x3 & *fPayloadCurr;
if (channelno % 2 != 0) { // odd channel
if (check != 0x2 && channelno < 21) {
fPayloadCurr++;
}
- if (adcwc != timebins / 3)
+ if (adcwc != nADCwords)
MCMError(kAdcDataAbort);
// adding index
AliDebug(2, Form("MCM header: 0x%08x", *fPayloadCurr));
// ----- checking for proper readout order - ROB -----
+ fCurrRobPos = ROB(*fPayloadCurr);
if (GetROBReadoutPos(ROB(*fPayloadCurr) / 2) >= lastrobpos) {
+ if (GetROBReadoutPos(ROB(*fPayloadCurr) / 2) > lastrobpos)
+ lastmcmpos = -1;
lastrobpos = GetROBReadoutPos(ROB(*fPayloadCurr) / 2);
}
else {
ROBError(kPosUnexp, Form("#%i after #%i in readout order", GetROBReadoutPos(ROB(*fPayloadCurr) / 2), lastrobpos));
}
- fCurrRobPos = ROB(*fPayloadCurr);
// ----- checking for proper readout order - MCM -----
- if (GetMCMReadoutPos(MCM(*fPayloadCurr)) >= (lastmcmpos + 1) % 16) {
+ fCurrMcmPos = MCM(*fPayloadCurr);
+ if (GetMCMReadoutPos(MCM(*fPayloadCurr)) > lastmcmpos) {
lastmcmpos = GetMCMReadoutPos(MCM(*fPayloadCurr));
}
else {
MCMError(kPosUnexp, Form("#%i after #%i in readout order", GetMCMReadoutPos(MCM(*fPayloadCurr)), lastmcmpos));
}
- fCurrMcmPos = MCM(*fPayloadCurr);
if (EvNo(*fPayloadCurr) != evno) {
if (evno == -1)
evno = EvNo(*fPayloadCurr);
else {
- MCMError(kPtrgCntMismatch, "%i <-> %i", evno, EvNo(*fPayloadCurr));
+ MCMError(kEvCntMismatch, "%i <-> %i", evno, EvNo(*fPayloadCurr));
}
}
currentTimebin = 0;
adcwc = 0;
- AliDebug(2, Form("Now looking %i words", timebins / 3));
+ Int_t nADCwords = (timebins + 2) / 3;
+ AliDebug(2, Form("Now looking %i words", nADCwords));
Int_t adccol = adccoloff - channelno;
Int_t padcol = padcoloff - channelno;
- while (adcwc < timebins / 3 &&
- *(fPayloadCurr) != fgkDataEndmarker &&
- fPayloadCurr - fPayloadStart < fPayloadSize) {
+ while ((adcwc < nADCwords) &&
+ (*(fPayloadCurr) != fgkDataEndmarker) &&
+ (fPayloadCurr - fPayloadStart < fPayloadSize)) {
int check = 0x3 & *fPayloadCurr;
if (channelno % 2 != 0) { // odd channel
if (check != 0x2 && channelno < 21) {
fPayloadCurr++;
}
- if (adcwc != timebins / 3)
+ if (adcwc != nADCwords)
MCMError(kAdcDataAbort);
// adding index
return (fPayloadCurr - start);
}
+Int_t AliTRDrawStream::SeekNextStack()
+{
+ // proceed in raw data stream till the next stack
+
+ if (!fCurrStackEndmarkerAvail)
+ return 0;
+
+ UInt_t *start = fPayloadCurr;
+
+ // read until data endmarkers
+ while ((fPayloadCurr - fPayloadStart < fPayloadSize-1) &&
+ ((fPayloadCurr[0] != fgkStackEndmarker[0]) ||
+ (fPayloadCurr[1] != fgkStackEndmarker[1])))
+ fPayloadCurr++;
+
+ if ((fPayloadCurr - start) != 0)
+ StackError(kUnknown, "skipped %i words to reach stack endmarker", fPayloadCurr - start);
+
+ AliDebug(2, Form("stack endmarker: 0x%08x 0x%08x", fPayloadCurr[0], fPayloadCurr[1]));
+
+ // goto next stack
+ fPayloadCurr++;
+ fPayloadCurr++;
+
+ return (fPayloadCurr-start);
+}
+
Int_t AliTRDrawStream::SeekNextLink()
{
// proceed in raw data stream till the next link
// ctor
}
+
+void AliTRDrawStream::SortTracklets(TClonesArray *trklArray, TList &sortedTracklets, Int_t *indices)
+{
+ // sort tracklets for referencing from GTU tracks
+
+ Int_t nTracklets = trklArray->GetEntriesFast();
+
+ Int_t lastHC = -1;
+ for (Int_t iTracklet = 0; iTracklet < nTracklets; iTracklet++) {
+ AliTRDtrackletBase *trkl = (AliTRDtrackletBase*) ((*trklArray)[iTracklet]);
+ Int_t hc = trkl->GetHCId();
+ if ((hc < 0) || (hc >= 1080)) {
+ AliErrorClass(Form("HC for tracklet: 0x%08x out of range: %i", trkl->GetTrackletWord(), trkl->GetHCId()));
+ continue;
+ }
+ AliDebugClass(5, Form("hc: %4i : 0x%08x z: %2i", hc, trkl->GetTrackletWord(), trkl->GetZbin()));
+ if (hc != lastHC) {
+ AliDebugClass(2, Form("set tracklet index for HC %i to %i", hc, iTracklet));
+ indices[hc] = iTracklet + 1;
+ lastHC = hc;
+ }
+ }
+
+ for (Int_t iDet = 0; iDet < 540; iDet++) {
+ Int_t trklIndexA = indices[2*iDet + 0] - 1;
+ Int_t trklIndexB = indices[2*iDet + 1] - 1;
+ Int_t trklIndex = sortedTracklets.GetEntries();
+ AliTRDtrackletBase *trklA = trklIndexA > -1 ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexA]) : 0x0;
+ AliTRDtrackletBase *trklB = trklIndexB > -1 ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexB]) : 0x0;
+ AliTRDtrackletBase *trklNext = 0x0;
+ while (trklA != 0x0 || trklB != 0x0) {
+ AliDebugClass(5, Form("det %i - A: %i/%i -> %p, B: %i/%i -> %p",
+ iDet, trklIndexA, nTracklets, trklA, trklIndexB, nTracklets, trklB));
+ if (trklA == 0x0) {
+ trklNext = trklB;
+ trklIndexB++;
+ trklB = trklIndexB < nTracklets ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexB]) : 0x0;
+ if (trklB && trklB->GetHCId() != 2*iDet + 1)
+ trklB = 0x0;
+ }
+ else if (trklB == 0x0) {
+ trklNext = trklA;
+ trklIndexA++;
+ trklA = trklIndexA < nTracklets ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexA]) : 0x0;
+ if (trklA && trklA->GetHCId() != 2*iDet)
+ trklA = 0x0;
+ }
+ else {
+ if ((trklA->GetZbin() < trklB->GetZbin()) ||
+ ((trklA->GetZbin() == trklB->GetZbin()) && (trklA->GetYbin() < trklB->GetYbin()))) {
+ trklNext = trklA;
+ trklIndexA++;
+ trklA = trklIndexA < nTracklets ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexA]) : 0x0;
+ if (trklA && trklA->GetHCId() != 2*iDet)
+ trklA = 0x0;
+ }
+ else {
+ trklNext = trklB;
+ trklIndexB++;
+ trklB = trklIndexB < nTracklets ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexB]) : 0x0;
+ if (trklB && trklB->GetHCId() != 2*iDet + 1)
+ trklB = 0x0;
+ }
+ }
+ if (trklNext) {
+ Int_t label = -2; // mark raw tracklets with label -2
+ if (AliTRDtrackletMCM *trklMCM = dynamic_cast<AliTRDtrackletMCM*> (trklNext))
+ label = trklMCM->GetLabel();
+ AliESDTrdTracklet *esdTracklet = new AliESDTrdTracklet(trklNext->GetTrackletWord(), trklNext->GetHCId(), label);
+ sortedTracklets.Add(esdTracklet);
+ }
+
+ // updating tracklet indices as in output
+ if (sortedTracklets.GetEntries() != trklIndex) {
+ indices[2*iDet + 0] = indices[2*iDet + 1] = trklIndex;
+ }
+ else
+ indices[2*iDet + 0] = indices[2*iDet + 1] = -1;
+ }
+ }
+}