#include "AliLog.h"
#include "AliRawReader.h"
+#include "AliTRDcalibDB.h"
#include "AliTRDdigitsManager.h"
#include "AliTRDdigitsParam.h"
+#include "AliTRDcalibDB.h"
+#include "AliTRDmcmSim.h"
#include "AliTRDtrapConfig.h"
#include "AliTRDarrayADC.h"
#include "AliTRDarrayDictionary.h"
"not a TRD equipment (1024-1041)",
"Invalid Stack header",
"Invalid detector number",
+ "Invalid pad row",
"No digits could be retrieved from the digitsmanager",
"HC header mismatch",
"HC check bits wrong",
1,
0,
1,
+ 0,
1,
- 1,
+ 0,
1,
2,
1,
AliTRDrawStream::kAbort,
AliTRDrawStream::kAbort,
AliTRDrawStream::kAbort,
+ AliTRDrawStream::kDiscardMCM,
AliTRDrawStream::kAbort,
AliTRDrawStream::kDiscardHC,
AliTRDrawStream::kDiscardHC,
while ((fCurrSlot < fgkNstacks) &&
(((fCurrStackMask & (1 << fCurrSlot)) == 0) ||
((fCurrLinkMask[fCurrSlot] & (1 << fCurrLink))) == 0)) {
+ if ((fCurrStackMask & (1 << fCurrSlot)) == 0) {
+ ++fCurrSlot;
+ fCurrSlot = 0;
+ continue;
+ }
fCurrLink++;
if (fCurrLink >= fgkNlinks) {
+ SeekNextStack();
fCurrLink = 0;
fCurrSlot++;
}
AliESDTrdTrack *trk = (AliESDTrdTrack*) (*fTracks)[trackIndex];
trk->SetFlags((trackWord >> 52) & 0x7ff);
- trk->SetReserved((trackWord >> 49) & 0x7);
+ trk->SetFlagsTiming((trackWord >> 51) & 0x1);
+ trk->SetReserved((trackWord >> 49) & 0x3);
trk->SetY((trackWord >> 36) & 0x1fff);
trk->SetTrackletIndex((trackWord >> 0) & 0x3f, 0);
trk->SetTrackletIndex((trackWord >> 6) & 0x3f, 1);
AliDebug(1, DumpRaw(Form("stack %i header", stack), fPayloadCurr, fCurrStackHeaderSize[stack]));
if (fPayloadCurr - fPayloadStart >= fPayloadSize - (Int_t) fCurrStackHeaderSize[stack]) {
- EquipmentError(kStackHeaderInvalid, "Stack index header %i aborted", stack);
+ EquipmentError(kStackHeaderInvalid, "Stack index header %i incomplete", stack);
// dumping stack header
AliError(DumpRaw(Form("stack %i header", stack), fPayloadCurr, fCurrStackHeaderSize[stack]));
switch (fCurrStackHeaderVersion[stack]) {
case 0xa:
+ case 0xb:
if (fCurrStackHeaderSize[stack] < 8) {
LinkError(kStackHeaderInvalid, "Stack header smaller than expected!");
return -1;
UInt_t* trailer = fPayloadStart + fPayloadSize -1;
// look for the trailer index word from the end
- for (Int_t iWord = 0; iWord < fPayloadSize; iWord++) {
- if ((fPayloadStart[fPayloadSize-1-iWord] & 0xffff) == 0x1f51) {
+ for (Int_t iWord = 0; iWord < fPayloadSize-2; iWord++) {
+ if ((fPayloadStart[fPayloadSize-3-iWord] == fgkStackEndmarker[0]) &&
+ (fPayloadStart[fPayloadSize-2-iWord] == fgkStackEndmarker[1]) &&
+ ((fPayloadStart[fPayloadSize-1-iWord] & 0xfff) == 0xf51)) {
trailer = fPayloadStart + fPayloadSize - 1 - iWord;
break;
}
count += fPayloadCurr - startPos;
// feeding TRAP config
-// AliTRDtrapConfig *trapcfg = AliTRDcalibDB::Instance()->GetTrapConfig();
-// trapcfg->ReadPackedConfig(fCurrHC, startPos, fPayloadCurr - startPos);
+ AliTRDtrapConfig *trapcfg = AliTRDcalibDB::Instance()->GetTrapConfig();
+ AliTRDmcmSim::ReadPackedConfig(trapcfg, fCurrHC, startPos, fPayloadCurr - startPos);
}
else {
Int_t tpmode = fCurrMajor & 0x7;
UInt_t *start = fPayloadCurr;
while (*(fPayloadCurr) != fgkTrackletEndmarker &&
- fPayloadCurr - fPayloadStart < fPayloadSize) {
+ *(fPayloadCurr) != fgkStackEndmarker[0] &&
+ *(fPayloadCurr) != fgkStackEndmarker[1] &&
+ fPayloadCurr - fPayloadStart < (fPayloadSize - 1)) {
new ((*fTrackletArray)[fTrackletArray->GetEntriesFast()]) AliTRDtrackletWord(*(fPayloadCurr), fCurrHC);
fPayloadCurr++;
AliDebug(1, Form("HC header: 0x%08x", *fPayloadCurr));
UInt_t *start = fPayloadCurr;
// check not to be at the data endmarker
- if (*fPayloadCurr == fgkDataEndmarker)
+ if (*fPayloadCurr == fgkDataEndmarker ||
+ *(fPayloadCurr) == fgkStackEndmarker[0] ||
+ *(fPayloadCurr) == fgkStackEndmarker[1]) {
+ LinkError(kHCmismatch, "found endmarker where HC header should be");
return 0;
+ }
fCurrSpecial = (*fPayloadCurr >> 31) & 0x1;
fCurrMajor = (*fPayloadCurr >> 24) & 0x7f;
MCMError(kPosUnexp, Form("#%i after #%i in readout order", GetMCMReadoutPos(MCM(*fPayloadCurr)), lastmcmpos));
}
- if (EvNo(*fPayloadCurr) != evno) {
+ if (EvNo(*fPayloadCurr) != (evno & 0xfffff)) {
if (evno == -1) {
evno = EvNo(*fPayloadCurr);
}
timebins = fNtimebins;
while (*(fPayloadCurr) != fgkDataEndmarker &&
+ *(fPayloadCurr) != fgkStackEndmarker[0] &&
+ *(fPayloadCurr) != fgkStackEndmarker[1] &&
fPayloadCurr - fPayloadStart < fPayloadSize) {
// ----- Checking MCM Header -----
GetMCMReadoutPos(MCM(*fPayloadCurr)), lastmcmpos, GetMCMReadoutPos(fCurrMcmPos)));
}
- if (EvNo(*fPayloadCurr) != evno) {
- if (evno == -1)
+ if (EvNo(*fPayloadCurr) != (evno & 0xfffff)) {
+ if (evno == -1) {
evno = EvNo(*fPayloadCurr);
+ }
else {
MCMError(kEvCntMismatch, "%i <-> %i", evno, EvNo(*fPayloadCurr));
}
fPayloadCurr++;
if ((row > 11) && (fCurrStack == 2)) {
- MCMError(kUnknown, "Data in padrow > 11 for stack 2");
+ MCMError(kInvalidPadRow, "Data in padrow > 11 for stack 2");
}
+ if (fErrorFlags & (kDiscardHC | kDiscardDDL))
+ break;
+
// ----- Reading ADC channels -----
AliDebug(2, DumpAdcMask("ADC mask: ", *fPayloadCurr));
}
}
- // filling the actual timebin data
- int tb2 = 0x3ff & *fPayloadCurr >> 22;
- int tb1 = 0x3ff & *fPayloadCurr >> 12;
- int tb0 = 0x3ff & *fPayloadCurr >> 2;
- if (adcwc != 0 || fCurrNtimebins <= 30)
- fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb0);
- else
- tb0 = -1;
- fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb1);
- fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb2);
+ if ((fErrorFlags & kDiscardMCM) == 0) {
+ // filling the actual timebin data
+ int tb2 = 0x3ff & (*fPayloadCurr >> 22);
+ int tb1 = 0x3ff & (*fPayloadCurr >> 12);
+ int tb0 = 0x3ff & (*fPayloadCurr >> 2);
+ if (adcwc != 0 || fCurrNtimebins <= 30)
+ fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb0);
+ else
+ tb0 = -1;
+ if (currentTimebin < fCurrNtimebins)
+ fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb1);
+ if (currentTimebin < fCurrNtimebins)
+ fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb2);
+ }
adcwc++;
fPayloadCurr++;
MCMError(kPosUnexp, Form("#%i after #%i in readout order", GetMCMReadoutPos(MCM(*fPayloadCurr)), lastmcmpos));
}
- if (EvNo(*fPayloadCurr) != evno) {
- if (evno == -1)
+ if (EvNo(*fPayloadCurr) != (evno & 0xfffff)) {
+ if (evno == -1) {
evno = EvNo(*fPayloadCurr);
+ }
else {
MCMError(kEvCntMismatch, "%i <-> %i", evno, EvNo(*fPayloadCurr));
}
Int_t adccoloff = AdcColOffset(*fPayloadCurr);
Int_t padcoloff = PadColOffset(*fPayloadCurr);
Int_t row = Row(*fPayloadCurr);
-
fPayloadCurr++;
+ if ((row > 11) && (fCurrStack == 2)) {
+ MCMError(kInvalidPadRow, "Data in padrow > 11 for stack 2");
+ }
+
+ if (fErrorFlags & (kDiscardHC | kDiscardDDL))
+ break;
+
// ----- reading marked ADC channels -----
while (channelcount < channelcountExp &&
*(fPayloadCurr) != fgkDataEndmarker) {
}
}
- // filling the actual timebin data
- int tb2 = 0x3ff & *fPayloadCurr >> 22;
- int tb1 = 0x3ff & *fPayloadCurr >> 12;
- int tb0 = 0x3ff & *fPayloadCurr >> 2;
- if (adcwc != 0 || fCurrNtimebins <= 30)
- fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb0);
- else
- tb0 = -1;
- fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb1);
- fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb2);
+ if ((fErrorFlags & kDiscardMCM) == 0) {
+ // filling the actual timebin data
+ int tb2 = 0x3ff & (*fPayloadCurr >> 22);
+ int tb1 = 0x3ff & (*fPayloadCurr >> 12);
+ int tb0 = 0x3ff & (*fPayloadCurr >> 2);
+ if (adcwc != 0 || fCurrNtimebins <= 30)
+ fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb0);
+ else
+ tb0 = -1;
+ if (currentTimebin < fCurrNtimebins)
+ fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb1);
+ if (currentTimebin < fCurrNtimebins)
+ fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb2);
+ }
adcwc++;
fPayloadCurr++;
// read until data endmarkers
while (fPayloadCurr - fPayloadStart < fPayloadSize &&
+ ((fPayloadCurr[0] != fgkStackEndmarker[0]) ||
+ (fPayloadCurr[1] != fgkStackEndmarker[1])) &&
*fPayloadCurr != fgkDataEndmarker)
fPayloadCurr++;
return kFALSE;
}
-TString AliTRDrawStream::DumpRaw(TString title, UInt_t *start, Int_t length, UInt_t endmarker)
+TString AliTRDrawStream::DumpRaw(TString title, const UInt_t *start, Int_t length, UInt_t endmarker)
{
// dump raw data
{
// sort tracklets for referencing from GTU tracks
+ if (!trklArray)
+ return;
+
Int_t nTracklets = trklArray->GetEntriesFast();
Int_t lastHC = -1;
trklA = 0x0;
}
else {
- if ((trklA->GetZbin() < trklB->GetZbin()) ||
- ((trklA->GetZbin() == trklB->GetZbin()) && (trklA->GetYbin() < trklB->GetYbin()))) {
+ if (trklA->GetZbin() <= trklB->GetZbin()) {
trklNext = trklA;
trklIndexA++;
trklA = trklIndexA < nTracklets ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexA]) : 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);
+ sortedTracklets.Add(trklNext);
+
}
+ }
+
+ // updating tracklet indices as in output
+ if (sortedTracklets.GetEntries() != trklIndex) {
+ indices[2*iDet + 0] = trklIndex;
+ indices[2*iDet + 1] = sortedTracklets.GetEntries();
+ } else {
+ indices[2*iDet + 0] = indices[2*iDet + 1] = -1;
+ }
+ }
+}
+
+void AliTRDrawStream::AssignTracklets(AliESDTrdTrack *trdTrack, Int_t *trackletIndex, Int_t refIndex[6])
+{
+ UInt_t mask = trdTrack->GetLayerMask();
+ UInt_t stack = trdTrack->GetStack();
+
+ for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
+ refIndex[iLayer] = -1;
- // updating tracklet indices as in output
- if (sortedTracklets.GetEntries() != trklIndex) {
- indices[2*iDet + 0] = indices[2*iDet + 1] = trklIndex;
+ if (mask & (1 << iLayer)) {
+
+ Int_t det = trdTrack->GetSector()*30 + stack*6 + iLayer;
+ Int_t idx = trdTrack->GetTrackletIndex(iLayer);
+
+ if ((det < 0) || (det > 539)) {
+ AliErrorClass(Form("Invalid detector no. from track: %i", 2*det));
+ continue;
+ }
+ if (trackletIndex[2*det] >= 0) {
+ if ((trackletIndex[2*det] + idx > -1) &&
+ (trackletIndex[2*det] + idx < trackletIndex[2*det+1])) {
+ refIndex[iLayer] = trackletIndex[2*det] + idx;
+ } else {
+ AliErrorClass(Form("Requested tracklet index %i out of range", idx));
+ }
+ } else {
+ AliErrorClass(Form("Non-existing tracklets requested in det %i", det));
}
- else
- indices[2*iDet + 0] = indices[2*iDet + 1] = -1;
}
}
}