Line data Source code
1 : #ifndef ALIMUONRAWSTREAMTRIGGERHP_H
2 : #define ALIMUONRAWSTREAMTRIGGERHP_H
3 : /* This file is property of and copyright by the ALICE HLT Project *
4 : * ALICE Experiment at CERN, All rights reserved. *
5 : * See cxx source for full Copyright notice */
6 :
7 : /* $Id$ */
8 :
9 : /// \ingroup raw
10 : /// \class AliMUONRawStreamTriggerHP
11 : /// \brief Higher performance decoder stream class for reading MUON raw trigger data.
12 : ///
13 : // This provides a streamer interface to the high performance decoder which
14 : // is required for AliRoot.
15 : //
16 : // Author Artur Szostak <artursz@iafrica.com>
17 :
18 : #include "AliMUONVRawStreamTrigger.h"
19 : #include "AliMUONTriggerDDLDecoder.h"
20 : #include "TArrayS.h"
21 :
22 : class AliMUONDDLTrigger;
23 :
24 :
25 : class AliMUONRawStreamTriggerHP : public AliMUONVRawStreamTrigger
26 : {
27 : public:
28 : class AliLocalStruct;
29 :
30 : AliMUONRawStreamTriggerHP();
31 : AliMUONRawStreamTriggerHP(AliRawReader* rawReader);
32 : virtual ~AliMUONRawStreamTriggerHP();
33 :
34 : /// Initialize iterator
35 : virtual void First();
36 :
37 : /// DDL iterator
38 : virtual Bool_t NextDDL();
39 :
40 : /// Whether the iteration is finished or not
41 : virtual Bool_t IsDone() const;
42 :
43 : /// Nothing is actually done in the AddErrorMessage method because we log
44 : /// the error messages as we find them in AliDecoderEventHandler::OnError().
45 0 : virtual void AddErrorMessage() { };
46 :
47 : /// Advance one step in the iteration. Returns false if finished.
48 : virtual Bool_t Next(UChar_t& id, UChar_t& dec, Bool_t& trigY,
49 : UChar_t& yPos, UChar_t& sXDev, UChar_t& xDev,
50 : UChar_t& xPos, Bool_t& triggerY, Bool_t& triggerX,
51 : TArrayS& xPattern, TArrayS& yPattern);
52 :
53 : /// Construct and return a pointer to the DDL payload object.
54 : virtual AliMUONDDLTrigger* GetDDLTrigger() const;
55 :
56 : /// Returns the next local trigger structure.
57 : const AliLocalStruct* Next();
58 :
59 : /// Return maximum number of DDLs.
60 48 : virtual Int_t GetMaxDDL() const { return fgkMaxDDL; }
61 :
62 : /// Return maximum number of regional cards in the DDL.
63 0 : virtual Int_t GetMaxReg() const { return (Int_t) fDecoder.MaxRegionals(); }
64 :
65 : /// Set the maximum number of regional cards in the DDL.
66 : virtual void SetMaxReg(Int_t reg);
67 :
68 : /// Return maximum number of local cards in the DDL.
69 1936 : virtual Int_t GetMaxLoc() const { return (Int_t) fDecoder.MaxLocals(); }
70 :
71 : /// Sets the maximum number of local cards in the DDL.
72 : virtual void SetMaxLoc(Int_t loc);
73 :
74 : /// Return number of the current DDL being handled in the range [0..1] and -1 if no DDL set.
75 128 : virtual Int_t GetDDL() const { return fDDL - 1; }
76 :
77 : /// check error/Warning presence
78 0 : virtual Bool_t IsErrorMessage() const { return fHadError; }
79 :
80 : /// Set warnings flag to disable warnings on data errors.
81 0 : virtual void DisableWarnings() { fDecoder.GetHandler().Warnings(kFALSE); }
82 : /// Set warnings flag to enable warnings on data errors.
83 0 : virtual void EnableWarnings() { fDecoder.GetHandler().Warnings(kTRUE); }
84 :
85 : /// Get number of end of DARC word errors in the DDL last decoded.
86 0 : UInt_t GetDarcEoWErrors() const {return fDecoder.GetHandler().GetDarcEoWErrors();}
87 :
88 : /// Get number of end of Global word errors in the DDL last decoded.
89 0 : UInt_t GetGlobalEoWErrors() const {return fDecoder.GetHandler().GetGlobalEoWErrors();}
90 :
91 : /// Get number of end of regional word errors in the DDL last decoded.
92 0 : UInt_t GetRegEoWErrors() const {return fDecoder.GetHandler().GetRegEoWErrors();}
93 :
94 : /// Get number of end of local word errors in the DDL last decoded.
95 0 : UInt_t GetLocalEoWErrors() const {return fDecoder.GetHandler().GetLocalEoWErrors();}
96 :
97 : /// Number of end of DARC word errors since First() was called.
98 0 : UInt_t NumberOfDarcEoWErrors() const { return fTotalNumberOfDarcEoWErrors; }
99 :
100 : /// Number of end of global word errors since First() was called.
101 0 : UInt_t NumberOfGlobalEoWErrors() const { return fTotalNumberOfGlobalEoWErrors; }
102 :
103 : /// Number of end of regional word errors since First() was called.
104 0 : UInt_t NumberOfRegEoWErrors() const { return fTotalNumberOfRegEoWErrors; }
105 :
106 : /// Number of end of local word errors since First() was called.
107 0 : UInt_t NumberOfLocalEoWErrors() const { return fTotalNumberOfLocalEoWErrors; }
108 :
109 : /// Whether we got any end of DARC word errors or not since calling First().
110 0 : Bool_t HasDarcEoWError() const { return NumberOfDarcEoWErrors() > 0; }
111 :
112 : /// Whether we got any end of global word errors or not since calling First().
113 0 : Bool_t HasGlobalEoWError() const { return NumberOfGlobalEoWErrors() > 0; }
114 :
115 : /// Whether we got any end of regional word errors or not since calling First().
116 0 : Bool_t HasRegEoWError() const { return NumberOfRegEoWErrors() > 0; }
117 :
118 : /// Whether we got any end of local word errors or not since calling First().
119 0 : Bool_t HasLocalEoWError() const { return NumberOfLocalEoWErrors() > 0; }
120 :
121 : /// Returns the "try to recover from errors" flag.
122 0 : Bool_t TryRecover() const { return Bool_t(fDecoder.TryRecover()); }
123 :
124 : /// Sets the "try to recover from errors" flag.
125 : /// i.e. should the decoder try to recover from errors found in the
126 : /// payload headers.
127 0 : void TryRecover(Bool_t value) { fDecoder.TryRecover(bool(value)); }
128 :
129 : /// Light weight interface class to the DARC and global header data.
130 : class AliHeader
131 : {
132 : public:
133 : /// Default constructor.
134 : AliHeader(
135 : UInt_t darcHeader = 0,
136 : const AliMUONDarcScalarsStruct* darcScalars = NULL,
137 : const AliMUONGlobalHeaderStruct* globalHeader = NULL,
138 : const AliMUONGlobalScalarsStruct* globalScalars = NULL
139 : ) :
140 34 : fDarcHeader(darcHeader), fDarcScalars(darcScalars),
141 17 : fGlobalHeader(globalHeader), fGlobalScalars(globalScalars)
142 34 : {
143 34 : }
144 :
145 : /// Implement shallow copying in the copy constructor.
146 : AliHeader(const AliHeader& o) :
147 0 : fDarcHeader(o.fDarcHeader), fDarcScalars(o.fDarcScalars),
148 0 : fGlobalHeader(o.fGlobalHeader), fGlobalScalars(o.fGlobalScalars)
149 0 : {
150 0 : }
151 :
152 : /// Implement shallow copying in the assignment operator.
153 : AliHeader& operator = (const AliHeader& object)
154 : {
155 16 : memcpy(this, &object, sizeof(AliHeader));
156 8 : return *this;
157 : }
158 :
159 : /// Default destructor.
160 52 : ~AliHeader() {};
161 :
162 : /// Return first word
163 0 : UInt_t GetWord() const {return GetDarcHeader();}
164 : /// Return global input
165 0 : UInt_t GetGlobalInput(Int_t n) const {return fGlobalHeader->fInput[n];}
166 : /// Return global output
167 8 : UChar_t GetGlobalOutput() const {return AliMUONTriggerDDLDecoderEventHandler::GetGlobalOutput(fGlobalHeader);}
168 : /// Return global config
169 0 : UShort_t GetGlobalConfig() const {return AliMUONTriggerDDLDecoderEventHandler::GetGlobalConfig(fGlobalHeader);}
170 :
171 : /// Return event type
172 0 : UChar_t GetEventType() const {return AliMUONTriggerDDLDecoderEventHandler::GetDarcEventType(GetDarcHeader());}
173 : /// Returns true if this was a physics event.
174 0 : Bool_t IsPhysicsEvent() const {return GetEventType() == 0x1;}
175 : /// Return Darc type
176 0 : UChar_t GetDarcType() const {return AliMUONTriggerDDLDecoderEventHandler::GetDarcType(GetDarcHeader());}
177 : /// Return serial number
178 0 : UChar_t GetSerialNb() const {return AliMUONTriggerDDLDecoderEventHandler::GetDarcSerialNb(GetDarcHeader());}
179 : /// Return version
180 0 : UChar_t GetVersion() const {return AliMUONTriggerDDLDecoderEventHandler::GetDarcVersion(GetDarcHeader());}
181 : /// Return VME trig
182 0 : Bool_t GetVMETrig() const {return AliMUONTriggerDDLDecoderEventHandler::GetDarcVMETrig(GetDarcHeader());}
183 : /// Return global flag
184 16 : Bool_t GetGlobalFlag() const {return AliMUONTriggerDDLDecoderEventHandler::GetDarcGlobalFlag(GetDarcHeader());}
185 : /// Return CPT trigger
186 0 : Bool_t GetCTPTrig() const {return AliMUONTriggerDDLDecoderEventHandler::GetDarcCTPTrig(GetDarcHeader());}
187 : /// Return DAQ flag
188 0 : Bool_t GetDAQFlag() const {return AliMUONTriggerDDLDecoderEventHandler::GetDarcDAQFlag(GetDarcHeader());}
189 : /// Return reg pattern
190 0 : UChar_t GetRegPattern() const {return AliMUONTriggerDDLDecoderEventHandler::GetDarcRegPattern(GetDarcHeader());}
191 :
192 : // DARC get methods
193 : /// Return DARC L0 received and used
194 0 : UInt_t GetDarcL0R() const {return (fDarcScalars != NULL) ? fDarcScalars->fL0R : 0;}
195 : /// Return DARC L1 physics
196 0 : UInt_t GetDarcL1P() const {return (fDarcScalars != NULL) ? fDarcScalars->fL1P : 0;}
197 : /// Return DARC L1 software
198 0 : UInt_t GetDarcL1S() const {return (fDarcScalars != NULL) ? fDarcScalars->fL1S : 0;}
199 : /// Return DARC L2 accept
200 0 : UInt_t GetDarcL2A() const {return (fDarcScalars != NULL) ? fDarcScalars->fL2A : 0;}
201 : /// Return DARC L2 reject
202 0 : UInt_t GetDarcL2R() const {return (fDarcScalars != NULL) ? fDarcScalars->fL2R : 0;}
203 : /// Return DARC clock
204 0 : UInt_t GetDarcClock() const {return (fDarcScalars != NULL) ? fDarcScalars->fClk : 0;}
205 : /// Return DARC hold (dead time)
206 0 : UInt_t GetDarcHold() const {return (fDarcScalars != NULL) ? fDarcScalars->fHold : 0;}
207 :
208 : // global get methods
209 : /// Return global L0
210 0 : UInt_t GetGlobalL0() const {return (fGlobalScalars != NULL) ? fGlobalScalars->fL0 : 0;}
211 : /// Return global clock
212 0 : UInt_t GetGlobalClock() const {return (fGlobalScalars != NULL) ? fGlobalScalars->fClk : 0;}
213 : /// Return global scalars or NULL if none exist.
214 0 : const UInt_t* GetGlobalScaler() const {return (fGlobalScalars != NULL) ? &fGlobalScalars->fScaler[0] : NULL;}
215 : /// Return global hold (dead time)
216 0 : UInt_t GetGlobalHold() const {return (fGlobalScalars != NULL) ? fGlobalScalars->fHold : 0;}
217 : /// Return global spare
218 0 : UInt_t GetGlobalSpare() const {return (fGlobalScalars != NULL) ? fGlobalScalars->fSpare : 0;}
219 :
220 : /// Return true if type for DARC is default.
221 0 : Bool_t DarcIsDefaultType() const {return GetDarcType() == AliMUONTriggerDDLDecoder<AliMUONTriggerDDLDecoderEventHandler>::DarcDefaultType();}
222 : /// Return true if type for DARC is Vadorh.
223 0 : Bool_t DarcIsVadohrType() const {return GetDarcType() == AliMUONTriggerDDLDecoder<AliMUONTriggerDDLDecoderEventHandler>::DarcVadorhType();}
224 :
225 : /// Return the DARC header's raw data.
226 16 : UInt_t GetDarcHeader() const {return fDarcHeader;}
227 :
228 : /// Return the DARC scalars raw data or NULL if none exist.
229 0 : const AliMUONDarcScalarsStruct* GetDarcScalars() const {return fDarcScalars;}
230 :
231 : /// Return the global header's raw data.
232 8 : const AliMUONGlobalHeaderStruct* GetGlobalHeader() const {return fGlobalHeader;}
233 :
234 : /// Return the global scalars raw data or NULL if none exist.
235 0 : const AliMUONGlobalScalarsStruct* GetGlobalScalars() const {return fGlobalScalars;}
236 :
237 : /// Print the contents of the headers to screen.
238 : void Print() const;
239 :
240 : private:
241 :
242 : UInt_t fDarcHeader; ///< Pointer to DARC header in DDL payload.
243 : const AliMUONDarcScalarsStruct* fDarcScalars; ///< Pointer to DARC scalars in DDL payload.
244 : const AliMUONGlobalHeaderStruct* fGlobalHeader; ///< Pointer to global header in DDL payload.
245 : const AliMUONGlobalScalarsStruct* fGlobalScalars; ///< Pointer to global scalars in DDL payload.
246 : };
247 :
248 : /// Light weight interface class to the regional card header data.
249 : class AliRegionalHeader
250 : {
251 : public:
252 : /// Default constructor.
253 : AliRegionalHeader(
254 : const AliLocalStruct* localsArray = NULL,
255 : const AliMUONRegionalHeaderStruct* header = NULL,
256 : const AliMUONRegionalScalarsStruct* scalars = NULL
257 : ) :
258 400 : fNext(NULL), fLocalsCount(0), fFirstLocal(localsArray),
259 200 : fHeader(header), fScalars(scalars)
260 400 : {
261 400 : }
262 :
263 : /// Implement shallow copying in the copy constructor.
264 : AliRegionalHeader(const AliRegionalHeader& o) :
265 0 : fNext(o.fNext), fLocalsCount(o.fLocalsCount),
266 0 : fFirstLocal(o.fFirstLocal), fHeader(o.fHeader),
267 0 : fScalars(o.fScalars)
268 0 : {
269 0 : }
270 :
271 : /// Implement shallow copying in the assignment operator.
272 : AliRegionalHeader& operator = (const AliRegionalHeader& object)
273 : {
274 256 : memcpy(this, &object, sizeof(AliRegionalHeader));
275 128 : return *this;
276 : }
277 :
278 : /// Default destructor.
279 672 : ~AliRegionalHeader() {};
280 :
281 : /// Return darc word
282 0 : UInt_t GetDarcWord() const {return fHeader->fDarcWord;}
283 : /// Return first reg word
284 0 : UInt_t GetWord() const {return fHeader->fWord;}
285 : /// Return regional input
286 0 : UInt_t GetInput(Int_t n) const {assert(n < 2); return fHeader->fInput[n];}
287 : /// Return L0
288 0 : UShort_t GetL0() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalL0(fHeader);}
289 : /// Return mask
290 0 : UShort_t GetMask() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalMask(fHeader);}
291 :
292 : //word: phys type:1, reset: 6, serialNb:5, Id:4, version: 8, regional output:8
293 : //true for phys, false for soft
294 : /// Return RegPhysFlag
295 0 : Bool_t GetRegPhysFlag() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalPhysFlag(fHeader);}
296 : /// Return ResetNb
297 0 : UChar_t GetResetNb() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalResetNb(fHeader);}
298 : /// Return SerialNb
299 0 : UChar_t GetSerialNb() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalSerialNb(fHeader);}
300 : /// Return Id
301 0 : UChar_t GetId() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalId(fHeader);}
302 : /// Return Version
303 0 : UChar_t GetVersion() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalVersion(fHeader);}
304 : /// Return Output
305 0 : UChar_t GetOutput() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalOutput(fHeader);}
306 :
307 : //Darc Status: error:10, #fpag:3, MBZ:3, phys type:1, present:1, not_full:1
308 : // not_empty:1, L2Rej:1, L2Acc:1, L1:1, L0:1, #evt:4, busy:4
309 : /// Return ErrorBits
310 0 : UShort_t GetErrorBits() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalErrorBits(fHeader);}
311 : /// Return FPGANumber
312 0 : UChar_t GetFPGANumber() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalFPGANumber(fHeader);}
313 : /// Return DarcPhysFlag
314 0 : Bool_t GetDarcPhysFlag() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalDarcPhysFlag(fHeader);}
315 : /// Return PresentFlag
316 0 : Bool_t GetPresentFlag() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalPresentFlag(fHeader);}
317 : /// Return RamNotFullFlag
318 0 : Bool_t GetRamNotFullFlag() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalRamNotFullFlag(fHeader);}
319 : /// Return RamNotEmptyFlag
320 0 : Bool_t GetRamNotEmptyFlag() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalRamNotEmptyFlag(fHeader);}
321 : /// Return L2RejStatus
322 0 : Bool_t GetL2RejStatus() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalL2RejStatus(fHeader);}
323 : /// Return L2AccStatus
324 0 : Bool_t GetL2AccStatus() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalL2AccStatus(fHeader);}
325 : /// Return L1Status
326 0 : Bool_t GetL1Status() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalL1Status(fHeader);}
327 : /// Return L0Status
328 0 : Bool_t GetL0Status() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalL0Status(fHeader);}
329 : /// Return EventInRam
330 0 : UChar_t GetEventInRam() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalEventInRam(fHeader);}
331 : /// Return Busy
332 0 : UChar_t GetBusy() const {return AliMUONTriggerDDLDecoderEventHandler::GetRegionalBusy(fHeader);}
333 :
334 : // scalar methods
335 : /// Return regional clock
336 0 : UInt_t GetClock() const {return (fScalars != NULL) ? fScalars->fClk : 0;}
337 : /// Return regional ouput
338 0 : const UInt_t* GetScaler() const {return (fScalars != NULL) ? &fScalars->fScaler[0] : NULL;}
339 : /// Return regional hold (dead time)
340 0 : UInt_t GetHold() const {return (fScalars != NULL) ? fScalars->fHold : 0;}
341 :
342 : /// Return raw data of regional header.
343 0 : const AliMUONRegionalHeaderStruct* GetHeader() const { return fHeader; }
344 :
345 : /// Return the raw data of the regional scalars or NULL if none exist.
346 0 : const AliMUONRegionalScalarsStruct* GetScalars() const { return fScalars; }
347 :
348 : /// Return the next regional structure header.
349 0 : const AliRegionalHeader* Next() const { return fNext; }
350 :
351 : /// Returns the first AliLocalStruct class in this regional structure.
352 1936 : const AliLocalStruct* GetFirstLocalStruct() const { return fFirstLocal; }
353 :
354 : /// Returns the number of local trigger structures within this regional structure.
355 4000 : UInt_t GetLocalStructCount() const { return fLocalsCount; }
356 :
357 : /// Return the i'th local trigger structure in this regional structure.
358 : const AliLocalStruct* GetLocalStruct(UInt_t i) const
359 : {
360 3872 : return i < fLocalsCount ? GetFirstLocalStruct() + i : NULL;
361 : }
362 :
363 : /// Sets the next regional structure header.
364 224 : void SetNext(const AliRegionalHeader* next) { fNext = next; }
365 :
366 : /// Increments the local trigger structure count.
367 1936 : void IncLocalStructCount() { fLocalsCount++; };
368 :
369 : /// Print the contents of the regional header and scalars to screen.
370 : void Print() const;
371 :
372 : private:
373 :
374 : const AliRegionalHeader* fNext; ///< Pointer to next regional header.
375 : UInt_t fLocalsCount; ///< The number of AliLocalStruct objects found in the array pointed to by fFirstLocal.
376 : const AliLocalStruct* fFirstLocal; ///< The first local trigger structure of this regional structure.
377 : const AliMUONRegionalHeaderStruct* fHeader; ///< Pointer to the regional header in the DDL payload.
378 : const AliMUONRegionalScalarsStruct* fScalars; ///< Pointer to the regional scalars in the DDL payload.
379 : };
380 :
381 : /// Light weight interface class to the local trigger card data.
382 : class AliLocalStruct
383 : {
384 : public:
385 : /// Default constructor.
386 : AliLocalStruct(
387 : const AliRegionalHeader* regionalHeader = NULL,
388 : const AliMUONLocalInfoStruct* localStruct = NULL,
389 : const AliMUONLocalScalarsStruct* scalars = NULL
390 : ) :
391 4240 : fRegional(regionalHeader), fNext(NULL),
392 2120 : fLocalStruct(localStruct), fScalars(scalars),
393 2120 : fCalculatedId(0)
394 4240 : {
395 4240 : }
396 :
397 : /// Implement shallow copying in the copy constructor.
398 : AliLocalStruct(const AliLocalStruct& o) :
399 0 : fRegional(o.fRegional), fNext(o.fNext),
400 0 : fLocalStruct(o.fLocalStruct), fScalars(o.fScalars),
401 0 : fCalculatedId(o.fCalculatedId)
402 0 : {
403 0 : }
404 :
405 : /// Implement shallow copying in the assignment operator.
406 : AliLocalStruct& operator = (const AliLocalStruct& object)
407 : {
408 1936 : memcpy(this, &object, sizeof(AliLocalStruct));
409 968 : return *this;
410 : }
411 :
412 : /// Default destructor.
413 6432 : ~AliLocalStruct() {};
414 :
415 : /// Return local data
416 : UInt_t GetData(Int_t n) const
417 : {
418 0 : assert(n < 5);
419 0 : return (reinterpret_cast<const UInt_t*>(fLocalStruct))[n];
420 : }
421 :
422 : /// Return X2
423 3872 : UShort_t GetX2() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalX2(fLocalStruct);}
424 : /// Return X1
425 3872 : UShort_t GetX1() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalX1(fLocalStruct);}
426 : /// Return X4
427 3872 : UShort_t GetX4() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalX4(fLocalStruct);}
428 : /// Return X3
429 3872 : UShort_t GetX3() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalX3(fLocalStruct);}
430 :
431 : /// Return Y2
432 3872 : UShort_t GetY2() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalY2(fLocalStruct);}
433 : /// Return Y1
434 3872 : UShort_t GetY1() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalY1(fLocalStruct);}
435 : /// Return Y4
436 3872 : UShort_t GetY4() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalY4(fLocalStruct);}
437 : /// Return Y3
438 3872 : UShort_t GetY3() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalY3(fLocalStruct);}
439 :
440 : /// return X pattern array
441 : void GetXPattern(TArrayS& array) const
442 : {
443 1936 : Short_t vec[4] = {static_cast<Short_t>(GetX1()), static_cast<Short_t>(GetX2()), static_cast<Short_t>(GetX3()), static_cast<Short_t>(GetX4())};
444 968 : array.Set(4, vec);
445 968 : }
446 :
447 : /// return Y pattern array
448 : void GetYPattern(TArrayS& array) const
449 : {
450 1936 : Short_t vec[4] = {static_cast<Short_t>(GetY1()), static_cast<Short_t>(GetY2()), static_cast<Short_t>(GetY3()), static_cast<Short_t>(GetY4())};
451 968 : array.Set(4, vec);
452 968 : }
453 :
454 : /// Return Id
455 3872 : UChar_t GetId() const {return fgOverrideId ? fCalculatedId : AliMUONTriggerDDLDecoderEventHandler::GetLocalId(fLocalStruct);}
456 : /// Return Dec
457 0 : UChar_t GetDec() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalDec(fLocalStruct);}
458 : /// Return TrigY
459 1936 : Bool_t GetTrigY() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalTrigY(fLocalStruct);}
460 : /// Return TriggerY
461 0 : Bool_t GetTriggerY() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalTriggerY(fLocalStruct);}
462 : /// Return Upos
463 1936 : UChar_t GetYPos() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalYPos(fLocalStruct);}
464 : /// Get Sign of X deviation
465 1936 : Bool_t GetSXDev() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalSXDev(fLocalStruct);}
466 : /// Get X deviation
467 1936 : UChar_t GetXDev() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalXDev(fLocalStruct);}
468 : /// Return TriggerX
469 0 : Bool_t GetTriggerX() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalTriggerX(fLocalStruct);}
470 : /// Return Xpos
471 1936 : UChar_t GetXPos() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalXPos(fLocalStruct);}
472 : /// Return LPT
473 1936 : UChar_t GetLpt() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalLpt(fLocalStruct);}
474 : /// Return HPT
475 1936 : UChar_t GetHpt() const {return AliMUONTriggerDDLDecoderEventHandler::GetLocalHpt(fLocalStruct);}
476 :
477 : // Scaler methods
478 : /// Return local L0
479 0 : UInt_t GetL0() const {return (fScalars != NULL) ? fScalars->fL0 : 0;}
480 : /// Return local hold (dead time)
481 0 : UInt_t GetHold() const {return (fScalars != NULL) ? fScalars->fHold : 0;}
482 : /// Return local clock
483 0 : UInt_t GetClock() const {return (fScalars != NULL) ? fScalars->fClk : 0;}
484 :
485 : /// Return switch
486 : UShort_t GetSwitch() const
487 : {
488 0 : return (fScalars != NULL) ?
489 0 : AliMUONTriggerDDLDecoderEventHandler::GetLocalSwitch(fScalars) : 0;
490 : }
491 :
492 : /// Return ComptXY
493 : UChar_t GetComptXY() const
494 : {
495 0 : return (fScalars != NULL) ?
496 0 : AliMUONTriggerDDLDecoderEventHandler::GetLocalComptXY(fScalars) : 0;
497 : }
498 :
499 : /// Return XY1
500 : UShort_t GetXY1(Int_t n) const
501 : {
502 0 : return (fScalars != NULL) ?
503 0 : AliMUONTriggerDDLDecoderEventHandler::GetLocalXY1(fScalars, n) : 0;
504 : }
505 :
506 : /// Return XY2
507 : UShort_t GetXY2(Int_t n) const
508 : {
509 0 : return (fScalars != NULL) ?
510 0 : AliMUONTriggerDDLDecoderEventHandler::GetLocalXY2(fScalars, n) : 0;
511 : }
512 :
513 : /// Return XY3
514 : UShort_t GetXY3(Int_t n) const
515 : {
516 0 : return (fScalars != NULL) ?
517 0 : AliMUONTriggerDDLDecoderEventHandler::GetLocalXY3(fScalars, n) : 0;
518 : }
519 :
520 : /// Return XY4
521 : UShort_t GetXY4(Int_t n) const
522 : {
523 0 : return (fScalars != NULL) ?
524 0 : AliMUONTriggerDDLDecoderEventHandler::GetLocalXY4(fScalars, n) : 0;
525 : }
526 :
527 : /// Return raw data of the local trigger structure.
528 0 : const AliMUONLocalInfoStruct* GetData() const {return fLocalStruct;}
529 :
530 : /// Return raw data of the local trigger scalars.
531 : /// Could be NULL if no scalars present.
532 0 : const AliMUONLocalScalarsStruct* GetScalars() const {return fScalars;}
533 :
534 : /// Return the parent regional header.
535 0 : const AliRegionalHeader* GetRegionalHeader() const { return fRegional; }
536 :
537 : /// Return the next local trigger structure.
538 0 : const AliLocalStruct* Next() const { return fNext; }
539 :
540 : /// Sets the next local trigger structure.
541 1808 : void SetNext(const AliLocalStruct* next) { fNext = next; }
542 :
543 : /// Sets the calculated ID value to be returned by GetId if fgOverrideId is true.
544 1936 : void SetCalculatedId(UChar_t id) { fCalculatedId = id; }
545 :
546 : /// Print the contents of the local trigger structure and contents to screen.
547 : void Print() const;
548 :
549 : /// Returns the override flag indicating if the GetId method should return the calculated Id value or not.
550 0 : static bool GetOverrideIdFlag() { return fgOverrideId; }
551 :
552 : /// Sets the override flag to control what value the GetId method returns.
553 0 : static void SetOverrideIdFlag(bool value) { fgOverrideId = value; }
554 :
555 : private:
556 :
557 : const AliRegionalHeader* fRegional; ///< The regional structure this local trigger structure belongs to.
558 : const AliLocalStruct* fNext; ///< Next local structure object in the regional structure.
559 : const AliMUONLocalInfoStruct* fLocalStruct; ///< Pointer to the local trigger structure data in the DDL payload.
560 : const AliMUONLocalScalarsStruct* fScalars; ///< Pointer to the local trigger scalars data in the DDL payload.
561 : UChar_t fCalculatedId; ///< Calculated ID value returned by GetId() if fgOverrideId == true.
562 : static bool fgOverrideId; //!<! Flag indicating if we should return a calculated number in the GetId method.
563 : };
564 :
565 : /// Returns the DARC and global headers plus scalars if they exist.
566 16 : const AliHeader* GetHeaders() const { return fDecoder.GetHandler().GetHeaders(); }
567 :
568 : /// Return the number of regional structures in the DDL payload.
569 : UInt_t GetRegionalHeaderCount() const
570 : {
571 16 : return fDecoder.GetHandler().RegionalHeaderCount();
572 : }
573 :
574 : /// Return the first regional structure header.
575 : const AliRegionalHeader* GetFirstRegionalHeader() const
576 : {
577 0 : return fDecoder.GetHandler().RegionalHeader(0);
578 : }
579 :
580 : /// Return the i'th regional header or NULL if not found.
581 : const AliRegionalHeader* GetRegionalHeader(UInt_t i) const
582 : {
583 128 : return fDecoder.GetHandler().RegionalHeader(i);
584 : }
585 :
586 : /// Returns the number of local trigger structures for the given
587 : /// regional structure number.
588 : UInt_t GetLocalStructCount(UInt_t reg) const
589 : {
590 0 : const AliRegionalHeader* r = GetRegionalHeader(reg);
591 0 : return r != NULL ? r->GetLocalStructCount() : 0;
592 : }
593 :
594 : /// Returns the i'th local trigger structure for the given regional
595 : /// structure number or NULL if not found.
596 : const AliLocalStruct* GetLocalStruct(UInt_t reg, UInt_t i) const
597 : {
598 0 : const AliRegionalHeader* r = GetRegionalHeader(reg);
599 0 : return r != NULL ? r->GetLocalStruct(i) : NULL;
600 : }
601 :
602 : /// Returns the current local struct being decoded or NULL if none found.
603 : const AliLocalStruct* CurrentLocalStruct() const
604 : {
605 0 : return (fkCurrentLocalStruct != fDecoder.GetHandler().EndOfLocalStructs()) ?
606 0 : fkCurrentLocalStruct : NULL;
607 : }
608 :
609 : /// Returns the current regional structure being decoded
610 : /// or NULL if none found.
611 : const AliRegionalHeader* CurrentRegionalHeader() const
612 : {
613 0 : const AliLocalStruct* local = CurrentLocalStruct();
614 0 : return (local != NULL) ? local->GetRegionalHeader() : NULL;
615 : }
616 :
617 : private:
618 : /// Not implemented
619 : AliMUONRawStreamTriggerHP(const AliMUONRawStreamTriggerHP& stream);
620 : /// Not implemented
621 : AliMUONRawStreamTriggerHP& operator = (const AliMUONRawStreamTriggerHP& stream);
622 :
623 :
624 : /// This is the custom event handler (callback interface) class which
625 : /// unpacks raw data words and fills an internal buffer with decoded digits
626 : /// as they are decoded by the high performance decoder.
627 : /// Any errors are logged to the parent AliMUONVRawStreamTrigger, so one
628 : /// must set this pointer appropriately before decoding and DDL payload.
629 : class AliDecoderEventHandler : public AliMUONTriggerDDLDecoderEventHandler
630 : {
631 : public:
632 :
633 : /// Default constructor.
634 : AliDecoderEventHandler();
635 : /// Default destructor.
636 : virtual ~AliDecoderEventHandler();
637 :
638 : /// Sets the internal arrays based on the maximum number of structures allowed.
639 : void SetMaxStructs(UInt_t maxRegionals, UInt_t maxLocals);
640 :
641 : /// Sets the raw stream object which should be the parent of this class.
642 18 : void SetRawStream(AliMUONVRawStreamTrigger* rawStream) { fRawStream = rawStream; }
643 :
644 : /// Returns the decoded DARC and global headers (and scalars if they exist).
645 16 : const AliHeader* GetHeaders() const { return &fHeaders; }
646 :
647 : /// Returns the number of regional headers.
648 16 : UInt_t RegionalHeaderCount() const { return fRegionalsCount; }
649 :
650 : /// Return the i'th regional structure header.
651 : const AliRegionalHeader* RegionalHeader(UInt_t i) const
652 : {
653 256 : return i < fRegionalsCount ? &fRegionals[i] : NULL;
654 : }
655 :
656 : /// Return the first local structure decoded.
657 16 : const AliLocalStruct* FirstLocalStruct() const { return fLocals; }
658 :
659 : /// Returns the marker to the end of local structures.
660 : /// i.e. one position past the last local structure in fLocals.
661 0 : const AliLocalStruct* EndOfLocalStructs() const { return fEndOfLocals; }
662 :
663 : /// Get number of end of DARC word errors.
664 16 : UInt_t GetDarcEoWErrors() const {return fDarcEoWErrors;}
665 :
666 : /// Get number of end of Global word errors.
667 16 : UInt_t GetGlobalEoWErrors() const {return fGlobalEoWErrors;}
668 :
669 : /// Get number of end of regional word errors.
670 16 : UInt_t GetRegEoWErrors() const {return fRegEoWErrors;}
671 :
672 : /// Get number of end of local word errors.
673 16 : UInt_t GetLocalEoWErrors() const {return fLocalEoWErrors;}
674 :
675 : /// Returns the warnings flag.
676 : Bool_t Warnings() const { return fWarnings; }
677 : /// Sets the warnings flag.
678 0 : void Warnings(Bool_t value) { fWarnings = value; }
679 :
680 : // The following methods are inherited from AliMUONTriggerDDLDecoderEventHandler:
681 :
682 : /// New buffer handler.
683 : void OnNewBuffer(const void* buffer, UInt_t bufferSize);
684 :
685 : /// End of buffer handler marks the end of local trigger structures.
686 : void OnEndOfBuffer(const void* /*buffer*/, UInt_t /*bufferSize*/)
687 : {
688 16 : fEndOfLocals = fCurrentLocal+1;
689 8 : }
690 :
691 : /// Handler for the DARC header which just remembers the pointers for later.
692 : void OnDarcHeader(UInt_t header,
693 : const AliMUONDarcScalarsStruct* scalars,
694 : const void* /*data*/)
695 : {
696 16 : fDarcHeader = header;
697 8 : fDarcScalars = scalars;
698 8 : }
699 :
700 : /// Handler for the global header which stores the pointer to the headers.
701 : void OnGlobalHeader(const AliMUONGlobalHeaderStruct* header,
702 : const AliMUONGlobalScalarsStruct* scalars,
703 : const void* /*data*/)
704 : {
705 16 : fHeaders = AliHeader(fDarcHeader, fDarcScalars, header, scalars);
706 8 : }
707 :
708 : /// Handler for new regional card structures.
709 : void OnNewRegionalStructV2(UInt_t iReg,
710 : const AliMUONRegionalHeaderStruct* header,
711 : const AliMUONRegionalScalarsStruct* scalars,
712 : const void* data);
713 :
714 : /// Handler for new local card structures.
715 : void OnLocalStructV2(UInt_t iLoc,
716 : const AliMUONLocalInfoStruct* localStruct,
717 : const AliMUONLocalScalarsStruct* scalars);
718 :
719 : /// Error handler.
720 : void OnError(ErrorCode error, const void* location);
721 :
722 : private:
723 :
724 : // Do not allow copying of this class.
725 : /// Not implemented
726 : AliDecoderEventHandler(const AliDecoderEventHandler& /*obj*/);
727 : /// Not implemented
728 : AliDecoderEventHandler& operator = (const AliDecoderEventHandler& /*obj*/);
729 :
730 : AliMUONVRawStreamTrigger* fRawStream; //!<! Pointer to the parent raw stream object.
731 : const void* fBufferStart; //!<! Pointer to the start of the current DDL payload buffer.
732 : UInt_t fDarcHeader; //!<! Currently decoded DARC header.
733 : const AliMUONDarcScalarsStruct* fDarcScalars; //!<! Currently decoded DARC scalars.
734 : AliHeader fHeaders; //!<! Headers of the DDL payload.
735 : UInt_t fRegionalsCount; //!<! Number of regional headers filled in fRegionals.
736 : AliRegionalHeader* fRegionals; //!<! Array of regional headers. [0..fMaxRegionals-1]
737 : AliLocalStruct* fLocals; //!<! Array of decoded local structured. [0..fMaxRegionals*fMaxLocals-1]
738 : AliLocalStruct* fEndOfLocals; //!<! Marker indicating the position just passed the last filled element in fLocals.
739 : AliRegionalHeader* fCurrentRegional; //!<! Current regional header position.
740 : AliLocalStruct* fCurrentLocal; //!<! Current local trigger structure.
741 : UInt_t fDarcEoWErrors; //!<! Number of end of DARC word errors.
742 : UInt_t fGlobalEoWErrors; //!<! Number of end of global word errors.
743 : UInt_t fRegEoWErrors; //!<! Number of end of regional word errors.
744 : UInt_t fLocalEoWErrors; //!<! Number of end of local word errors.
745 : Bool_t fWarnings; //!<! Flag indicating if we should generate a warning for errors.
746 :
747 : static const AliMUONRegionalHeaderStruct fgkEmptyHeader; //!<! Empty header for skipped regional structures.
748 : };
749 :
750 : AliMUONTriggerDDLDecoder<AliDecoderEventHandler> fDecoder; //!<! The decoder for the DDL payload.
751 : Int_t fDDL; //!<! The current DDL number being handled.
752 : Int_t fBufferSize; //!<! This is the buffer size in bytes of fBuffer.
753 : UChar_t* fBuffer; //!<! This is the buffer in which we store the DDL payload read from AliRawReader.
754 : const AliLocalStruct* fkCurrentLocalStruct; //!<! The current local trigger structure being handled by Next().
755 : Bool_t fHadError; //!<! Flag indicating if there was a decoding error or not.
756 : Bool_t fDone; //!<! Flag indicating if the iteration is done or not.
757 : mutable AliMUONDDLTrigger* fDDLObject; //!<! Temporary DDL object used by GetDDLTrigger() for caching.
758 : UInt_t fTotalNumberOfDarcEoWErrors; //!<! The total number of end of DARC word errors since the last call to First().
759 : UInt_t fTotalNumberOfGlobalEoWErrors; //!<! The total number of end of global word errors since the last call to First().
760 : UInt_t fTotalNumberOfRegEoWErrors; //!<! The total number of end of regional word errors since the last call to First().
761 : UInt_t fTotalNumberOfLocalEoWErrors; //!<! The total number of end of local word errors since the last call to First().
762 :
763 : static const Int_t fgkMaxDDL; //!<! Maximum number of DDLs
764 :
765 34 : ClassDef(AliMUONRawStreamTriggerHP, 0) // Higher performance decoder class for MUON trigger rawdata.
766 : };
767 :
768 : ////////////////////////////////////////////////////////////////////////////////
769 :
770 : inline const AliMUONRawStreamTriggerHP::AliLocalStruct* AliMUONRawStreamTriggerHP::Next()
771 : {
772 : /// Iterates through all the local trigger structures for the event.
773 : /// When no more local triggers are found then NULL is returned.
774 :
775 0 : do {
776 0 : if (fkCurrentLocalStruct != fDecoder.GetHandler().EndOfLocalStructs())
777 0 : return fkCurrentLocalStruct++;
778 0 : } while (NextDDL());
779 0 : return NULL;
780 0 : }
781 :
782 :
783 : inline void AliMUONRawStreamTriggerHP::AliDecoderEventHandler::OnNewRegionalStructV2(
784 : UInt_t iReg,
785 : const AliMUONRegionalHeaderStruct* header,
786 : const AliMUONRegionalScalarsStruct* scalars,
787 : const void* /*data*/
788 : )
789 : {
790 : /// New regional structure handler is called by the decoder whenever a
791 : /// new regional header is found. We just mark the header and increment
792 : /// the appropriate counters.
793 :
794 128 : assert( header != NULL );
795 64 : assert( iReg < fRegionalsCount );
796 :
797 64 : fCurrentRegional = fRegionals+iReg;
798 64 : *fCurrentRegional = AliRegionalHeader(fCurrentLocal+1, header, scalars);
799 :
800 : // Link to the next regional structure unless this is the last one.
801 64 : if (iReg+1 < fRegionalsCount)
802 : {
803 56 : fCurrentRegional->SetNext(fCurrentRegional+1);
804 56 : }
805 64 : }
806 :
807 :
808 : inline void AliMUONRawStreamTriggerHP::AliDecoderEventHandler::OnLocalStructV2(
809 : UInt_t iLoc,
810 : const AliMUONLocalInfoStruct* localStruct,
811 : const AliMUONLocalScalarsStruct* scalars
812 : )
813 : {
814 : /// New local trigger structure handler.
815 : /// This is called by the high performance decoder when a new local trigger
816 : /// structure is found within the DDL payload.
817 : /// We mark the location of the structure in the DDL paytload and increment
818 : /// appropriate counters.
819 :
820 1936 : assert( localStruct != NULL );
821 968 : assert( fCurrentLocal != NULL );
822 968 : assert( fCurrentRegional != NULL );
823 968 : assert( fCurrentRegional->GetLocalStructCount() < (UInt_t)fRawStream->GetMaxLoc() );
824 :
825 : // Link the previous local structure unless it is the first one.
826 968 : if (fCurrentRegional->GetLocalStructCount() > 0)
827 : {
828 904 : fCurrentLocal->SetNext(fCurrentLocal+1);
829 904 : }
830 :
831 968 : fCurrentLocal++;
832 968 : *fCurrentLocal = AliLocalStruct(fCurrentRegional, localStruct, scalars);
833 968 : fCurrentLocal->SetCalculatedId(iLoc);
834 968 : fCurrentRegional->IncLocalStructCount();
835 968 : }
836 :
837 : #endif // ALIMUONRAWSTREAMTRIGGERHP_H
|