#include <AliTPCRawStream.h>
#include <TTree.h>
+//==============================================================================
+//==============================================================================
+// AliEveTPCData
+//==============================================================================
//______________________________________________________________________________
-// AliEveTPCData
//
// A central manager for TPC data of an event. Can read digits (from
// a tree: LoadDigits()) and raw-data (via AliRawReader: LoadRaw()).
fSectors(36), fSectorBlockSize(65536),
fLoadThreshold(0), fLoadPedestal(0), fAutoPedestal(kFALSE)
{
+ // Constructor.
+
AliEveTPCSectorData::InitStatics();
}
AliEveTPCData::~AliEveTPCData()
{
+ // Destructor, deletes all sector-data.
+
DeleteAllSectors();
}
void AliEveTPCData::CreateSector(Int_t sector)
{
- if(fSectors[sector] == 0)
+ // Create sector-data for sector if it does not exist already.
+
+ if (fSectors[sector] == 0)
fSectors[sector] = new AliEveTPCSectorData(sector, fSectorBlockSize);
}
void AliEveTPCData::CreateAllSectors()
{
- for(Int_t s=0; s<36; ++s)
+ // Create all 36 sectors.
+
+ for (Int_t s=0; s<36; ++s)
CreateSector(s);
}
void AliEveTPCData::DropAllSectors()
{
- for(Int_t s=0; s<36; ++s) {
- if(fSectors[s] != 0)
+ // Drop data of all existing sectors.
+
+ for (Int_t s=0; s<36; ++s) {
+ if (fSectors[s] != 0)
fSectors[s]->DropData();
}
}
void AliEveTPCData::DeleteAllSectors()
{
- for(Int_t s=0; s<36; ++s) {
+ // Delete all sector-data.
+
+ for (Int_t s=0; s<36; ++s) {
delete fSectors[s];
fSectors[s] = 0;
}
AliEveTPCSectorData* AliEveTPCData::GetSectorData(Int_t sector, Bool_t spawnSectors)
{
- if(sector < 0 || sector > 35) return 0;
- if(fSectors[sector] == 0 && spawnSectors)
+ // Get sector-data for sector. If spawnSectors is true, the
+ // sector-data is created if it does not exist already.
+
+ if (sector < 0 || sector > 35) return 0;
+ if (fSectors[sector] == 0 && spawnSectors)
CreateSector(sector);
return fSectors[sector];
}
for (Int_t ent=0; ent<numEnt; ent++) {
tree->GetEntry(ent);
AliEveTPCSectorData::GetParam().AdjustSectorRow(digit.GetID(), sector, row);
- if(sector >= 36) {
+ if (sector >= 36) {
sector -= 36;
row += AliEveTPCSectorData::GetInnSeg().GetNRows();
}
secData = GetSectorData(sector, spawnSectors);
- if(secData == 0)
+ if (secData == 0)
continue;
- if(digit.First() == kFALSE)
+ if (digit.First() == kFALSE)
continue;
curPad = -1;
do {
time = digit.CurrentRow();
signal = digit.CurrentDigit();
- if(pad != curPad) {
- if(inFill)
+ if (pad != curPad) {
+ if (inFill)
secData->EndPad(fAutoPedestal, fLoadThreshold);
secData->BeginPad(row, pad, kFALSE);
curPad = pad;
inFill = kTRUE;
}
- if(fAutoPedestal) {
+ if (fAutoPedestal) {
secData->RegisterData(time, signal);
} else {
signal -= fLoadPedestal;
- if(signal >= fLoadThreshold)
+ if (signal >= fLoadThreshold)
secData->RegisterData(time, signal);
}
} while (digit.Next());
- if(inFill) {
+ if (inFill) {
secData->EndPad(fAutoPedestal, fLoadThreshold);
inFill = kFALSE;
}
// via CreateSector() are loaded.
// If spawnSectors is true sectors are created if data for them is encountered.
- static const TEveException eH("AliEveTPCData::LoadRaw ");
+ static const TEveException kEH("AliEveTPCData::LoadRaw ");
Int_t sector = -1, row = -1, pad = -1, rowOffset = 0;
Short_t time, signal;
- Bool_t inFill = kFALSE;
- Short_t lastTime = 9999;
+ Bool_t inFill = kFALSE;
+ Short_t pdrwCnt = 9999; // Count time-bins in padrow; needed to detect more than 1024 time-bins per padrow.
+ Short_t lastTime = 9999; // Last time-bin stored; needed to check for out-of-order time bins.
+ Bool_t pdrwCntWarn = kFALSE;
Bool_t lastTimeWarn = kFALSE;
AliEveTPCSectorData* secData = 0;
while (input.Next()) {
if (input.IsNewSector()) {
- if(inFill) {
+ if (inFill) {
secData->EndPad(fAutoPedestal, threshold);
inFill = kFALSE;
}
sector = input.GetSector();
- if(sector >= 36) {
+ if (sector >= 36) {
sector -= 36;
rowOffset = AliEveTPCSectorData::GetInnSeg().GetNRows();
} else {
continue;
if (input.IsNewPad()) {
- if(inFill) {
+ if (inFill) {
secData->EndPad(fAutoPedestal, threshold);
inFill = kFALSE;
}
row = input.GetRow() + rowOffset;
pad = input.GetPad();
- if(pad >= AliEveTPCSectorData::GetNPadsInRow(row)) {
- if(warn) {
- Warning(eH.Data(), "pad out of range (row=%d, pad=%d, maxpad=%d).",
+ if (pad >= AliEveTPCSectorData::GetNPadsInRow(row)) {
+ if (warn) {
+ Warning(kEH.Data(), "pad out of range (row=%d, pad=%d, maxpad=%d).",
row, pad, AliEveTPCSectorData::GetNPadsInRow(row));
}
continue;
}
- AliEveTPCSectorData::PadRowHack* prh = secData->GetPadRowHack(row, pad);
- if(prh != 0) {
- threshold = prh->fThrExt + Short_t(prh->fThrFac*fLoadThreshold);
- } else {
- threshold = fLoadThreshold;
- }
+ threshold = fLoadThreshold;
secData->BeginPad(row, pad, kTRUE);
inFill = kTRUE;
+ pdrwCnt = 0; pdrwCntWarn = kFALSE;
lastTime = 1024; lastTimeWarn = kFALSE;
}
time = input.GetTime();
signal = input.GetSignal();
- if(time >= lastTime) {
- if(lastTimeWarn == kFALSE) {
- if(warn)
- Warning(eH.Data(), "time out of order (row=%d, pad=%d, time=%d, lastTime=%d).",
+ ++pdrwCnt;
+ if (pdrwCnt > 1024) {
+ if (pdrwCntWarn == kFALSE) {
+ if (warn)
+ Warning(kEH.Data(), "more than 1024 time-bins (row=%d, pad=%d, time=%d).\nFurther warnings of this type will be suppressed for this padrow.",
+ row, pad, time);
+ pdrwCntWarn = kTRUE;
+ }
+ continue;
+ }
+ if (time >= lastTime) {
+ if (lastTimeWarn == kFALSE) {
+ if (warn)
+ Warning(kEH.Data(), "time out of order (row=%d, pad=%d, time=%d, lastTime=%d).\nFurther warnings of this type will be suppressed for this padrow.",
row, pad, time, lastTime);
lastTimeWarn = kTRUE;
}
continue;
}
lastTime = time;
- if(fAutoPedestal) {
+ if (fAutoPedestal) {
secData->RegisterData(time, signal);
} else {
signal -= fLoadPedestal;
- if(signal > threshold)
+ if (signal > threshold)
secData->RegisterData(time, signal);
}
}
- if(inFill) {
+ if (inFill) {
secData->EndPad(fAutoPedestal, threshold);
inFill = kFALSE;
}