- Reset TProcessID count after each event
[u/mrichter/AliRoot.git] / RAW / AliAltroDecoder.h
1 //#-*- Mode: c++ -*-
2 // $Id$
3
4 #ifndef ALIALTRODECODER_H
5 #define ALIALTRODECODER_H
6 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
7  * See cxx source for full Copyright notice                               */
8
9 /**
10    @file AliAltroDocoder.h
11    @author Per Thomas Hille, Oystein Djuvsland
12    @date   
13    @brief High performance decoder class for the RCU/Altro data format
14 */
15
16 ///////////////////////////////////////////////////////////////////////////////
17 ///
18 /// This is the class for fast decoding of TPC/PHOS/EMCAL raw data
19 //  see .cxx file for more detailed comments.
20 ///
21 ///////////////////////////////////////////////////////////////////////////////
22
23
24
25 #include <TObject.h>
26
27 #include <iostream>
28 using namespace std;
29  
30 #define DDL_32BLOCK_SIZE         5
31 #define MAX_BRANCHES             2
32 #define MAX_FEE_PER_BRANCH       16
33 #define MAX_ALTROS_PER_FEE       8
34 #define CHANNELS_PER_ALTRO       16
35 #define MAX_SAMPLES_PER_CHANNEL  1024
36 #define ALTRO_TRAILER_SIZE       4
37 #define MAX_TRAILER_WORDS        3
38
39 class AliAltroData;
40
41 class AliAltroDecoder: public TObject {
42  public:
43   AliAltroDecoder();
44   virtual ~AliAltroDecoder();
45   Bool_t Decode();
46   Bool_t NextChannel(AliAltroData *altroDataPtr);
47
48   /**
49    * Copy the original 10/40 bit encecoded data of the current channel.
50    * The funtions copies the data to the end of the provided buffer.
51    * @param pBuffer    target buffer
52    * @param bufferSize size of target buffer
53    * @return number of copied bytes, neg. error code if failed
54    */
55   Int_t CopyBackward(Byte_t* pBuffer, Int_t bufferSize);
56
57   /* 
58    * DONT use !
59    * For debugging purphoses only, will be removed in near future
60    **/
61   template<typename T> 
62   void  DumpData(T *array, Int_t N, Int_t nPerLine)
63   {
64     cout <<   "DumpData N=  " << N <<endl;
65
66     for(Int_t i= 0; i< N; i++)
67       {
68         if((i%nPerLine == 0)  &&  (i != 0))
69           {
70             printf("\n");
71           }
72
73         cout << array[i]<< "\t";
74
75       }
76   }
77
78   int SetMemory(UChar_t  *dtaPtr, UInt_t size);
79   void PrintInfo(AliAltroData &altrodata, Int_t n = 0, Int_t nPerLine = 4);
80   Float_t GetFailureRate();
81
82   /**
83    * Provide a pointer to RCU trailer.
84    * The type of the parameter might not be optimal, but the function has
85    * been chosen that way to be similar to the counterpart in
86    * AliAltroRawStream.
87    * @return kTRUE if trailer available;
88    */
89   Bool_t  GetRCUTrailerData(UChar_t*& data) const;
90
91   /**
92    * Provide size of RCU trailer.
93    */
94   Int_t   GetRCUTrailerSize() const;
95
96  private:
97
98   AliAltroDecoder& operator = (const AliAltroDecoder& decoder);
99   AliAltroDecoder(const AliAltroDecoder& decoder);
100   Bool_t CheckPayloadTrailer() const;
101   void DecodeDDLBlock();
102   void DecodeLastDDLBlock();
103   Int_t CountAAApaddings() const;
104   UInt_t  *f32DtaPtr;                        // Pointer to dat of the input buffer in entities of 32 bit words (the RCU/DDL block)
105   UChar_t *f8DtaPtr;                         // Pointer to dat of the input buffer in entities of 8 bit words (the RCU/DDL block)
106   const Long_t fkN32HeaderWords;              // Number of 32 bit words in the common data header
107   Int_t    fN40AltroWords;                   // Number of 40 bit altro words contained in the RCU payload as calculated form the payload size
108   Int_t    fN40RcuAltroWords;                // Number of 40 bit altro words contained in the RCU payload as given by the RCU trailer        
109   Int_t    fNDDLBlocks;                      // Number of DDL blocks in the payload (the last blocj might/ight not be 160 bits )
110   Int_t    f32LastDDLBlockSize;              // Size of the last DDL block
111   UInt_t   fDDLBlockDummy[DDL_32BLOCK_SIZE]; // buffer to contain the las DDL block, if the block is not aligned with 160 bitm the remaining fileds are padded with zeroes
112   UInt_t   f8PayloadSize;                    // The size of the payload in bytes (after subtraction of the RCU header and the RCU trailer words)
113   Long_t   fOutBufferIndex;                  // current buffer position of the buffer for the decoded data (10 bit words represnted as int's)
114   UInt_t   fSize;                            // The size of the input RCU/DDL payload in entities of bytes, inluding the RCU header and trailer
115   UInt_t   fOutBuffer[MAX_FEE_PER_BRANCH*MAX_BRANCHES*MAX_ALTROS_PER_FEE*CHANNELS_PER_ALTRO*(MAX_SAMPLES_PER_CHANNEL + ALTRO_TRAILER_SIZE)]; // Buffer to hold the decoded data
116   UInt_t   fNAltro10bitWords;                // The total number of 10 bit altro words in the RCU payload, including trailers (disregardin that the altro trialer is not aligned with 10 bit)
117   Int_t    fComplete;                        // Number of altro channels that is only partially read out  (0x2aaa pattern missing in trailer)
118   Int_t    fInComplete;                      // Number of altro channels that is read out properly
119   Bool_t   fDecodeIfCorruptedTrailer;        // Wether or not to try to decode the data if the RCU trailer is incorrect (will succseed in most cases)
120   Bool_t   fIsDecoded;                       // Wether or not the buffer set last by the "SetMemory()" function has been decoded
121   Bool_t  fIsFatalCorruptedTrailer;          // If trailer is fataly corrupted, not possible in any way to recover, then it is not allowed to decode the DDL payload.  
122
123   ClassDef(AliAltroDecoder, 0)  // class for decoding Altro payload
124 };
125
126 #endif