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