]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRDrawStream.h
There are two modification:
[u/mrichter/AliRoot.git] / TRD / AliTRDrawStream.h
CommitLineData
0508ca31 1/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
2 * See cxx source for full Copyright notice */
3
4//-----------------------------------
5//
5f006bd7 6// decoding of TRD raw data stream
0508ca31 7// and translation into digits
8//
9//----------------------------------
10
d60fe037 11#ifndef ALITRDRAWSTREAM_H
12#define ALITRDRAWSTREAM_H
13
8df1f8f5 14#include "TObject.h"
f4b3235e 15#include "TClonesArray.h"
16#include "TTree.h"
d60fe037 17
9cb9c409 18#include "AliLog.h"
19
d60fe037 20class TObjArray;
21class TString;
cc26f39c 22class TBranch;
d60fe037 23
24class AliRawReader;
25class AliTRDdigitsManager;
26class AliTRDdigitsParam;
27class AliTRDarrayADC;
28class AliTRDSignalIndex;
cc26f39c 29class AliTRDtrackletContainer;
d60fe037 30
8df1f8f5 31class AliTRDrawStream : public TObject
d60fe037 32{
33 public:
34 AliTRDrawStream(AliRawReader *rawReader = 0x0);
35 ~AliTRDrawStream();
36
9cb9c409 37 enum { kDDLOffset = 0x400, // Offset for DDL numbers
38 kDDLMax = 0x411 }; // Max DDL number for TRD SM
84f471a7 39
d60fe037 40 Bool_t SetReader(AliRawReader *rawReader) { fRawReader = rawReader; return kTRUE; }
41 void SetDigitsManager(AliTRDdigitsManager *digMgr) { fDigitsManager = digMgr; }
5fdfc9e4 42 void SetTrackletArray(TClonesArray *ar) { fTracklets = ar; }
43 void SetTrackArray(TClonesArray *ar) { fTracks = ar; }
44 void SetMarkerArray(TClonesArray *ar) { fMarkers = ar; }
45
46 TClonesArray* GetTrackletArray() const { return fTracklets; }
47 TClonesArray* GetTrackArray() const { return fTracks; }
48 TClonesArray* GetMarkerArray() const { return fMarkers; }
d60fe037 49
f4b3235e 50 AliTRDdigitsManager* GetDigitsManager() const { return fDigitsManager; }
51 TTree *GetTrackletTree() const { return fTrackletTree; }
52
d60fe037 53 Bool_t ReadEvent(TTree *trackletTree = 0x0);
54
55 Bool_t NextDDL();
5f006bd7 56 Int_t NextChamber(AliTRDdigitsManager *digMgr);
9cb9c409 57 Int_t NextChamber(AliTRDdigitsManager *digMgr,
2519cca4 58 UInt_t ** /* trackletContainer */, UShort_t ** /* errorContainer */) { AliError("Deprecated, use NextChamber(AliTRDdigitsManger*) instead!"); return NextChamber(digMgr); }
d60fe037 59
67271412 60 Bool_t ConnectTracklets(TTree *trklTree);
61
5fdfc9e4 62 void StoreErrorsInTree() { fStoreError = &AliTRDrawStream::StoreErrorTree; }
63 void StoreErrorsInArray() { fStoreError = &AliTRDrawStream::StoreErrorArray; }
f4b3235e 64 void EnableErrorStorage() { fStoreError = &AliTRDrawStream::StoreErrorTree; }
65 void DisableErrorStorage() { fStoreError = &AliTRDrawStream::ForgetError; }
66
d60fe037 67 // error handling
5f006bd7 68 enum ErrorCode_t {
69 kUnknown = 0,
70 kLinkMonitor,
71 kPtrgCntMismatch,
d60fe037 72 kNonTrdEq,
73 kStackHeaderInvalid,
74 kInvalidDetector,
75 kNoDigits,
76 kHCmismatch,
77 kHCcheckFailed,
78 kPosUnexp,
79 kTPmodeInvalid,
80 kTPmismatch,
81 kNtimebinsChanged,
82 kAdcMaskInconsistent,
83 kAdcCheckInvalid,
84 kAdcDataAbort,
85 kAdcChannelsMiss,
86 kMissMcmHeaders,
2519cca4 87 kMissTpData,
d60fe037 88 kLastErrorCode
5f006bd7 89 };
d60fe037 90
cc26f39c 91 enum ErrorBehav_t {
92223bf6 92 kTolerate = 0,
5f006bd7 93 kAbort = 1,
92223bf6 94 kDiscardMCM = 2,
95 kDiscardHC = 4
cc26f39c 96 };
97
5fdfc9e4 98 enum MarkerCode_t {
8df9496c 99 kHCactive = 1,
100 kSecactive = 2
5fdfc9e4 101 };
102
0508ca31 103 TTree* GetErrorTree() const { return fErrors; }
d60fe037 104 static const char* GetErrorMessage(ErrorCode_t errCode);
9cb9c409 105 static void SetErrorDebugLevel(ErrorCode_t error, Int_t level) { fgErrorDebugLevel[error] = level; }
106 static void SetErrorBehaviour(ErrorCode_t error, ErrorBehav_t behav) { fgErrorBehav[error] = behav; }
d60fe037 107
8df9496c 108 class AliTRDrawStreamError : public TObject {
109 public:
5f006bd7 110 AliTRDrawStreamError(Int_t error = 0, Int_t sector = -1, Int_t stack = -1, Int_t link = -1, Int_t rob = -1, Int_t mcm = -1);
8df9496c 111 virtual ~AliTRDrawStreamError() {}
112 Int_t fError; // error code
113 Int_t fSector; // sector
114 Int_t fStack; // stack
115 Int_t fLink; // link
116 Int_t fRob; // ROB no
117 Int_t fMcm; // MCM no
118 ClassDef(AliTRDrawStreamError, 1);
119 };
120
cc26f39c 121 // event statistics
122 class AliTRDrawStats : public TObject {
123 public:
124 AliTRDrawStats() : TObject(), fBytesRead(0) {}
125 void ClearStats();
126
127 class AliTRDrawStatsSector : public TObject {
128 public:
129 AliTRDrawStatsSector() : TObject(), fBytes(0), fBytesRead(0), fNTracklets(0), fNMCMs(0), fNChannels(0) {}
130 void ClearStats();
131
132 class AliTRDrawStatsHC : public TObject {
133 public:
134 AliTRDrawStatsHC() : TObject(), fBytes(0), fBytesRead(0), fNTracklets(0), fNMCMs(0), fNChannels(0) {}
135 void ClearStats();
136
137 Int_t fBytes; // number of bytes (not necessarily read)
138 Int_t fBytesRead; // number of bytes read
139 Int_t fNTracklets; // number of tracklets
140 Int_t fNMCMs; // number of MCMs (from MCM headers)
141 Int_t fNChannels; // number of channels
142 ClassDef(AliTRDrawStatsHC, 1);
143 };
144
145 Int_t fBytes; // number of bytes (not necessarily read)
146 Int_t fBytesRead; // number of bytes read
147 Int_t fNTracklets; // number of tracklets
148 Int_t fNMCMs; // number of MCMs (from MCM headers)
149 Int_t fNChannels; // number of channels
150 AliTRDrawStatsHC fStatsHC[60]; //[60] HC-wise statistics
151 ClassDef(AliTRDrawStatsSector, 1);
152 };
153
cc26f39c 154 AliTRDrawStatsSector fStatsSector[18]; //[18] sector-wise statistics
155 Int_t fBytesRead; // number of bytes read
156 ClassDef(AliTRDrawStats, 1);
157 };
158
cc26f39c 159 AliTRDrawStats* GetStats() { return &fStats; }
92305359 160 Int_t GetEventSize(Int_t sector) const { return fStats.fStatsSector[sector].fBytes; }
161 Int_t GetNTracklets(Int_t sector) const { return fStats.fStatsSector[sector].fNTracklets; }
162 Int_t GetNMCMs(Int_t sector) const { return fStats.fStatsSector[sector].fNMCMs; }
163 Int_t GetNChannels(Int_t sector) const { return fStats.fStatsSector[sector].fNChannels; }
cc26f39c 164
2519cca4 165 ULong64_t GetTrkFlags(Int_t sector, Int_t stack) const { return fCurrTrkFlags[sector*fgkNstacks + stack]; }
166 UInt_t GetTriggerFlags(Int_t sector) const { return fCurrTrgFlags[sector]; }
167
cc26f39c 168 // raw data dumping
169 void SetDumpMCM(Int_t det, Int_t rob, Int_t mcm, Bool_t dump = kTRUE);
170
92305359 171 Bool_t IsDumping() const { return (fNDumpMCMs > 0); }
172 Bool_t DumpingMCM(Int_t det, Int_t rob, Int_t mcm) const;
cc26f39c 173
5f006bd7 174 TString DumpRaw(TString title, UInt_t *start, Int_t length, UInt_t endmarker = 0xffffffff);
9cb9c409 175 TString DumpMcmHeader(TString title, UInt_t word);
176 TString DumpAdcMask(TString title, UInt_t word);
177
178 // temporary: allow to change expected readout order
179 static void SetMCMReadoutPos(Int_t mcm, Int_t pos) { if (mcm > -1 && mcm < 16) fgMcmOrder[mcm] = pos; }
180 static void SetROBReadoutPos(Int_t robpair, Int_t pos) { if (robpair > -1 && robpair < 4) fgMcmOrder[robpair] = pos; }
cc26f39c 181
d60fe037 182 protected:
9cb9c409 183 Int_t ReadGTUHeaders(UInt_t *buffer);
d60fe037 184 Int_t ReadSmHeader();
9cb9c409 185 Int_t ReadTrackingHeader(Int_t stack);
186 Int_t ReadTriggerHeaders();
187 Int_t ReadStackHeader(Int_t stack);
188 Int_t DecodeGTUtracks();
189 Int_t ReadGTUTrailer();
d60fe037 190
191 Int_t ReadLinkData();
192 Int_t ReadTracklets();
193 Int_t ReadHcHeader();
194 Int_t ReadTPData(Int_t mode = 1);
195 Int_t ReadZSData();
196 Int_t ReadNonZSData();
197
92223bf6 198 Int_t SeekNextLink();
199
d60fe037 200 // MCM header decoding
0508ca31 201 Int_t ROB(UInt_t mcmhdr) const { return 0x7 & mcmhdr >> 28; }
202 Int_t MCM(UInt_t mcmhdr) const { return 0xf & mcmhdr >> 24; }
203 Int_t Row(UInt_t mcmhdr) const { return (ROB(mcmhdr) / 2) * 4 + MCM(mcmhdr) / 4; }
204 Int_t AdcColOffset(UInt_t mcmhdr) const { return (MCM(mcmhdr) % 4 + 1) * 21 + (ROB(mcmhdr) % 2) * 84 - 1; }
205 Int_t PadColOffset(UInt_t mcmhdr) const { return (MCM(mcmhdr) % 4 + 1) * 18 + (ROB(mcmhdr) % 2) * 72 + 1; }
206 Int_t EvNo(UInt_t mcmhdr) const { return 0xfffff & mcmhdr >> 4; }
207 Int_t Check(UInt_t mcmhdr) const { return 0xf & mcmhdr; }
208 Int_t CouldBeMCMhdr(UInt_t mcmhdr) const { return ((0xf & mcmhdr) == 0xc); }
209
9cb9c409 210 Int_t GetMCMReadoutPos(Int_t mcm) const { return (mcm > -1 && mcm < 16) ? fgMcmOrder[mcm] : -1; }
211 Int_t GetROBReadoutPos(Int_t rob) const { return (rob > -1 && rob < 4) ? fgRobOrder[rob] : -1; }
d60fe037 212
213 // ADC mask decoding
0508ca31 214 Int_t GetActiveChannels(UInt_t adcmask) const { return 0x1fffff & adcmask >> 4; }
82029d44 215 inline Int_t GetNActiveChannelsFromMask(UInt_t adcmask) const; // { Int_t nch = 0; for (Int_t i = 0; i < 21; i++) if ((GetActiveChannels(adcmask) & 1 << i)) nch++; return nch; }
0508ca31 216 Int_t GetNActiveChannels(UInt_t adcmask) const { return (0x1f & ~(adcmask >> 25)); }
217 Int_t CouldBeADCmask(UInt_t adcmask) const { return ((0xf & adcmask) == 0xc && (0x3 & adcmask >> 30) == 0x1); }
5f006bd7 218
d60fe037 219 // error message generation
5f006bd7 220 void EquipmentError(ErrorCode_t err = kUnknown, const char *const msg = "", ...);
221 void StackError (ErrorCode_t err = kUnknown, const char *const msg = "", ...);
222 void LinkError (ErrorCode_t err = kUnknown, const char *const msg = "", ...);
223 void ROBError (ErrorCode_t err = kUnknown, const char *const msg = "", ...);
224 void MCMError (ErrorCode_t err = kUnknown, const char *const msg = "", ...);
f4b3235e 225 void StoreErrorTree() { fErrors->Fill(); }
5fdfc9e4 226 void StoreErrorArray() { new ((*fMarkers)[fMarkers->GetEntriesFast()]) AliTRDrawStreamError(fLastError); }
f4b3235e 227 void ForgetError() { return; }
228 void (AliTRDrawStream::*fStoreError)(); //! function pointer to method used for storing the error
d60fe037 229
92305359 230 static const char* fgkErrorMessages[kLastErrorCode]; // error messages corresponding to the error codes
231 static Int_t fgErrorDebugLevel[kLastErrorCode]; // error debug level
92223bf6 232 static ErrorBehav_t fgErrorBehav[kLastErrorCode]; // bevhaviour in case of error of given type
d60fe037 233
234 // I/O
5f006bd7 235 AliRawReader *fRawReader; // pointer to the raw reader to take the data from
0508ca31 236 AliTRDdigitsManager *fDigitsManager; // pointer to the digitsManager to fill the data
237 AliTRDdigitsParam *fDigitsParam; // pointer to the parameters belonging to the digits
d60fe037 238
0508ca31 239 TTree *fErrors; // tree containing the occured error codes
8df9496c 240 AliTRDrawStreamError fLastError; // last error which occured
92223bf6 241 UInt_t fErrorFlags; // error flags used to steer subsequent reading
242 char fErrorBuffer[100]; // buffer for error message
d60fe037 243
2519cca4 244 AliTRDrawStats fStats; // event statistics, clearing must be done by the user
245
0508ca31 246 UInt_t *fPayloadStart; // pointer to start of data payload
247 UInt_t *fPayloadCurr; // pointer to current reading position in the payload
cc26f39c 248 Int_t fPayloadSize; // size of the payload (in UInt_t words)
d60fe037 249
0508ca31 250 static const Int_t fgkNlinks; // number of links to read
9cb9c409 251 static const Int_t fgkNsectors; // number of sectors
0508ca31 252 static const Int_t fgkNstacks; // number of stacks to read
9cb9c409 253 static const Int_t fgkNtriggers; // number of triggers in data stream
5f006bd7 254 static const UInt_t fgkDataEndmarker; // data endmarker
0508ca31 255 static const UInt_t fgkTrackletEndmarker; // tracklet endmarker
9cb9c409 256 static Int_t fgMcmOrder []; // expected readout order of the MCMs
257 static Int_t fgRobOrder []; // expected readout order of the ROBs
d60fe037 258
259 // persistent information
0508ca31 260 Int_t fNtimebins; // number of timebins
5f006bd7 261 Int_t fLastEvId; // Event ID of last event
d60fe037 262
263 // information valid at current reader position
0508ca31 264 // all the variables fCurr... refer to the value at the current
265 // reading position
5f006bd7 266 Int_t fCurrSlot; // current slot
0508ca31 267 Int_t fCurrLink; // current link
268 Int_t fCurrRobPos; // current ROB number
269 Int_t fCurrMcmPos; // current MCM number
d60fe037 270
271 // DDL header
0508ca31 272 UInt_t fCurrEquipmentId; // current Equipment ID
d60fe037 273
9cb9c409 274 // SM header
275 UInt_t fCurrSmHeaderSize; // current size of the SM header
276 UInt_t fCurrSmHeaderVersion; // current version of the SM header
277 UInt_t fCurrTrailerReadout; // current presence of trailer (after the payload)
278 UInt_t fCurrTrgHeaderAvail; // current trigger information availability
279 UInt_t fCurrTrgHeaderReadout; // current readout mode for the trigger headers
280 UInt_t fCurrTrkHeaderAvail; // current tracking information availability
281 UInt_t fCurrEvType; // current event type
282 UInt_t fCurrTriggerEnable; // current trigger enable
283 UInt_t fCurrTriggerFired; // current trigger fired
0508ca31 284 UInt_t fCurrTrackEnable; // current value of track enable
285 UInt_t fCurrTrackletEnable; // current value of tracklet enable
286 UInt_t fCurrStackMask; // current mask of active stacks
d60fe037 287
9cb9c409 288 // Tracking header
289 UInt_t *fCurrTrkHeaderIndexWord; // current tracking header index word
290 UInt_t *fCurrTrkHeaderSize; // current tracking header index word
2519cca4 291 ULong64_t *fCurrTrkFlags; // current tracking done flags
9cb9c409 292
293 // Trigger header
294 UInt_t *fCurrTrgHeaderIndexWord; // current tracking header index word
295 UInt_t *fCurrTrgHeaderSize; // current tracking header index word
2519cca4 296 UInt_t *fCurrTrgFlags; // current trigger flags of all sectors
9cb9c409 297
298 // Stack header
0508ca31 299 UInt_t *fCurrStackIndexWord; // current stack index words
300 UInt_t *fCurrStackHeaderSize; // current stack index sizes
301 UInt_t *fCurrStackHeaderVersion; // current stack header versions
302 UInt_t *fCurrLinkMask; // current link masks
303 UInt_t *fCurrCleanCheckout; // current clean checkout flags
304 UInt_t *fCurrBoardId; // current board IDs
9cb9c409 305 UInt_t fCurrHwRev; // current hardware revision
306 UInt_t *fCurrHwRevTMU; // current hardware revision
0508ca31 307 UInt_t *fCurrLinkMonitorFlags; // current link monitor flags
308 UInt_t *fCurrLinkDataTypeFlags; // current link data flags
309 UInt_t *fCurrLinkDebugFlags; // current link debug flags
d60fe037 310
311 // HC information
0508ca31 312 Int_t fCurrSpecial; // current value of the special flag
313 Int_t fCurrMajor; // current major version
314 Int_t fCurrMinor; // current minor version
315 Int_t fCurrAddHcWords; // current number of additional HC-header words
316 Int_t fCurrSm; // current sector
317 Int_t fCurrStack; // current stack
318 Int_t fCurrLayer; // current layer
319 Int_t fCurrSide; // current side
320 Int_t fCurrHC; // current HC
321 Int_t fCurrCheck; // current check bits
322 Int_t fCurrNtimebins; // current number of timebins
323 Int_t fCurrBC; // current BC
324 Int_t fCurrPtrgCnt; // current pretrigger count
325 Int_t fCurrPtrgPhase; // current pretrigger phase
d60fe037 326
cc26f39c 327 // settings for dumping
328 Int_t fDumpMCM[100]; // MCMs to dump
329 Int_t fNDumpMCMs; // number of MCMs to dump
330
d60fe037 331 // tracklet information
0508ca31 332 TClonesArray *fTrackletArray; // pointer to array for tracklet storage
d60fe037 333
334 // output data
0508ca31 335 AliTRDarrayADC *fAdcArray; // pointer to ADC array
336 AliTRDSignalIndex *fSignalIndex; // pointer to the signal index
337 TTree *fTrackletTree; // pointer to the tree for tracklet storage
5fdfc9e4 338 TClonesArray *fTracklets; // pointer to array of tracklets
339 TClonesArray *fTracks; // pointer to array of GTU tracks
340 TClonesArray *fMarkers; // pointer to array of markers (data present, errors, ...)
d60fe037 341
342 AliTRDrawStream(const AliTRDrawStream&); // not implemented
0508ca31 343 AliTRDrawStream& operator=(const AliTRDrawStream&); // not implemented
d60fe037 344
345 ClassDef(AliTRDrawStream, 0);
346};
347
82029d44 348Int_t AliTRDrawStream::GetNActiveChannelsFromMask(UInt_t adcmask) const
349{
350 // return number of active bits in the ADC mask
351
352 adcmask = GetActiveChannels(adcmask);
353 adcmask = adcmask - ((adcmask >> 1) & 0x55555555);
354 adcmask = (adcmask & 0x33333333) + ((adcmask >> 2) & 0x33333333);
355 return (((adcmask + (adcmask >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24;
356}
357
d60fe037 358#endif