#include <TObjString.h>
#include "AliMUONPayloadTracker.h"
#include "AliMUONDspHeader.h"
#include "AliMUONBlockHeader.h"
#include "AliMUONBusStruct.h"
#include "AliMUONDDLTracker.h"
#include "AliMUONLogger.h"
#include "AliLog.h"
ClassImp(AliMUONPayloadTracker)
AliMUONPayloadTracker::AliMUONPayloadTracker()
: TObject(),
fBusPatchId(0),
fDspId(0),
fBlkId(0),
fMaxDDL(20),
fMaxBlock(2),
fMaxDsp(5),
fMaxBus(5),
fDDLTracker(new AliMUONDDLTracker()),
fBusStruct(new AliMUONBusStruct()),
fBlockHeader(new AliMUONBlockHeader()),
fDspHeader(new AliMUONDspHeader()),
fLog(new AliMUONLogger(1000)),
fParityErrors(0),
fGlitchErrors(0),
fPaddingErrors(0),
fWarnings(kTRUE)
{
}
AliMUONPayloadTracker::~AliMUONPayloadTracker()
{
delete fDDLTracker;
delete fBusStruct;
delete fBlockHeader;
delete fDspHeader;
delete fLog;
}
Bool_t AliMUONPayloadTracker::Decode(UInt_t* buffer, Int_t totalDDLSize)
{
static Int_t kBlockHeaderSize = fBlockHeader->GetHeaderLength();
static Int_t kDspHeaderSize = fDspHeader->GetHeaderLength();
static Int_t kBusPatchHeaderSize = fBusStruct->GetHeaderLength();
Int_t totalBlockSize;
Int_t totalDspSize;
Int_t totalBusPatchSize;
Int_t dataSize;
Int_t bufSize;
Int_t indexBlk;
Int_t indexDsp;
Int_t indexBusPatch;
Int_t index = 0;
Int_t iBlock = 0;
while (buffer[index] == fBlockHeader->GetDefaultDataKey()) {
if (iBlock > fMaxBlock) break;
memcpy(fBlockHeader->GetHeader(),&buffer[index], (kBlockHeaderSize)*4);
totalBlockSize = fBlockHeader->GetTotalLength();
indexBlk = index;
index += kBlockHeaderSize;
fDDLTracker->AddBlkHeader(*fBlockHeader);
Int_t iDsp = 0;
while (buffer[index] == fDspHeader->GetDefaultDataKey()) {
if (iDsp > fMaxDsp) break;
memcpy(fDspHeader->GetHeader(),&buffer[index], kDspHeaderSize*4);
totalDspSize = fDspHeader->GetTotalLength();
if (fDspHeader->GetErrorWord()) {
if ( fDspHeader->GetErrorWord() == (0x000000B1 | fBlockHeader->GetDspId())
|| fDspHeader->GetErrorWord() == (0x00000091 | fBlockHeader->GetDspId()) ){
Char_t* msg = Form("Glitch error detected in DSP %d, skipping event ", fBlockHeader->GetDspId());
if (fWarnings) AliWarning(msg);
AddErrorMessage(msg);
fGlitchErrors++;
return kFALSE ;
}
}
indexDsp = index;
index += kDspHeaderSize;
fDDLTracker->AddDspHeader(*fDspHeader, iBlock);
Int_t iBusPatch = 0;
while (buffer[index] == fBusStruct->GetDefaultDataKey()) {
if (iBusPatch > fMaxBus) break;
memcpy(fBusStruct->GetHeader(), &buffer[index], kBusPatchHeaderSize*4);
totalBusPatchSize = fBusStruct->GetTotalLength();
indexBusPatch = index;
if(totalBusPatchSize > kBusPatchHeaderSize) {
index += kBusPatchHeaderSize;
dataSize = fBusStruct->GetLength();
bufSize = fBusStruct->GetBufSize();
if(dataSize > 0) {
if (dataSize > bufSize)
fBusStruct->SetAlloc(dataSize);
memcpy(fBusStruct->GetData(), &buffer[index], dataSize*4);
fBusStruct->SetBlockId(iBlock);
fBusStruct->SetDspId(iDsp);
if(!CheckDataParity()) {
fParityErrors++;
return kFALSE;
}
fDDLTracker->AddBusPatch(*fBusStruct, iBlock, iDsp);
}
}
index = indexBusPatch + totalBusPatchSize;
if (index >= totalDDLSize) {
index = totalDDLSize - 1;
break;
}
iBusPatch++;
}
if (fDspHeader->GetPaddingWord() == 1) {
if (buffer[index++] != fDspHeader->GetDefaultPaddingWord()) {
Char_t *msg = Form("Padding word error for iBlock %d, iDsp %d, iBus %d\n",
iBlock, iDsp, iBusPatch);
if (fWarnings) AliWarning(msg);
AddErrorMessage(msg);
fPaddingErrors++;
}
}
index = indexDsp + totalDspSize;
if (index >= totalDDLSize) {
index = totalDDLSize - 1;
break;
}
iDsp++;
}
index = indexBlk + totalBlockSize;
if (index >= totalDDLSize) {
index = totalDDLSize - 1;
break;
}
iBlock++;
}
if (buffer[index++] != fBlockHeader->GetDdlDataKey() ||
buffer[index++] != fBlockHeader->GetDdlDataKey()) {
Char_t *msg = Form("Bad end of DDL data key\n");
if (fWarnings) AliWarning(msg);
AddErrorMessage(msg);
}
return kTRUE;
}
void AliMUONPayloadTracker::ResetDDL()
{
fDDLTracker->GetBlkHeaderArray()->Delete();
fGlitchErrors = 0;
fPaddingErrors = 0;
fParityErrors = 0;
}
void AliMUONPayloadTracker::SetMaxBlock(Int_t blk)
{
if (blk > 2) blk = 2;
fMaxBlock = blk;
}
Bool_t AliMUONPayloadTracker::CheckDataParity()
{
Int_t parity;
UInt_t data;
Int_t dataSize = fBusStruct->GetLength();
for (int idata = 0; idata < dataSize; idata++) {
data = fBusStruct->GetData(idata);
parity = data & 0x1;
for (Int_t i = 1; i <= 30; i++)
parity ^= ((data >> i) & 0x1);
if (parity != fBusStruct->GetParity(idata)) {
Char_t* msg = Form("Parity error in word %d for manuId %d and channel %d in buspatch %d\n",
idata, fBusStruct->GetManuId(idata), fBusStruct->GetChannelId(idata),
fBusStruct->GetBusPatchId());
if (fWarnings) AliWarning(msg);
AddErrorMessage(msg);
fParityErrors++;
return kFALSE;
}
}
return kTRUE;
}
void AliMUONPayloadTracker::AddErrorMessage(const Char_t* msg)
{
TString tmp(msg);
Int_t pos = tmp.First("\n");
tmp[pos] = 0;
fLog->Log(tmp.Data());
}
AliMUONPayloadTracker.cxx:1 AliMUONPayloadTracker.cxx:2 AliMUONPayloadTracker.cxx:3 AliMUONPayloadTracker.cxx:4 AliMUONPayloadTracker.cxx:5 AliMUONPayloadTracker.cxx:6 AliMUONPayloadTracker.cxx:7 AliMUONPayloadTracker.cxx:8 AliMUONPayloadTracker.cxx:9 AliMUONPayloadTracker.cxx:10 AliMUONPayloadTracker.cxx:11 AliMUONPayloadTracker.cxx:12 AliMUONPayloadTracker.cxx:13 AliMUONPayloadTracker.cxx:14 AliMUONPayloadTracker.cxx:15 AliMUONPayloadTracker.cxx:16 AliMUONPayloadTracker.cxx:17 AliMUONPayloadTracker.cxx:18 AliMUONPayloadTracker.cxx:19 AliMUONPayloadTracker.cxx:20 AliMUONPayloadTracker.cxx:21 AliMUONPayloadTracker.cxx:22 AliMUONPayloadTracker.cxx:23 AliMUONPayloadTracker.cxx:24 AliMUONPayloadTracker.cxx:25 AliMUONPayloadTracker.cxx:26 AliMUONPayloadTracker.cxx:27 AliMUONPayloadTracker.cxx:28 AliMUONPayloadTracker.cxx:29 AliMUONPayloadTracker.cxx:30 AliMUONPayloadTracker.cxx:31 AliMUONPayloadTracker.cxx:32 AliMUONPayloadTracker.cxx:33 AliMUONPayloadTracker.cxx:34 AliMUONPayloadTracker.cxx:35 AliMUONPayloadTracker.cxx:36 AliMUONPayloadTracker.cxx:37 AliMUONPayloadTracker.cxx:38 AliMUONPayloadTracker.cxx:39 AliMUONPayloadTracker.cxx:40 AliMUONPayloadTracker.cxx:41 AliMUONPayloadTracker.cxx:42 AliMUONPayloadTracker.cxx:43 AliMUONPayloadTracker.cxx:44 AliMUONPayloadTracker.cxx:45 AliMUONPayloadTracker.cxx:46 AliMUONPayloadTracker.cxx:47 AliMUONPayloadTracker.cxx:48 AliMUONPayloadTracker.cxx:49 AliMUONPayloadTracker.cxx:50 AliMUONPayloadTracker.cxx:51 AliMUONPayloadTracker.cxx:52 AliMUONPayloadTracker.cxx:53 AliMUONPayloadTracker.cxx:54 AliMUONPayloadTracker.cxx:55 AliMUONPayloadTracker.cxx:56 AliMUONPayloadTracker.cxx:57 AliMUONPayloadTracker.cxx:58 AliMUONPayloadTracker.cxx:59 AliMUONPayloadTracker.cxx:60 AliMUONPayloadTracker.cxx:61 AliMUONPayloadTracker.cxx:62 AliMUONPayloadTracker.cxx:63 AliMUONPayloadTracker.cxx:64 AliMUONPayloadTracker.cxx:65 AliMUONPayloadTracker.cxx:66 AliMUONPayloadTracker.cxx:67 AliMUONPayloadTracker.cxx:68 AliMUONPayloadTracker.cxx:69 AliMUONPayloadTracker.cxx:70 AliMUONPayloadTracker.cxx:71 AliMUONPayloadTracker.cxx:72 AliMUONPayloadTracker.cxx:73 AliMUONPayloadTracker.cxx:74 AliMUONPayloadTracker.cxx:75 AliMUONPayloadTracker.cxx:76 AliMUONPayloadTracker.cxx:77 AliMUONPayloadTracker.cxx:78 AliMUONPayloadTracker.cxx:79 AliMUONPayloadTracker.cxx:80 AliMUONPayloadTracker.cxx:81 AliMUONPayloadTracker.cxx:82 AliMUONPayloadTracker.cxx:83 AliMUONPayloadTracker.cxx:84 AliMUONPayloadTracker.cxx:85 AliMUONPayloadTracker.cxx:86 AliMUONPayloadTracker.cxx:87 AliMUONPayloadTracker.cxx:88 AliMUONPayloadTracker.cxx:89 AliMUONPayloadTracker.cxx:90 AliMUONPayloadTracker.cxx:91 AliMUONPayloadTracker.cxx:92 AliMUONPayloadTracker.cxx:93 AliMUONPayloadTracker.cxx:94 AliMUONPayloadTracker.cxx:95 AliMUONPayloadTracker.cxx:96 AliMUONPayloadTracker.cxx:97 AliMUONPayloadTracker.cxx:98 AliMUONPayloadTracker.cxx:99 AliMUONPayloadTracker.cxx:100 AliMUONPayloadTracker.cxx:101 AliMUONPayloadTracker.cxx:102 AliMUONPayloadTracker.cxx:103 AliMUONPayloadTracker.cxx:104 AliMUONPayloadTracker.cxx:105 AliMUONPayloadTracker.cxx:106 AliMUONPayloadTracker.cxx:107 AliMUONPayloadTracker.cxx:108 AliMUONPayloadTracker.cxx:109 AliMUONPayloadTracker.cxx:110 AliMUONPayloadTracker.cxx:111 AliMUONPayloadTracker.cxx:112 AliMUONPayloadTracker.cxx:113 AliMUONPayloadTracker.cxx:114 AliMUONPayloadTracker.cxx:115 AliMUONPayloadTracker.cxx:116 AliMUONPayloadTracker.cxx:117 AliMUONPayloadTracker.cxx:118 AliMUONPayloadTracker.cxx:119 AliMUONPayloadTracker.cxx:120 AliMUONPayloadTracker.cxx:121 AliMUONPayloadTracker.cxx:122 AliMUONPayloadTracker.cxx:123 AliMUONPayloadTracker.cxx:124 AliMUONPayloadTracker.cxx:125 AliMUONPayloadTracker.cxx:126 AliMUONPayloadTracker.cxx:127 AliMUONPayloadTracker.cxx:128 AliMUONPayloadTracker.cxx:129 AliMUONPayloadTracker.cxx:130 AliMUONPayloadTracker.cxx:131 AliMUONPayloadTracker.cxx:132 AliMUONPayloadTracker.cxx:133 AliMUONPayloadTracker.cxx:134 AliMUONPayloadTracker.cxx:135 AliMUONPayloadTracker.cxx:136 AliMUONPayloadTracker.cxx:137 AliMUONPayloadTracker.cxx:138 AliMUONPayloadTracker.cxx:139 AliMUONPayloadTracker.cxx:140 AliMUONPayloadTracker.cxx:141 AliMUONPayloadTracker.cxx:142 AliMUONPayloadTracker.cxx:143 AliMUONPayloadTracker.cxx:144 AliMUONPayloadTracker.cxx:145 AliMUONPayloadTracker.cxx:146 AliMUONPayloadTracker.cxx:147 AliMUONPayloadTracker.cxx:148 AliMUONPayloadTracker.cxx:149 AliMUONPayloadTracker.cxx:150 AliMUONPayloadTracker.cxx:151 AliMUONPayloadTracker.cxx:152 AliMUONPayloadTracker.cxx:153 AliMUONPayloadTracker.cxx:154 AliMUONPayloadTracker.cxx:155 AliMUONPayloadTracker.cxx:156 AliMUONPayloadTracker.cxx:157 AliMUONPayloadTracker.cxx:158 AliMUONPayloadTracker.cxx:159 AliMUONPayloadTracker.cxx:160 AliMUONPayloadTracker.cxx:161 AliMUONPayloadTracker.cxx:162 AliMUONPayloadTracker.cxx:163 AliMUONPayloadTracker.cxx:164 AliMUONPayloadTracker.cxx:165 AliMUONPayloadTracker.cxx:166 AliMUONPayloadTracker.cxx:167 AliMUONPayloadTracker.cxx:168 AliMUONPayloadTracker.cxx:169 AliMUONPayloadTracker.cxx:170 AliMUONPayloadTracker.cxx:171 AliMUONPayloadTracker.cxx:172 AliMUONPayloadTracker.cxx:173 AliMUONPayloadTracker.cxx:174 AliMUONPayloadTracker.cxx:175 AliMUONPayloadTracker.cxx:176 AliMUONPayloadTracker.cxx:177 AliMUONPayloadTracker.cxx:178 AliMUONPayloadTracker.cxx:179 AliMUONPayloadTracker.cxx:180 AliMUONPayloadTracker.cxx:181 AliMUONPayloadTracker.cxx:182 AliMUONPayloadTracker.cxx:183 AliMUONPayloadTracker.cxx:184 AliMUONPayloadTracker.cxx:185 AliMUONPayloadTracker.cxx:186 AliMUONPayloadTracker.cxx:187 AliMUONPayloadTracker.cxx:188 AliMUONPayloadTracker.cxx:189 AliMUONPayloadTracker.cxx:190 AliMUONPayloadTracker.cxx:191 AliMUONPayloadTracker.cxx:192 AliMUONPayloadTracker.cxx:193 AliMUONPayloadTracker.cxx:194 AliMUONPayloadTracker.cxx:195 AliMUONPayloadTracker.cxx:196 AliMUONPayloadTracker.cxx:197 AliMUONPayloadTracker.cxx:198 AliMUONPayloadTracker.cxx:199 AliMUONPayloadTracker.cxx:200 AliMUONPayloadTracker.cxx:201 AliMUONPayloadTracker.cxx:202 AliMUONPayloadTracker.cxx:203 AliMUONPayloadTracker.cxx:204 AliMUONPayloadTracker.cxx:205 AliMUONPayloadTracker.cxx:206 AliMUONPayloadTracker.cxx:207 AliMUONPayloadTracker.cxx:208 AliMUONPayloadTracker.cxx:209 AliMUONPayloadTracker.cxx:210 AliMUONPayloadTracker.cxx:211 AliMUONPayloadTracker.cxx:212 AliMUONPayloadTracker.cxx:213 AliMUONPayloadTracker.cxx:214 AliMUONPayloadTracker.cxx:215 AliMUONPayloadTracker.cxx:216 AliMUONPayloadTracker.cxx:217 AliMUONPayloadTracker.cxx:218 AliMUONPayloadTracker.cxx:219 AliMUONPayloadTracker.cxx:220 AliMUONPayloadTracker.cxx:221 AliMUONPayloadTracker.cxx:222 AliMUONPayloadTracker.cxx:223 AliMUONPayloadTracker.cxx:224 AliMUONPayloadTracker.cxx:225 AliMUONPayloadTracker.cxx:226 AliMUONPayloadTracker.cxx:227 AliMUONPayloadTracker.cxx:228 AliMUONPayloadTracker.cxx:229 AliMUONPayloadTracker.cxx:230 AliMUONPayloadTracker.cxx:231 AliMUONPayloadTracker.cxx:232 AliMUONPayloadTracker.cxx:233 AliMUONPayloadTracker.cxx:234 AliMUONPayloadTracker.cxx:235 AliMUONPayloadTracker.cxx:236 AliMUONPayloadTracker.cxx:237 AliMUONPayloadTracker.cxx:238 AliMUONPayloadTracker.cxx:239 AliMUONPayloadTracker.cxx:240 AliMUONPayloadTracker.cxx:241 AliMUONPayloadTracker.cxx:242 AliMUONPayloadTracker.cxx:243 AliMUONPayloadTracker.cxx:244 AliMUONPayloadTracker.cxx:245 AliMUONPayloadTracker.cxx:246 AliMUONPayloadTracker.cxx:247 AliMUONPayloadTracker.cxx:248 AliMUONPayloadTracker.cxx:249 AliMUONPayloadTracker.cxx:250 AliMUONPayloadTracker.cxx:251 AliMUONPayloadTracker.cxx:252 AliMUONPayloadTracker.cxx:253 AliMUONPayloadTracker.cxx:254 AliMUONPayloadTracker.cxx:255 AliMUONPayloadTracker.cxx:256 AliMUONPayloadTracker.cxx:257 AliMUONPayloadTracker.cxx:258 AliMUONPayloadTracker.cxx:259 AliMUONPayloadTracker.cxx:260 AliMUONPayloadTracker.cxx:261 AliMUONPayloadTracker.cxx:262 AliMUONPayloadTracker.cxx:263 AliMUONPayloadTracker.cxx:264 AliMUONPayloadTracker.cxx:265 AliMUONPayloadTracker.cxx:266 AliMUONPayloadTracker.cxx:267 AliMUONPayloadTracker.cxx:268 AliMUONPayloadTracker.cxx:269 AliMUONPayloadTracker.cxx:270 AliMUONPayloadTracker.cxx:271 AliMUONPayloadTracker.cxx:272 AliMUONPayloadTracker.cxx:273 AliMUONPayloadTracker.cxx:274 AliMUONPayloadTracker.cxx:275 AliMUONPayloadTracker.cxx:276 AliMUONPayloadTracker.cxx:277 AliMUONPayloadTracker.cxx:278 AliMUONPayloadTracker.cxx:279 AliMUONPayloadTracker.cxx:280 AliMUONPayloadTracker.cxx:281 AliMUONPayloadTracker.cxx:282 AliMUONPayloadTracker.cxx:283 AliMUONPayloadTracker.cxx:284 AliMUONPayloadTracker.cxx:285 AliMUONPayloadTracker.cxx:286 AliMUONPayloadTracker.cxx:287 AliMUONPayloadTracker.cxx:288 AliMUONPayloadTracker.cxx:289 AliMUONPayloadTracker.cxx:290 AliMUONPayloadTracker.cxx:291 AliMUONPayloadTracker.cxx:292 AliMUONPayloadTracker.cxx:293 AliMUONPayloadTracker.cxx:294 AliMUONPayloadTracker.cxx:295 AliMUONPayloadTracker.cxx:296 AliMUONPayloadTracker.cxx:297 AliMUONPayloadTracker.cxx:298 AliMUONPayloadTracker.cxx:299 AliMUONPayloadTracker.cxx:300 AliMUONPayloadTracker.cxx:301 AliMUONPayloadTracker.cxx:302 AliMUONPayloadTracker.cxx:303 AliMUONPayloadTracker.cxx:304 AliMUONPayloadTracker.cxx:305 AliMUONPayloadTracker.cxx:306 AliMUONPayloadTracker.cxx:307 AliMUONPayloadTracker.cxx:308 AliMUONPayloadTracker.cxx:309 AliMUONPayloadTracker.cxx:310 AliMUONPayloadTracker.cxx:311 AliMUONPayloadTracker.cxx:312 AliMUONPayloadTracker.cxx:313 AliMUONPayloadTracker.cxx:314 AliMUONPayloadTracker.cxx:315 AliMUONPayloadTracker.cxx:316 AliMUONPayloadTracker.cxx:317 AliMUONPayloadTracker.cxx:318 AliMUONPayloadTracker.cxx:319 AliMUONPayloadTracker.cxx:320 AliMUONPayloadTracker.cxx:321 AliMUONPayloadTracker.cxx:322 AliMUONPayloadTracker.cxx:323