]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONRawStreamTriggerHP.cxx
Update pr task: drathee
[u/mrichter/AliRoot.git] / MUON / AliMUONRawStreamTriggerHP.cxx
CommitLineData
1788245f 1/**************************************************************************
2 * This file is property of and copyright by the ALICE HLT Project *
3 * All rights reserved. *
4 * *
5 * Primary Authors: *
6 * Artur Szostak <artursz@iafrica.com> *
7 * *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
16
17/* $Id$ */
18
19/// \class AliMUONRawStreamTriggerHP
20///
21/// Implementation of a streamer interface to the high performance trigger decoder.
22/// This is the raw stream class which interfaces between the high performance
23/// core decoder for MUON trigger chambers and the AliRawReader class.
24/// To gain the most out of the decoder, the Next() method should be used,
25/// for example:
26/// \code
27/// AliMUONRawStreamTriggerHP* rawStream; // assume initialised
28/// const AliMUONRawStreamTriggerHP::AliLocalStruct* localStruct;
29/// while ((localStruct = rawStream->Next()) != NULL)
30/// {
31/// // Do something with localStruct here.
32/// }
33/// \endcode
34///
35/// This decoder tries to implement as similar an interface as possible to
36/// AliMUONRawStreamTrigger where possible. However certain constructs which
37/// would slow us down too much are avoided.
38///
39/// \author Artur Szostak <artursz@iafrica.com>
40
41#include "AliMUONRawStreamTriggerHP.h"
481d8064 42#include "AliMUONDarcHeader.h"
43#include "AliMUONRegHeader.h"
44#include "AliMUONLocalStruct.h"
45#include "AliMUONDDLTrigger.h"
1788245f 46#include "AliRawReader.h"
47#include "AliLog.h"
48#include <cassert>
49#include <iostream>
1788245f 50using std::cout;
51using std::endl;
52using std::hex;
53using std::dec;
54
55/// \cond CLASSIMP
56ClassImp(AliMUONRawStreamTriggerHP)
57/// \endcond
58
59const Int_t AliMUONRawStreamTriggerHP::fgkMaxDDL = 2;
b385ced2 60bool AliMUONRawStreamTriggerHP::AliLocalStruct::fgOverrideId = true;
1788245f 61
50a1db76 62const AliMUONRegionalHeaderStruct
63AliMUONRawStreamTriggerHP::AliDecoderEventHandler::fgkEmptyHeader = {
64 AliMUONTriggerDDLDecoder<AliDecoderEventHandler>::RegionalErrorWord(),
65 0,
66 {0, 0},
67 0
68};
69
1788245f 70
71AliMUONRawStreamTriggerHP::AliMUONRawStreamTriggerHP() :
72 AliMUONVRawStreamTrigger(),
73 fDecoder(),
74 fDDL(0),
75 fBufferSize(8192),
76 fBuffer(new UChar_t[8192]),
586dda01 77 fkCurrentLocalStruct(NULL),
1788245f 78 fHadError(kFALSE),
481d8064 79 fDone(kFALSE),
74585128 80 fDDLObject(NULL),
81 fTotalNumberOfDarcEoWErrors(0),
82 fTotalNumberOfGlobalEoWErrors(0),
83 fTotalNumberOfRegEoWErrors(0),
84 fTotalNumberOfLocalEoWErrors(0)
1788245f 85{
86 ///
87 /// Default constructor.
88 ///
89
90 fDecoder.ExitOnError(false);
91
92 fDecoder.GetHandler().SetMaxStructs(
93 fDecoder.MaxRegionals(),
94 fDecoder.MaxLocals()
95 );
96
97 fDecoder.GetHandler().SetRawStream(this);
98}
99
100
101AliMUONRawStreamTriggerHP::AliMUONRawStreamTriggerHP(AliRawReader* rawReader) :
102 AliMUONVRawStreamTrigger(rawReader),
103 fDecoder(),
104 fDDL(0),
105 fBufferSize(8192),
106 fBuffer(new UChar_t[8192]),
586dda01 107 fkCurrentLocalStruct(NULL),
1788245f 108 fHadError(kFALSE),
481d8064 109 fDone(kFALSE),
74585128 110 fDDLObject(NULL),
111 fTotalNumberOfDarcEoWErrors(0),
112 fTotalNumberOfGlobalEoWErrors(0),
113 fTotalNumberOfRegEoWErrors(0),
114 fTotalNumberOfLocalEoWErrors(0)
1788245f 115{
116 ///
117 /// Constructor with AliRawReader as argument.
118 ///
119
120 fDecoder.ExitOnError(false);
121
122 fDecoder.GetHandler().SetMaxStructs(
123 fDecoder.MaxRegionals(),
124 fDecoder.MaxLocals()
125 );
126
127 fDecoder.GetHandler().SetRawStream(this);
128}
129
130
131AliMUONRawStreamTriggerHP::~AliMUONRawStreamTriggerHP()
132{
133 ///
134 /// Default destructor which cleans up the memory allocated.
135 ///
136
137 if (fBuffer != NULL)
138 {
139 delete [] fBuffer;
140 }
481d8064 141 if (fDDLObject != NULL)
142 {
143 delete fDDLObject;
144 }
1788245f 145}
146
147
148void AliMUONRawStreamTriggerHP::First()
149{
150 /// Initialise or reset the iterator.
151 /// The first DDL will be found and decoded.
152
153 assert( GetReader() != NULL );
154
155 fDDL = 0;
156 fDone = kFALSE;
157 NextDDL();
74585128 158 fTotalNumberOfDarcEoWErrors = 0;
159 fTotalNumberOfGlobalEoWErrors = 0;
160 fTotalNumberOfRegEoWErrors = 0;
161 fTotalNumberOfLocalEoWErrors = 0;
1788245f 162}
163
164
165Bool_t AliMUONRawStreamTriggerHP::NextDDL()
166{
167 /// Read in the next trigger DDL and decode the payload with the
168 /// high performance decoder.
169 /// \return kTRUE if the next DDL was successfully read and kFALSE
170 /// otherwise.
171
172 assert( GetReader() != NULL );
173
481d8064 174 // The temporary object if generated in GetDDLTracker, is now stale,
175 // so delete it.
176 if (fDDLObject != NULL)
177 {
178 delete fDDLObject;
179 fDDLObject = NULL;
180 }
181
586dda01 182 fkCurrentLocalStruct = NULL;
1788245f 183
184 while (fDDL < GetMaxDDL())
185 {
186 GetReader()->Reset();
187 GetReader()->Select("MUONTRG", fDDL, fDDL); // Select the DDL file to be read.
188 if (GetReader()->ReadHeader()) break;
189 AliDebug(3, Form("Skipping DDL %d which does not seem to be there", fDDL+1));
190 fDDL++;
191 }
192
193 // If we reach the end of the DDL list for this event then reset the
194 // DDL counter, mark the iteration as done and exit.
195 if (fDDL >= GetMaxDDL())
196 {
197 fDDL = 0;
198 fDone = kTRUE;
199 return kFALSE;
200 }
201 else
202 {
203 fDone = kFALSE;
204 }
205
206 AliDebug(3, Form("DDL Number %d\n", fDDL));
207
208 Int_t dataSize = GetReader()->GetDataSize(); // in bytes
209 // Check if we have enough buffer space already in fBuffer. If we do then
210 // just continue reading otherwise we need to resize the buffer.
211 if (fBufferSize < dataSize)
212 {
213 if (fBuffer != NULL)
214 {
215 delete [] fBuffer;
216 fBuffer = NULL;
217 fBufferSize = 0;
218 }
219 try
220 {
221 fBuffer = new UChar_t[dataSize];
222 fBufferSize = dataSize;
223 }
224 catch (const std::bad_alloc&)
225 {
226 AliError("Could not allocate more buffer space. Cannot decode DDL.");
227 return kFALSE;
228 }
229 }
230
231 if (not GetReader()->ReadNext(fBuffer, dataSize))
232 {
233 return kFALSE;
234 }
235
236#ifndef R__BYTESWAP
237 Swap(reinterpret_cast<UInt_t*>(fBuffer), dataSize / sizeof(UInt_t)); // Swap needed for mac power pc.
238#endif
239
a5f5f349 240 fDDL++; // Remember to increment index to next DDL before the calls to
241 // fDecoder.Decode since the callback methods of the decoder might
242 // use AliMUONRawStreamTriggerHP::GetDDL()
243
a53aa6cf 244 // Check if this is a scalar event.
e9463054 245 AliRawReader * reader = GetReader();
246 if (!reader) return kFALSE;
247
248 const AliRawDataHeader * cdh = reader->GetDataHeader();
249 const AliRawDataHeaderV3 * cdh3 = reader->GetDataHeaderV3();
250
251 if (!cdh && !cdh3) return kFALSE;
252
253 bool scalerEvent = ((cdh ? cdh->GetL1TriggerMessage() : cdh3->GetL1TriggerMessage()) & 0x1) == 0x1;
a53aa6cf 254
1788245f 255 bool result = false;
256 try
257 {
258 // Since we might allocate memory inside OnNewBuffer in the event
259 // handler we need to trap any memory allocation exception to be robust.
a53aa6cf 260 result = fDecoder.Decode(fBuffer, dataSize, scalerEvent);
1788245f 261 fHadError = (result == true ? kFALSE : kTRUE);
74585128 262 fTotalNumberOfDarcEoWErrors += fDecoder.GetHandler().GetDarcEoWErrors();
263 fTotalNumberOfGlobalEoWErrors += fDecoder.GetHandler().GetGlobalEoWErrors();
264 fTotalNumberOfRegEoWErrors += fDecoder.GetHandler().GetRegEoWErrors();
265 fTotalNumberOfLocalEoWErrors += fDecoder.GetHandler().GetLocalEoWErrors();
1788245f 266 }
267 catch (const std::bad_alloc&)
268 {
269 AliError("Could not allocate more buffer space. Cannot decode DDL.");
270 return kFALSE;
271 }
272
273 // Update the current local structure pointer.
586dda01 274 fkCurrentLocalStruct = fDecoder.GetHandler().FirstLocalStruct();
1788245f 275
1788245f 276 return kTRUE;
277}
278
279
280Bool_t AliMUONRawStreamTriggerHP::IsDone() const
281{
282 /// Indicates whether the iteration is finished or not.
283 /// \return kTRUE if we already read all the digits and kFALSE if not.
284
285 return fDone;
286}
287
288
289Bool_t AliMUONRawStreamTriggerHP::Next(
290 UChar_t& id, UChar_t& dec, Bool_t& trigY,
291 UChar_t& yPos, UChar_t& sXDev, UChar_t& xDev,
292 UChar_t& xPos, Bool_t& triggerY, Bool_t& triggerX,
293 TArrayS& xPattern, TArrayS& yPattern
294 )
295{
586dda01 296 /// Advance one step in the iteration. Returns kFALSE if finished.
297 /// If kTRUE is returned then the output parameters are filled with
298 /// the values found in the next local trigger circuit structure.
299
1788245f 300 const AliLocalStruct* localStruct = Next();
301 if (localStruct == NULL) return kFALSE;
302
303 id = localStruct->GetId();
304 dec = localStruct->GetDec();
305 trigY = localStruct->GetTrigY();
306 yPos = localStruct->GetYPos();
307 sXDev = localStruct->GetSXDev();
308 xDev = localStruct->GetXDev();
309 xPos = localStruct->GetXPos();
310
311 triggerX = localStruct->GetTriggerX();
312 triggerY = localStruct->GetTriggerY();
313
314 localStruct->GetXPattern(xPattern);
315 localStruct->GetYPattern(yPattern);
316
317 return kTRUE;
318}
319
320
481d8064 321AliMUONDDLTrigger* AliMUONRawStreamTriggerHP::GetDDLTrigger() const
322{
323 /// Construct and return a pointer to the DDL payload object.
324 /// \return Pointer to internally constructed AliMUONDDLTrigger object.
325 /// The object is owned by this class and should not be deleted
326 /// by the caller.
327 ///
328 /// \note This method should not be used just to gain access to the DDL
329 /// payload, unless there is a good reason to have the AliMUONDDLTrigger
330 /// object. For example, if you want to modify the data and then save it
331 /// to another DDL stream. Otherwise it can be an order of magnitude
332 /// faster to access the DDL headers and data with the GetHeaders,
333 /// GetRegionalHeader and GetLocalStruct methods for example.
334 /// Refer to the MUONRawStreamTrigger.C macro to see how to use the fast
335 /// decoder interface optimally.
336
337 if (fDDLObject != NULL) return fDDLObject;
338
339 fDDLObject = new AliMUONDDLTrigger;
340
341 // Copy over all DARC, global headers and scalars.
342 AliMUONDarcHeader* darcHeader = fDDLObject->GetDarcHeader();
343 const AliHeader* hdr = GetHeaders();
344 UInt_t word = hdr->GetDarcHeader();
345 memcpy(darcHeader->GetHeader(), &word, sizeof(word));
346 if (hdr->GetDarcScalars() != NULL)
347 {
348 memcpy(darcHeader->GetDarcScalers(), hdr->GetDarcScalars(), sizeof(AliMUONDarcScalarsStruct));
349 }
350 memcpy(darcHeader->GetGlobalInput(), hdr->GetGlobalHeader(), sizeof(AliMUONGlobalHeaderStruct));
351 if (hdr->GetGlobalScalars() != NULL)
352 {
353 memcpy(darcHeader->GetGlobalScalers(), hdr->GetGlobalScalars(), sizeof(AliMUONGlobalScalarsStruct));
354 }
355
356 for (Int_t iReg = 0; iReg < (Int_t)GetRegionalHeaderCount(); iReg++)
357 {
358 AliMUONRegHeader regHeader;
359 AliMUONLocalStruct localStruct;
360
361 const AliRegionalHeader* rh = GetRegionalHeader(iReg);
362 // Copy local structure and scalars and add everything into DDL object.
363 memcpy(regHeader.GetHeader(), rh->GetHeader(), sizeof(AliMUONRegionalHeaderStruct));
364 if (rh->GetScalars() != NULL)
365 {
366 memcpy(regHeader.GetScalers(), rh->GetScalars(), sizeof(AliMUONRegionalScalarsStruct));
367 }
368 fDDLObject->AddRegHeader(regHeader);
369
a53aa6cf 370 const AliLocalStruct* lstruct = rh->GetFirstLocalStruct();
371 while (lstruct != NULL)
481d8064 372 {
373 // Copy local structure and scalars and add everything into DDL object.
a53aa6cf 374 memcpy(localStruct.GetData(), lstruct->GetData(), sizeof(AliMUONLocalInfoStruct));
375 if (lstruct->GetScalars() != NULL)
481d8064 376 {
a53aa6cf 377 memcpy(localStruct.GetScalers(), lstruct->GetScalars(), sizeof(AliMUONLocalScalarsStruct));
481d8064 378 }
b385ced2 379 if (AliMUONRawStreamTriggerHP::AliLocalStruct::GetOverrideIdFlag() == true)
380 {
381 // Since the override ID flag is set, we need to replace the
382 // ID in the structure with the calculated one returned by GetId().
383 AliMUONLocalInfoStruct* strptr = reinterpret_cast<AliMUONLocalInfoStruct*>( localStruct.GetData() );
db7e03ac 384 UInt_t triggerBits = strptr->fTriggerBits;
f6e91869 385 triggerBits &= ~(0xF << 19);
386 strptr->fTriggerBits = triggerBits | ((lstruct->GetId() & 0xF) << 19);
b385ced2 387 }
481d8064 388 fDDLObject->AddLocStruct(localStruct, iReg);
a53aa6cf 389 lstruct = lstruct->Next();
481d8064 390 }
391 }
392
393 return fDDLObject;
394}
395
396
50a1db76 397void AliMUONRawStreamTriggerHP::SetMaxReg(Int_t reg)
1788245f 398{
399 /// Set the maximum allowed number of regional cards in the DDL.
400
401 fDecoder.MaxRegionals( (UInt_t) reg );
402
403 fDecoder.GetHandler().SetMaxStructs(
404 fDecoder.MaxRegionals(),
405 fDecoder.MaxLocals()
406 );
407}
408
409
410void AliMUONRawStreamTriggerHP::SetMaxLoc(Int_t loc)
411{
412 /// Sets the maximum number of local cards in the DDL.
413
414 fDecoder.MaxLocals( (UInt_t) loc );
415
416 fDecoder.GetHandler().SetMaxStructs(
417 fDecoder.MaxRegionals(),
418 fDecoder.MaxLocals()
419 );
420}
421
422///////////////////////////////////////////////////////////////////////////////
423
424void AliMUONRawStreamTriggerHP::AliHeader::Print() const
425{
426 /// Print DARC header, global header and global scalars to screen.
427
428 cout << "===== DARC info =====" << endl;
429 cout << "Header bits : 0x" << hex << fDarcHeader << dec << endl;
430 if (fDarcScalars != NULL)
431 {
432 cout << "L0R : " << fDarcScalars->fL0R << " (0x"
433 << hex << fDarcScalars->fL0R << dec << ")" << endl;
434 cout << "L1P : " << fDarcScalars->fL1P << " (0x"
435 << hex << fDarcScalars->fL1P << dec << ")" << endl;
436 cout << "L1S : " << fDarcScalars->fL1S << " (0x"
437 << hex << fDarcScalars->fL1S << dec << ")" << endl;
438 cout << "L2A : " << fDarcScalars->fL2A << " (0x"
439 << hex << fDarcScalars->fL2A << dec << ")" << endl;
440 cout << "L2R : " << fDarcScalars->fL2R << " (0x"
441 << hex << fDarcScalars->fL2R << dec << ")" << endl;
442 cout << "Clock : " << fDarcScalars->fClk << " (0x"
443 << hex << fDarcScalars->fClk << dec << ")" << endl;
444 cout << "Hold : " << fDarcScalars->fHold << " (0x"
445 << hex << fDarcScalars->fHold << dec << ")" << endl;
446 cout << "Spare : " << fDarcScalars->fSpare << " (0x"
447 << hex << fDarcScalars->fSpare << dec << ")" << endl;
448 }
449 else
450 {
451 cout << "Scalars == NULL" << endl;
452 }
453
454 cout << "===== Global info =====" << endl;
455 for (int i = 0; i < 4; i++)
456 {
457 cout << "Input[" << i << "] : " << fGlobalHeader->fInput[i] << " (0x"
458 << hex << fGlobalHeader->fInput[i] << dec << ")" << endl;
459 }
460 cout << "Output : " << fGlobalHeader->fOutput << " (0x"
461 << hex << fGlobalHeader->fOutput << dec << ")" << endl;
462 if (fGlobalScalars != NULL)
463 {
464 cout << "L0 : " << fGlobalScalars->fL0 << " (0x"
465 << hex << fGlobalScalars->fL0 << dec << ")" << endl;
466 cout << "Clock : " << fGlobalScalars->fClk << " (0x"
467 << hex << fGlobalScalars->fClk << dec << ")" << endl;
468 for (int j = 0; j < 4; j++)
469 {
470 cout << "Scaler[" << j << "] : " << fGlobalScalars->fScaler[j] << " (0x"
471 << hex << fGlobalScalars->fScaler[j] << dec << ")" << endl;
472 }
473 cout << "Hold : " << fGlobalScalars->fHold << " (0x"
474 << hex << fGlobalScalars->fHold << dec << ")" << endl;
475 cout << "Spare : " << fGlobalScalars->fSpare << " (0x"
476 << hex << fGlobalScalars->fSpare << dec << ")" << endl;
477 }
478 else
479 {
480 cout << "Scalars == NULL" << endl;
481 }
482}
483
484void AliMUONRawStreamTriggerHP::AliRegionalHeader::Print() const
485{
486 /// Print the regional header and scalars to screen.
487
488 cout << "===== Regional card info =====" << endl;
489 cout << "DarcWord : " << fHeader->fDarcWord << " (0x"
490 << hex << fHeader->fDarcWord << dec << ")" << endl;
491 cout << "Word : " << fHeader->fWord << " (0x"
492 << hex << fHeader->fWord << dec << ")" << endl;
493 cout << "Input[0] : " << fHeader->fInput[0] << " (0x"
494 << hex << fHeader->fInput[0] << dec << ")" << endl;
495 cout << "Input[1] : " << fHeader->fInput[1] << " (0x"
496 << hex << fHeader->fInput[1] << dec << ")" << endl;
497 cout << "L0/Mask : " << fHeader->fL0CountAndMask << " (0x"
498 << hex << fHeader->fL0CountAndMask << dec << ")" << endl;
499 if (fScalars != NULL)
500 {
501 cout << "Clock : " << fScalars->fClk << " (0x"
502 << hex << fScalars->fClk << dec << ")" << endl;
503 for (int i = 0; i < 8; i++)
504 {
505 cout << "Scaler[" << i << "] : " << fScalars->fScaler[i] << " (0x"
506 << hex << fScalars->fScaler[i] << dec << ")" << endl;
507 }
508 cout << "Hold : " << fScalars->fHold << " (0x"
509 << hex << fScalars->fHold << dec << ")" << endl;
510 }
511 else
512 {
513 cout << "Scalars == NULL" << endl;
514 }
515}
516
517void AliMUONRawStreamTriggerHP::AliLocalStruct::Print() const
518{
519 /// Print local trigger structure and scalars to screen.
520
521 cout << "===== Local card info =====" << endl;
522 cout << "X2X1 : " << fLocalStruct->fX2X1 << " (0x"
523 << hex << fLocalStruct->fX2X1 << dec << ")" << endl;
524 cout << "X4X3 : " << fLocalStruct->fX4X3 << " (0x"
525 << hex << fLocalStruct->fX4X3 << dec << ")" << endl;
526 cout << "Y2Y1 : " << fLocalStruct->fY2Y1 << " (0x"
527 << hex << fLocalStruct->fY2Y1 << dec << ")" << endl;
528 cout << "Y4Y3 : " << fLocalStruct->fY4Y3 << " (0x"
529 << hex << fLocalStruct->fY4Y3 << dec << ")" << endl;
530 cout << "Trigger bits : " << fLocalStruct->fTriggerBits << " (0x"
531 << hex << fLocalStruct->fTriggerBits << dec << ")" << endl;
532 if (fScalars != NULL)
533 {
534 cout << "L0 : " << fScalars->fL0 << " (0x"
535 << hex << fScalars->fL0 << dec << ")" << endl;
536 cout << "Hold : " << fScalars->fHold << " (0x"
537 << hex << fScalars->fHold << dec << ")" << endl;
538 cout << "Clock : " << fScalars->fClk << " (0x"
539 << hex << fScalars->fClk << dec << ")" << endl;
540 cout << "LPtNTrig : " << fScalars->fLPtNTrig << " (0x"
541 << hex << fScalars->fLPtNTrig << dec << ")" << endl;
542 cout << "HPtNTrig : " << fScalars->fHPtNTrig << " (0x"
543 << hex << fScalars->fHPtNTrig << dec << ")" << endl;
544 cout << "LPtRTrig : " << fScalars->fLPtRTrig << " (0x"
545 << hex << fScalars->fLPtRTrig << dec << ")" << endl;
546 cout << "HPtRTrig : " << fScalars->fHPtRTrig << " (0x"
547 << hex << fScalars->fHPtRTrig << dec << ")" << endl;
548 cout << "LPtLTrig : " << fScalars->fLPtLTrig << " (0x"
549 << hex << fScalars->fLPtLTrig << dec << ")" << endl;
550 cout << "HPtLTrig : " << fScalars->fHPtLTrig << " (0x"
551 << hex << fScalars->fHPtLTrig << dec << ")" << endl;
552 cout << "LPtSTrig : " << fScalars->fLPtSTrig << " (0x"
553 << hex << fScalars->fLPtSTrig << dec << ")" << endl;
554 cout << "HPtSTrig : " << fScalars->fHPtSTrig << " (0x"
555 << hex << fScalars->fHPtSTrig << dec << ")" << endl;
556 for (int i = 0; i < 8*4; i++)
557 {
558 cout << "Scaler[" << i << "] : " << fScalars->fScaler[i] << " (0x"
559 << hex << fScalars->fScaler[i] << dec << ")" << endl;
560 }
561 cout << "EOS : " << fScalars->fEOS << " (0x"
562 << hex << fScalars->fEOS << dec << ")" << endl;
563 cout << "Reset : " << fScalars->fReset << " (0x"
564 << hex << fScalars->fReset << dec << ")" << endl;
565 }
566 else
567 {
568 cout << "Scalars == NULL" << endl;
569 }
570}
571
572///////////////////////////////////////////////////////////////////////////////
573
574AliMUONRawStreamTriggerHP::AliDecoderEventHandler::AliDecoderEventHandler() :
575 fRawStream(NULL),
576 fBufferStart(NULL),
577 fDarcHeader(0),
578 fDarcScalars(NULL),
579 fHeaders(),
580 fRegionalsCount(0),
581 fRegionals(NULL),
582 fLocals(NULL),
583 fEndOfLocals(NULL),
584 fCurrentRegional(NULL),
585 fCurrentLocal(NULL),
586 fDarcEoWErrors(0),
587 fGlobalEoWErrors(0),
588 fRegEoWErrors(0),
589 fLocalEoWErrors(0),
590 fWarnings(kTRUE)
591{
592 /// Default constructor
593}
594
595
596AliMUONRawStreamTriggerHP::AliDecoderEventHandler::~AliDecoderEventHandler()
597{
598 /// Default destructor cleans up the allocated memory.
599
600 if (fRegionals != NULL) delete [] fRegionals;
601 if (fLocals != NULL) delete [] fLocals;
602}
603
604
605void AliMUONRawStreamTriggerHP::AliDecoderEventHandler::SetMaxStructs(
606 UInt_t maxRegionals, UInt_t maxLocals
607 )
608{
609 /// Sets the maximum number of structures allowed.
610
611 // Start by clearing the current arrays.
612 if (fRegionals != NULL)
613 {
614 delete [] fRegionals;
615 fRegionals = NULL;
616 }
617 if (fLocals != NULL)
618 {
619 delete [] fLocals;
620 fLocals = NULL;
621 fEndOfLocals = NULL;
622 }
623 fCurrentRegional = NULL;
624 fCurrentLocal = NULL;
625
626 // Allocate new memory.
627 fRegionals = new AliRegionalHeader[maxRegionals];
628 fLocals = new AliLocalStruct[maxRegionals*maxLocals];
629 fEndOfLocals = fLocals;
50a1db76 630
631 fRegionalsCount = maxRegionals;
1788245f 632}
633
634
635void AliMUONRawStreamTriggerHP::AliDecoderEventHandler::OnNewBuffer(
636 const void* buffer, UInt_t /*bufferSize*/
637 )
638{
639 /// This is called by the high performance decoder when a new DDL payload
640 /// is about to be decoded.
641
642 assert( fRawStream != NULL );
643
644 // remember the start of the buffer to be used in OnError.
645 fBufferStart = buffer;
646
647 // Reset error counters.
648 fDarcEoWErrors = 0;
649 fGlobalEoWErrors = 0;
650 fRegEoWErrors = 0;
651 fLocalEoWErrors = 0;
652
50a1db76 653 // Reset the current local structure pointer which will be used to track
654 // where we need to fill fLocals. We have to subtract one space because we
655 // will increment the pointer the first time in the OnLocalStruct method.
1788245f 656 fCurrentLocal = fLocals-1;
50a1db76 657
658 fCurrentRegional = NULL;
659
660 // Reset and link up all the regional structures together.
661 for (UInt_t i = 0; i+1 < fRegionalsCount; i++)
662 {
663 fRegionals[i] = AliRegionalHeader(fLocals, &fgkEmptyHeader, NULL);
664 fRegionals[i].SetNext(&fRegionals[i+1]);
665 }
666 // Reset the last structure.
667 fRegionals[fRegionalsCount-1] = AliRegionalHeader(fLocals, &fgkEmptyHeader, NULL);
1788245f 668}
669
670
671void AliMUONRawStreamTriggerHP::AliDecoderEventHandler::OnError(
672 ErrorCode error, const void* location
673 )
674{
675 /// This is called by the high performance decoder when a error occurs
676 /// when trying to decode the DDL payload. This indicates corruption in
677 /// the data. This method converts the error code to a descriptive message
678 /// and logs this with the raw reader.
679 /// \param error The error code indicating the problem.
680 /// \param location A pointer to the location within the DDL payload buffer
681 /// being decoded where the problem with the data was found.
682
683 assert( fRawStream != NULL );
684 assert( fRawStream->GetReader() != NULL );
685
686 Char_t* message = NULL;
687 //UInt_t word = 0;
688
689 switch (error)
690 {
691 case kWrongEventType:
692 message = Form("Wrong event type obtained from the Darc header, take the one of CDH");
693 break;
694
695 case kBadEndOfDarc:
696 fDarcEoWErrors++;
697 message = Form(
698 "Wrong end of Darc word %x instead of %x\n",
699 *reinterpret_cast<const UInt_t*>(location),
700 AliMUONTriggerDDLDecoder<AliMUONTriggerDDLDecoderEventHandler>::EndOfDarcWord()
701 );
702 fRawStream->GetReader()->AddMajorErrorLog(kDarcEoWErr, message);
703 break;
704
705 case kBadEndOfGlobal:
706 fGlobalEoWErrors++;
707 message = Form(
708 "Wrong end of Global word %x instead of %x\n",
709 *reinterpret_cast<const UInt_t*>(location),
710 AliMUONTriggerDDLDecoder<AliMUONTriggerDDLDecoderEventHandler>::EndOfGlobalWord()
711 );
712 fRawStream->GetReader()->AddMajorErrorLog(kGlobalEoWErr, message);
713 break;
714
715 case kBadEndOfRegional:
716 fRegEoWErrors++;
717 message = Form(
718 "Wrong end of Regional word %x instead of %x\n",
719 *reinterpret_cast<const UInt_t*>(location),
720 AliMUONTriggerDDLDecoder<AliMUONTriggerDDLDecoderEventHandler>::EndOfRegionalWord()
721 );
722 fRawStream->GetReader()->AddMajorErrorLog(kRegEoWErr, message);
723 break;
724
725 case kBadEndOfLocal:
726 fLocalEoWErrors++;
727 message = Form(
728 "Wrong end of Local word %x instead of %x\n",
729 *reinterpret_cast<const UInt_t*>(location),
730 AliMUONTriggerDDLDecoder<AliMUONTriggerDDLDecoderEventHandler>::EndOfLocalWord()
731 );
732 fRawStream->GetReader()->AddMajorErrorLog(kLocalEoWErr, message);
733 break;
734
735 default:
736 message = Form(
1130977f 737 "%s (At byte %lu in DDL.)",
1788245f 738 ErrorCodeToMessage(error),
e9463054 739 (unsigned long)location - (unsigned long)fBufferStart + sizeof(AliRawDataHeaderV3)
1788245f 740 );
741 fRawStream->GetReader()->AddMajorErrorLog(error, message);
742 break;
743 }
744
745 if (fWarnings)
746 {
747 AliWarningGeneral(
748 "AliMUONRawStreamTriggerHP::AliDecoderEventHandler",
749 message
750 );
751 }
752}
753