next50 trigger mask in AliHLTGlobalEsdConverterComponent
[u/mrichter/AliRoot.git] / VZERO / AliVZERORawStream.h
1 #ifndef ALIVZERORAWSTREAM_H
2 #define ALIVZERORAWSTREAM_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 ///////////////////////////////////////////////////////////////////////////////
7 ///
8 /// This is a class for reading the VZERO DDL raw data
9 /// The format of the raw data corresponds to the one
10 /// implemented in AliVZEROBuffer class.
11 ///
12 /// PLEASE NOTE that Int_t channel is here the FEE channel from 0 to 63 in the 
13 /// order defined by Yannick Zoccarato which is not the same order as the order 
14 /// defined in aliroot by the naming and numbering conventions.
15 /// Therefore one has to go from FEE_Channel to AliRoot_Channel using 
16 /// GetOfflineChannel(Int_t channel)  when going from Online to Offline !!!
17 ///
18 ///////////////////////////////////////////////////////////////////////////////
19
20 #include <TObject.h>
21 #include <TMath.h>
22
23 class AliRawReader;
24 class AliVZEROTriggerData;
25
26 class AliVZERORawStream: public TObject {
27   public :
28     AliVZERORawStream(AliRawReader* rawReader);
29     virtual ~AliVZERORawStream();
30
31     virtual void      Reset();
32     virtual Bool_t    Next();
33
34 // Getters of various scalers and Minimum Bias flags :
35
36    ULong64_t          GetBBScalers(Int_t channel) const  
37       { return        fBBScalers[channel]; }
38    ULong64_t          GetBGScalers(Int_t channel) const  
39       { return        fBGScalers[channel]; }
40    UInt_t             GetTriggerScalers(Int_t num_scaler) const 
41       { return        fScalers[num_scaler]; }
42    UInt_t             GetBunchNumbersMB(Int_t num_bunch) const 
43       { return        fBunchNumbers[num_bunch]; }
44    UShort_t           GetChargeMB(Int_t channel, Int_t num_bunch) const  
45       { return        fChargeMB[channel][num_bunch]; } 
46    Bool_t             GetIntMBFlag(Int_t channel, Int_t num_bunch) const   
47       { return        fIsIntMB[channel][num_bunch]; } 
48    Bool_t             GetBBMBFlag(Int_t channel, Int_t num_bunch) const   
49       { return        fIsBBMB[channel][num_bunch]; }  
50    Bool_t             GetBGMBFlag(Int_t channel, Int_t num_bunch) const   
51       { return        fIsBGMB[channel][num_bunch]; }      
52        
53 // Getters of ADC signals, ADC pedestals, time information and corresponding flags :
54
55     Short_t           GetADC(Int_t channel) const
56       { return TMath::MaxElement(kNEvOfInt, fADC[channel]); }    // maximum value instead of central clock
57 //    { return fADC[channel][kNEvOfInt/2]; }
58             
59     Short_t           GetPedestal(Int_t channel, Int_t event) const
60       { return fADC[channel][event]; }
61     Bool_t            GetIntegratorFlag(Int_t channel, Int_t event) const
62       { return fIsInt[channel][event]; }
63     Bool_t            GetBBFlag(Int_t channel, Int_t event) const
64       { return fIsBB[channel][event]; } 
65     Bool_t            GetBGFlag(Int_t channel, Int_t event) const
66       { return fIsBG[channel][event]; }   
67     Short_t           GetTime(Int_t channel) const
68       { return fTime[channel]; }
69     Short_t           GetWidth(Int_t channel) const
70       { return fWidth[channel]; }
71
72     UShort_t          GetTriggerInputs() const
73       { return fTrigger; }
74     UShort_t          GetTriggerInputsMask() const
75       { return fTriggerMask; }
76
77     void              CalculateChargeForCentrTriggers(AliVZEROTriggerData *triggerData,
78                                                       UShort_t &chargeA, UShort_t &chargeC) const;
79     void              CalculateBBandBGFlags(AliVZEROTriggerData *triggerData,
80                                             UChar_t &nBBA, UChar_t &nBBC,
81                                             UChar_t &nBGA, UChar_t &nBGC) const;
82     void              FillTriggerBits(AliVZEROTriggerData *triggerData);
83
84 // Getter of Offline Channel number as used in aliroot (defined by aliroot 
85 // numbering convention) from FEE channel (electronic channel number given 
86 // by the V0 electronics readout) - See comment above - 
87
88     Int_t              GetOfflineChannel(Int_t channel)  const
89       { Int_t  fOfflineChannel[64] = {39, 38, 37, 36, 35, 34, 33, 32, 
90                                       47, 46, 45, 44, 43, 42, 41, 40, 
91                                       55, 54, 53, 52, 51, 50, 49, 48, 
92                                       63, 62, 61, 60, 59, 58, 57, 56,
93                                        7,  6,  5,  4,  3,  2,  1,  0, 
94                                       15, 14, 13, 12, 11, 10,  9,  8,
95                                       23, 22, 21, 20, 19, 18, 17, 16, 
96                                       31, 30, 29, 28, 27, 26, 25, 24};
97                return fOfflineChannel[channel]; }       
98
99     enum EVZERORawDataParams {
100       kNChannels = 64, // number of electronic channels in V0 (FEE numbering)
101       kNEvOfInt  = 21, // number of events of interest
102       kNScalers  = 16, // number of scalers
103       kNBunches  = 10  // number of bunches used in Minimum Bias information 
104     };
105
106     enum EVZERORawStreamError {
107       kRawDataSizeErr = 1
108     };
109
110   private:
111
112     AliVZERORawStream(const AliVZERORawStream& stream);
113     AliVZERORawStream& operator = (const AliVZERORawStream& stream);
114
115     UInt_t GetNextWord();
116     UShort_t GetNextShort();
117
118     ULong64_t     fBBScalers[kNChannels];        // 'Beam-Beam' scalers for all channels
119     ULong64_t     fBGScalers[kNChannels];        // 'Beam-Gas' scalers for all channels
120     UInt_t        fScalers[kNScalers];           // Trigger scalers
121     UInt_t        fBunchNumbers[kNBunches];      // Bunch numbers for the previous 10 MB events
122     UShort_t      fChargeMB[kNChannels][kNBunches]; // ADC counts for all channels for the previous 10 MB events
123     Bool_t        fIsIntMB[kNChannels][kNBunches];  // 'Integrator' flag for all channels for the previous 10 MB events
124     Bool_t        fIsBBMB[kNChannels][kNBunches];   // 'Beam-Beam' flag for all channels for the previous 10 MB events
125     Bool_t        fIsBGMB[kNChannels][kNBunches];   // 'Beam-Gas' for all channels for the previous 10 MB events
126
127     Short_t       fADC[kNChannels][kNEvOfInt];   // ADC counts for all channels and all events of interest
128     Bool_t        fIsInt[kNChannels][kNEvOfInt]; // 'Integrator' flag for all channels 
129     Bool_t        fIsBB[kNChannels][kNEvOfInt];  // 'Beam-Beam' flag for all channels
130     Bool_t        fIsBG[kNChannels][kNEvOfInt];  // 'Beam-Gas' flag for all channels
131     Short_t       fTime[kNChannels];             // leading time for all channels - from HPTDC - in HPTDC units
132     Short_t       fWidth[kNChannels];            // pulse width for all channels - from HPTDC - in HPTDC units
133
134     UShort_t      fTrigger;        // VZERO trigger inputs
135     UShort_t      fTriggerMask;    // VZERO trigger inputs mask
136
137     Int_t         fPosition;       // current position in the raw-data payload
138     
139
140     AliRawReader* fRawReader;      // object for reading the raw data
141
142     UChar_t*      fData;           // pointer to raw data payload
143
144     ClassDef(AliVZERORawStream, 0) // class for reading VZERO DDL raw data
145 };
146
147 #endif