1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 ////////////////////////////////////////////////////////////////////////////
18 // Decoding data from the TRD raw stream //
19 // and translation into ADC values, on-line tracklets and tracks //
21 // Author: J. Klein (jochen.klein@cern.ch) //
23 ////////////////////////////////////////////////////////////////////////////
28 #include "TClonesArray.h"
32 #include "AliRawReader.h"
33 #include "AliTRDcalibDB.h"
34 #include "AliTRDdigitsManager.h"
35 #include "AliTRDdigitsParam.h"
36 #include "AliTRDcalibDB.h"
37 #include "AliTRDmcmSim.h"
38 #include "AliTRDtrapConfig.h"
39 #include "AliTRDarrayADC.h"
40 #include "AliTRDarrayDictionary.h"
41 #include "AliTRDSignalIndex.h"
42 #include "AliTRDtrackletWord.h"
43 #include "AliTRDtrackletMCM.h"
44 #include "AliESDTrdTrack.h"
45 #include "AliTreeLoader.h"
46 #include "AliLoader.h"
48 #include "AliTRDrawStream.h"
51 #include "AliRunLoader.h"
53 ClassImp(AliTRDrawStream)
55 // some static information
56 Int_t AliTRDrawStream::fgMcmOrder[] = {12, 13, 14, 15,
60 Int_t AliTRDrawStream::fgRobOrder [] = {0, 1, 2, 3};
61 const Int_t AliTRDrawStream::fgkNlinks = 12;
62 const Int_t AliTRDrawStream::fgkNstacks = 5;
63 const Int_t AliTRDrawStream::fgkNsectors = 18;
64 const Int_t AliTRDrawStream::fgkNtriggers = 12;
65 const UInt_t AliTRDrawStream::fgkDataEndmarker = 0x00000000;
66 const UInt_t AliTRDrawStream::fgkTrackletEndmarker = 0x10001000;
67 const UInt_t AliTRDrawStream::fgkStackEndmarker[] = { 0xe0d01000, 0xe0d10000 };
69 const char* AliTRDrawStream::fgkErrorMessages[] = {
71 "Link monitor active",
72 "Event counter mismatch",
73 "not a TRD equipment (1024-1041)",
74 "Invalid Stack header",
75 "Invalid detector number",
77 "No digits could be retrieved from the digitsmanager",
79 "HC check bits wrong",
80 "Unexpected position in readout stream",
81 "Invalid testpattern mode",
82 "Testpattern mismatch",
83 "Number of timebins changed",
84 "ADC mask inconsistent",
85 "ADC check bits invalid",
87 "Missing expected ADC channels",
88 "Missing MCM headers",
93 Int_t AliTRDrawStream::fgErrorDebugLevel[] = {
117 AliTRDrawStream::ErrorBehav_t AliTRDrawStream::fgErrorBehav[] = {
118 AliTRDrawStream::kTolerate,
119 AliTRDrawStream::kDiscardHC,
120 AliTRDrawStream::kTolerate,
121 AliTRDrawStream::kAbort,
122 AliTRDrawStream::kAbort,
123 AliTRDrawStream::kAbort,
124 AliTRDrawStream::kDiscardMCM,
125 AliTRDrawStream::kAbort,
126 AliTRDrawStream::kDiscardHC,
127 AliTRDrawStream::kDiscardHC,
128 AliTRDrawStream::kTolerate,
129 AliTRDrawStream::kTolerate,
130 AliTRDrawStream::kTolerate,
131 AliTRDrawStream::kTolerate,
132 AliTRDrawStream::kTolerate,
133 AliTRDrawStream::kTolerate,
134 AliTRDrawStream::kTolerate,
135 AliTRDrawStream::kTolerate,
136 AliTRDrawStream::kTolerate,
137 AliTRDrawStream::kTolerate,
138 AliTRDrawStream::kTolerate
141 AliTRDrawStream::AliTRDrawStream(AliRawReader *rawReader) :
142 fStoreError(&AliTRDrawStream::ForgetError),
143 fRawReader(rawReader),
160 fCurrSmHeaderSize(0),
161 fCurrSmHeaderVersion(0),
162 fCurrTrailerReadout(0),
163 fCurrTrgHeaderAvail(0),
164 fCurrTrgHeaderReadout(0),
165 fCurrTrkHeaderAvail(0),
166 fCurrStackEndmarkerAvail(0),
168 fCurrTriggerEnable(0),
169 fCurrTriggerFired(0),
171 fCurrTrackletEnable(0),
173 fCurrTrkHeaderIndexWord(0x0),
174 fCurrTrkHeaderSize(0x0),
176 fCurrTrgHeaderIndexWord(0x0),
177 fCurrTrgHeaderSize(0x0),
179 fCurrStackIndexWord(0x0),
180 fCurrStackHeaderSize(0x0),
181 fCurrStackHeaderVersion(0x0),
183 fCurrCleanCheckout(0x0),
187 fCurrLinkMonitorFlags(0x0),
188 fCurrLinkDataTypeFlags(0x0),
189 fCurrLinkDebugFlags(0x0),
190 fCurrMatchFlagsSRAM(0),
191 fCurrMatchFlagsPostBP(0),
192 fCurrChecksumStack(),
217 // default constructor
219 fCurrTrkHeaderIndexWord = new UInt_t[fgkNstacks];
220 fCurrTrkHeaderSize = new UInt_t[fgkNstacks];
221 fCurrTrkFlags = new ULong64_t[fgkNsectors*fgkNstacks];
222 fCurrTrgHeaderIndexWord = new UInt_t[fgkNtriggers];
223 fCurrTrgHeaderSize = new UInt_t[fgkNtriggers];
224 fCurrTrgFlags = new UInt_t[fgkNsectors];
225 fCurrStackIndexWord = new UInt_t[fgkNstacks];
226 fCurrStackHeaderSize = new UInt_t[fgkNstacks];
227 fCurrStackHeaderVersion = new UInt_t[fgkNstacks];
228 fCurrLinkMask = new UInt_t[fgkNstacks];
229 fCurrCleanCheckout = new UInt_t[fgkNstacks];
230 fCurrBoardId = new UInt_t[fgkNstacks];
231 fCurrHwRevTMU = new UInt_t[fgkNstacks];
232 fCurrLinkMonitorFlags = new UInt_t[fgkNstacks * fgkNlinks];
233 fCurrLinkDataTypeFlags = new UInt_t[fgkNstacks * fgkNlinks];
234 fCurrLinkDebugFlags = new UInt_t[fgkNstacks * fgkNlinks];
235 for (Int_t iSector = 0; iSector < fgkNsectors; iSector++)
236 fCurrTrgFlags[iSector] = 0;
237 for (Int_t i = 0; i < 100; i++)
240 // preparing TClonesArray
241 fTrackletArray = new TClonesArray("AliTRDtrackletWord", 256);
243 // setting up the error tree
244 fErrors = new TTree("errorStats", "Error statistics");
245 fErrors->SetDirectory(0x0);
246 fErrors->Branch("error", &fLastError);
247 fErrors->SetCircular(1000);
248 for (Int_t i = 0; i < 100; i++) {
254 AliTRDrawStream::~AliTRDrawStream()
260 delete [] fCurrTrkHeaderIndexWord;
261 delete [] fCurrTrkHeaderSize;
262 delete [] fCurrTrkFlags;
263 delete [] fCurrTrgHeaderIndexWord;
264 delete [] fCurrTrgHeaderSize;
265 delete [] fCurrTrgFlags;
266 delete [] fCurrStackIndexWord;
267 delete [] fCurrStackHeaderSize;
268 delete [] fCurrStackHeaderVersion;
269 delete [] fCurrLinkMask;
270 delete [] fCurrCleanCheckout;
271 delete [] fCurrBoardId;
272 delete [] fCurrHwRevTMU;
273 delete [] fCurrLinkMonitorFlags;
274 delete [] fCurrLinkDataTypeFlags;
275 delete [] fCurrLinkDebugFlags;
278 Bool_t AliTRDrawStream::ReadEvent(TTree *trackletTree)
280 // read the current event from the raw reader and fill it to the digits manager
283 AliError("No raw reader available");
288 ConnectTracklets(trackletTree);
293 // loop over all DDLs
294 // data starts with GTU payload, i.e. SM index word
295 UChar_t *buffer = 0x0;
297 while (fRawReader->ReadNextData(buffer)) {
299 fCurrEquipmentId = fRawReader->GetEquipmentId();
300 AliDebug(2, Form("equipment: %i", fCurrEquipmentId));
302 if (fCurrEquipmentId < kDDLOffset || fCurrEquipmentId > kDDLMax) {
303 EquipmentError(kNonTrdEq, "Skipping");
308 new ((*fMarkers)[fMarkers->GetEntriesFast()])
309 AliTRDrawStreamError(-kSecactive, fCurrEquipmentId - kDDLOffset);
311 ReadGTUHeaders((UInt_t*) buffer);
313 if (fCurrTrailerReadout)
316 // loop over all active links
317 AliDebug(2, Form("Stack mask 0x%02x", fCurrStackMask));
318 for (Int_t iStack = 0; iStack < fgkNstacks; iStack++) {
320 if ((fCurrStackMask & (1 << fCurrSlot)) == 0)
323 AliDebug(2, Form("Stack %i, Link mask: 0x%02x", fCurrSlot, fCurrLinkMask[fCurrSlot]));
324 for (Int_t iLink = 0; iLink < fgkNlinks; iLink++) {
326 fCurrHC = (fCurrEquipmentId - kDDLOffset) * fgkNstacks * fgkNlinks +
327 fCurrSlot * fgkNlinks + iLink;
328 if ((fCurrLinkMask[fCurrSlot] & (1 << fCurrLink)) == 0)
334 // check for link monitor error flag
335 if (fCurrLinkMonitorFlags[fCurrSlot*fgkNlinks + fCurrLink] != 0) {
336 LinkError(kLinkMonitor);
337 if (fgErrorBehav[kLinkMonitor] == kTolerate)
338 size += ReadLinkData();
341 // read the data from one HC
342 size += ReadLinkData();
344 // read all data endmarkers
345 size += SeekNextLink();
348 // continue with next stack
357 Bool_t AliTRDrawStream::NextDDL()
359 // continue reading with the next equipment
364 fCurrEquipmentId = 0;
368 UChar_t *buffer = 0x0;
370 while (fRawReader->ReadNextData(buffer)) {
372 fCurrEquipmentId = fRawReader->GetEquipmentId();
373 AliDebug(2, Form("equipment: %i", fCurrEquipmentId));
375 if (fCurrEquipmentId < kDDLOffset || fCurrEquipmentId > kDDLMax) {
376 EquipmentError(kNonTrdEq, "Skipping");
381 new ((*fMarkers)[fMarkers->GetEntriesFast()])
382 AliTRDrawStreamError(-kSecactive, fCurrEquipmentId - kDDLOffset);
384 ReadGTUHeaders((UInt_t*) buffer);
386 if (fCurrTrailerReadout)
396 Int_t AliTRDrawStream::NextChamber(AliTRDdigitsManager *digMgr)
398 // read the data for the next chamber
399 // in case you only want to read the data of a single chamber
400 // to read all data ReadEvent(...) is recommended
402 fDigitsManager = digMgr;
407 // tracklet output preparation
408 TTree *trklTree = 0x0;
409 AliRunLoader *rl = AliRunLoader::Instance();
410 AliLoader* trdLoader = rl ? rl->GetLoader("TRDLoader") : NULL;
411 AliDataLoader *trklLoader = trdLoader ? trdLoader->GetDataLoader("tracklets") : NULL;
413 AliTreeLoader *trklTreeLoader = (AliTreeLoader*) trklLoader->GetBaseLoader("tracklets-raw");
415 trklTree = trklTreeLoader->Tree();
417 trklTree = trklLoader->Tree();
420 if (fTrackletTree != trklTree)
421 ConnectTracklets(trklTree);
424 AliError("No raw reader available");
428 while (fCurrSlot < 0 || fCurrSlot >= fgkNstacks) {
433 while ((fCurrSlot < fgkNstacks) &&
434 (((fCurrStackMask & (1 << fCurrSlot)) == 0) ||
435 ((fCurrLinkMask[fCurrSlot] & (1 << fCurrLink))) == 0)) {
436 if ((fCurrStackMask & (1 << fCurrSlot)) == 0) {
442 if (fCurrLink >= fgkNlinks) {
450 AliDebug(2, Form("Stack %i, Link %i, mask: 0x%02x", fCurrSlot, fCurrLink, fCurrLinkMask[fCurrSlot]));
451 fCurrHC = (fCurrEquipmentId - kDDLOffset) * fgkNlinks * fgkNstacks +
452 fCurrSlot * fgkNlinks + fCurrLink;
454 if (fCurrLinkMonitorFlags[fCurrSlot*fgkNlinks + fCurrLink] != 0) {
455 LinkError(kLinkMonitor);
456 if (fgErrorBehav[kLinkMonitor] == kTolerate)
460 // read the data from one HC
463 // read all data endmarkers
466 if (fCurrLink % 2 == 0) {
467 // if we just read the A-side HC then also check the B-side
470 if (fCurrLinkMask[fCurrSlot] & (1 << fCurrLink)) {
471 if (fCurrLinkMonitorFlags[fCurrSlot*fgkNlinks + fCurrLink] != 0) {
472 LinkError(kLinkMonitor);
473 if (fgErrorBehav[kLinkMonitor] == kTolerate)
484 if ((fCurrStackMask & (1 << fCurrSlot)) == 0) {
490 if (fCurrLink >= fgkNlinks) {
496 } while ((fCurrSlot < fgkNstacks) &&
497 (((fCurrStackMask & (1 << fCurrSlot)) == 0) ||
498 ((fCurrLinkMask[fCurrSlot] & (1 << fCurrLink))) == 0));
500 // return chamber information from HC if it is valid
501 // otherwise return information from link position
502 if (fCurrSm < 0 || fCurrSm >= fgkNsectors || fCurrStack < 0 || fCurrStack >= fgkNstacks || fCurrLayer < 0 || fCurrLayer >= fgkNlinks/2)
503 return ((fCurrEquipmentId-kDDLOffset) + fCurrSlot * fgkNlinks/2 + fCurrLink/2);
505 return (fCurrSm * fgkNstacks*fgkNlinks/2 + fCurrStack * fgkNlinks/2 + fCurrLayer);
509 Int_t AliTRDrawStream::ReadGTUHeaders(UInt_t *buffer)
511 // check the data source and read the headers
513 if (fCurrEquipmentId >= kDDLOffset && fCurrEquipmentId <= kDDLMax) {
516 // setting the pointer to data and current reading position
517 fPayloadCurr = fPayloadStart = buffer;
518 fPayloadSize = fRawReader->GetDataSize() / sizeof(UInt_t);
519 fStats.fStatsSector[fCurrEquipmentId - kDDLOffset].fBytes = fRawReader->GetDataSize();
520 AliDebug(2, Form("Read buffer of size: %i", fRawReader->GetDataSize()));
522 AliDebug(1, DumpRaw("raw data", fPayloadCurr, TMath::Min(fPayloadSize, 1000)));
525 if (ReadSmHeader() < 0) {
526 AliError(Form("Reading SM header failed, skipping this DDL %i", fCurrEquipmentId));
530 // read tracking headers (if available)
531 if (fCurrTrkHeaderAvail) {
532 for (Int_t iStack = 0; iStack < fgkNstacks; iStack++) {
533 if ((fCurrStackMask & (1 << iStack)) != 0)
534 ReadTrackingHeader(iStack);
538 // read trigger header(s) (if available)
539 if (fCurrTrgHeaderAvail)
540 ReadTriggerHeaders();
543 for (Int_t iStack = 0; iStack < fgkNstacks; iStack++) {
544 if ((fCurrStackMask & (1 << iStack)) != 0)
545 ReadStackHeader(iStack);
554 Int_t AliTRDrawStream::ReadSmHeader()
556 // read the SMU index header at the current reading position
557 // and store the information in the corresponding variables
559 if (fPayloadCurr - fPayloadStart >= fPayloadSize - 1) {
560 EquipmentError(kUnknown, "SM Header incomplete");
564 fCurrTrgFlags[fCurrEquipmentId-kDDLOffset] = 0;
566 fCurrSmHeaderSize = ((*fPayloadCurr) >> 16) & 0xffff;
567 fCurrSmHeaderVersion = ((*fPayloadCurr) >> 12) & 0xf;
568 fCurrTrackEnable = ((*fPayloadCurr) >> 6) & 0x1;
569 fCurrTrackletEnable = ((*fPayloadCurr) >> 5) & 0x1;
570 fCurrStackMask = ((*fPayloadCurr) ) & 0x1f;
571 fCurrHwRev = (fPayloadCurr[1] >> 12) & 0xffff;
572 fCurrStackEndmarkerAvail = 0;
574 switch (fCurrSmHeaderVersion) {
576 fCurrTrailerReadout = 0;
577 fCurrTrgHeaderAvail = 0;
579 fCurrTrkHeaderAvail = 0;
585 fCurrTrailerReadout = ((*fPayloadCurr) >> 10) & 0x1;
586 fCurrTrgHeaderAvail = 1;
587 fCurrTrgHeaderReadout = ((*fPayloadCurr) >> 9) & 0x1;
588 fCurrEvType = ((*fPayloadCurr) >> 7) & 0x3;
589 fCurrTrkHeaderAvail = fCurrTrackEnable;
590 fCurrTriggerEnable = (fPayloadCurr[2] >> 8) & 0xfff;
591 fCurrTriggerFired = (fPayloadCurr[2] >> 20) & 0xfff;
592 fCurrTrgFlags[fCurrEquipmentId-kDDLOffset] = fCurrTriggerFired;
596 fCurrTrailerReadout = ((*fPayloadCurr) >> 10) & 0x1;
597 fCurrTrgHeaderAvail = 1;
598 fCurrTrgHeaderReadout = ((*fPayloadCurr) >> 9) & 0x1;
599 fCurrEvType = ((*fPayloadCurr) >> 7) & 0x3;
600 fCurrTrkHeaderAvail = fCurrTrackEnable;
601 fCurrTriggerEnable = (fPayloadCurr[2] >> 8) & 0xfff;
602 fCurrTriggerFired = (fPayloadCurr[2] >> 20) & 0xfff;
603 fCurrTrgFlags[fCurrEquipmentId-kDDLOffset] = fCurrTriggerFired;
604 fCurrStackEndmarkerAvail = 1;
608 AliError(Form("unknown SM header version: 0x%x", fCurrSmHeaderVersion));
611 AliDebug(5, Form("SM header: size: %i, version: %i, track enable: %i, tracklet enable: %i, stack mask: %2x, trailer: %i, trgheader: %i, trkheader: %i",
613 fCurrSmHeaderVersion,
619 fCurrTrkHeaderAvail ));
621 // jump to the first word after the SM header
622 fPayloadCurr += fCurrSmHeaderSize + 1;
624 return fCurrSmHeaderSize + 1;
627 Int_t AliTRDrawStream::DecodeGTUtracks()
629 // decode GTU track words
630 // this depends on the hardware revision of the SMU
632 Int_t sector = fCurrEquipmentId-kDDLOffset;
634 if ((sector < 0) || (sector > 17)) {
635 AliError(Form("Invalid sector %i for GTU tracks", sector));
639 AliDebug(1, DumpRaw(Form("GTU tracks in sector %2i (hw rev %i)", sector, fCurrHwRev),
640 fPayloadCurr + 4, 10, 0xffe0ffff));
642 fCurrTrgFlags[sector] = 0;
644 if (fCurrHwRev < 1772) {
645 UInt_t fastWord; // fast trigger word
646 ULong64_t trackWord = 0; // extended track word
649 for (UInt_t iWord = 4; iWord < fCurrSmHeaderSize; iWord++) {
650 if (fPayloadCurr[iWord] == 0x10000000) { // stack boundary marker
656 ((fPayloadCurr[iWord] & 0xfffff0f0) == 0x13370000)) {
657 fastWord = fPayloadCurr[iWord];
658 fCurrTrgFlags[sector] |= 1 << (stack+11); // assume tracking done if fast word sent
659 AliDebug(1, Form("stack %i: fast trigger word: 0x%08x", stack, fastWord));
662 else if ((idx & 0x1) == 0x1) {
663 trackWord |= ((ULong64_t) fPayloadCurr[iWord]) << 32;
664 AliDebug(1,Form("track debug word: 0x%016llx", trackWord));
666 AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()])
669 trk->SetSector(sector);
670 trk->SetStack((trackWord >> 60) & 0x7);
674 trk->SetLayerMask((trackWord >> 16) & 0x3f);
675 trk->SetTrackletIndex((trackWord >> 22) & 0x3f, 0);
676 trk->SetTrackletIndex((trackWord >> 28) & 0x3f, 1);
677 trk->SetTrackletIndex((trackWord >> 34) & 0x3f, 2);
678 trk->SetTrackletIndex((trackWord >> 40) & 0x3f, 3);
679 trk->SetTrackletIndex((trackWord >> 46) & 0x3f, 4);
680 trk->SetTrackletIndex((trackWord >> 52) & 0x3f, 5);
686 Float_t pt = (((Int_t) (trackWord & 0xffff) ^ 0x8000) - 0x8000)/128.;
687 if (TMath::Abs(pt) > 0.1) {
688 trk->SetA((Int_t) (0.15*51625./100./pt / 160e-4 * 2));
693 trackWord = fPayloadCurr[iWord];
699 else if (fCurrHwRev < 1804) {
700 UInt_t fastWord; // fast trigger word
701 ULong64_t trackWord = 0; // extended track word
704 for (UInt_t iWord = 4; iWord < fCurrSmHeaderSize; iWord++) {
705 if (fPayloadCurr[iWord] == 0xffe0ffff) { // stack boundary marker
711 ((fPayloadCurr[iWord] & 0xfffff0f0) == 0x13370000)) {
712 fastWord = fPayloadCurr[iWord];
713 fCurrTrgFlags[sector] |= 1 << (stack+11); // assume tracking done if fast word sent
714 AliDebug(1, Form("stack %i: fast trigger word: 0x%08x", stack, fastWord));
717 else if ((idx & 0x1) == 0x1) {
718 trackWord |= ((ULong64_t) fPayloadCurr[iWord]) << 32;
719 AliDebug(1, Form("track debug word: 0x%016llx", trackWord));
721 AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()])
724 trk->SetSector(fCurrEquipmentId-kDDLOffset);
725 trk->SetStack((trackWord >> 60) & 0x7);
729 trk->SetLayerMask((trackWord >> 16) & 0x3f);
730 trk->SetTrackletIndex((trackWord >> 22) & 0x3f, 0);
731 trk->SetTrackletIndex((trackWord >> 28) & 0x3f, 1);
732 trk->SetTrackletIndex((trackWord >> 34) & 0x3f, 2);
733 trk->SetTrackletIndex((trackWord >> 40) & 0x3f, 3);
734 trk->SetTrackletIndex((trackWord >> 46) & 0x3f, 4);
735 trk->SetTrackletIndex((trackWord >> 52) & 0x3f, 5);
741 Float_t pt = (((Int_t) (trackWord & 0xffff) ^ 0x8000) - 0x8000)/128.;
742 if (TMath::Abs(pt) > 0.1) {
743 trk->SetA((Int_t) (-0.15*51625./100./pt / 160e-4 * 2));
748 trackWord = fPayloadCurr[iWord];
754 else if (fCurrHwRev < 1819) {
755 UInt_t fastWord; // fast trigger word
756 ULong64_t trackWord = 0; // extended track word
759 for (UInt_t iWord = 4; iWord < fCurrSmHeaderSize; iWord++) {
760 if (fPayloadCurr[iWord] == 0xffe0ffff) { // stack boundary marker
766 ((fPayloadCurr[iWord] & 0xfffff0f0) == 0x13370000)) {
767 fastWord = fPayloadCurr[iWord];
768 if (fastWord & (1 << 13))
769 fCurrTrgFlags[sector] |= 1 << (stack+11);
770 AliDebug(1, Form("stack %i: fast trigger word: 0x%08x", stack, fastWord));
773 else if ((idx & 0x1) == 0x1) {
774 trackWord |= ((ULong64_t) fPayloadCurr[iWord]) << 32;
775 AliDebug(1, Form("track debug word: 0x%016llx", trackWord));
778 AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()])
781 trk->SetSector(fCurrEquipmentId-kDDLOffset);
782 trk->SetStack((trackWord >> 60) & 0x7);
785 // trk->SetPt(((trackWord & 0xffff) ^ 0x8000) - 0x8000);
787 trk->SetLayerMask((trackWord >> 16) & 0x3f);
788 trk->SetTrackletIndex((trackWord >> 22) & 0x3f, 0);
789 trk->SetTrackletIndex((trackWord >> 28) & 0x3f, 1);
790 trk->SetTrackletIndex((trackWord >> 34) & 0x3f, 2);
791 trk->SetTrackletIndex((trackWord >> 40) & 0x3f, 3);
792 trk->SetTrackletIndex((trackWord >> 46) & 0x3f, 4);
793 trk->SetTrackletIndex((trackWord >> 52) & 0x3f, 5);
799 Float_t pt = (((Int_t) (trackWord & 0xffff) ^ 0x8000) - 0x8000)/128.;
800 if (TMath::Abs(pt) > 0.1) {
801 trk->SetA((Int_t) (0.15*51625./100./trk->Pt() / 160e-4 * 2));
806 trackWord = fPayloadCurr[iWord];
812 else if (fCurrHwRev < 1860) {
813 UInt_t fastWord; // fast trigger word
814 ULong64_t trackWord = 0; // extended track word
817 Bool_t upperWord = kFALSE;
819 for (UInt_t iWord = 4; iWord < fCurrSmHeaderSize; iWord++) {
820 if (fPayloadCurr[iWord] == 0xffe0ffff) { // stack boundary marker
826 // assemble the 32-bit words out of 16-bit blocks
828 word |= (fPayloadCurr[iWord] & 0xffff0000);
832 // lower word is read first
833 word = (fPayloadCurr[iWord] & 0xffff0000) >> 16;
838 if ((word & 0xffff0008) == 0x13370008) {
840 AliDebug(1, Form("stack %i: fast track word: 0x%08x", stack, fastWord));
841 if (fastWord & (1 << 13))
842 fCurrTrgFlags[sector] |= 1 << (stack+11);
845 else if ((idx & 0x1) == 0x1) {
846 trackWord |= ((ULong64_t) word) << 32;
847 AliDebug(1, Form("track debug word: 0x%016llx", trackWord));
849 AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()])
852 trk->SetSector(fCurrEquipmentId-kDDLOffset);
853 trk->SetStack((trackWord >> 60) & 0x7);
857 trk->SetLayerMask((trackWord >> 16) & 0x3f);
858 trk->SetTrackletIndex((trackWord >> 22) & 0x3f, 0);
859 trk->SetTrackletIndex((trackWord >> 28) & 0x3f, 1);
860 trk->SetTrackletIndex((trackWord >> 34) & 0x3f, 2);
861 trk->SetTrackletIndex((trackWord >> 40) & 0x3f, 3);
862 trk->SetTrackletIndex((trackWord >> 46) & 0x3f, 4);
863 trk->SetTrackletIndex((trackWord >> 52) & 0x3f, 5);
869 Float_t pt = (((Int_t) (trackWord & 0xffff) ^ 0x8000) - 0x8000)/128.;
870 if (TMath::Abs(pt) > 0.1) {
871 trk->SetA((Int_t) (0.15*51625./100./pt / 160e-4 * 2));
884 ULong64_t trackWord = 0; // this is the debug word
887 Bool_t upperWord = kFALSE;
889 for (UInt_t iWord = 4; iWord < fCurrSmHeaderSize; iWord++) {
890 if (fPayloadCurr[iWord] == 0xffe0ffff) {
896 // assemble the 32-bit words out of 16-bit blocks
898 word |= (fPayloadCurr[iWord] & 0xffff0000);
902 // lower word is read first
903 word = (fPayloadCurr[iWord] & 0xffff0000) >> 16;
908 if ((word & 0xffff0008) == 0x13370008) {
909 AliDebug(1, Form("stack %i: fast track word: 0x%08x", stack, word));
912 else if ((word & 0xffff0010) == 0x13370010) {
913 AliDebug(1, Form("stack %i: tracking done word: 0x%08x", stack, word));
914 fCurrTrgFlags[sector] |= 1 << (stack+11);
917 else if ((idx & 0x1) == 0x1) {
918 trackWord |= ((ULong64_t) word) << 32;
919 AliDebug(1, Form("track debug word: 0x%16llx", trackWord));
921 AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()])
923 trk->SetSector(fCurrEquipmentId-kDDLOffset);
924 trk->SetStack((trackWord >> 60) & 0x7);
928 trk->SetLayerMask((trackWord >> 16) & 0x3f);
929 trk->SetTrackletIndex((trackWord >> 22) & 0x3f, 0);
930 trk->SetTrackletIndex((trackWord >> 28) & 0x3f, 1);
931 trk->SetTrackletIndex((trackWord >> 34) & 0x3f, 2);
932 trk->SetTrackletIndex((trackWord >> 40) & 0x3f, 3);
933 trk->SetTrackletIndex((trackWord >> 46) & 0x3f, 4);
934 trk->SetTrackletIndex((trackWord >> 52) & 0x3f, 5);
940 Float_t pt = (((Int_t) (trackWord & 0xffff) ^ 0x8000) - 0x8000)/128.;
941 if (TMath::Abs(pt) > 0.1) {
942 trk->SetA(-(Int_t) (0.15*51625./100./pt / 160e-4 * 2));
956 Int_t AliTRDrawStream::ReadTrackingHeader(Int_t stack)
958 // read the tracking information and store it for the given stack
962 fCurrTrkHeaderIndexWord[stack] = *fPayloadCurr;
963 fCurrTrkHeaderSize[stack] = ((*fPayloadCurr) >> 16) & 0x3ff;
965 AliDebug(1, Form("tracking header index word: 0x%08x, size: %i (hw rev: %i)",
966 fCurrTrkHeaderIndexWord[stack], fCurrTrkHeaderSize[stack], fCurrHwRev));
967 Int_t trackingTime = *fPayloadCurr & 0x3ff;
969 fCurrTrgFlags[fCurrEquipmentId-kDDLOffset] |= ((fCurrTrkHeaderIndexWord[stack] >> 10) & 0x1) << (22 + stack);
973 ULong64_t trackWord = 0;
975 Int_t trackIndex = fTracks ? fTracks->GetEntriesFast() : -1;
977 for (UInt_t iWord = 0; iWord < fCurrTrkHeaderSize[stack]; iWord++) {
980 // first part of 64-bit word
981 trackWord = fPayloadCurr[iWord];
984 trackWord |= ((ULong64_t) fPayloadCurr[iWord]) << 32;
986 if (trackWord & (1ul << 63)) {
987 if ((trackWord & (0x3ful << 56)) != 0) {
989 AliDebug(2, Form("track word: 0x%016llx", trackWord));
992 AliESDTrdTrack *trk = new ((*fTracks)[fTracks->GetEntriesFast()])
995 trk->SetSector(fCurrEquipmentId-kDDLOffset);
996 trk->SetLayerMask((trackWord >> 56) & 0x3f);
997 trk->SetA( (((trackWord >> 38) & 0x3ffff) ^ 0x20000) - 0x20000);
998 trk->SetB( (((trackWord >> 20) & 0x3ffff) ^ 0x20000) - 0x20000);
999 trk->SetC( (((trackWord >> 8) & 0xffff) ^ 0x8000) - 0x8000);
1000 trk->SetPID((trackWord >> 0) & 0xff);
1001 trk->SetStack(stack);
1004 // now compare the track word with the one generated from the ESD information
1005 if (trackWord != trk->GetTrackWord(0)) {
1006 AliError(Form("track word 0x%016llx does not match the read one 0x%016llx",
1007 trk->GetTrackWord(0), trackWord));
1012 // done marker (so far only used to set trigger flag)
1013 fCurrTrgFlags[fCurrEquipmentId-kDDLOffset] |= 1 << (27 + stack);
1014 fCurrTrkFlags[(fCurrEquipmentId-kDDLOffset)*fgkNstacks + stack] = trackWord;
1016 AliDebug(2, Form("tracking done marker: 0x%016llx, trigger flags: 0x%08x",
1017 trackWord, fCurrTrgFlags[fCurrEquipmentId-kDDLOffset]));
1018 AliDebug(2, Form("seg / stack / first / last / done / index : %i %i %lli %lli %lli %i",
1019 fCurrEquipmentId - kDDLOffset, stack,
1020 (trackWord >> 20) & 0x3ff,
1021 (trackWord >> 10) & 0x3ff,
1022 (trackWord >> 0) & 0x3ff,
1027 // extended track word
1028 AliDebug(2, Form("extended track word: 0x%016llx", trackWord));
1031 AliESDTrdTrack *trk = (AliESDTrdTrack*) (*fTracks)[trackIndex];
1033 trk->SetFlags((trackWord >> 52) & 0x7ff);
1034 trk->SetFlagsTiming((trackWord >> 51) & 0x1);
1035 trk->SetReserved((trackWord >> 49) & 0x3);
1036 trk->SetY((trackWord >> 36) & 0x1fff);
1037 trk->SetTrackletIndex((trackWord >> 0) & 0x3f, 0);
1038 trk->SetTrackletIndex((trackWord >> 6) & 0x3f, 1);
1039 trk->SetTrackletIndex((trackWord >> 12) & 0x3f, 2);
1040 trk->SetTrackletIndex((trackWord >> 18) & 0x3f, 3);
1041 trk->SetTrackletIndex((trackWord >> 24) & 0x3f, 4);
1042 trk->SetTrackletIndex((trackWord >> 30) & 0x3f, 5);
1044 if (trackWord != trk->GetExtendedTrackWord(0)) {
1045 AliError(Form("extended track word 0x%016llx does not match the read one 0x%016llx",
1046 trk->GetExtendedTrackWord(0), trackWord));
1056 fPayloadCurr += fCurrTrkHeaderSize[stack];
1058 return fCurrTrkHeaderSize[stack];
1061 Int_t AliTRDrawStream::ReadTriggerHeaders()
1063 // read all trigger headers present
1065 AliDebug(1, Form("trigger mask: 0x%03x, fired: 0x%03x\n",
1066 fCurrTriggerEnable, fCurrTriggerFired));
1067 // loop over potential trigger blocks
1068 for (Int_t iTrigger = 0; iTrigger < fgkNtriggers; iTrigger++) {
1069 // check for trigger enable
1070 if (fCurrTriggerEnable & (1 << iTrigger)) {
1071 // check for readout mode and trigger fired
1072 if ((fCurrTrgHeaderReadout == 0) || (fCurrTriggerFired & (1 << iTrigger))) {
1074 AliDebug(1, Form("trigger index word %i: 0x%08x\n", iTrigger, *fPayloadCurr));
1075 fCurrTrgHeaderIndexWord[iTrigger] = *fPayloadCurr;
1076 fCurrTrgHeaderSize[iTrigger] = ((*fPayloadCurr) >> 16) & 0x3ff;
1077 if (iTrigger == 7) {
1078 // timeout trigger, use to extract tracking time
1079 fCurrTrgFlags[fCurrEquipmentId-kDDLOffset] |= (*fPayloadCurr & 0x3ff) << 12;
1084 fPayloadCurr += fCurrTrgHeaderSize[iTrigger];
1092 Int_t AliTRDrawStream::ReadStackHeader(Int_t stack)
1094 // read the stack header
1095 // and store the information in the corresponding variables
1097 fCurrStackIndexWord[stack] = *fPayloadCurr;
1098 fCurrStackHeaderSize[stack] = (((*fPayloadCurr) >> 16) & 0xffff) + 1;
1099 fCurrStackHeaderVersion[stack] = ((*fPayloadCurr) >> 12) & 0xf;
1100 fCurrLinkMask[stack] = (*fPayloadCurr) & 0xfff;
1102 // dumping stack header
1103 AliDebug(1, DumpRaw(Form("stack %i header", stack), fPayloadCurr, fCurrStackHeaderSize[stack]));
1105 if (fPayloadCurr - fPayloadStart >= fPayloadSize - (Int_t) fCurrStackHeaderSize[stack]) {
1106 EquipmentError(kStackHeaderInvalid, "Stack index header %i incomplete", stack);
1107 // dumping stack header
1108 AliError(DumpRaw(Form("stack %i header", stack), fPayloadCurr, fCurrStackHeaderSize[stack]));
1113 switch (fCurrStackHeaderVersion[stack]) {
1116 if (fCurrStackHeaderSize[stack] < 8) {
1117 LinkError(kStackHeaderInvalid, "Stack header smaller than expected!");
1121 fCurrCleanCheckout[stack] = fPayloadCurr[1] & 0x1;
1122 fCurrBoardId[stack] = (fPayloadCurr[1] >> 8) & 0xff;
1123 fCurrHwRevTMU[stack] = (fPayloadCurr[1] >> 16) & 0xffff;
1125 for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
1127 fCurrLinkMonitorFlags [stack*fgkNlinks + iLayer*2] = fPayloadCurr[iLayer+2] & 0xf;
1128 fCurrLinkDataTypeFlags [stack*fgkNlinks + iLayer*2] = (fPayloadCurr[iLayer+2] >> 4) & 0x3;
1129 fCurrLinkDebugFlags [stack*fgkNlinks + iLayer*2] = (fPayloadCurr[iLayer+2] >> 12) & 0xf;
1131 fCurrLinkMonitorFlags [stack*fgkNlinks + iLayer*2 + 1] = (fPayloadCurr[iLayer+2] >> 16) & 0xf;
1132 fCurrLinkDataTypeFlags [stack*fgkNlinks + iLayer*2 + 1] = (fPayloadCurr[iLayer+2] >> 20) & 0x3;
1133 fCurrLinkDebugFlags [stack*fgkNlinks + iLayer*2 + 1] = (fPayloadCurr[iLayer+2] >> 28) & 0xf;
1138 LinkError(kStackHeaderInvalid, "Invalid Stack Header version %x", fCurrStackHeaderVersion[stack]);
1141 fPayloadCurr += fCurrStackHeaderSize[stack];
1143 return fCurrStackHeaderSize[stack];
1146 Int_t AliTRDrawStream::ReadGTUTrailer()
1148 // read the SM trailer containing CRCs from various stages
1150 UInt_t* trailer = fPayloadStart + fPayloadSize -1;
1152 // look for the trailer index word from the end
1153 for (Int_t iWord = 0; iWord < fPayloadSize-2; iWord++) {
1154 if ((fPayloadStart[fPayloadSize-3-iWord] == fgkStackEndmarker[0]) &&
1155 (fPayloadStart[fPayloadSize-2-iWord] == fgkStackEndmarker[1]) &&
1156 ((fPayloadStart[fPayloadSize-1-iWord] & 0xfff) == 0xf51)) {
1157 trailer = fPayloadStart + fPayloadSize - 1 - iWord;
1162 if (((*trailer) & 0xffff) == 0x1f51) {
1163 UInt_t trailerIndexWord = (*trailer);
1164 Int_t trailerSize = (trailerIndexWord >> 16) & 0xffff;
1165 AliDebug(2, DumpRaw("GTU trailer", trailer, trailerSize+1));
1166 // parse the trailer
1167 if (trailerSize >= 4) {
1168 // match flags from GTU
1169 fCurrMatchFlagsSRAM = (trailer[1] >> 0) & 0x1f;
1170 fCurrMatchFlagsPostBP = (trailer[1] >> 5) & 0x1f;
1171 // individual checksums
1172 fCurrChecksumStack[0] = (trailer[1] >> 16) & 0xffff;
1173 fCurrChecksumStack[1] = (trailer[2] >> 0) & 0xffff;
1174 fCurrChecksumStack[2] = (trailer[2] >> 16) & 0xffff;
1175 fCurrChecksumStack[3] = (trailer[3] >> 0) & 0xffff;
1176 fCurrChecksumStack[4] = (trailer[3] >> 16) & 0xffff;
1177 fCurrChecksumSIU = trailer[4];
1179 if ((fCurrMatchFlagsSRAM & fCurrStackMask) != fCurrStackMask)
1180 EquipmentError(kCRCmismatch, "CRC mismatch SRAM: 0x%02x", fCurrMatchFlagsSRAM);
1181 if ((fCurrMatchFlagsPostBP & fCurrStackMask) != fCurrStackMask)
1182 EquipmentError(kCRCmismatch, "CRC mismatch BP: 0x%02x", fCurrMatchFlagsPostBP);
1186 LinkError(kUnknown, "Invalid GTU trailer");
1190 EquipmentError(kUnknown, "trailer index marker mismatch");
1195 Int_t AliTRDrawStream::ReadLinkData()
1197 // read the data in one link (one HC) until the data endmarker is reached
1198 // returns the number of words read!
1201 UInt_t* startPosLink = fPayloadCurr;
1203 AliDebug(1, DumpRaw(Form("link data from seg %2i slot %i link %2i", fCurrEquipmentId-kDDLOffset, fCurrSlot, fCurrLink),
1204 fPayloadCurr, TMath::Min((Int_t) (fPayloadSize - (fPayloadCurr-fPayloadStart)), 100), 0x00000000));
1207 new ((*fMarkers)[fMarkers->GetEntriesFast()])
1208 AliTRDrawStreamError(-kHCactive, fCurrEquipmentId-kDDLOffset, fCurrSlot, fCurrLink);
1210 if (fErrorFlags & kDiscardHC)
1213 if (fCurrTrackletEnable) {
1214 count += ReadTracklets();
1215 if (fErrorFlags & kDiscardHC)
1219 AliDebug(1, DumpRaw("HC header", fPayloadCurr, 4, 0x00000000));
1220 count += ReadHcHeader();
1221 if (fErrorFlags & kDiscardHC)
1224 Int_t det = fCurrSm * 30 + fCurrStack * 6 + fCurrLayer;
1226 if (det > -1 && det < 540) {
1228 // ----- check which kind of data -----
1229 if (fCurrMajor & 0x40) {
1230 if ((fCurrMajor & 0x7) == 0x7) {
1231 AliDebug(1, "This is a config event");
1232 UInt_t *startPos = fPayloadCurr;
1233 while (fPayloadCurr - fPayloadStart < fPayloadSize &&
1234 *fPayloadCurr != fgkDataEndmarker)
1236 count += fPayloadCurr - startPos;
1238 // feeding TRAP config
1239 AliTRDtrapConfig *trapcfg = AliTRDcalibDB::Instance()->GetTrapConfig();
1240 AliTRDmcmSim::ReadPackedConfig(trapcfg, fCurrHC, startPos, fPayloadCurr - startPos);
1243 Int_t tpmode = fCurrMajor & 0x7;
1244 AliDebug(1, Form("Checking testpattern (mode %i) data", tpmode));
1245 count += ReadTPData(tpmode);
1249 // reading real data
1250 if (fDigitsManager) {
1251 if ((fAdcArray = fDigitsManager->GetDigits(det))) {
1252 //fAdcArray->Expand();
1253 if (fAdcArray->GetNtime() != fCurrNtimebins)
1254 fAdcArray->Allocate(16, 144, fCurrNtimebins);
1257 LinkError(kNoDigits);
1260 if (!fDigitsParam) {
1261 fDigitsParam = fDigitsManager->GetDigitsParam();
1264 fDigitsParam->SetPretriggerPhase(det, fCurrPtrgPhase);
1265 fDigitsParam->SetNTimeBins(det, fCurrNtimebins);
1266 fDigitsParam->SetADCbaseline(det, 10);
1269 if (fDigitsManager->UsesDictionaries()) {
1270 fDigitsManager->GetDictionary(det, 0)->Reset();
1271 fDigitsManager->GetDictionary(det, 1)->Reset();
1272 fDigitsManager->GetDictionary(det, 2)->Reset();
1275 if ((fSignalIndex = fDigitsManager->GetIndexes(det))) {
1276 fSignalIndex->SetSM(fCurrSm);
1277 fSignalIndex->SetStack(fCurrStack);
1278 fSignalIndex->SetLayer(fCurrLayer);
1279 fSignalIndex->SetDetNumber(det);
1280 if (!fSignalIndex->IsAllocated())
1281 fSignalIndex->Allocate(16, 144, fCurrNtimebins);
1284 if (fCurrMajor & 0x20) {
1285 AliDebug(1, "This is a zs event");
1286 count += ReadZSData();
1289 AliDebug(1, "This is a nozs event");
1290 count += ReadNonZSData();
1294 // just read until data endmarkers
1295 while (fPayloadCurr - fPayloadStart < fPayloadSize &&
1296 *fPayloadCurr != fgkDataEndmarker)
1302 LinkError(kInvalidDetector, "%i", det);
1303 while (fPayloadCurr - fPayloadStart < fPayloadSize &&
1304 *fPayloadCurr != fgkDataEndmarker)
1308 if (fCurrSm > -1 && fCurrSm < 18) {
1309 fStats.fStatsSector[fCurrSm].fStatsHC[fCurrHC%60].fBytes += (fPayloadCurr - startPosLink) * sizeof(UInt_t);
1310 fStats.fStatsSector[fCurrSm].fStatsHC[fCurrHC%60].fBytesRead += count * sizeof(UInt_t);
1311 fStats.fStatsSector[fCurrSm].fBytesRead += count * sizeof(UInt_t);
1312 fStats.fBytesRead += count * sizeof(UInt_t);
1318 Int_t AliTRDrawStream::ReadTracklets()
1320 // read the tracklets from one HC
1322 fTrackletArray->Clear();
1324 UInt_t *start = fPayloadCurr;
1325 while (*(fPayloadCurr) != fgkTrackletEndmarker &&
1326 *(fPayloadCurr) != fgkStackEndmarker[0] &&
1327 *(fPayloadCurr) != fgkStackEndmarker[1] &&
1328 fPayloadCurr - fPayloadStart < (fPayloadSize - 1)) {
1329 new ((*fTrackletArray)[fTrackletArray->GetEntriesFast()]) AliTRDtrackletWord(*(fPayloadCurr), fCurrHC);
1334 if (fTrackletArray->GetEntriesFast() > 0) {
1335 AliDebug(1, Form("Found %i tracklets in %i %i %i (ev. %i)", fTrackletArray->GetEntriesFast(),
1336 (fCurrEquipmentId-kDDLOffset), fCurrSlot, fCurrLink, fRawReader->GetEventIndex()));
1337 if (fCurrSm > -1 && fCurrSm < 18) {
1338 fStats.fStatsSector[fCurrSm].fStatsHC[fCurrHC%60].fNTracklets += fTrackletArray->GetEntriesFast();
1339 fStats.fStatsSector[fCurrSm].fNTracklets += fTrackletArray->GetEntriesFast();
1342 fTrackletTree->Fill();
1344 for (Int_t iTracklet = 0; iTracklet < fTrackletArray->GetEntriesFast(); iTracklet++) {
1345 new ((*fTracklets)[fTracklets->GetEntriesFast()]) AliTRDtrackletWord(*((AliTRDtrackletWord*)(*fTrackletArray)[iTracklet]));
1349 // loop over remaining tracklet endmarkers
1350 while ((*(fPayloadCurr) == fgkTrackletEndmarker &&
1351 fPayloadCurr - fPayloadStart < fPayloadSize))
1354 return fPayloadCurr - start;
1357 Int_t AliTRDrawStream::ReadHcHeader()
1359 // read and parse the HC header of one HC
1360 // and store the information in the corresponding variables
1362 AliDebug(1, Form("HC header: 0x%08x", *fPayloadCurr));
1363 UInt_t *start = fPayloadCurr;
1364 // check not to be at the data endmarker
1365 if (*fPayloadCurr == fgkDataEndmarker ||
1366 *(fPayloadCurr) == fgkStackEndmarker[0] ||
1367 *(fPayloadCurr) == fgkStackEndmarker[1]) {
1368 LinkError(kHCmismatch, "found endmarker where HC header should be");
1372 fCurrSpecial = (*fPayloadCurr >> 31) & 0x1;
1373 fCurrMajor = (*fPayloadCurr >> 24) & 0x7f;
1374 fCurrMinor = (*fPayloadCurr >> 17) & 0x7f;
1375 fCurrAddHcWords = (*fPayloadCurr >> 14) & 0x7;
1376 fCurrSm = (*fPayloadCurr >> 9) & 0x1f;
1377 fCurrLayer = (*fPayloadCurr >> 6) & 0x7;
1378 fCurrStack = (*fPayloadCurr >> 3) & 0x7;
1379 fCurrSide = (*fPayloadCurr >> 2) & 0x1;
1380 fCurrCheck = (*fPayloadCurr) & 0x3;
1382 if ((fCurrSm != (((Int_t) fCurrEquipmentId) - kDDLOffset)) ||
1383 (fCurrStack != fCurrSlot) ||
1384 (fCurrLayer != fCurrLink / 2) ||
1385 (fCurrSide != fCurrLink % 2)) {
1386 LinkError(kHCmismatch,
1387 "HC: %i, %i, %i, %i\n 0x%08x 0x%08x 0x%08x 0x%08x",
1388 fCurrSm, fCurrStack, fCurrLayer, fCurrSide,
1389 fPayloadCurr[0], fPayloadCurr[1], fPayloadCurr[2], fPayloadCurr[3]);
1391 if (fCurrCheck != 0x1) {
1392 LinkError(kHCcheckFailed);
1395 if (fCurrAddHcWords > 0) {
1396 fCurrNtimebins = (fPayloadCurr[1] >> 26) & 0x3f;
1397 fCurrBC = (fPayloadCurr[1] >> 10) & 0xffff;
1398 fCurrPtrgCnt = (fPayloadCurr[1] >> 6) & 0xf;
1399 fCurrPtrgPhase = (fPayloadCurr[1] >> 2) & 0xf;
1402 fPayloadCurr += 1 + fCurrAddHcWords;
1404 return (fPayloadCurr - start);
1407 Int_t AliTRDrawStream::ReadTPData(Int_t mode)
1409 // testing of testpattern 1 to 3 (hardcoded), 0 missing
1410 // evcnt checking missing
1412 Int_t cpufromchannel[] = {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3};
1416 Int_t mcmcount = -1;
1417 Int_t wordcount = 0;
1418 Int_t channelcount = 0;
1420 UInt_t expadcval = 0;
1422 Int_t lastmcmpos = -1;
1423 Int_t lastrobpos = -1;
1425 UInt_t* start = fPayloadCurr;
1427 while (*(fPayloadCurr) != fgkDataEndmarker &&
1428 fPayloadCurr - fPayloadStart < fPayloadSize - 1) {
1430 // ----- Checking MCM Header -----
1431 AliDebug(2, DumpMcmHeader("MCM header: ", *fPayloadCurr));
1432 UInt_t *startPosMCM = fPayloadCurr;
1435 // ----- checking for proper readout order - ROB -----
1436 fCurrRobPos = ROB(*fPayloadCurr);
1437 if (GetROBReadoutPos(ROB(*fPayloadCurr) / 2) >= lastrobpos) {
1438 if (GetROBReadoutPos(ROB(*fPayloadCurr) / 2) > lastrobpos)
1440 lastrobpos = GetROBReadoutPos(ROB(*fPayloadCurr) / 2);
1443 ROBError(kPosUnexp, Form("#%i after #%i in readout order", GetROBReadoutPos(ROB(*fPayloadCurr) / 2), lastrobpos));
1446 // ----- checking for proper readout order - MCM -----
1447 fCurrMcmPos = MCM(*fPayloadCurr);
1448 if (GetMCMReadoutPos(MCM(*fPayloadCurr)) > lastmcmpos) {
1449 lastmcmpos = GetMCMReadoutPos(MCM(*fPayloadCurr));
1452 MCMError(kPosUnexp, Form("#%i after #%i in readout order", GetMCMReadoutPos(MCM(*fPayloadCurr)), lastmcmpos));
1455 if (EvNo(*fPayloadCurr) != (evno & 0xfffff)) {
1457 evno = EvNo(*fPayloadCurr);
1460 MCMError(kEvCntMismatch, "%i <-> %i", evno, EvNo(*fPayloadCurr));
1466 evcnt = 0x3f & *fPayloadCurr >> 26;
1469 while (channelcount < 21) {
1471 if (cpu != cpufromchannel[channelcount]) {
1472 cpu = cpufromchannel[channelcount];
1473 expadcval = (1 << 9) | (fCurrRobPos << 6) | (fCurrMcmPos << 2) | cpu;
1477 while (count < 10) {
1478 if (*fPayloadCurr == fgkDataEndmarker) {
1479 MCMError(kMissTpData);
1480 return (fPayloadCurr - start);
1483 if (channelcount % 2 == 0)
1490 expword |= expadcval << 2;
1491 expadcval = ( (expadcval << 1) | ( ( (expadcval >> 9) ^ (expadcval >> 6) ) & 1) ) & 0x3FF;
1492 expword |= expadcval << 12;
1493 expadcval = ( (expadcval << 1) | ( ( (expadcval >> 9) ^ (expadcval >> 6) ) & 1) ) & 0x3FF;
1494 expword |= expadcval << 22;
1495 expadcval = ( (expadcval << 1) | ( ( (expadcval >> 9) ^ (expadcval >> 6) ) & 1) ) & 0x3FF;
1497 else if (mode == 2) {
1498 // ----- TP 2 ------
1499 expword = ((0x3f & evcnt) << 26) | ((fCurrSm + 1) << 21) | ((fCurrLayer + 1) << 18) |
1500 ((fCurrStack + 1) << 15) |
1501 (fCurrRobPos << 12) | (fCurrMcmPos << 8) | (cpu << 6) | (wordcount + 1);
1503 else if (mode == 3) {
1505 expword = ((0xfff & evcnt) << 20) | (fCurrSm << 15) | (fCurrLink/2 << 12) | (fCurrStack << 9) |
1506 (fCurrRobPos << 6) | (fCurrMcmPos << 2) | (cpu << 0);
1510 LinkError(kTPmodeInvalid, "Just reading");
1513 diff = *fPayloadCurr ^ expword;
1514 AliDebug(11, Form("Comparing ch %2i, word %2i (cpu %i): 0x%08x <-> 0x%08x",
1515 channelcount, wordcount, cpu, *fPayloadCurr, expword));
1518 MCMError(kTPmismatch,
1519 "Seen 0x%08x, expected 0x%08x, diff: 0x%08x, 0x%04x, 0x%02x - word %2i (cpu %i, ch %i)",
1520 *fPayloadCurr, expword, diff,
1521 0xffff & (diff | diff >> 16),
1522 0xff & (diff | diff >> 8 | diff >> 16 | diff >> 24),
1523 wordcount, cpu, channelcount);;
1528 if (*fPayloadCurr == fgkDataEndmarker)
1529 return (fPayloadCurr - start);
1533 // continue with next MCM
1535 if (IsDumping() && DumpingMCM(fCurrHC/2, fCurrRobPos, fCurrMcmPos)) {
1536 AliInfo(DumpRaw(Form("Event %i: Det %3i ROB %i MCM %2i", fRawReader->GetEventIndex(), fCurrHC/2, fCurrRobPos, fCurrMcmPos),
1537 startPosMCM, fPayloadCurr - startPosMCM));
1541 return fPayloadCurr - start;
1545 Int_t AliTRDrawStream::ReadZSData()
1547 // read the zs data from one link from the current reading position
1549 UInt_t *start = fPayloadCurr;
1552 Int_t mcmcountExp = fCurrStack == 2 ? 48 : 64;
1553 Int_t channelcount = 0;
1554 Int_t channelcountExp = 0;
1555 Int_t channelcountMax = 0;
1557 Int_t currentTimebin = 0;
1560 Int_t lastmcmpos = -1;
1561 Int_t lastrobpos = -1;
1563 if (fCurrNtimebins != fNtimebins) {
1565 LinkError(kNtimebinsChanged,
1566 "No. of timebins changed from %i to %i", fNtimebins, fCurrNtimebins);
1567 fNtimebins = fCurrNtimebins;
1570 timebins = fNtimebins;
1572 while (*(fPayloadCurr) != fgkDataEndmarker &&
1573 *(fPayloadCurr) != fgkStackEndmarker[0] &&
1574 *(fPayloadCurr) != fgkStackEndmarker[1] &&
1575 fPayloadCurr - fPayloadStart < fPayloadSize) {
1577 // ----- Checking MCM Header -----
1578 AliDebug(2, DumpMcmHeader("MCM header: ", *fPayloadCurr));
1579 UInt_t *startPosMCM = fPayloadCurr;
1581 // ----- checking for proper readout order - ROB -----
1582 fCurrRobPos = ROB(*fPayloadCurr);
1583 if (GetROBReadoutPos(ROB(*fPayloadCurr) / 2) >= lastrobpos) {
1584 if (GetROBReadoutPos(ROB(*fPayloadCurr) / 2) > lastrobpos)
1586 lastrobpos = GetROBReadoutPos(ROB(*fPayloadCurr) / 2);
1589 ROBError(kPosUnexp, Form("#%i after #%i and #%i in readout order",
1590 GetROBReadoutPos(ROB(*fPayloadCurr) / 2), lastrobpos, GetROBReadoutPos(fCurrRobPos)));
1593 // ----- checking for proper readout order - MCM -----
1594 fCurrMcmPos = MCM(*fPayloadCurr);
1595 if (GetMCMReadoutPos(MCM(*fPayloadCurr)) > lastmcmpos) {
1596 lastmcmpos = GetMCMReadoutPos(MCM(*fPayloadCurr));
1599 MCMError(kPosUnexp, Form("#%i after #%i and #%i in readout order",
1600 GetMCMReadoutPos(MCM(*fPayloadCurr)), lastmcmpos, GetMCMReadoutPos(fCurrMcmPos)));
1603 if (EvNo(*fPayloadCurr) != (evno & 0xfffff)) {
1605 evno = EvNo(*fPayloadCurr);
1608 MCMError(kEvCntMismatch, "%i <-> %i", evno, EvNo(*fPayloadCurr));
1611 Int_t adccoloff = AdcColOffset(*fPayloadCurr);
1612 Int_t padcoloff = PadColOffset(*fPayloadCurr);
1613 Int_t row = Row(*fPayloadCurr);
1616 if ((row > 11) && (fCurrStack == 2)) {
1617 MCMError(kInvalidPadRow, "Data in padrow > 11 for stack 2");
1620 if (fErrorFlags & (kDiscardHC | kDiscardDDL))
1623 // ----- Reading ADC channels -----
1624 AliDebug(2, DumpAdcMask("ADC mask: ", *fPayloadCurr));
1626 // ----- analysing the ADC mask -----
1628 channelcountExp = GetNActiveChannelsFromMask(*fPayloadCurr);
1629 channelcountMax = GetNActiveChannels(*fPayloadCurr);
1630 Int_t channelmask = GetActiveChannels(*fPayloadCurr);
1631 Int_t channelno = -1;
1634 if (channelcountExp != channelcountMax) {
1635 if (channelcountExp > channelcountMax) {
1636 Int_t temp = channelcountExp;
1637 channelcountExp = channelcountMax;
1638 channelcountMax = temp;
1640 while (channelcountExp < channelcountMax && channelcountExp < 21 &&
1641 fPayloadCurr - fPayloadStart < fPayloadSize - 10 * channelcountExp - 1) {
1642 MCMError(kAdcMaskInconsistent,
1643 "Possible MCM-H: 0x%08x, possible ADC-mask: 0x%08x",
1644 *(fPayloadCurr + 10 * channelcountExp),
1645 *(fPayloadCurr + 10 * channelcountExp + 1) );
1646 if (!CouldBeMCMhdr( *(fPayloadCurr + 10 * channelcountExp)) && !CouldBeADCmask( *(fPayloadCurr + 10 * channelcountExp + 1)))
1652 MCMError(kAdcMaskInconsistent,
1653 "Inconsistency in no. of active channels: Counter: %i, Mask: %i, chosen: %i!",
1654 GetNActiveChannels(fPayloadCurr[-1]), GetNActiveChannelsFromMask(fPayloadCurr[-1]), channelcountExp);
1656 AliDebug(2, Form("expecting %i active channels, %i timebins", channelcountExp, fCurrNtimebins));
1658 // ----- reading marked ADC channels -----
1659 while (channelcount < channelcountExp && *(fPayloadCurr) != fgkDataEndmarker) {
1662 while (channelno < 20 && (channelmask & 1 << channelno) == 0)
1665 if (fCurrNtimebins > 30) {
1666 currentTimebin = ((*fPayloadCurr >> 2) & 0x3f);
1667 timebins = ((*fPayloadCurr >> 8) & 0xf) * 3;
1674 Int_t nADCwords = (timebins + 2) / 3;
1675 AliDebug(3, Form("Now reading %i words for channel %2i", nADCwords, channelno));
1676 Int_t adccol = adccoloff - channelno;
1677 Int_t padcol = padcoloff - channelno;
1678 // if (adccol < 3 || adccol > 165)
1679 // AliInfo(Form("writing channel %i of det %3i %i:%2i to adcrow/-col: %i/%i padcol: %i",
1680 // channelno, fCurrHC/2, fCurrRobPos, fCurrMcmPos, row, adccol, padcol));
1682 while ((adcwc < nADCwords) &&
1683 (*(fPayloadCurr) != fgkDataEndmarker) &&
1684 (fPayloadCurr - fPayloadStart < fPayloadSize)) {
1685 int check = 0x3 & *fPayloadCurr;
1686 if (channelno % 2 != 0) { // odd channel
1687 if (check != 0x2 && channelno < 21) {
1688 MCMError(kAdcCheckInvalid,
1689 "%i for %2i. ADC word in odd channel %i",
1690 check, adcwc+1, channelno);
1693 else { // even channel
1694 if (check != 0x3 && channelno < 21) {
1695 MCMError(kAdcCheckInvalid,
1696 "%i for %2i. ADC word in even channel %i",
1697 check, adcwc+1, channelno);
1701 if ((fErrorFlags & kDiscardMCM) == 0) {
1702 // filling the actual timebin data
1703 int tb2 = 0x3ff & (*fPayloadCurr >> 22);
1704 int tb1 = 0x3ff & (*fPayloadCurr >> 12);
1705 int tb0 = 0x3ff & (*fPayloadCurr >> 2);
1706 if (adcwc != 0 || fCurrNtimebins <= 30)
1707 fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb0);
1710 if (currentTimebin < fCurrNtimebins)
1711 fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb1);
1712 if (currentTimebin < fCurrNtimebins)
1713 fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb2);
1720 if (adcwc != nADCwords)
1721 MCMError(kAdcDataAbort);
1724 if (padcol > 0 && padcol < 144) {
1725 fSignalIndex->AddIndexRC(row, padcol);
1731 if (fCurrSm > -1 && fCurrSm < 18) {
1732 fStats.fStatsSector[fCurrSm].fStatsHC[fCurrHC%60].fNChannels += channelcount;
1733 fStats.fStatsSector[fCurrSm].fNChannels += channelcount;
1735 if (channelcount != channelcountExp)
1736 MCMError(kAdcChannelsMiss);
1739 if (fCurrSm > -1 && fCurrSm < 18) {
1740 fStats.fStatsSector[fCurrSm].fStatsHC[fCurrHC%60].fNMCMs++;
1741 fStats.fStatsSector[fCurrSm].fNMCMs++;
1744 if (IsDumping() && DumpingMCM(fCurrHC/2, fCurrRobPos, fCurrMcmPos)) {
1745 AliInfo(DumpRaw(Form("Event %i: Det %3i ROB %i MCM %2i", fRawReader->GetEventIndex(), fCurrHC/2, fCurrRobPos, fCurrMcmPos),
1746 startPosMCM, fPayloadCurr - startPosMCM));
1749 // continue with next MCM
1752 // check for missing MCMs (if header suppression is inactive)
1753 if (((fCurrMajor & 0x1) == 0) && (mcmcount != mcmcountExp)) {
1754 LinkError(kMissMcmHeaders,
1755 "No. of MCM headers %i not as expected: %i",
1756 mcmcount, mcmcountExp);
1759 return (fPayloadCurr - start);
1762 Int_t AliTRDrawStream::ReadNonZSData()
1764 // read the non-zs data from one link from the current reading position
1766 UInt_t *start = fPayloadCurr;
1769 Int_t mcmcountExp = fCurrStack == 2 ? 48 : 64;
1770 Int_t channelcount = 0;
1771 Int_t channelcountExp = 0;
1773 Int_t currentTimebin = 0;
1776 Int_t lastmcmpos = -1;
1777 Int_t lastrobpos = -1;
1779 if (fCurrNtimebins != fNtimebins) {
1781 LinkError(kNtimebinsChanged,
1782 "No. of timebins changed from %i to %i", fNtimebins, fCurrNtimebins);
1783 fNtimebins = fCurrNtimebins;
1786 timebins = fNtimebins;
1788 while (*(fPayloadCurr) != fgkDataEndmarker &&
1789 fPayloadCurr - fPayloadStart < fPayloadSize - 2) {
1791 // ----- Checking MCM Header -----
1792 AliDebug(2, Form("MCM header: 0x%08x", *fPayloadCurr));
1794 // ----- checking for proper readout order - ROB -----
1795 fCurrRobPos = ROB(*fPayloadCurr);
1796 if (GetROBReadoutPos(ROB(*fPayloadCurr) / 2) >= lastrobpos) {
1797 if (GetROBReadoutPos(ROB(*fPayloadCurr) / 2) > lastrobpos)
1799 lastrobpos = GetROBReadoutPos(ROB(*fPayloadCurr) / 2);
1802 ROBError(kPosUnexp, Form("#%i after #%i in readout order", GetROBReadoutPos(ROB(*fPayloadCurr) / 2), lastrobpos));
1805 // ----- checking for proper readout order - MCM -----
1806 fCurrMcmPos = MCM(*fPayloadCurr);
1807 if (GetMCMReadoutPos(MCM(*fPayloadCurr)) > lastmcmpos) {
1808 lastmcmpos = GetMCMReadoutPos(MCM(*fPayloadCurr));
1811 MCMError(kPosUnexp, Form("#%i after #%i in readout order", GetMCMReadoutPos(MCM(*fPayloadCurr)), lastmcmpos));
1814 if (EvNo(*fPayloadCurr) != (evno & 0xfffff)) {
1816 evno = EvNo(*fPayloadCurr);
1819 MCMError(kEvCntMismatch, "%i <-> %i", evno, EvNo(*fPayloadCurr));
1824 channelcountExp = 21;
1827 Int_t adccoloff = AdcColOffset(*fPayloadCurr);
1828 Int_t padcoloff = PadColOffset(*fPayloadCurr);
1829 Int_t row = Row(*fPayloadCurr);
1832 if ((row > 11) && (fCurrStack == 2)) {
1833 MCMError(kInvalidPadRow, "Data in padrow > 11 for stack 2");
1836 if (fErrorFlags & (kDiscardHC | kDiscardDDL))
1839 // ----- reading marked ADC channels -----
1840 while (channelcount < channelcountExp &&
1841 *(fPayloadCurr) != fgkDataEndmarker) {
1848 Int_t nADCwords = (timebins + 2) / 3;
1849 AliDebug(2, Form("Now looking %i words", nADCwords));
1850 Int_t adccol = adccoloff - channelno;
1851 Int_t padcol = padcoloff - channelno;
1852 while ((adcwc < nADCwords) &&
1853 (*(fPayloadCurr) != fgkDataEndmarker) &&
1854 (fPayloadCurr - fPayloadStart < fPayloadSize)) {
1855 int check = 0x3 & *fPayloadCurr;
1856 if (channelno % 2 != 0) { // odd channel
1857 if (check != 0x2 && channelno < 21) {
1858 MCMError(kAdcCheckInvalid,
1859 "%i for %2i. ADC word in odd channel %i",
1860 check, adcwc+1, channelno);
1863 else { // even channel
1864 if (check != 0x3 && channelno < 21) {
1865 MCMError(kAdcCheckInvalid,
1866 "%i for %2i. ADC word in even channel %i",
1867 check, adcwc+1, channelno);
1871 if ((fErrorFlags & kDiscardMCM) == 0) {
1872 // filling the actual timebin data
1873 int tb2 = 0x3ff & (*fPayloadCurr >> 22);
1874 int tb1 = 0x3ff & (*fPayloadCurr >> 12);
1875 int tb0 = 0x3ff & (*fPayloadCurr >> 2);
1876 if (adcwc != 0 || fCurrNtimebins <= 30)
1877 fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb0);
1880 if (currentTimebin < fCurrNtimebins)
1881 fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb1);
1882 if (currentTimebin < fCurrNtimebins)
1883 fAdcArray->SetDataByAdcCol(row, adccol, currentTimebin++, tb2);
1890 if (adcwc != nADCwords)
1891 MCMError(kAdcDataAbort);
1894 if (padcol > 0 && padcol < 144) {
1895 fSignalIndex->AddIndexRC(row, padcol);
1901 if (channelcount != channelcountExp)
1902 MCMError(kAdcChannelsMiss);
1904 // continue with next MCM
1907 // check for missing MCMs (if header suppression is inactive)
1908 if (mcmcount != mcmcountExp) {
1909 LinkError(kMissMcmHeaders,
1910 "%i not as expected: %i", mcmcount, mcmcountExp);
1913 return (fPayloadCurr - start);
1916 Int_t AliTRDrawStream::SeekNextStack()
1918 // proceed in raw data stream till the next stack
1920 if (!fCurrStackEndmarkerAvail)
1923 UInt_t *start = fPayloadCurr;
1925 // read until data endmarkers
1926 while ((fPayloadCurr - fPayloadStart < fPayloadSize-1) &&
1927 ((fPayloadCurr[0] != fgkStackEndmarker[0]) ||
1928 (fPayloadCurr[1] != fgkStackEndmarker[1])))
1931 if ((fPayloadCurr - start) != 0)
1932 StackError(kUnknown, "skipped %i words to reach stack endmarker", fPayloadCurr - start);
1934 AliDebug(2, Form("stack endmarker: 0x%08x 0x%08x", fPayloadCurr[0], fPayloadCurr[1]));
1940 return (fPayloadCurr-start);
1943 Int_t AliTRDrawStream::SeekNextLink()
1945 // proceed in raw data stream till the next link
1947 UInt_t *start = fPayloadCurr;
1949 // read until data endmarkers
1950 while (fPayloadCurr - fPayloadStart < fPayloadSize &&
1951 ((fPayloadCurr[0] != fgkStackEndmarker[0]) ||
1952 (fPayloadCurr[1] != fgkStackEndmarker[1])) &&
1953 *fPayloadCurr != fgkDataEndmarker)
1956 // read all data endmarkers
1957 while (fPayloadCurr - fPayloadStart < fPayloadSize &&
1958 *fPayloadCurr == fgkDataEndmarker)
1961 return (fPayloadCurr - start);
1964 Bool_t AliTRDrawStream::ConnectTracklets(TTree *trklTree)
1966 // connect the tracklet tree used to store the tracklet output
1968 fTrackletTree = trklTree;
1972 if (!fTrackletTree->GetBranch("hc"))
1973 fTrackletTree->Branch("hc", &fCurrHC, "hc/I");
1975 fTrackletTree->SetBranchAddress("hc", &fCurrHC);
1977 if (!fTrackletTree->GetBranch("trkl"))
1978 fTrackletTree->Branch("trkl", &fTrackletArray);
1980 fTrackletTree->SetBranchAddress("trkl", &fTrackletArray);
1986 void AliTRDrawStream::EquipmentError(ErrorCode_t err, const char *const msg, ...)
1988 // register error according to error code on equipment level
1989 // and return the corresponding error message
1991 fLastError.fSector = fCurrEquipmentId - kDDLOffset;
1992 fLastError.fStack = -1;
1993 fLastError.fLink = -1;
1994 fLastError.fRob = -1;
1995 fLastError.fMcm = -1;
1996 fLastError.fError = err;
1997 (this->*fStoreError)();
2000 if (fgErrorDebugLevel[err] > 10)
2001 AliDebug(fgErrorDebugLevel[err],
2002 Form("Event %6i: Eq. %2d - %s : %s",
2003 fRawReader->GetEventIndex(), fCurrEquipmentId, fgkErrorMessages[err],
2004 (va_start(ap, msg), vsprintf(fErrorBuffer, msg, ap), va_end(ap), fErrorBuffer) ));
2006 AliError(Form("Event %6i: Eq. %2d - %s : %s",
2007 fRawReader->GetEventIndex(), fCurrEquipmentId, fgkErrorMessages[err],
2008 (va_start(ap, msg), vsprintf(fErrorBuffer, msg, ap), va_end(ap), fErrorBuffer) ));
2009 fErrorFlags |= fgErrorBehav[err];
2013 void AliTRDrawStream::StackError(ErrorCode_t err, const char *const msg, ...)
2015 // register error according to error code on stack level
2016 // and return the corresponding error message
2018 fLastError.fSector = fCurrEquipmentId - kDDLOffset;
2019 fLastError.fStack = fCurrSlot;
2020 fLastError.fLink = -1;
2021 fLastError.fRob = -1;
2022 fLastError.fMcm = -1;
2023 fLastError.fError = err;
2024 (this->*fStoreError)();
2027 if (fgErrorDebugLevel[err] > 0)
2028 AliDebug(fgErrorDebugLevel[err],
2029 Form("Event %6i: Eq. %2d S %i - %s : %s",
2030 fRawReader->GetEventIndex(), fCurrEquipmentId, fCurrSlot, fgkErrorMessages[err],
2031 (va_start(ap, msg), vsprintf(fErrorBuffer, msg, ap), va_end(ap), fErrorBuffer) ));
2033 AliError(Form("Event %6i: Eq. %2d S %i - %s : %s",
2034 fRawReader->GetEventIndex(), fCurrEquipmentId, fCurrSlot, fgkErrorMessages[err],
2035 (va_start(ap, msg), vsprintf(fErrorBuffer, msg, ap), va_end(ap), fErrorBuffer) ));
2036 fErrorFlags |= fgErrorBehav[err];
2040 void AliTRDrawStream::LinkError(ErrorCode_t err, const char *const msg, ...)
2042 // register error according to error code on link level
2043 // and return the corresponding error message
2045 fLastError.fSector = fCurrEquipmentId - kDDLOffset;
2046 fLastError.fStack = fCurrSlot;
2047 fLastError.fLink = fCurrLink;
2048 fLastError.fRob = -1;
2049 fLastError.fMcm = -1;
2050 fLastError.fError = err;
2051 (this->*fStoreError)();
2054 if (fgErrorDebugLevel[err] > 0)
2055 AliDebug(fgErrorDebugLevel[err],
2056 Form("Event %6i: Eq. %2d S %i l %2i - %s : %s",
2057 fRawReader->GetEventIndex(), fCurrEquipmentId, fCurrSlot, fCurrLink, fgkErrorMessages[err],
2058 (va_start(ap, msg), vsprintf(fErrorBuffer, msg, ap), va_end(ap), fErrorBuffer) ));
2060 AliError(Form("Event %6i: Eq. %2d S %i l %2i - %s : %s",
2061 fRawReader->GetEventIndex(), fCurrEquipmentId, fCurrSlot, fCurrLink, fgkErrorMessages[err],
2062 (va_start(ap, msg), vsprintf(fErrorBuffer, msg, ap), va_end(ap), fErrorBuffer) ));
2063 fErrorFlags |= fgErrorBehav[err];
2067 void AliTRDrawStream::ROBError(ErrorCode_t err, const char *const msg, ...)
2069 // register error according to error code on ROB level
2070 // and return the corresponding error message
2072 fLastError.fSector = fCurrEquipmentId - kDDLOffset;
2073 fLastError.fStack = fCurrSlot;
2074 fLastError.fLink = fCurrLink;
2075 fLastError.fRob = fCurrRobPos;
2076 fLastError.fMcm = -1;
2077 fLastError.fError = err;
2078 (this->*fStoreError)();
2081 if (fgErrorDebugLevel[err] > 0)
2082 AliDebug(fgErrorDebugLevel[err],
2083 Form("Event %6i: Eq. %2d S %i l %2i ROB %i - %s : %s",
2084 fRawReader->GetEventIndex(), fCurrEquipmentId, fCurrSlot, fCurrLink, fCurrRobPos, fgkErrorMessages[err],
2085 (va_start(ap, msg), vsprintf(fErrorBuffer, msg, ap), va_end(ap), fErrorBuffer) ));
2087 AliError(Form("Event %6i: Eq. %2d S %i l %2i ROB %i - %s : %s",
2088 fRawReader->GetEventIndex(), fCurrEquipmentId, fCurrSlot, fCurrLink, fCurrRobPos, fgkErrorMessages[err],
2089 (va_start(ap, msg), vsprintf(fErrorBuffer, msg, ap), va_end(ap), fErrorBuffer) ));
2090 fErrorFlags |= fgErrorBehav[err];
2094 void AliTRDrawStream::MCMError(ErrorCode_t err, const char *const msg, ...)
2096 // register error according to error code on MCM level
2097 // and return the corresponding error message
2099 fLastError.fSector = fCurrEquipmentId - kDDLOffset;
2100 fLastError.fStack = fCurrSlot;
2101 fLastError.fLink = fCurrLink;
2102 fLastError.fRob = fCurrRobPos;
2103 fLastError.fMcm = fCurrMcmPos;
2104 fLastError.fError = err;
2105 (this->*fStoreError)();
2108 if (fgErrorDebugLevel[err] > 0)
2109 AliDebug(fgErrorDebugLevel[err],
2110 Form("Event %6i: Eq. %2d S %i l %2i ROB %i MCM %2i - %s : %s",
2111 fRawReader->GetEventIndex(), fCurrEquipmentId, fCurrSlot, fCurrLink, fCurrRobPos, fCurrMcmPos, fgkErrorMessages[err],
2112 (va_start(ap, msg), vsprintf(fErrorBuffer, msg, ap), va_end(ap), fErrorBuffer) ));
2114 AliError(Form("Event %6i: Eq. %2d S %i l %2i ROB %i MCM %2i - %s : %s",
2115 fRawReader->GetEventIndex(), fCurrEquipmentId, fCurrSlot, fCurrLink, fCurrRobPos, fCurrMcmPos, fgkErrorMessages[err],
2116 (va_start(ap, msg), vsprintf(fErrorBuffer, msg, ap), va_end(ap), fErrorBuffer) ));
2117 fErrorFlags |= fgErrorBehav[err];
2120 const char* AliTRDrawStream::GetErrorMessage(ErrorCode_t errCode)
2122 // return the error message for the given error code
2124 if (errCode > 0 && errCode < kLastErrorCode)
2125 return fgkErrorMessages[errCode];
2130 void AliTRDrawStream::AliTRDrawStats::ClearStats()
2132 // clear statistics (includes clearing sector-wise statistics)
2135 for (Int_t iSector = 0; iSector < 18; iSector++) {
2136 fStatsSector[iSector].ClearStats();
2141 void AliTRDrawStream::AliTRDrawStats::AliTRDrawStatsSector::ClearStats()
2143 // clear statistics (includes clearing HC-wise statistics)
2151 for (Int_t iHC = 0; iHC < 60; iHC++) {
2152 fStatsHC[iHC].ClearStats();
2156 void AliTRDrawStream::AliTRDrawStats::AliTRDrawStatsSector::AliTRDrawStatsHC::ClearStats()
2167 void AliTRDrawStream::SetDumpMCM(Int_t det, Int_t rob, Int_t mcm, Bool_t dump)
2169 // mark MCM for dumping of raw data
2172 fDumpMCM[fNDumpMCMs++] = (det << 7) | (rob << 4) | mcm;
2176 for (iMCM = 0; iMCM < fNDumpMCMs; iMCM++) {
2177 if (fDumpMCM[iMCM] == ((det << 7) | (rob << 4) | mcm)) {
2182 for ( ; iMCM < fNDumpMCMs; iMCM++) {
2183 fDumpMCM[iMCM] = fDumpMCM[iMCM+1];
2188 Bool_t AliTRDrawStream::DumpingMCM(Int_t det, Int_t rob, Int_t mcm) const
2190 // check if MCM data should be dumped
2192 for (Int_t iMCM = 0; iMCM < fNDumpMCMs; iMCM++) {
2193 if (fDumpMCM[iMCM] == ((det << 7) | (rob << 4) | mcm)) {
2200 TString AliTRDrawStream::DumpRaw(TString title, const UInt_t *start, Int_t length, UInt_t endmarker)
2205 for (Int_t pos = 0; pos < length; pos += 4) {
2206 if ((start[pos+0] != endmarker) && pos+0 < length)
2207 if ((start[pos+1] != endmarker && pos+1 < length))
2208 if ((start[pos+2] != endmarker && pos+2 < length))
2209 if ((start[pos+3] != endmarker && pos+3 < length))
2210 title += Form(" 0x%08x 0x%08x 0x%08x 0x%08x\n",
2211 start[pos+0], start[pos+1], start[pos+2], start[pos+3]);
2213 title += Form(" 0x%08x 0x%08x 0x%08x 0x%08x\n",
2214 start[pos+0], start[pos+1], start[pos+2], start[pos+3]);
2218 title += Form(" 0x%08x 0x%08x 0x%08x\n",
2219 start[pos+0], start[pos+1], start[pos+2]);
2223 title += Form(" 0x%08x 0x%08x\n",
2224 start[pos+0], start[pos+1]);
2228 title += Form(" 0x%08x\n",
2236 TString AliTRDrawStream::DumpMcmHeader(TString title, UInt_t word)
2238 title += Form("0x%08x -> ROB: %i, MCM: %2i",
2239 word, ROB(word), MCM(word));
2243 TString AliTRDrawStream::DumpAdcMask(TString title, UInt_t word)
2245 title += Form("0x%08x -> #ch : %2i, 0x%06x (%2i ch)",
2246 word, GetNActiveChannels(word), GetActiveChannels(word), GetNActiveChannelsFromMask(word));
2250 AliTRDrawStream::AliTRDrawStreamError::AliTRDrawStreamError(Int_t error, Int_t sector, Int_t stack, Int_t link, Int_t rob, Int_t mcm) :
2262 void AliTRDrawStream::SortTracklets(TClonesArray *trklArray, TList &sortedTracklets, Int_t *indices)
2264 // sort tracklets for referencing from GTU tracks
2269 Int_t nTracklets = trklArray->GetEntriesFast();
2272 for (Int_t iTracklet = 0; iTracklet < nTracklets; iTracklet++) {
2273 AliTRDtrackletBase *trkl = (AliTRDtrackletBase*) ((*trklArray)[iTracklet]);
2274 Int_t hc = trkl->GetHCId();
2275 if ((hc < 0) || (hc >= 1080)) {
2276 AliErrorClass(Form("HC for tracklet: 0x%08x out of range: %i", trkl->GetTrackletWord(), trkl->GetHCId()));
2279 AliDebugClass(5, Form("hc: %4i : 0x%08x z: %2i", hc, trkl->GetTrackletWord(), trkl->GetZbin()));
2281 AliDebugClass(2, Form("set tracklet index for HC %i to %i", hc, iTracklet));
2282 indices[hc] = iTracklet + 1;
2287 for (Int_t iDet = 0; iDet < 540; iDet++) {
2288 Int_t trklIndexA = indices[2*iDet + 0] - 1;
2289 Int_t trklIndexB = indices[2*iDet + 1] - 1;
2290 Int_t trklIndex = sortedTracklets.GetEntries();
2291 AliTRDtrackletBase *trklA = trklIndexA > -1 ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexA]) : 0x0;
2292 AliTRDtrackletBase *trklB = trklIndexB > -1 ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexB]) : 0x0;
2293 AliTRDtrackletBase *trklNext = 0x0;
2294 while (trklA != 0x0 || trklB != 0x0) {
2295 AliDebugClass(5, Form("det %i - A: %i/%i -> %p, B: %i/%i -> %p",
2296 iDet, trklIndexA, nTracklets, trklA, trklIndexB, nTracklets, trklB));
2300 trklB = trklIndexB < nTracklets ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexB]) : 0x0;
2301 if (trklB && trklB->GetHCId() != 2*iDet + 1)
2304 else if (trklB == 0x0) {
2307 trklA = trklIndexA < nTracklets ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexA]) : 0x0;
2308 if (trklA && trklA->GetHCId() != 2*iDet)
2312 if (trklA->GetZbin() <= trklB->GetZbin()) {
2315 trklA = trklIndexA < nTracklets ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexA]) : 0x0;
2316 if (trklA && trklA->GetHCId() != 2*iDet)
2322 trklB = trklIndexB < nTracklets ? (AliTRDtrackletBase*) ((*trklArray)[trklIndexB]) : 0x0;
2323 if (trklB && trklB->GetHCId() != 2*iDet + 1)
2328 sortedTracklets.Add(trklNext);
2333 // updating tracklet indices as in output
2334 if (sortedTracklets.GetEntries() != trklIndex) {
2335 indices[2*iDet + 0] = trklIndex;
2336 indices[2*iDet + 1] = sortedTracklets.GetEntries();
2338 indices[2*iDet + 0] = indices[2*iDet + 1] = -1;
2343 void AliTRDrawStream::AssignTracklets(AliESDTrdTrack *trdTrack, Int_t *trackletIndex, Int_t refIndex[6])
2345 UInt_t mask = trdTrack->GetLayerMask();
2346 UInt_t stack = trdTrack->GetStack();
2348 for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
2349 refIndex[iLayer] = -1;
2351 if (mask & (1 << iLayer)) {
2353 Int_t det = trdTrack->GetSector()*30 + stack*6 + iLayer;
2354 Int_t idx = trdTrack->GetTrackletIndex(iLayer);
2356 if ((det < 0) || (det > 539)) {
2357 AliErrorClass(Form("Invalid detector no. from track: %i", 2*det));
2360 if (trackletIndex[2*det] >= 0) {
2361 if ((trackletIndex[2*det] + idx > -1) &&
2362 (trackletIndex[2*det] + idx < trackletIndex[2*det+1])) {
2363 refIndex[iLayer] = trackletIndex[2*det] + idx;
2365 AliErrorClass(Form("Requested tracklet index %i out of range", idx));
2368 AliErrorClass(Form("Non-existing tracklets requested in det %i", det));