]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRDrawStreamTB.cxx
New check for bad SDD modules (F. Prino)
[u/mrichter/AliRoot.git] / TRD / AliTRDrawStreamTB.cxx
CommitLineData
fa7427d0 1#/**************************************************************************
3a039a31 2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
7* Permission to use, copy, modify and distribute this software and its *
8* documentation strictly for non-commercial purposes is hereby granted *
9* without fee, provided that the above copyright notice appears in all *
10* copies and that both the copyright notice and this permission notice *
11* appear in the supporting documentation. The authors make no claims *
12* about the suitability of this software for any purpose. It is *
13* provided "as is" without express or implied warranty. *
14**************************************************************************/
d4232bb6 15
16/* $Id$ */
17
18///////////////////////////////////////////////////////////////////////////////
19// //
20// This class provides access to TRD digits in raw data. //
21// //
22// It loops over all TRD digits in the raw data given by the AliRawReader. //
23// The Next method goes to the next digit. If there are no digits left //
24// it returns kFALSE. //
25// Several getters provide information about the current digit. //
26// //
27// Author: M. Ploskon (ploskon@ikf.uni-frankfurt.de) //
28// //
29///////////////////////////////////////////////////////////////////////////////
30
31#include "TString.h"
32#include "TFile.h"
33#include "TTreeStream.h"
34
35#include "AliTRDrawStreamTB.h"
36#include "AliTRDgeometry.h"
37#include "AliTRDfeeParam.h"
38#include "AliTRDdigitsManager.h"
625f5260 39#include "AliTRDdataArrayS.h"
6bd744d3 40#include "AliTRDdataArrayI.h"
fb44eb8e 41#include "AliTRDdataArrayDigits.h"
d4232bb6 42#include "AliTRDSignalIndex.h"
0e09df31 43#include "AliTRDrecoParam.h"
fa7427d0 44#include "AliTRDcalibDB.h"
45#include "Cal/AliTRDCalPadStatus.h"
d4232bb6 46
e16f790e 47//[mj tracklet writing] #include "AliTRDrawTracklet.h"
48
d4232bb6 49#include "AliLog.h"
50#include "AliRawReader.h"
51
52#define END_OF_TRACKLET_MARKEROLD 0xaaaaaaaa
53#define END_OF_TRACKLET_MARKERNEW 0x10001000
54#define ENDOFRAWDATAMARKER 0x00000000
55#define WORD_SIZE sizeof(UInt_t) // size of a word in bytes
56#define EXTRA_LEAD_WORDS 24
57#define CDH_WORDS 8
58
59#define IS_BIT_SET(w,b) ( ((w) >> (b)) & 0x1 ) // 1 if bit b is set in word w
60#define GET_VALUE_AT(w,m,s) (( (w) >> (s)) & (m) ) // get value of word w rshifted by s and mask with m
61
62// SM index word masks:
63#define SM_HEADER_SIZE(w) GET_VALUE_AT(w,0xffff,16)
64#define TRACKLETS_ENABLED(w) IS_BIT_SET(w,5)
65#define STACK_MASK(w) ((w) & 0x1f)
66
67// Stack word masks
68#define STACK_HEADER_SIZE(w) GET_VALUE_AT(w,0xffff,16)
69#define STACK_LINK_WORD(w) ((w) & 0xfff)
e16f790e 70#define LINK0_DATA_TYPE_FLAG(w) (GET_VALUE_AT(w,0x3,4) == (0x0) ? 0 : 1) // 0 if physics data
71#define LINK1_DATA_TYPE_FLAG(w) (GET_VALUE_AT(w,0x3,20) == (0x0) ? 0 : 1) // 0 if physics data
72#define LINK0_MONITOR_FLAG(w) (GET_VALUE_AT(w,0xf,0) == (0x0) ? 0 : 1) // 0 if OK
73#define LINK1_MONITOR_FLAG(w) (GET_VALUE_AT(w,0xf,16) == (0x0) ? 0 : 1) // 0 if OK
d4232bb6 74
75// HC word masks
76//#define HC_HEADER_MASK_ERR(w) ( ((w) & (0x80000003)) == (0x80000001) ? 0 : 1) // 0 if OK!!!
77#define HC_HEADER_MASK_ERR(w) ( ((w) & (0x3)) == (0x1) ? 0 : 1) // 0 if OK!!!
78
79// HC word 0
80#define HC_SPECIAL_RAW_VERSION(w) IS_BIT_SET(w,31)
81#define HC_MAJOR_RAW_VERSION(w) GET_VALUE_AT(w,0x7f,24)
dc25a859 82#define HC_MAJOR_RAW_VERSION_OPT(w) GET_VALUE_AT(w,0x7,24)
d4232bb6 83#define HC_MINOR_RAW_VERSION(w) GET_VALUE_AT(w,0x7f,17)
84#define HC_EXTRA_WORDS(w) GET_VALUE_AT(w,0x7,14)
85#define HC_DCS_BOARD(w) GET_VALUE_AT(w,0xfff<<20,20)
86#define HC_SM_NUMBER(w) GET_VALUE_AT(w,0x1f,9)
87#define HC_LAYER_NUMBER(w) GET_VALUE_AT(w,0x7,6)
88#define HC_STACK_NUMBER(w) GET_VALUE_AT(w,0x7,3)
89#define HC_SIDE_NUMBER(w) IS_BIT_SET(w,2)
90
91// HC word 1
92#define HC_NTIMEBINS(w) GET_VALUE_AT(w,0x3f,26)
93#define HC_BUNCH_CROSS_COUNTER(w) GET_VALUE_AT(w,0xffff,10)
94#define HC_PRETRIGGER_COUNTER(w) GET_VALUE_AT(w,0xf,6)
95#define HC_PRETRIGGER_PHASE(w) GET_VALUE_AT(w,0xf,6)
96
d4232bb6 97// MCM word and ADC mask
98#define MCM_HEADER_MASK_ERR(w) ( ((w) & (0xf)) == (0xc) ? 0 : 1) // 0 if OK!!!
99#define MCM_ADCMASK_MASK_ERR(w) ( ((w) & (0xf)) == (0xc) ? 0 : 1) // 0 if OK!!!
100#define MCM_MCM_NUMBER(w) GET_VALUE_AT(w,0x0f,24)
101#define MCM_ROB_NUMBER(w) GET_VALUE_AT(w,0x7,28)
102#define MCM_EVENT_COUNTER(w) GET_VALUE_AT(w,0x00fffff,4)
103#define MCM_ADCMASK_VAL(w) GET_VALUE_AT(w,0x1fffff,4)
bb1009bf 104#define MCM_ADCMASK_NADC(w) GET_VALUE_AT(w,0x1f,25)
d4232bb6 105
bb1009bf 106#define MCM_DUMMY_ADCMASK_VAL 0x015fffffc // updated
2e2bc4a1 107#define ADCDATA_VAL1 0x2 // updated
108#define ADCDATA_VAL2 0x3 // updated
109
d4232bb6 110//--------------------------------------------------------
111#define ADC_WORD_MASK(w) ((w) & 0x3)
112//--------------------------------------------------------
dc25a859 113
114
d4232bb6 115ClassImp(AliTRDrawStreamTB)
116
117Bool_t AliTRDrawStreamTB::fgExtraSkip = kFALSE;
118Bool_t AliTRDrawStreamTB::fgSkipCDH = kFALSE;
119Bool_t AliTRDrawStreamTB::fgWarnError = kTRUE;
e16f790e 120Bool_t AliTRDrawStreamTB::fgCleanDataOnly = kFALSE;
d4232bb6 121Bool_t AliTRDrawStreamTB::fgDebugFlag = kTRUE;
711edbd9 122Bool_t AliTRDrawStreamTB::fgEnableMemoryReset = kTRUE;
6bd744d3 123Bool_t AliTRDrawStreamTB::fgStackNumberChecker = kTRUE;
7e8f4d17 124Bool_t AliTRDrawStreamTB::fgStackLinkNumberChecker = kTRUE;
bb1009bf 125Bool_t AliTRDrawStreamTB::fgSkipData = kTRUE;
d4232bb6 126UInt_t AliTRDrawStreamTB::fgDumpHead = 0;
1ced3838 127Int_t AliTRDrawStreamTB::fgCommonAdditive = 0;
d4232bb6 128Int_t AliTRDrawStreamTB::fgEmptySignals[] =
129 {
130 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
131 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
132 };
9c7c9ec1 133Short_t AliTRDrawStreamTB::fgMCMordering[] =
134 {
135 12, 13, 14, 15, 8, 9, 10, 11, 4, 5, 6, 7, 0, 1, 2, 3
136 };
137Short_t AliTRDrawStreamTB::fgROBordering[] =
138 {
139 0, 1, 2, 3
140 };
141Int_t AliTRDrawStreamTB::fgLastHC = -1;
142Int_t AliTRDrawStreamTB::fgLastROB = -1;
143Int_t AliTRDrawStreamTB::fgLastIndex = -1;
3be28fbf 144Bool_t AliTRDrawStreamTB::fDumpingEnable = kFALSE;
145Int_t AliTRDrawStreamTB::fDumpingSM = -1;
146Int_t AliTRDrawStreamTB::fDumpingStack = -1;
147Int_t AliTRDrawStreamTB::fDumpingLayer = -1;
148Int_t AliTRDrawStreamTB::fDumpingROB = -1;
149Int_t AliTRDrawStreamTB::fDumpingMCM = -1;
150
d4232bb6 151
152AliTRDrawStreamTB::AliTRDrawStreamTB()
dfbb4bb9 153 : AliTRDrawStreamBase()
d4232bb6 154 , fSM()
155 , fStack(0)
156 , fHC(0)
157 , fMCM(0)
158 , fADC(0)
159 , fpPos(0)
160 , fpBegin(0)
161 , fpEnd(0)
162 , fWordLength(0)
163 , fStackNumber(-1)
164 , fStackLinkNumber(-1)
165 , fhcMCMcounter(0)
166 , fmcmADCcounter(0)
167 , fLinkTrackletCounter(-1)
168 , fEndOfTrackletCount(-1)
21a48b1c 169 , fNWordsCounter(-1)
d4232bb6 170 , fMaskADCword(0)
171 , fTbinADC(0)
172 , fDecodedADCs(-1)
173 , fEventCounter(0)
174 , fLastEventCounter(0)
d4232bb6 175 , fSharedPadsOn(kFALSE)
176 , fMaxADCgeom(0)
e16f790e 177 , fBufferRead(0)
d4232bb6 178 , fGeometry(0)
179 , fRawReader(0)
180 , fTRDfeeParam(0)
d4232bb6 181{
182 //
183 // default constructor
184 //
185
186 if (Init() == kFALSE)
187 {
188 AliWarning("Unable to Init.");
189 }
190}
191
192//--------------------------------------------------------
193AliTRDrawStreamTB::AliTRDrawStreamTB(AliRawReader *rawReader)
dfbb4bb9 194 : AliTRDrawStreamBase(rawReader)
d4232bb6 195 , fSM()
196 , fStack(0)
197 , fHC(0)
198 , fMCM(0)
199 , fADC(0)
200 , fpPos(0)
201 , fpBegin(0)
202 , fpEnd(0)
203 , fWordLength(0)
204 , fStackNumber(-1)
205 , fStackLinkNumber(-1)
206 , fhcMCMcounter(0)
207 , fmcmADCcounter(0)
208 , fLinkTrackletCounter(-1)
209 , fEndOfTrackletCount(-1)
21a48b1c 210 , fNWordsCounter(-1)
d4232bb6 211 , fMaskADCword(0)
212 , fTbinADC(0)
213 , fDecodedADCs(-1)
214 , fEventCounter(0)
215 , fLastEventCounter(0)
d4232bb6 216 , fSharedPadsOn(kFALSE)
217 , fMaxADCgeom(0)
e16f790e 218 , fBufferRead(0)
d4232bb6 219 , fGeometry(0)
220 , fRawReader(rawReader)
221 , fTRDfeeParam(0)
d4232bb6 222{
223 //
224 // default constructor
225 //
226 if (fRawReader)
227 {
228 if (Init() == kFALSE)
3a039a31 229 {
230 AliWarning("Unable to Init. Try setting up the reader with SetReader or buffer with Init(void *, UInt_t )");
231 }
d4232bb6 232 }
233 else
234 {
235 AliWarning("Unable to setup reader. Use SetReader(AliRawReader*).");
236 }
237}
238
239//------------------------------------------------------------
240
241AliTRDrawStreamTB::AliTRDrawStreamTB(const AliTRDrawStreamTB& /*st*/)
dfbb4bb9 242 : AliTRDrawStreamBase()
d4232bb6 243 , fSM()
244 , fStack(0)
245 , fHC(0)
246 , fMCM(0)
247 , fADC(0)
248 , fpPos(0)
249 , fpBegin(0)
250 , fpEnd(0)
251 , fWordLength(0)
252 , fStackNumber(-1)
253 , fStackLinkNumber(-1)
254 , fhcMCMcounter(0)
255 , fmcmADCcounter(0)
256 , fLinkTrackletCounter(-1)
257 , fEndOfTrackletCount(-1)
21a48b1c 258 , fNWordsCounter(-1)
d4232bb6 259 , fMaskADCword(0)
260 , fTbinADC(0)
261 , fDecodedADCs(-1)
262 , fEventCounter(0)
263 , fLastEventCounter(0)
d4232bb6 264 , fSharedPadsOn(kFALSE)
265 , fMaxADCgeom(0)
e16f790e 266 , fBufferRead(0)
d4232bb6 267 , fGeometry(0)
268 , fRawReader(0)
269 , fTRDfeeParam(0)
d4232bb6 270{
271 //
272 // Copy constructor
273 //
274 AliError("Not implemeneted.");
275}
276
277//------------------------------------------------------------
dfbb4bb9 278Bool_t AliTRDrawStreamTB::SetRawVersion(Int_t fraw)
d4232bb6 279{
280 //
281 // function provided for backward compatibility
282 //
283 AliWarning("Raw data version is read from raw data stream! No point of setting it in here.");
284 fraw = 0; // avoid warnings
dfbb4bb9 285 return kFALSE;
d4232bb6 286}
287
288//------------------------------------------------------------
289AliTRDrawStreamTB::~AliTRDrawStreamTB()
290{
291 //
292 // destructor
293 //
294 delete fGeometry;
d4232bb6 295}
296
297//------------------------------------------------------------
298
299AliTRDrawStreamTB &
300AliTRDrawStreamTB::operator=(const AliTRDrawStreamTB &)
301{
302 //
303 // we are not using this functionality
304 //
305 AliFatal("May not use.");
306 return *this;
307}
308
d4232bb6 309//___________________________________________________________
310void
311AliTRDrawStreamTB::SwapOnEndian()
312{
313 //
314 // Check the endian and swap if needed
315 //
d4232bb6 316 int itemp = 1;
317 char* ptemp = (char*) &itemp;
318 if (ptemp[0] != 1)
319 {
d4232bb6 320 if (fgDebugFlag) AliDebug(8, "Swapping.");
321
322 fpPos = fpBegin;
323 UInt_t iutmp = 0;
324 while (fpPos < fpEnd)
3a039a31 325 {
326 fpPos += 1;
327 iutmp = (((*fpPos & 0x000000ffU) << 24) | ((*fpPos & 0x0000ff00U) << 8) |
328 ((*fpPos & 0x00ff0000U) >> 8) | ((*fpPos & 0xff000000U) >> 24));
329 // here we override the value in the buffer!
330 *fpPos = iutmp;
331 }
d4232bb6 332 fpPos = fpBegin;
333 }
334}
335
d4232bb6 336//------------------------------------------------------------
337Bool_t
338AliTRDrawStreamTB::DumpWords(UInt_t *px, UInt_t iw, UInt_t marker)
339{
e16f790e 340
d4232bb6 341 TString tsreturn = Form("\n[ Dump Sequence at 0x%08x ] : ", px);
342 for (UInt_t i = 0; i < iw; i++)
343 {
344 if (px + iw >= fpEnd)
3a039a31 345 return kFALSE;
d4232bb6 346
347 if (i % 8 == 0)
3a039a31 348 tsreturn += "\n ";
d4232bb6 349 if (marker != 0 && marker == px[i])
3a039a31 350 tsreturn += Form(" *>0x%08x<* ", px[i]);
d4232bb6 351 else
3a039a31 352 tsreturn += Form("0x%08x ", px[i]);
d4232bb6 353 }
354 tsreturn += "\n";
355
356 AliInfo(tsreturn.Data());
357
358 return kTRUE;
359}
360
361//------------------------------------------------------------
362Bool_t
363AliTRDrawStreamTB::SkipWords(UInt_t iw)
364{
365 //
e16f790e 366 // Skip words corresponding to iw
d4232bb6 367 //
d4232bb6 368 if ( fpPos + iw < fpEnd )
369 {
370 fpPos += iw;
371 return kTRUE;
372 }
373 else
374 {
375 if (fgWarnError) AliWarning(Form("Skip %d words failed. %d available", iw, fpEnd - fpPos - 1));
d4232bb6 376 return kFALSE;
377 }
378
379 return kTRUE;
380}
381
382//------------------------------------------------------------
383Bool_t
384AliTRDrawStreamTB::SetReader(AliRawReader *reader)
385{
d4232bb6 386
387 if (reader != 0)
388 {
389 fRawReader = reader;
390 if (fRawReader)
3a039a31 391 {
392 return Init();
393 }
d4232bb6 394 else
3a039a31 395 {
396 AliWarning("Unable to setup reader.");
397 return kFALSE;
398 }
d4232bb6 399 }
400 else
401 {
402 AliWarning("AliRawReader argument is 0.");
403 fRawReader = 0;
404 }
405
406 return kFALSE;
407}
408
409//------------------------------------------------------------
410Int_t
411AliTRDrawStreamTB::NextBuffer()
412{
413 //
414 // return -1 if no more buffers available
e16f790e 415 // return 0 DecodeSM failed (clean data required for example) but still maybe more data to come
416 // return 1 DecodeSM OK
d4232bb6 417 //
418
419 if (fRawReader != 0)
420 {
421 UChar_t *buffer = 0;
422 UInt_t length = 0;
423 Bool_t kBufferSet = fRawReader->ReadNextData(buffer);
424 if (kBufferSet == kTRUE)
3a039a31 425 {
426 if (fgDebugFlag) AliDebug(9, "Buffer is set.");
427 length = fRawReader->GetDataSize();
428 if (fgExtraSkip == kTRUE)
429 {
430 buffer += EXTRA_LEAD_WORDS * WORD_SIZE;
431 length -= EXTRA_LEAD_WORDS * WORD_SIZE;
432 }
433
434 if (fgSkipCDH == kTRUE)
435 {
436 buffer += CDH_WORDS * WORD_SIZE;
437 length -= CDH_WORDS * WORD_SIZE;
438 }
439
440 if (length > 0)
441 {
442 if (fgDebugFlag) AliDebug(9, Form("Buffer length : %d", length));
711edbd9 443 if (fgEnableMemoryReset) ResetMemory(); //[mj]
3a039a31 444 if (DecodeSM((void*)buffer, length) == kTRUE)
445 return 1;
446 else
447 return 0;
448 }
449 }
d4232bb6 450 else
3a039a31 451 {
452 return -1;
453 }
d4232bb6 454 }
455
456 return -1;
457}
458
459//------------------------------------------------------------
460void
461AliTRDrawStreamTB::ResetCounters()
462{
463 //
464 // reset some global counters
465 //
e16f790e 466 fBufferRead = kFALSE; // important to read buffer
d4232bb6 467
468 fStackNumber = 0;
469 fStackLinkNumber = 0;
d4232bb6 470 fDecodedADCs = 0;
471
472 fSM.fActiveStacks = 0;
473 fSM.fNexpectedHalfChambers = 0;
474
475 fLinkTrackletCounter = 0;
d4232bb6 476 fLastEventCounter = 0;
477 fEventCounter = 0;
478}
479
480//------------------------------------------------------------
481void
482AliTRDrawStreamTB::ResetIterators()
483{
484 //
e16f790e 485 // reset data which should be reset every sm
d4232bb6 486 //
e16f790e 487 fStackNumber = 0; // reset for Next() function
488 fStackLinkNumber = 0; // reset for Next() function
d4232bb6 489 fhcMCMcounter = 0;
490 fmcmADCcounter = 0;
491}
492
711edbd9 493//------------------------------------------------------------
494void
495AliTRDrawStreamTB::ResetPerSM()
496{
497 //
498 // reset every SM
499 //
500
501 fSM.fHeaderSize = 0;
502 fSM.fTrackletEnable = kFALSE;
503 fSM.fCorrupted = 0;
504 fSM.fNexpectedHalfChambers = 0;
505 fSM.fNexpectedHalfChambers = 0;
506 fSM.fClean = kTRUE;
507 fSM.fPos = NULL;
508 for (Int_t i=0; i<5; i++){
3a039a31 509 fSM.fStackActive[i] = kFALSE;
711edbd9 510 }
511}
512
513//------------------------------------------------------------
514void
515AliTRDrawStreamTB::ResetPerStack()
516{
517 //
518 // reset every Stack
519 //
520
521 fStack->fHeaderSize = 0;
522 fStack->fActiveLinks = 0;
523 fStack->fPos = NULL;
524 for (Int_t i=0; i<12; i++){
3a039a31 525 fStack->fLinksActive[i] = kFALSE;
526 fStack->fLinksDataType[i] = 0;
527 fStack->fLinksMonitor[i] = 0;
528 fStack->fLinkMonitorError[i] = 0;
711edbd9 529 }
530}
531
e16f790e 532//------------------------------------------------------------
533void
534AliTRDrawStreamTB::ResetPerHC()
535{
536 //
537 // reset every HC
538 //
539 fEventCounter = 0;
711edbd9 540 fHC->fTrackletError = 0;
541 fHC->fNTracklets = 0;
542 fHC->fSpecialRawV = 0;
543 fHC->fRawVMajor = 0;
544 fHC->fRawVMajorOpt = 0;
545 fHC->fRawVMinor = 0;
546 fHC->fNExtraWords = 0;
547 fHC->fDCSboard = 0;
548 fHC->fSM = 0;
549 fHC->fStack = 0;
550 fHC->fLayer = 0;
551 fHC->fSide = 0;
552 fHC->fTimeBins = 0;
553 fHC->fBunchCrossCounter = 0;
554 fHC->fPreTriggerCounter = 0;
555 fHC->fPreTriggerPhase = 0;
556 fHC->fDET = 0;
557 fHC->fROC = 0;
558 fHC->fRowMax = 0;
559 fHC->fColMax = 0;
560 fHC->fMCMmax = 0;
561
562 fHC->fH0Corrupted = 0;
563 fHC->fH1Corrupted = 0;
564 fHC->fCorrupted = 0;
e16f790e 565}
566
711edbd9 567//------------------------------------------------------------
568void
569AliTRDrawStreamTB::ResetPerMCM()
570{
571 //
572 // reset every MCM
573 //
711edbd9 574 fMCM->fROB = 0;
575 fMCM->fMCM = 0;
576 fMCM->fROW = 0;
577 fMCM->fEvCounter = 0;
578 fMCM->fADCMask = 0;
579 fMCM->fADCMaskWord = 0;
580 fMCM->fADCmax = 0;
581 fMCM->fADCcount = 0;
582 fMCM->fMCMADCWords = 0;
583 fMCM->fSingleADCwords = 0;
584 fMCM->fMCMhdCorrupted = 0;
585 fMCM->fADCmaskCorrupted = 0;
586 fMCM->fCorrupted = 0;
587 fMCM->fPos = NULL;
588 fMCM->fAdcDataPos = NULL;
589 fMCM->fADCcounter = 0;
590
591 for (Int_t i=0; i<21; i++){
3a039a31 592 fMCM->fADCchannel[i] = 0;
711edbd9 593 }
594}
595
596//------------------------------------------------------------
597void
598AliTRDrawStreamTB::ResetPerADC()
599{
600 //
601 // reset every ADC
602 //
603 fADC->fPos = NULL;
604 fADC->fADCnumber = 0;
605 fADC->fCOL = 0;
606 fADC->fIsShared = kTRUE;
607 fADC->fCorrupted = 0;
608
609 for (Int_t i=0; i<30; i++){
3a039a31 610 fADC->fSignals[i] = 0;
711edbd9 611 }
612}
613
614//------------------------------------------------------------
615void
616AliTRDrawStreamTB::ResetMemory()
617{
21a48b1c 618 //
619 // initialize all the data members to prevent read data
620 // from previous buffer
621 //
711edbd9 622 ResetPerSM();
623 for (Int_t istack=0; istack<5; istack++){
3a039a31 624 fStack = &fSM.fStacks[istack];
625 ResetPerStack();
626 for (Int_t ilink=0; ilink<12; ilink++){
711edbd9 627 fHC = &fStack->fHalfChambers[ilink];
628 ResetPerHC();
629 for (Int_t imcm=0; imcm<12; imcm++){
3a039a31 630 fMCM = &fHC->fMCMs[imcm];
631 ResetPerMCM();
632 for (Int_t iadc=0; iadc<12; iadc++){
711edbd9 633 fADC = &fMCM->fADCs[iadc];
634 ResetPerADC();
3a039a31 635 }
711edbd9 636 }
3a039a31 637 }
711edbd9 638 }
639}
640
d4232bb6 641//------------------------------------------------------------
642
643Bool_t
644AliTRDrawStreamTB::Next()
645{
646 //
647 // returns with true on next adc read
648 // returns false on errors and end of buffer
649 //
3a039a31 650if (fBufferRead)
651 {
e16f790e 652
653 while (fStackNumber < 5 && fSM.fActiveStacks > 0)
654 {
655 if(fSM.fStackActive[fStackNumber] == kTRUE)
3a039a31 656 {
657 fStack = &fSM.fStacks[fStackNumber];
658 while (fStackLinkNumber < 12)
659 {
660 if (fStack->fLinksActive[fStackLinkNumber] == kTRUE && fStack->fLinksMonitor[fStackLinkNumber] == 0)
661 {
662 fHC = &fStack->fHalfChambers[fStackLinkNumber];
663 if (!fHC)
664 {
665 AliError(Form("HC missing at stack %d link %d", fStackNumber, fStackLinkNumber));
666 return kFALSE;
667 }
668 if (fHC->fCorrupted == 0 && (fHC->fH0Corrupted == 0 && fHC->fH1Corrupted == 0)) // if HC data corrupted(in any case), we don't read data at all from this HC
669 {
670 while (fhcMCMcounter < fHC->fMCMmax)
671 {
672 fMCM = &fHC->fMCMs[fhcMCMcounter];
673 if (!fMCM)
674 {
675 AliError(Form("HC missing at stack %d link %d atMCMslot %d",
676 fStackNumber, fStackLinkNumber, fhcMCMcounter));
677 return kFALSE;
678 }
679 while(fmcmADCcounter < fMCM->fADCmax)
680 {
681 fADC = &fMCM->fADCs[fmcmADCcounter];
682 if (!fADC)
683 {
684 AliError(Form("ADC missing at stack %d link %d MCMslot %d ADCslot %d",
685 fStackNumber, fStackLinkNumber, fhcMCMcounter, fmcmADCcounter));
686 return kFALSE;
687 }
688 fmcmADCcounter++;
689 if (fSharedPadsOn)
690 {
691 return kTRUE;
692 }
693 else
694 {
695 if (fADC->fIsShared == kFALSE)
696 return kTRUE;
697 }
698 } //while adc in MCM
699 fhcMCMcounter++;
700 // next MCM should go through all active ADCs
701 fmcmADCcounter = 0;
702 } // while mcm
703 } // if HC OK
704 }// if link active
705 fStackLinkNumber++;
706 // next stack link (HC) should go through all active MCMs
707 fhcMCMcounter = 0;
708 }// while links
709 }// if stack active
e16f790e 710 fStackNumber++;
711 // next stack should go through all links - start from 0
712 fStackLinkNumber = 0;
713 }
3a039a31 714 } // fBufferRead
715
716 // in case rawreader manages the mem buffers, go for the next buffer
717 if (fRawReader)
718 {
719 Int_t nextBuff = NextBuffer();
720 while (nextBuff != -1)
721 {
722 if (nextBuff > 0)
e16f790e 723 {
724 fBufferRead = kTRUE;
3a039a31 725 return Next();
e16f790e 726 }
3a039a31 727 nextBuff = NextBuffer();
728 }
729 }
d4232bb6 730
731 return kFALSE;
732}
733
734//------------------------------------------------------------
d4232bb6 735Int_t
21a48b1c 736AliTRDrawStreamTB::NextChamber(AliTRDdigitsManager *digitsManager, UInt_t **trackletContainer)
d4232bb6 737{
738 //
739 // Fills single chamber digit array
740 // Return value is the detector number
741 //
742
fa7427d0 743 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
fb44eb8e 744 AliTRDdataArrayDigits *digits = 0;
d4232bb6 745 AliTRDdataArrayI *track0 = 0;
746 AliTRDdataArrayI *track1 = 0;
747 AliTRDdataArrayI *track2 = 0;
748 AliTRDSignalIndex *indexes = 0;
749
750 // Loop through the digits
751 Int_t lastdet = -1;
c5f589b9 752 Int_t det = -1;
21a48b1c 753 Int_t lastside = -1;
754 Int_t side = -1;
d4232bb6 755 Int_t it = 0;
9c7c9ec1 756 Int_t ntracklets = 0;
757
758 if (trackletContainer){
21a48b1c 759 for (Int_t i = 0; i < 2; i++)
3a039a31 760 for (Int_t j = 0; j < MAX_TRACKLETS_PERHC; j++)
21a48b1c 761 trackletContainer[i][j] = 0;
9c7c9ec1 762 }
763
d4232bb6 764 while (Next())
765 {
766 det = GetDet();
e16f790e 767 side = GetSide();
9c7c9ec1 768
e16f790e 769 if (trackletContainer)
770 {
3a039a31 771 if ((det + side*AliTRDgeometry::kNdet) != (lastdet + lastside*AliTRDgeometry::kNdet))
772 {
773 if (det != lastdet)
774 {
e16f790e 775 if (lastdet != -1)
776 {
3a039a31 777 return lastdet;
e16f790e 778 }
3a039a31 779 }
780 ntracklets = GetNTracklets();
781 if(ntracklets > 0) memcpy(trackletContainer[side], GetTrackletWords(), sizeof(UInt_t) * ntracklets); //copy tracklet words to trackletContainer array
782 lastside = side;
e16f790e 783 }
9c7c9ec1 784 }
785
d4232bb6 786 if (det != lastdet)
3a039a31 787 {
788 // If new detector found
789 if (lastdet == -1)
790 {
791 lastdet = det;
792 }
793 else
794 {
795 return lastdet;
796 }
797
798 if (det < 0 || det >= AliTRDgeometry::kNdet)
799 {
800 if (fSM.fClean == kTRUE)
801 {
802 AliError(Form("Strange Det Number %d BUT event buffer seems to be clean.", det));
803 }
804 else
805 {
806 AliError(Form("Strange Det Number %d. Event buffer marked NOT clean!", det));
807 }
808 continue;
809 }
810
811 // Add a container for the digits of this detector
812 digits = (AliTRDdataArrayDigits *) digitsManager->GetDigits(det);
fa7427d0 813
c5f589b9 814 if (digitsManager->UsesDictionaries())
815 {
3a039a31 816 track0 = (AliTRDdataArrayI *) digitsManager->GetDictionary(det,0);
817 track1 = (AliTRDdataArrayI *) digitsManager->GetDictionary(det,1);
818 track2 = (AliTRDdataArrayI *) digitsManager->GetDictionary(det,2);
819 }
820
821 if (!digits)
822 {
823 if (fSM.fClean == kTRUE)
824 {
825 AliError(Form("Unable to get digits for det %d BUT event buffer seems to be clean.", det));
826 }
827 else
828 {
829 AliError(Form("Unable to get digits for det %d. Event buffer is NOT clean!", det));
830 }
831 return -1;
832 }
833
834 Int_t rowMax = GetRowMax();
835 Int_t colMax = GetColMax();
836 Int_t ntbins = GetNumberOfTimeBins();
837
838 // Allocate memory space for the digits buffer
839 if (digits->GetNtime() == 0)
840 {
841 digits->Allocate(rowMax, colMax, ntbins);
c5f589b9 842 if (digitsManager->UsesDictionaries())
843 {
3a039a31 844 track0->Allocate(rowMax, colMax, ntbins);
845 track1->Allocate(rowMax, colMax, ntbins);
846 track2->Allocate(rowMax, colMax, ntbins);
847 }
848 }
849
850 indexes = digitsManager->GetIndexes(det);
851 indexes->SetSM(GetSM());
852 indexes->SetStack(GetStack());
853 indexes->SetLayer(GetLayer());
854 indexes->SetDetNumber(det);
855 if (indexes->IsAllocated() == kFALSE)
856 indexes->Allocate(rowMax, colMax, ntbins);
857 }
fa7427d0 858
859 Char_t padStatus = cal->GetPadStatus(det, GetCol(), GetRow());
e16f790e 860
d4232bb6 861 // ntimebins data are ready to read
862 for (it = 0; it < GetNumberOfTimeBins(); it++)
3a039a31 863 {
864 if (GetSignals()[it] > 0)
865 {
866 digits->SetDataUnchecked(GetRow(), GetCol(), it, GetSignals()[it]);
867 if(padStatus)
868 digits->SetPadStatus(GetRow(), GetCol(), it, padStatus);
869
870 indexes->AddIndexTBin(GetRow(), GetCol(), it);
c5f589b9 871 if (digitsManager->UsesDictionaries())
872 {
3a039a31 873 track0->SetDataUnchecked(GetRow(), GetCol(), it, 0);
874 track1->SetDataUnchecked(GetRow(), GetCol(), it, 0);
875 track2->SetDataUnchecked(GetRow(), GetCol(), it, 0);
876 }
877 }
878 } // tbins
d4232bb6 879 }// while Next()
880
d4232bb6 881 return det;
d4232bb6 882}
883
884//------------------------------------------------------------
885Bool_t
886AliTRDrawStreamTB::Init()
887{
888 //
e16f790e 889 // Initialize geometry and fee parameters
d4232bb6 890 //
891
892 TDirectory *saveDir = gDirectory;
893
894 if (!fGeometry)
895 {
896 fGeometry = new AliTRDgeometry();
897 }
898
899 if (!fGeometry)
900 {
901 AliError("Geometry FAILED!");
902 return kFALSE;
903 }
904
905 fTRDfeeParam = AliTRDfeeParam::Instance();
906 if (!fTRDfeeParam)
907 {
908 AliError("AliTRDfeeParam FAILED!");
909 return kFALSE;
910 }
911
912 fMaxADCgeom = (Int_t)fGeometry->ADCmax();
913
e16f790e 914 ResetCounters(); // fBufferRead is set to kFALSE - important
d4232bb6 915
916 saveDir->cd();
917
918 return kTRUE;
919}
920
d4232bb6 921//------------------------------------------------------------
922Bool_t
923AliTRDrawStreamTB::InitBuffer(void *buffer, UInt_t length)
924{
925 //
e16f790e 926 // set initial information about the buffer
d4232bb6 927 //
928
e16f790e 929 if (fgDebugFlag) AliDebug(5, Form("Equipment ID: %d",fRawReader->GetEquipmentId()));
3be28fbf 930 if (fRawReader->GetEquipmentId()<1024 || fRawReader->GetEquipmentId()>1041) //tmp protection
931 return kFALSE;
e16f790e 932
d4232bb6 933 ResetCounters();
934
935 fpBegin = (UInt_t *)buffer;
936
937 if (WORD_SIZE == 0)
938 {
e16f790e 939 AliFatal("Strange word size. size of UInt_t == 0");
d4232bb6 940 return kFALSE;
941 }
942
943 fWordLength = length/WORD_SIZE;
944 fpEnd = fpBegin + fWordLength;
945 fpPos = fpBegin;
946
947 if (fpBegin == 0 || length <= 0)
948 {
e16f790e 949 AliError(Form("Buffer size or pointer is strange. pointer to the buffer is 0x%08x of size %d", fpBegin, length));
d4232bb6 950 return kFALSE;
951 }
952
953 SwapOnEndian();
954
955 if (fgDumpHead > 0)
956 {
e16f790e 957 AliInfo(Form("---------- Dumping %u words from the beginnig of the buffer ----------",fgDumpHead));
d4232bb6 958 if (DumpWords(fpBegin, fgDumpHead) == kFALSE)
3a039a31 959 {
960 AliError("Dump failed. Not enough data.");
961 }
e16f790e 962 AliInfo(Form("---------- Dumping ended ----------------------------------------------"));
d4232bb6 963 }
964
e16f790e 965 return kTRUE;
966}
967
968//------------------------------------------------------------
969Bool_t
970AliTRDrawStreamTB::DecodeGTUheader()
971{
972 // Decode Supermodule Index Word
d4232bb6 973 DecodeSMInfo(fpPos, &fSM);
974
975 if (fgDebugFlag) AliDebug(5, DumpSMInfo(&fSM));
976
977 fpPos++;
978 if (fpPos < fpEnd)
979 {
e16f790e 980 // fSM.fHeaderSize represent additional Supermodule header size which contains additional information regarding hardware design.
981 // For the moment, we skip decoding these words
d4232bb6 982 if (SkipWords(fSM.fHeaderSize) == kTRUE)
3a039a31 983 {
984 for (Int_t istack = 0; istack < 5; istack++)
985 {
986 if (fSM.fStackActive[istack] == kFALSE)
987 continue;
d4232bb6 988
3a039a31 989 fStack = &fSM.fStacks[istack];
e16f790e 990
991 // Decode Stack Index Word of given stack
3a039a31 992 DecodeStackInfo(fpPos, fStack);
993 fpPos++;
994
995 fSM.fNexpectedHalfChambers += fStack->fActiveLinks;
996
997 if (fgDebugFlag) AliDebug(5, DumpStackInfo(fStack));
998
999 if (SkipWords(fStack->fHeaderSize-6) == kFALSE) // 6 is the 6 stack header words for 12 links
1000 {
1001 if (fRawReader) fRawReader->AddMajorErrorLog(kDecodeStackInfo, "Stack header words missing");
1002 return kFALSE;
1003 }
e16f790e 1004 for (Int_t iword=0; iword<6; iword++) // decode 6 stack header words
3a039a31 1005 {
1006 // Decode Stack Header Word of given stack
1007 DecodeStackHeader(fpPos, fStack, iword);
1008 fpPos++;
1009 }
1010 }
1011 }
d4232bb6 1012 else
3a039a31 1013 {
1014 return kFALSE;
1015 }
d4232bb6 1016 }
1017 else
1018 {
e16f790e 1019 if (fgWarnError) AliWarning("No additional sm headers and stack index words present.");
d4232bb6 1020 if (fRawReader) fRawReader->AddMajorErrorLog(kDecodeStackInfo, "Stack info missing");
1021 return kFALSE;
1022 }
1023
d4232bb6 1024 if (fpPos < fpEnd)
1025 {
e16f790e 1026 if (fgDebugFlag) AliDebug(5, "GTU headers are OK.");
d4232bb6 1027 }
1028 else
1029 {
e16f790e 1030 if (fgWarnError) AliWarning("No data just after GTU headers.");
1031 if (fRawReader) fRawReader->AddMajorErrorLog(kMissingData, "Missing sm data");
d4232bb6 1032 return kFALSE;
1033 }
1034
e16f790e 1035 if (fgDebugFlag) AliDebug(5, Form("Expected half chambers from GTU header: %d", fSM.fNexpectedHalfChambers));
1036
d4232bb6 1037 return kTRUE;
1038}
1039
1040//------------------------------------------------------------
1041Bool_t
1042AliTRDrawStreamTB::DecodeSM(void *buffer, UInt_t length)
1043{
1044 //
e16f790e 1045 // decode one sm data in buffer
d4232bb6 1046 //
1047
e16f790e 1048 ResetIterators();
d4232bb6 1049
1050 fSM.fClean = kTRUE;
e16f790e 1051 if (InitBuffer(buffer, length) == kFALSE)
d4232bb6 1052 {
e16f790e 1053 if (fgWarnError) AliError("InitBuffer failed.");
d4232bb6 1054 fSM.fClean = kFALSE;
1055 return kFALSE;
1056 }
1057
e16f790e 1058 if (DecodeGTUheader()== kFALSE)
1059 return kFALSE;
1060
d4232bb6 1061 for (Int_t istack = 0; istack < 5; istack++)
1062 {
e16f790e 1063 fStackNumber = istack;
d4232bb6 1064 if (fSM.fStackActive[istack] == kFALSE)
3a039a31 1065 continue;
d4232bb6 1066
1067 fStack = &fSM.fStacks[istack];
1068
9c7c9ec1 1069 fgLastHC = -1; // to check rob number odering
d4232bb6 1070 for (Int_t ilink = 0; ilink < 12; ilink++)
3a039a31 1071 {
1072 fStackLinkNumber = ilink;
1073 if (fStack->fLinksActive[ilink] == kFALSE)
1074 continue;
d4232bb6 1075
e16f790e 1076 // check GTU link monitor
1077 if (!(fStack->fLinksDataType[ilink] == 0 && fStack->fLinksMonitor[ilink] == 0))
1078 {
1079 fStack->fLinkMonitorError[ilink] = 1;
1080 SeekEndOfData(); // skip this HC data if GTU link monitor report error
21a48b1c 1081 fStack->fLinkMonitorError[ilink] += fNWordsCounter; // counts words of given hc having link monitor error
e16f790e 1082 continue;
1083 }
1084
3a039a31 1085 if (fpPos >= fpEnd)
1086 {
1087 if (fRawReader) fRawReader->AddMajorErrorLog(kLinkDataMissing, "Link data missing");
711edbd9 1088 if (fgWarnError) AliError("Link data missing.");
3a039a31 1089 fSM.fClean = kFALSE;
1090 break;
1091 }
d4232bb6 1092
3a039a31 1093 fHC = &fStack->fHalfChambers[ilink];
e16f790e 1094 ResetPerHC();
7e8f4d17 1095
3a039a31 1096 if (fSM.fTrackletEnable == kTRUE)
1097 {
1098 if (DecodeTracklets() == kFALSE)
1099 {
1100
1101 fSM.fClean = kFALSE;
1102 SeekEndOfData();
1103
1104 if (fgWarnError)
1105 {
1106 AliError(Form("Tracklet decoding failed stack %d link %d", fStackNumber, fStackLinkNumber));
1107 }
1108 continue;
1109 }
1110 }
1111
1112 if (fpPos >= fpEnd)
1113 {
1114 if (fRawReader) fRawReader->AddMajorErrorLog(kHCdataMissing, "HC data missing");
711edbd9 1115 if (fgWarnError) AliError("HC data missing.");
3a039a31 1116 fSM.fClean = kFALSE;
1117 break;
1118 }
1119
9c7c9ec1 1120 fgLastROB = -1; // to check mcm number odering
1121 fgLastIndex = -1 ; // to check mcm number odering
3a039a31 1122 if (DecodeHC() == kFALSE)
1123 {
1124 fSM.fClean = kFALSE;
e16f790e 1125 if (fHC->fCorrupted < 16) SeekEndOfData(); // In case that we meet END_OF_TRACKLET_MARKERNEW
1126 // during ADC data decoding or MCM header decoding
bb1009bf 1127 // we don't seek ENDOFRAWDATAMARKER
d4232bb6 1128
3a039a31 1129 if (fgWarnError)
1130 {
1131 AliError(Form("Failed HC : %s", DumpHCinfoH0(fHC)));
1132 AliError(Form("Failed HC : %s", DumpHCinfoH1(fHC)));
1133 }
1134
1135 continue;
1136 }
1137 else
1138 {
1139 SeekEndOfData(); // make sure that finish off with the end of data markers
1140 }
1141
1142 } // ilink
d4232bb6 1143 } // istack
1144
e16f790e 1145 ResetIterators(); // need to do it again for Next() function
d4232bb6 1146
1147 if (fSM.fClean == kTRUE)
1148 return kTRUE;
1149
1150 if (fgCleanDataOnly && (fSM.fClean == kFALSE))
1151 {
1ced3838 1152 if (fgWarnError)
3a039a31 1153 {
1154 AliWarning("Buffer with errors. Returning FALSE.");
1155 AliWarning(Form("--- Failed SM : %s ---", DumpSMInfo(&fSM)));
1156 }
e16f790e 1157 fSM.fActiveStacks = 0; // Next() will not give data
d4232bb6 1158 return kFALSE;
1159 }
1160
1161 return kTRUE;
1162}
1163
1164//------------------------------------------------------------
1165Int_t
1166AliTRDrawStreamTB::DecodeSM()
1167{
1168 //
1169 // decode SM data in case AliRawReader is in use
e16f790e 1170 //
d4232bb6 1171 if (fRawReader)
1172 {
1173 Int_t nextBuff = NextBuffer();
1174 while (nextBuff != -1)
3a039a31 1175 {
1176 if (nextBuff > 0)
1177 return nextBuff;
1178 nextBuff = NextBuffer();
1179 }
d4232bb6 1180 return -1;
1181 }
1182 else
1183 {
1184 AliWarning("AliRawReader not set.");
1185 }
1186 return kFALSE;
1187}
1188
1189//------------------------------------------------------------
1190Int_t
1191AliTRDrawStreamTB::DecodeSM(AliRawReader *reader)
1192{
1193 //
1194 // decode SM with the AliRawReader
1195 //
1196 if (reader != 0)
1197 {
1198 fRawReader = reader;
1199 return DecodeSM();
1200 }
1201 else
1202 {
1203 AliWarning("Argument AliRawReader is 0.");
1204 }
1205 return kFALSE;
1206}
1207
1208//------------------------------------------------------------
1209Bool_t
1210AliTRDrawStreamTB::SeekEndOfData()
1211{
1212 //
1213 // go to end of data marker
1214 //
1215 Int_t fEndOfDataCount = 0;
711edbd9 1216 fNWordsCounter = 0;
d4232bb6 1217
1218 while ( *fpPos != ENDOFRAWDATAMARKER && fpPos < fpEnd )
1219 {
1220 fpPos++;
711edbd9 1221 fNWordsCounter++;
d4232bb6 1222 }
d4232bb6 1223 while (*fpPos == ENDOFRAWDATAMARKER && fpPos < fpEnd )
1224 {
1225 fEndOfDataCount++;
1226 fpPos++;
1227 }
1228
d4232bb6 1229 return kTRUE;
1230}
1231
e16f790e 1232//------------------------------------------------------------
1233Bool_t
1234AliTRDrawStreamTB::SkipMCMdata(UInt_t iw)
1235{
1236
1237 if (fgDebugFlag) AliDebug(11,Form("Skip %d words due to MCM header corruption.",iw));
1238 UInt_t iwcounter = 0;
1239 while ( *fpPos != ENDOFRAWDATAMARKER && iwcounter < iw)
1240 {
1241 if ( *fpPos == END_OF_TRACKLET_MARKERNEW)
1242 {
1243 if (fgDebugFlag) AliDebug(11,"Met END_OF_TRACKLET_MARKERNEW");
1244 fMCM->fCorrupted += 16;
1245 fHC->fCorrupted += 16;
1246 return kFALSE;
1247 }
1248 fpPos++;
1249 iwcounter++;
1250 }
1251
1252 if (iwcounter == iw)
1253 {
1254 fpPos++;
1255 return kTRUE;
1256 }
1257
1258 if (fgDebugFlag) AliDebug(11,"Met ENDOFRAWDATAMARKER");
1259 return kFALSE;
1260}
1261
d4232bb6 1262//------------------------------------------------------------
1263Bool_t
1264AliTRDrawStreamTB::SeekNextMCMheader()
1265{
1266 //
1267 // go to mcm marker
1268 //
1269
e16f790e 1270 fpPos++;
d4232bb6 1271
1272 while ( *fpPos != ENDOFRAWDATAMARKER && fpPos < fpEnd )
1273 {
e16f790e 1274 if (MCM_HEADER_MASK_ERR(*fpPos) == 0 && MCM_HEADER_MASK_ERR(*(fpPos+1)) == 0)
3a039a31 1275 {
1276 if (fgDebugFlag) AliDebug(11,Form("^^^ Found : Pos 0x%08x : Val 0x%08x", fpPos, *fpPos));
1277 return kTRUE;
1278 }
e16f790e 1279 if ( *fpPos == END_OF_TRACKLET_MARKERNEW)
1280 {
1281 fMCM->fCorrupted += 16;
1282 fHC->fCorrupted += 16;
1283 return kFALSE;
1284 }
d4232bb6 1285 fpPos++;
1286 }
1287
1288 SeekEndOfData();
1289 return kFALSE;
1290}
1291
1292//------------------------------------------------------------
1293
1294Bool_t
1295AliTRDrawStreamTB::DecodeTracklets()
1296{
1297 //
1298 // decode tracklets
1299 //
1300
1301 fLinkTrackletCounter = 0;
1302 fEndOfTrackletCount = 0;
3be28fbf 1303 fHC->fNTracklets = 0;
d4232bb6 1304
21a48b1c 1305 for (Int_t i = 0; i < MAX_TRACKLETS_PERHC; i++)
1306 fHC->fTrackletWords[i] = 0;
e16f790e 1307
d4232bb6 1308 if (fgDebugFlag) AliDebug(10, Form("Decode tracklets at 0x%08x : 0x%08x", fpPos, *fpPos));
d4232bb6 1309
1310 while ( *fpPos != END_OF_TRACKLET_MARKEROLD && *fpPos != END_OF_TRACKLET_MARKERNEW && fpPos < fpEnd )
1311 {
d4232bb6 1312 if (fgDebugFlag) AliDebug(10, Form("Tracklet found at 0x%08x : 0x%08x", fpPos, *fpPos));
1313
d4232bb6 1314 fLinkTrackletCounter++;
1315
1316 if (fLinkTrackletCounter > MAX_TRACKLETS_PERHC)
3a039a31 1317 {
1318 if (fgDebugFlag) AliDebug(11,Form("Max number of tracklets exceeded %d > %d.",
1319 fLinkTrackletCounter, MAX_TRACKLETS_PERHC));
1320 if (fRawReader) fRawReader->AddMajorErrorLog(kTrackletOverflow,"Too many tracklets");
e16f790e 1321 fHC->fTrackletError = 1;
3a039a31 1322 return kFALSE;
1323 }
d4232bb6 1324
21a48b1c 1325 fHC->fTrackletWords[fLinkTrackletCounter-1] = UInt_t(*fpPos); //store tracklet words into array
9c7c9ec1 1326 fHC->fNTracklets = fLinkTrackletCounter;
d4232bb6 1327 fpPos++;
1328 }
1329
1330 while ( ( *fpPos == END_OF_TRACKLET_MARKEROLD || *fpPos == END_OF_TRACKLET_MARKERNEW ) && fpPos < fpEnd )
1331 {
d4232bb6 1332 if (fgDebugFlag) AliDebug(10, Form("EoTracklets found at 0x%08x : 0x%08x", fpPos, *fpPos));
1333
1334 fEndOfTrackletCount++;
1335 fpPos++;
1336 }
1337
1338 if ( fEndOfTrackletCount < 2 )
1339 {
e16f790e 1340 if (fgDebugFlag) AliDebug(11,"End of tracklets word missing");
d4232bb6 1341 if (fRawReader) fRawReader->AddMajorErrorLog(kEOTrackeltsMissing, "End of tracklets word missing");
e16f790e 1342 fHC->fTrackletError += 2;
d4232bb6 1343 return kFALSE;
1344 }
1345
1346 return kTRUE;
1347}
1348
1349//------------------------------------------------------------
1350Bool_t
1351AliTRDrawStreamTB::IsRowValid()
1352{
d4232bb6 1353 if ( (fHC->fStack == 2 && fMCM->fROW >= fGeometry->RowmaxC0()) ||
3a039a31 1354 (fHC->fStack != 2 && fMCM->fROW >= fGeometry->RowmaxC1()) || fMCM->fROW < 0 )
d4232bb6 1355 {
e16f790e 1356 if (fgDebugFlag) AliDebug(11,Form("SM%d L%dS%d: Wrong Padrow (%d) fROB=%d, fSIDE=%d, fMCM=%02d"
3a039a31 1357 , fHC->fSM, fHC->fLayer, fHC->fStack, fMCM->fROW, fMCM->fROB, fHC->fSide, fMCM->fMCM ));
d4232bb6 1358 return kFALSE;
1359 }
1360 return kTRUE;
1361}
1362
1363//------------------------------------------------------------
1364Bool_t
1365AliTRDrawStreamTB::IsMCMheaderOK()
1366{
1367 //
1368 // check the mcm header
1369 //
1370
9c7c9ec1 1371 if (fgLastROB != fMCM->fROB)
1372 {
1373 fgLastIndex = 0;
1374 if (fgLastROB== -1) fgLastROB = fMCM->fROB;
1375 }
1376 else
1377 {
1378 Int_t matchingcounter = 0;
1379 for (Int_t i=fgLastIndex+1; i<16; i++)
3a039a31 1380 {
1381 if ( fMCM->fMCM == fgMCMordering[i] )
1382 {
1383 fgLastIndex = i;
1384 matchingcounter++;
1385 break;
1386 }
1387 }
9c7c9ec1 1388 if (matchingcounter == 0)
1389 {
1390 fMCM->fMCMhdCorrupted += 2;
1391 AliDebug(11,Form("MCM number from last MCM is larger: MCM # from last MCM %d, MCM # from current MCM %d \n",(fMCM-1)->fMCM, fMCM->fMCM));
1392 }
1393 }
1394
1395 if ( fgLastHC == fHC->fLayer*2 + fHC->fSide )
1396 {
1397 if ( fMCM->fROB < (fMCM-1)->fROB )
1398 {
3a039a31 1399 fMCM->fMCMhdCorrupted += 2;
1400 AliDebug(11,Form("ROB number from last MCM is larger: ROB # from last MCM %d, ROB # from current MCM %d \n",(fMCM-1)->fROB, fMCM->fROB));
9c7c9ec1 1401 }
1402 else fgLastROB = fMCM->fROB;
1403 }
3a039a31 1404
9c7c9ec1 1405 fgLastHC = fHC->fLayer*2 + fHC->fSide;
3a039a31 1406
9c7c9ec1 1407 /*
1408 // this check will come back later again when we have "patched MCM map"
e16f790e 1409 int expectedROB = -1;
1410 if(!fHC->fSide) expectedROB = int(fHC->fMCMmax/16)*2;
1411 else expectedROB = int(fHC->fMCMmax/16)*2 + 1;
1412 int expectedMCM = 4*(3-int((fHC->fMCMmax%16)/4)) + fHC->fMCMmax%4;
d4232bb6 1413
e16f790e 1414 if ( expectedROB != fMCM->fROB || expectedMCM != fMCM->fMCM)
d4232bb6 1415 {
e16f790e 1416 fMCM->fMCMhdCorrupted += 2;
1417 AliDebug(11,Form("ROB expected %d ROB read %d, MCM expected %d MCM read %d\n",expectedROB, fMCM->fROB, expectedMCM, fMCM->fMCM));
d4232bb6 1418 }
9c7c9ec1 1419 */
d4232bb6 1420
e16f790e 1421 // below two conditions are redundant
1422 /*
d4232bb6 1423 if ( fMCM->fMCM < 0 || fMCM->fMCM > 15 || fMCM->fROB < 0 || fMCM->fROB > 7 )
1424 {
e16f790e 1425 fMCM->fMCMhdCorrupted += 8; // need to assign new number
1426 if (fgDebugFlag) AliDebug(11,Form("ROB or MCM number is out of range. %s\n", DumpMCMinfo(fMCM)));
d4232bb6 1427 }
d4232bb6 1428 if (IsRowValid() == kFALSE)
e16f790e 1429 {
1430 fMCM->fMCMhdCorrupted += 16; // need to assign new number
1431 }
1432 */
1433
bb1009bf 1434 if (fEventCounter == 0)
1435 {
1436 fEventCounter = fMCM->fEvCounter;
1437 }
1438
e16f790e 1439 if (fEventCounter != fMCM->fEvCounter)
bb1009bf 1440 {
e16f790e 1441 fMCM->fMCMhdCorrupted += 4; if (fgDebugFlag) AliDebug(11,Form("Event number(%d) of current MCM is different from that(%d) of reference MCM %s.\n", fMCM->fEvCounter, fEventCounter, DumpMCMinfo(fMCM)));
bb1009bf 1442 }
1443
e16f790e 1444 if (fEventCounter < fLastEventCounter)
bb1009bf 1445 {
e16f790e 1446 fMCM->fMCMhdCorrupted += 8; if (fgDebugFlag) AliDebug(11,Form("Event from the past? Current %d Last %d %s.\n", fEventCounter, fLastEventCounter, DumpMCMinfo(fMCM)));
bb1009bf 1447 }
1448
e16f790e 1449 if ( fMCM->fADCmaskCorrupted > 0 )
1450 return kFALSE;
1451
1452 if ( fMCM->fMCMhdCorrupted > 0 )
1453 return kFALSE;
1454
bb1009bf 1455 return kTRUE;
1456}
1457
d4232bb6 1458//------------------------------------------------------------
1459Bool_t
1460AliTRDrawStreamTB::DecodeMCMheader()
1461{
1462 //
1463 // decode the mcm header
1464 //
1465
bb1009bf 1466 DecodeMCMheader(fpPos, fMCM);
3be28fbf 1467
1468 if (fDumpingEnable)
1469 {
1470 if (fMCM->fMCM == fDumpingMCM)
1471 {
1472 if (fMCM->fROB == fDumpingROB && fHC->fLayer == fDumpingLayer)
1473 {
1474 if (fHC->fSM == fDumpingSM && fHC->fStack == fDumpingStack)
1475 {
1476 if (fgDebugFlag) {
21a48b1c 1477 AliDebug(5,DumpHCinfoH0(fHC));
1478 AliDebug(5,DumpMCMinfo(fMCM));
3be28fbf 1479 }
1480 DumpWords(fpPos, 212);
1481 }
1482 }
1483 }
1484 }
1485
bb1009bf 1486 if (fHC->fCorrupted >= 16)
1487 {
1488 fpPos--;
1489 return kFALSE;
1490 }
d4232bb6 1491
bb1009bf 1492 fMCM->fROW = fTRDfeeParam->GetPadRowFromMCM(fMCM->fROB, fMCM->fMCM);
d4232bb6 1493
bb1009bf 1494 if ((fHC->fRawVMajor > 2 && fHC->fRawVMajor <5) || (fHC->fRawVMajor > 31 && fHC->fRawVMajor < 64)) //cover old and new version definition of ZS data
d4232bb6 1495 {
1496 fpPos++;
1497 if ( fpPos < fpEnd )
3a039a31 1498 {
1499 DecodeMask(fpPos, fMCM);
bb1009bf 1500 if (fHC->fCorrupted >= 16)
1501 {
1502 fpPos--;
1503 return kFALSE;
1504 }
3a039a31 1505 MCMADCwordsWithTbins(fHC->fTimeBins, fMCM);
1506 fMCM->fAdcDataPos = fpPos + 1;
1507 }
d4232bb6 1508 else
3a039a31 1509 {
1510 if (fgDebugFlag) AliDebug(11,"Expected ADC mask word. Fail due to buffer END.");
1511 if (fRawReader) fRawReader->AddMajorErrorLog(kMCMADCMaskMissing,"Missing");
e16f790e 1512 fHC->fCorrupted += 32;
3a039a31 1513 return kFALSE;
1514 }
d4232bb6 1515 }
1516 else
1517 {
1518 UInt_t dummyMask = MCM_DUMMY_ADCMASK_VAL;
bb1009bf 1519 DecodeMask(&dummyMask, fMCM);
d4232bb6 1520 MCMADCwordsWithTbins(fHC->fTimeBins, fMCM);
1521 fMCM->fAdcDataPos = fpPos + 1;
1522 }
1523
1524 if (fgDebugFlag)
1525 {
1526 AliDebug(6, DumpMCMinfo(fMCM));
1527 AliDebug(7, DumpMCMadcMask(fMCM));
1528 }
1529
1530 if (IsMCMheaderOK() == kFALSE)
d4232bb6 1531 return kFALSE;
3a039a31 1532
d4232bb6 1533 return kTRUE;
d4232bb6 1534}
1535
1536//------------------------------------------------------------
1537Bool_t
1538AliTRDrawStreamTB::IsHCheaderOK()
1539{
1540 //
e16f790e 1541 // check insanity of half chamber header
d4232bb6 1542 //
1543
e16f790e 1544 if (fHC->fStack < 0 || fHC->fStack > 4)
d4232bb6 1545 {
e16f790e 1546 if (fgDebugFlag) AliDebug(11,Form("Wrong Stack %d", fHC->fStack));
1547 return kFALSE;
1548 }
d4232bb6 1549
e16f790e 1550 if (fHC->fLayer < 0 || fHC->fLayer >= AliTRDgeometry::kNlayer)
1551 {
1552 if (fgDebugFlag) AliDebug(11,Form("Wrong layer %d", fHC->fLayer));
d4232bb6 1553 return kFALSE;
1554 }
1555
e16f790e 1556 if (fHC->fSide < 0 || fHC->fSide > 1)
d4232bb6 1557 {
e16f790e 1558 if (fgDebugFlag) AliDebug(11,Form("Wrong Side %d", fHC->fSide));
d4232bb6 1559 return kFALSE;
1560 }
1561
6bd744d3 1562 if (fgStackNumberChecker)
d4232bb6 1563 {
3a039a31 1564 if (fHC->fStack != fStackNumber)
1565 {
e16f790e 1566 if (fgDebugFlag) AliDebug(11,Form("Missmatch: Stack number between HC header %d and GTU link mask %d",
3a039a31 1567 fHC->fStack, fStackNumber));
6bd744d3 1568 fStackNumber = -1;
1569 return kFALSE;
3a039a31 1570 }
d4232bb6 1571 }
1572
7e8f4d17 1573 if (fgStackLinkNumberChecker)
d4232bb6 1574 {
3a039a31 1575 //if (fHC->fLayer * 2 + fHC->fSide != fStackLinkNumber)
1576 // let it make flexible to consider known fiber swapping
1577 if ((fHC->fLayer * 2 != fStackLinkNumber) && (fHC->fLayer * 2 != fStackLinkNumber - 1))
1578 {
e16f790e 1579 if (fgDebugFlag) AliDebug(11,Form("Missmatch: Layer number between HC header %d and GTU link mask %d | %s",
3a039a31 1580 fHC->fLayer, fStackLinkNumber, DumpStackInfo(fStack)));
e16f790e 1581 fStackLinkNumber = -1;
1582 return kFALSE;
3a039a31 1583 }
d4232bb6 1584 }
1585
e16f790e 1586 // SLOW GEOM : consistancy check with geometry
d4232bb6 1587 fHC->fDET = fGeometry->GetDetector(fHC->fLayer, fHC->fStack, fHC->fSM);
1588 if (fHC->fDET < 0 || fHC->fDET >= AliTRDgeometry::kNdet)
1589 {
e16f790e 1590 if (fgDebugFlag) AliDebug(11,Form("Wrong detector %d", fHC->fDET));
d4232bb6 1591 if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongDet, "Wrong Det");
1592 return kFALSE;
1593 }
1594
d4232bb6 1595 if (fHC->fSM != fGeometry->GetSector(fHC->fDET)
053767a4 1596 || fHC->fSM <0 || fHC->fSM >= AliTRDgeometry::kNsector)
d4232bb6 1597 {
e16f790e 1598 if (fgDebugFlag) AliDebug(11,Form("Wrong SM(sector) %d (Geometry says: %d) Stack=%d Layer=%d Det=%d",
3a039a31 1599 fHC->fSM, fGeometry->GetSector(fHC->fDET),
1600 fHC->fStack, fHC->fLayer, fHC->fDET));
d4232bb6 1601 if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongSM, "Wrong SM");
1602 return kFALSE;
1603 }
1604
d4232bb6 1605 fHC->fROC = fGeometry->GetDetectorSec(fHC->fLayer, fHC->fStack);
1606 if (fHC->fROC < 0)
1607 {
1608 if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongROC, "Wrong ROC");
1609 return kFALSE;
1610 }
1611
1612 fHC->fRowMax = fGeometry->GetRowMax(fHC->fLayer, fHC->fStack, fHC->fSM);
1613 if (fHC->fRowMax < 1)
1614 {
1615 if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongROC, "Wrong ROC Row Max");
1616 return kFALSE;
1617 }
1618
1619 fHC->fColMax = fGeometry->GetColMax(fHC->fROC);
1620 if (fHC->fColMax < 1)
1621 {
1622 if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderWrongROC, "Wrong ROC Col Max");
1623 return kFALSE;
1624 }
d4232bb6 1625
1626 return kTRUE;
1627}
1628
1629//------------------------------------------------------------
1630Bool_t
1631AliTRDrawStreamTB::DecodeHCheader()
1632{
1633 //
1634 // decode the half chamber header
1635 //
1636
e16f790e 1637 if (DecodeHCwordH0(fpPos, fHC) == kFALSE)
1638 return kFALSE;
d4232bb6 1639
1640 if (fHC->fNExtraWords > 0)
1641 {
1642 fpPos++;
1643 if (fpPos < fpEnd)
3a039a31 1644 {
1645 if (DecodeHCwordH1(fpPos, fHC) == kFALSE)
e16f790e 1646 return kFALSE;
3a039a31 1647 }
d4232bb6 1648 else
3a039a31 1649 {
1650 if (fgDebugFlag) AliDebug(11,"Expected HC header word 1. Fail due to buffer END.");
1651 if (fRawReader) fRawReader->AddMajorErrorLog(kHCWordMissing,"Next HC word 1 (count from 0) missing");
1652 return kFALSE;
1653 }
d4232bb6 1654 }
1655
1656 if (fgDebugFlag) AliDebug(5, DumpHCinfoH0(fHC));
1657 if (fgDebugFlag) AliDebug(5, DumpHCinfoH1(fHC));
1658
1659 fHC->fDET = -1;
1660 if (IsHCheaderOK() == kFALSE)
1661 {
e16f790e 1662 fHC->fH0Corrupted += 2;
1663 if (fgDebugFlag) AliDebug(11,Form("H0 Header Insane. Word 0x%08x", *fHC->fPos));
d4232bb6 1664 return kFALSE;
1665 }
1666
1667 return kTRUE;
1668}
1669
1670//------------------------------------------------------------
1671Bool_t
1672AliTRDrawStreamTB::DecodeHC()
1673{
1674 //
e16f790e 1675 // decode hc header and data
d4232bb6 1676 //
1677
1678 if (DecodeHCheader() == kFALSE)
1679 {
e16f790e 1680 if (fgWarnError) AliWarning(Form("HC Header decode failed. H0 Error: %d H1 Error: %d",fHC->fH0Corrupted,fHC->fH1Corrupted));
1681 if (fRawReader) fRawReader->AddMajorErrorLog(kHCHeaderCorrupt, "HC header corrupted");
d4232bb6 1682 return kFALSE;
1683 }
1684 else
1685 {
1686 fpPos++;
1687 if (fpPos >= fpEnd)
3a039a31 1688 {
e16f790e 1689 fHC->fCorrupted += 1;
3a039a31 1690 if (fgDebugFlag) AliDebug(11,"No MCM data? Not enough data in the buffer.");
1691 if (fRawReader) fRawReader->AddMajorErrorLog(kMCMdataMissing, "MCM data missing");
1692 return kFALSE;
1693 }
d4232bb6 1694 }
1695
1696 fHC->fMCMmax = 0;
1697 while (*fpPos != ENDOFRAWDATAMARKER && fpPos < fpEnd)
1698 {
1699 if (fHC->fMCMmax > TRD_MAX_MCM)
3a039a31 1700 {
e16f790e 1701 fHC->fCorrupted += 2;
3a039a31 1702 if (fgDebugFlag) AliDebug(11,"More mcm data than expected!");
1703 if (fRawReader) fRawReader->AddMajorErrorLog(kMCMoverflow, "Too many mcms found!");
1704 return kFALSE;
1705 }
d4232bb6 1706
1707 fMCM = &fHC->fMCMs[fHC->fMCMmax];
1708
1709 if (DecodeMCMheader() == kFALSE)
3a039a31 1710 {
e16f790e 1711 if (fHC->fCorrupted < 4) fHC->fCorrupted += 4; // benchmark hc data corruption as 4
3a039a31 1712
1713 if (fgSkipData == kTRUE || fHC->fCorrupted >= 16)
e16f790e 1714 return kFALSE; // stop HC data reading
1715
1716 fHC->fMCMmax++; // increase mcm counter to match with expected rob/mcm number
1717
1718 // in case we decide to keep reading data, skip this mcm data and find next mcm header
1719 if (fMCM->fADCmaskCorrupted < 2)
1720 {
1721 if (SkipMCMdata(fMCM->fADCcount*fMCM->fSingleADCwords) == kFALSE)
3a039a31 1722 return kFALSE;
e16f790e 1723 continue;
1724 }
1725 else
1726 {
1727 if (SeekNextMCMheader() == kFALSE)
3a039a31 1728 return kFALSE;
e16f790e 1729 continue;
1730 }
3a039a31 1731 }
d4232bb6 1732
1733 fHC->fMCMmax++;
3a039a31 1734
d4232bb6 1735 if (fMCM->fADCmax > 0)
3a039a31 1736 {
1737 fpPos++;
1738 if (fpPos >= fpEnd)
1739 {
e16f790e 1740 fMCM->fCorrupted += 1;
1741 if (fHC->fCorrupted < 4) fHC->fCorrupted += 4; // benchmark hc data corruption as 4
3a039a31 1742 if (fgDebugFlag) AliDebug(9, Form("Buffer short of data. ADC data expected."));
1743 return kFALSE;
1744 }
dc25a859 1745
3a039a31 1746 for (Int_t iadc = 0; iadc < fMCM->fADCmax; iadc++)
1747 {
1748 fADC = &fMCM->fADCs[iadc];
1749 fADC->fADCnumber = fMCM->fADCchannel[iadc];
d4232bb6 1750
3a039a31 1751 if (fgDebugFlag) AliDebug(9, Form("This is ADC %d of %d. ADC number is %d.",
1752 iadc+1, fMCM->fADCmax, fMCM->fADCchannel[iadc]));
d4232bb6 1753
3a039a31 1754 if (fpPos + fMCM->fSingleADCwords >= fpEnd)
1755 {
1756
e16f790e 1757 fMCM->fCorrupted += 2;
1758 if (fHC->fCorrupted < 4) fHC->fCorrupted += 4; // benchmark hc data corruption as 4
3a039a31 1759 if (fgDebugFlag) AliDebug(11,"ADC (10 words) expected. Not enough data in the buffer.");
1760 return kFALSE;
1761 }
d4232bb6 1762
bb1009bf 1763 if (fHC->fRawVMajor < 64) // normal(real) ADC data
1764 {
3a039a31 1765 if (DecodeADC() == kFALSE)
1766 {
e16f790e 1767 if (fMCM->fCorrupted < 4) fMCM->fCorrupted += 4; // benchmark mcm data corruption as 4
21a48b1c 1768 if (fHC->fCorrupted < 4) fHC->fCorrupted += 4; // benchmark hc data corruption as 4
3a039a31 1769 if (fADC->fIsShared && fADC->fCorrupted == 16) // check if we are out of the det when the pad is shared
1770 {
1771 fADC->fCOL = -1;
1772 fpPos = fADC->fPos + fMCM->fSingleADCwords;
1773 }
1774 else
1775 {
1776 if (fgDebugFlag) AliDebug(11,Form("ADC decode failed."));
1777 if (fgSkipData == kTRUE || fHC->fCorrupted >= 16)
1778 return kFALSE; // stop HC data reading
1779 }
1780 }
bb1009bf 1781 }
1782 else // test pattern data
dc25a859 1783 {
e16f790e 1784 if (fgWarnError) AliError("These are test pattern data. You need other reader"); // will be served in other class
bb1009bf 1785 }
3a039a31 1786 }
1787 }
d4232bb6 1788 else
3a039a31 1789 {
1790 fpPos++;
1791 }
d4232bb6 1792 }//while eof data
1793
1794 if (fpPos >= fpEnd)
1795 {
e16f790e 1796 if (fgDebugFlag) AliDebug(11,"We are at the end of buffer. There should be one more word left.");
d4232bb6 1797 return kFALSE;
1798 }
1799
1800 return kTRUE;
1801}
d4232bb6 1802//------------------------------------------------------------
dc25a859 1803
d4232bb6 1804Bool_t
1805AliTRDrawStreamTB::DecodeADC()
1806{
1807 //
1808 // decode single ADC channel
1809 //
1810
1811 fADC->fCorrupted = 0;
2e2bc4a1 1812 if(fADC->fADCnumber%2==1) fMaskADCword = ADC_WORD_MASK(ADCDATA_VAL1);
1813 if(fADC->fADCnumber%2==0) fMaskADCword = ADC_WORD_MASK(ADCDATA_VAL2);
1814
d4232bb6 1815 fADC->fPos = fpPos;
d4232bb6 1816 fTbinADC = 0;
1817
1818 for (Int_t i = 0; i < TRD_MAX_TBINS; i++)
1819 fADC->fSignals[i] = 0;
1820
1821 for (Int_t iw = 0; iw < fMCM->fSingleADCwords; iw++)
1822 {
bb1009bf 1823 if (HC_HEADER_MASK_ERR(*fpPos) == 0 || *fpPos == END_OF_TRACKLET_MARKERNEW)
1824 {
1825 if (fgWarnError) AliError(Form("There should be ADC data. We meet HC header or END_OF_TRACKLET_MARKER 0x%08x",*fpPos));
3a039a31 1826 fADC->fCorrupted += 16;
bb1009bf 1827 fHC->fCorrupted += 16;
1828 fpPos--;
1829
1830 return kFALSE;
1831 }
d4232bb6 1832 if (fMaskADCword != ADC_WORD_MASK(*fpPos))
3a039a31 1833 {
1834 fADC->fCorrupted += 1;
e16f790e 1835 if (fgDebugFlag) AliDebug(11,Form("Wrong ADC data mask! ADC channel number: %02d [Expected mask: 0x%08x Current mask: 0x%08x] MCM= %s Error : %d",
3a039a31 1836 fADC->fADCnumber, fMaskADCword, ADC_WORD_MASK(*fpPos),DumpMCMinfo(fMCM),fADC->fCorrupted));
e16f790e 1837 fpPos++;
3a039a31 1838 continue;
1839 }
1ced3838 1840
1841 // here we subtract the baseline ( == common additive)
1842 fADC->fSignals[fTbinADC + 0] = ((*fpPos & 0x00000ffc) >> 2) - fgCommonAdditive;
1843 fADC->fSignals[fTbinADC + 1] = ((*fpPos & 0x003ff000) >> 12) - fgCommonAdditive;
1844 fADC->fSignals[fTbinADC + 2] = ((*fpPos & 0xffc00000) >> 22) - fgCommonAdditive;
d4232bb6 1845
1846 fTbinADC += 3;
1847 fpPos++;
1848 }
1849
1850 if (fADC->fADCnumber <= 1 || fADC->fADCnumber == fMaxADCgeom - 1)
1851 {
1852 fADC->fIsShared = kTRUE;
1853 }
1854 else
1855 {
1856 fADC->fIsShared = kFALSE;
1857 }
1858
1859 if ( fADC->fADCnumber >= fMaxADCgeom - 1)
1860 {
d4232bb6 1861 fADC->fCOL = AliTRDfeeParam::Instance()->GetPadColFromADC(fMCM->fROB, fMCM->fMCM, fADC->fADCnumber - 1);
1862 fADC->fCOL--;
1863 }
1864 else
1865 {
1866 fADC->fCOL = fTRDfeeParam->GetPadColFromADC(fMCM->fROB, fMCM->fMCM, fADC->fADCnumber);
1867 }
1868
1869 if (fADC->fCOL >= fHC->fColMax || fADC->fCOL < 0)
1870 {
1871 if (fADC->fIsShared == kFALSE)
3a039a31 1872 {
1873 fADC->fCorrupted += 32;
1874 if (fgDebugFlag) AliDebug(11,Form("Wrong column! ADCnumber %d MaxIs %d Col %d MaxIs %d MCM= %s",
1875 fADC->fADCnumber, fMaxADCgeom, fADC->fCOL, fHC->fColMax, DumpMCMinfo(fMCM)));
1876 }
3be28fbf 1877 //else
3a039a31 1878 //{
1879 // we are out of the det when the pad is shared
1880 //if (fgDebugFlag) AliDebug(11, Form("Column out of the detector! ADCnumber %d MaxIs %d Col %d MaxIs %d MCM= %s",
1881 // fADC->fADCnumber, fMaxADCgeom, fADC->fCOL, fHC->fColMax, DumpMCMinfo(fMCM)));
1882 //fADC->fCorrupted += 32;
1883 //}
d4232bb6 1884 }
1885
1886 if (fADC->fCorrupted > 0)
1887 {
1888 return kFALSE;
1889 }
1890
1891 fDecodedADCs++;
1892 return kTRUE;
1893}
dc25a859 1894
d4232bb6 1895//--------------------------------------------------------
dc25a859 1896
bb1009bf 1897
d4232bb6 1898void AliTRDrawStreamTB::DecodeSMInfo(const UInt_t *word, struct AliTRDrawSM *sm) const
1899{
1900 //
e16f790e 1901 // Decode Supermodule Index Word
1902 // The Supermodule Index Word is a 32-Bit word wit following structure
1903 // ssssssss ssssssss vvvv rrrr r d t mmmm
1904 // s: Size of the Supermodule Header, v: Supermodule Header Version, r: Reserved for future use
1905 // d: Track Data Enabled Bit, t: Tracklet Data Enabled Bit, m: Stack Mask
d4232bb6 1906 //
e16f790e 1907 sm->fPos = (UInt_t*)word;
d4232bb6 1908
d4232bb6 1909 UInt_t vword = *word;
1910 sm->fHeaderSize = SM_HEADER_SIZE(vword);
1911
1912 if (TRACKLETS_ENABLED(vword) > 0)
1913 sm->fTrackletEnable = kTRUE;
1914 else
1915 sm->fTrackletEnable = kFALSE;
1916
1917 UInt_t stackMask = STACK_MASK(vword);
1918 sm->fActiveStacks = 0;
1919 for (Int_t i = 0; i < 5; i++)
1920 {
d4232bb6 1921 if (IS_BIT_SET(stackMask,i) > 0)
3a039a31 1922 {
1923 sm->fStackActive[i] = kTRUE;
1924 sm->fActiveStacks++;
1925 }
d4232bb6 1926 else
3a039a31 1927 {
1928 sm->fStackActive[i] = kFALSE;
1929 }
d4232bb6 1930 }
1931}
1932
1933//--------------------------------------------------------
1934const char *AliTRDrawStreamTB::DumpSMInfo(const struct AliTRDrawSM *sm)
1935{
1936 //
1937 // Get SM structure into a const char
1938 //
d4232bb6 1939 return Form("[ SM Info 0x%08x] : Hsize %d TrackletEnable %d Stacks %d %d %d %d %d",
3a039a31 1940 *sm->fPos,
1941 sm->fHeaderSize, sm->fTrackletEnable,
1942 sm->fStackActive[0], sm->fStackActive[1], sm->fStackActive[2],
1943 sm->fStackActive[3], sm->fStackActive[4]);
d4232bb6 1944}
1945
1946//--------------------------------------------------------
1947void AliTRDrawStreamTB::DecodeStackInfo(const UInt_t *word, struct AliTRDrawStack *st) const
1948{
1949 //
e16f790e 1950 // Decode Stack #i Index Word
1951 // The Stack #i Index Word is a 32-Bit word wit following structure
1952 // ssssssss ssssssss vvvv mmmm mmmmmmmm
1953 // s: Size of the Stack #i Header, v: Supermodule Header Version, m: Link Mask
d4232bb6 1954 //
d4232bb6 1955 st->fPos = (UInt_t*)word;
1956
d4232bb6 1957 UInt_t vword = *word;
1958 st->fHeaderSize = STACK_HEADER_SIZE(vword);
1959
1960 UInt_t linkMask = STACK_LINK_WORD(vword);
1961 st->fActiveLinks = 0;
1962 for (Int_t i = 0; i < 12; i++)
1963 {
d4232bb6 1964 if (IS_BIT_SET(linkMask,i) > 0)
3a039a31 1965 {
1966 st->fLinksActive[i] = kTRUE;
1967 st->fActiveLinks++;
1968 }
d4232bb6 1969 else
3a039a31 1970 {
1971 st->fLinksActive[i] = kFALSE;
1972 }
d4232bb6 1973 }
1974}
1975
e16f790e 1976//--------------------------------------------------------
1977void AliTRDrawStreamTB::DecodeStackHeader(const UInt_t *word, struct AliTRDrawStack *st, Int_t iword) const
1978{
1979 st->fPos = (UInt_t*)word;
1980
1981 UInt_t vword = *word;
1982 st->fLinksDataType[2*iword] = LINK0_DATA_TYPE_FLAG(vword);
1983 st->fLinksMonitor[2*iword] = LINK0_MONITOR_FLAG(vword);
1984 st->fLinksDataType[2*iword+1] = LINK1_DATA_TYPE_FLAG(vword);
1985 st->fLinksMonitor[2*iword+1] = LINK1_MONITOR_FLAG(vword);
1986}
1987
d4232bb6 1988//--------------------------------------------------------
1989const char *AliTRDrawStreamTB::DumpStackInfo(const struct AliTRDrawStack *st)
1990{
1991 //
1992 // format the string with the stack info
1993 //
1e7cdb95 1994
d4232bb6 1995 return Form("[ Stack Info 0x%08x ] : Hsize %d Links Active %d %d %d %d %d %d %d %d %d %d %d %d",
3a039a31 1996 *st->fPos,
1997 st->fHeaderSize,
1998 st->fLinksActive[0], st->fLinksActive[1], st->fLinksActive[2], st->fLinksActive[3],
1999 st->fLinksActive[4], st->fLinksActive[5], st->fLinksActive[6], st->fLinksActive[7],
2000 st->fLinksActive[8], st->fLinksActive[9], st->fLinksActive[10], st->fLinksActive[11]);
1e7cdb95 2001
d4232bb6 2002}
2003
2004//--------------------------------------------------------
e16f790e 2005Bool_t AliTRDrawStreamTB::DecodeHCwordH0(const UInt_t *word, struct AliTRDrawHC *hc) const
d4232bb6 2006{
2007 //
2008 // decode the hc header word 0
2009 //
d4232bb6 2010 UInt_t vword = *word;
2011
e16f790e 2012 hc->fH0Corrupted = HC_HEADER_MASK_ERR(vword);
2013 if (hc->fH0Corrupted > 0)
d4232bb6 2014 {
3a039a31 2015 if (fgDebugFlag) AliDebug(11,Form("H0 Header Mask Error. Word 0x%08x", *fHC->fPos));
2016 return kFALSE;
d4232bb6 2017 }
2018
2019 hc->fSpecialRawV = HC_SPECIAL_RAW_VERSION(vword);
2020 hc->fRawVMajor = HC_MAJOR_RAW_VERSION(vword);
dc25a859 2021 hc->fRawVMajorOpt = HC_MAJOR_RAW_VERSION_OPT(vword);
d4232bb6 2022 hc->fRawVMinor = HC_MINOR_RAW_VERSION(vword);
2023 hc->fNExtraWords = HC_EXTRA_WORDS(vword);
2024 hc->fDCSboard = HC_DCS_BOARD(vword);
2025 hc->fSM = HC_SM_NUMBER(vword);
2026 hc->fStack = HC_STACK_NUMBER(vword);
2027 hc->fLayer = HC_LAYER_NUMBER(vword);
2028 hc->fSide = HC_SIDE_NUMBER(vword);
2029
2030 hc->fPos[0] = (UInt_t*)word;
2031
e16f790e 2032 return kTRUE;
d4232bb6 2033}
2034
2035//--------------------------------------------------------
e16f790e 2036Bool_t AliTRDrawStreamTB::DecodeHCwordH1(const UInt_t *word, struct AliTRDrawHC *hc) const
d4232bb6 2037{
2038 //
e16f790e 2039 // decode the hc header word 1
d4232bb6 2040 //
2041
d4232bb6 2042 UInt_t vword = *word;
2043
e16f790e 2044 hc->fH1Corrupted = HC_HEADER_MASK_ERR(vword);
2045 if (hc->fH1Corrupted > 0)
2046 {
3a039a31 2047 if (fgDebugFlag) AliDebug(11,Form("H1 Header Mask Error. Word 0x%08x", *fHC->fPos));
2048 return kFALSE;
d4232bb6 2049 }
2050
2051 hc->fTimeBins = HC_NTIMEBINS(vword);
2052 hc->fBunchCrossCounter = HC_BUNCH_CROSS_COUNTER(vword);
2053 hc->fPreTriggerCounter = HC_PRETRIGGER_COUNTER(vword);
2054 hc->fPreTriggerPhase = HC_PRETRIGGER_PHASE(vword);
2055
2056 hc->fPos[1] = (UInt_t*)word;
e16f790e 2057
2058 return kTRUE;
d4232bb6 2059}
2060
2061//--------------------------------------------------------
2062const char *AliTRDrawStreamTB::DumpHCinfoH0(const struct AliTRDrawHC *hc)
2063{
2064 //
e16f790e 2065 // dump the hc header word 0
d4232bb6 2066 //
2067 if (!hc)
2068 return Form("Unable to dump. Null received as parameter!?!");
2069 else
2070 return Form("[ HC[0] at 0x%08x ] : 0x%08x Info is : RawV %d SM %d Stack %d Layer %d Side %d DCSboard %d",
3a039a31 2071 hc->fPos[0], *(hc->fPos[0]), hc->fRawVMajor, hc->fSM, hc->fStack, hc->fLayer, hc->fSide, hc->fDCSboard);
d4232bb6 2072}
2073
2074//--------------------------------------------------------
2075const char *AliTRDrawStreamTB::DumpHCinfoH1(const struct AliTRDrawHC *hc)
2076{
2077 //
e16f790e 2078 // dump the hc header word 1
d4232bb6 2079 //
2080 if (!hc)
2081 return Form("Unable to dump. Null received as parameter!?!");
2082 else
2083 return Form("[ HC[1] at 0x%08x ] : 0x%08x Info is : TBins %d BCcount %d PreTrigCount %d PreTrigPhase %d",
3a039a31 2084 hc->fPos[1], *(hc->fPos[1]), hc->fTimeBins, hc->fBunchCrossCounter, hc->fPreTriggerCounter, hc->fPreTriggerPhase);
d4232bb6 2085}
2086
2087//--------------------------------------------------------
2088void AliTRDrawStreamTB::DecodeMCMheader(const UInt_t *word, struct AliTRDrawMCM *mcm) const
2089{
2090 //
2091 // decode the mcm header
2092 //
d4232bb6 2093 UInt_t vword = *word;
2094
bb1009bf 2095 if (vword == END_OF_TRACKLET_MARKERNEW)
6bd744d3 2096 {
bb1009bf 2097 if (fgWarnError) AliError(Form("There should be MCM header. We meet END_OF_TRACKLET_MARKER 0x%08x",vword));
e16f790e 2098 mcm->fMCMhdCorrupted += 16;
bb1009bf 2099 fHC->fCorrupted += 16; //to finish data reading of this HC
6bd744d3 2100 }
e16f790e 2101
2102 mcm->fMCMhdCorrupted = MCM_HEADER_MASK_ERR(vword); //if MCM header mask has error
2103 if (fgDebugFlag && mcm->fMCMhdCorrupted != 0) AliDebug(11,Form("Wrong MCM header mask 0x%08x.\n", *fpPos));
2104
d4232bb6 2105 mcm->fROB = MCM_ROB_NUMBER(vword);
2106 mcm->fMCM = MCM_MCM_NUMBER(vword);
2107 mcm->fEvCounter = MCM_EVENT_COUNTER(vword);
d4232bb6 2108 mcm->fPos = (UInt_t*)word;
2109}
2110
2111//--------------------------------------------------------
2112UInt_t AliTRDrawStreamTB::GetMCMadcMask(const UInt_t *word, struct AliTRDrawMCM *mcm) const
2113{
2114 //
2115 // get the adc mask
2116 //
d4232bb6 2117 UInt_t vword = *word;
2118
bb1009bf 2119 mcm->fADCmax = 0;
2120 mcm->fADCMask = 0;
2121 mcm->fADCcount = 0;
d4232bb6 2122 mcm->fADCMaskWord = vword;
bb1009bf 2123
2124 if (vword == END_OF_TRACKLET_MARKERNEW)
2125 {
2126 if (fgWarnError) AliError(Form("There should be MCMadcMask. We meet END_OF_TRACKLET_MARKER 0x%08x",vword));
e16f790e 2127 mcm->fADCmaskCorrupted += 16;
bb1009bf 2128 fHC->fCorrupted += 16; //to finish data reading of this HC
2129 }
2130
d4232bb6 2131 if ( MCM_ADCMASK_MASK_ERR(vword) == 0 )
2132 {
bb1009bf 2133 mcm->fADCMask = MCM_ADCMASK_VAL(vword);
2134 mcm->fADCcount = MCM_ADCMASK_NADC(~vword);
d4232bb6 2135 }
2136 else
2137 {
2138 mcm->fADCMask = 0xffffffff;
e16f790e 2139 mcm->fADCmaskCorrupted = 1; // mcm adc mask error
2140 if (fgDebugFlag) AliDebug(11,Form("Wrong ADC Mask word 0x%08x.\n", *fpPos));
d4232bb6 2141 }
2142
2143 return mcm->fADCMask;
2144}
2145
2146//--------------------------------------------------------
2147void AliTRDrawStreamTB::DecodeMask(const UInt_t *word, struct AliTRDrawMCM *mcm) const
2148{
2149 //
2150 // decode the adc mask - adcs to be read out
2151 //
d4232bb6 2152 mcm->fMCMADCWords = 0;
2153 mcm->fSingleADCwords = 0;
2154 mcm->fADCmax = 0;
2155 mcm->fADCMask = GetMCMadcMask(word, mcm);
bb1009bf 2156
d4232bb6 2157 if (mcm->fADCMask > 0)
2158 {
2159 for (Int_t i = 0; i < TRD_MAX_ADC; i++)
3a039a31 2160 {
2161 mcm->fADCchannel[mcm->fADCmax] = 0;
2162 if( IS_BIT_SET(mcm->fADCMask,i) )
2163 {
2164 mcm->fADCchannel[mcm->fADCmax] = i;
2165 mcm->fADCmax++;
2166 }
2167 }
d4232bb6 2168 }
bb1009bf 2169 if (mcm->fADCcount != mcm->fADCmax && fHC->fRawVMajor >= 32) // backward compatibility
2170 {
e16f790e 2171 mcm->fADCmaskCorrupted += 2;
2172 if (fgDebugFlag) AliDebug(11,Form("ADC counts from ADCMask are different %d %d : ADCMask word 0x%08x\n", mcm->fADCcount, mcm->fADCmax, *fMCM->fPos));
bb1009bf 2173 }
d4232bb6 2174}
2175
2176//--------------------------------------------------------
2177void AliTRDrawStreamTB::MCMADCwordsWithTbins(UInt_t fTbins, struct AliTRDrawMCM *mcm) const
2178{
2179 //
2180 // count the expected mcm words for a given tbins
2181 //
2182 mcm->fMCMADCWords = ( mcm->fADCmax ) * ( fTbins / 3 );
2183 mcm->fSingleADCwords = 0;
2184 if (mcm->fADCmax > 0)
2185 {
2186 mcm->fSingleADCwords = mcm->fMCMADCWords/mcm->fADCmax;
2187 }
2188}
2189
2190//--------------------------------------------------------
2191const char *AliTRDrawStreamTB::DumpMCMinfo(const struct AliTRDrawMCM *mcm)
2192{
2193 //
2194 // mcm info in a string
2195 //
2196 if (!mcm)
2197 return Form("Unable to dump. Null received as parameter!?!");
2198 else
2199 return Form("[ MCM 0x%08x ] : ROB %d MCM %d EvCounter %d", *(mcm->fPos), mcm->fROB, mcm->fMCM, mcm->fEvCounter);
2200}
2201
2202//--------------------------------------------------------
d4232bb6 2203const char *AliTRDrawStreamTB::DumpMCMadcMask(const struct AliTRDrawMCM *mcm)
2204{
2205 //
2206 // mcm adc mask in a string
2207 //
2208 if (!mcm)
2209 return Form("Unable to dump. Null received as parameter!?!");
2210
2211 TString tsreturn = Form("[Word] : 0x%08x => [Mask] : 0x%08x : ", mcm->fADCMaskWord, mcm->fADCMask);
2212 for (Int_t i = 0; i < 21; i++)
2213 {
2214 tsreturn += Form("%d ", mcm->fADCchannel[i]);
2215 }
2216 tsreturn += "";
2217 return tsreturn.Data();
2218}