ROOT logo
#ifndef ALIVZERORAWSTREAM_H
#define ALIVZERORAWSTREAM_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

///////////////////////////////////////////////////////////////////////////////
///
/// This is a class for reading the VZERO DDL raw data
/// The format of the raw data corresponds to the one
/// implemented in AliVZEROBuffer class.
///
/// PLEASE NOTE that Int_t channel is here the FEE channel from 0 to 63 in the 
/// order defined by Yannick Zoccarato which is not the same order as the order 
/// defined in aliroot by the naming and numbering conventions.
/// Therefore one has to go from FEE_Channel to AliRoot_Channel using 
/// GetOfflineChannel(Int_t channel)  when going from Online to Offline !!!
///
///////////////////////////////////////////////////////////////////////////////

#include <TObject.h>
#include <TMath.h>

class AliRawReader;
class AliVZEROTriggerData;

class AliVZERORawStream: public TObject {
  public :
    AliVZERORawStream(AliRawReader* rawReader);
    virtual ~AliVZERORawStream();

    virtual void      Reset();
    virtual Bool_t    Next();

// Getters of various scalers and Minimum Bias flags :

   ULong64_t          GetBBScalers(Int_t channel) const  
      { return        fBBScalers[channel]; }
   ULong64_t          GetBGScalers(Int_t channel) const  
      { return        fBGScalers[channel]; }
   UInt_t             GetTriggerScalers(Int_t num_scaler) const 
      { return        fScalers[num_scaler]; }
   UInt_t             GetBunchNumbersMB(Int_t num_bunch) const 
      { return        fBunchNumbers[num_bunch]; }
   UShort_t           GetChargeMB(Int_t channel, Int_t num_bunch) const  
      { return        fChargeMB[channel][num_bunch]; } 
   Bool_t             GetIntMBFlag(Int_t channel, Int_t num_bunch) const   
      { return        fIsIntMB[channel][num_bunch]; } 
   Bool_t             GetBBMBFlag(Int_t channel, Int_t num_bunch) const   
      { return        fIsBBMB[channel][num_bunch]; }  
   Bool_t             GetBGMBFlag(Int_t channel, Int_t num_bunch) const   
      { return        fIsBGMB[channel][num_bunch]; }      
       
// Getters of ADC signals, ADC pedestals, time information and corresponding flags :

    Short_t           GetADC(Int_t channel) const
      { return TMath::MaxElement(kNEvOfInt, fADC[channel]); }    // maximum value instead of central clock
//    { return fADC[channel][kNEvOfInt/2]; }
            
    Short_t           GetPedestal(Int_t channel, Int_t event) const
      { return fADC[channel][event]; }
    Bool_t            GetIntegratorFlag(Int_t channel, Int_t event) const
      { return fIsInt[channel][event]; }
    Bool_t            GetBBFlag(Int_t channel, Int_t event) const
      { return fIsBB[channel][event]; } 
    Bool_t            GetBGFlag(Int_t channel, Int_t event) const
      { return fIsBG[channel][event]; }   
    Short_t           GetTime(Int_t channel) const
      { return fTime[channel]; }
    Short_t           GetWidth(Int_t channel) const
      { return fWidth[channel]; }

    UShort_t          GetTriggerInputs() const
      { return fTrigger; }
    UShort_t          GetTriggerInputsMask() const
      { return fTriggerMask; }

    void              CalculateChargeForCentrTriggers(AliVZEROTriggerData *triggerData,
						      UShort_t &chargeA, UShort_t &chargeC) const;
    void              CalculateBBandBGFlags(AliVZEROTriggerData *triggerData,
					    UChar_t &nBBA, UChar_t &nBBC,
					    UChar_t &nBGA, UChar_t &nBGC) const;
    void              FillTriggerBits(AliVZEROTriggerData *triggerData);

// Getter of Offline Channel number as used in aliroot (defined by aliroot 
// numbering convention) from FEE channel (electronic channel number given 
// by the V0 electronics readout) - See comment above - 

    Int_t              GetOfflineChannel(Int_t channel)  const
      { Int_t  fOfflineChannel[64] = {39, 38, 37, 36, 35, 34, 33, 32, 
                                      47, 46, 45, 44, 43, 42, 41, 40, 
			              55, 54, 53, 52, 51, 50, 49, 48, 
			              63, 62, 61, 60, 59, 58, 57, 56,
			               7,  6,  5,  4,  3,  2,  1,  0, 
			              15, 14, 13, 12, 11, 10,  9,  8,
			              23, 22, 21, 20, 19, 18, 17, 16, 
			              31, 30, 29, 28, 27, 26, 25, 24};
               return fOfflineChannel[channel]; }	

    enum EVZERORawDataParams {
      kNChannels = 64, // number of electronic channels in V0 (FEE numbering)
      kNEvOfInt  = 21, // number of events of interest
      kNScalers  = 16, // number of scalers
      kNBunches  = 10  // number of bunches used in Minimum Bias information 
    };

    enum EVZERORawStreamError {
      kRawDataSizeErr = 1
    };

  private:

    AliVZERORawStream(const AliVZERORawStream& stream);
    AliVZERORawStream& operator = (const AliVZERORawStream& stream);

    UInt_t GetNextWord();
    UShort_t GetNextShort();

    ULong64_t     fBBScalers[kNChannels];        // 'Beam-Beam' scalers for all channels
    ULong64_t     fBGScalers[kNChannels];        // 'Beam-Gas' scalers for all channels
    UInt_t        fScalers[kNScalers];           // Trigger scalers
    UInt_t        fBunchNumbers[kNBunches];      // Bunch numbers for the previous 10 MB events
    UShort_t      fChargeMB[kNChannels][kNBunches]; // ADC counts for all channels for the previous 10 MB events
    Bool_t        fIsIntMB[kNChannels][kNBunches];  // 'Integrator' flag for all channels for the previous 10 MB events
    Bool_t        fIsBBMB[kNChannels][kNBunches];   // 'Beam-Beam' flag for all channels for the previous 10 MB events
    Bool_t        fIsBGMB[kNChannels][kNBunches];   // 'Beam-Gas' for all channels for the previous 10 MB events

    Short_t       fADC[kNChannels][kNEvOfInt];   // ADC counts for all channels and all events of interest
    Bool_t        fIsInt[kNChannels][kNEvOfInt]; // 'Integrator' flag for all channels 
    Bool_t        fIsBB[kNChannels][kNEvOfInt];  // 'Beam-Beam' flag for all channels
    Bool_t        fIsBG[kNChannels][kNEvOfInt];  // 'Beam-Gas' flag for all channels
    Short_t       fTime[kNChannels];             // leading time for all channels - from HPTDC - in HPTDC units
    Short_t       fWidth[kNChannels];            // pulse width for all channels - from HPTDC - in HPTDC units

    UShort_t      fTrigger;        // VZERO trigger inputs
    UShort_t      fTriggerMask;    // VZERO trigger inputs mask

    Int_t         fPosition;       // current position in the raw-data payload
    

    AliRawReader* fRawReader;      // object for reading the raw data

    UChar_t*      fData;           // pointer to raw data payload

    ClassDef(AliVZERORawStream, 0) // class for reading VZERO DDL raw data
};

#endif
 AliVZERORawStream.h:1
 AliVZERORawStream.h:2
 AliVZERORawStream.h:3
 AliVZERORawStream.h:4
 AliVZERORawStream.h:5
 AliVZERORawStream.h:6
 AliVZERORawStream.h:7
 AliVZERORawStream.h:8
 AliVZERORawStream.h:9
 AliVZERORawStream.h:10
 AliVZERORawStream.h:11
 AliVZERORawStream.h:12
 AliVZERORawStream.h:13
 AliVZERORawStream.h:14
 AliVZERORawStream.h:15
 AliVZERORawStream.h:16
 AliVZERORawStream.h:17
 AliVZERORawStream.h:18
 AliVZERORawStream.h:19
 AliVZERORawStream.h:20
 AliVZERORawStream.h:21
 AliVZERORawStream.h:22
 AliVZERORawStream.h:23
 AliVZERORawStream.h:24
 AliVZERORawStream.h:25
 AliVZERORawStream.h:26
 AliVZERORawStream.h:27
 AliVZERORawStream.h:28
 AliVZERORawStream.h:29
 AliVZERORawStream.h:30
 AliVZERORawStream.h:31
 AliVZERORawStream.h:32
 AliVZERORawStream.h:33
 AliVZERORawStream.h:34
 AliVZERORawStream.h:35
 AliVZERORawStream.h:36
 AliVZERORawStream.h:37
 AliVZERORawStream.h:38
 AliVZERORawStream.h:39
 AliVZERORawStream.h:40
 AliVZERORawStream.h:41
 AliVZERORawStream.h:42
 AliVZERORawStream.h:43
 AliVZERORawStream.h:44
 AliVZERORawStream.h:45
 AliVZERORawStream.h:46
 AliVZERORawStream.h:47
 AliVZERORawStream.h:48
 AliVZERORawStream.h:49
 AliVZERORawStream.h:50
 AliVZERORawStream.h:51
 AliVZERORawStream.h:52
 AliVZERORawStream.h:53
 AliVZERORawStream.h:54
 AliVZERORawStream.h:55
 AliVZERORawStream.h:56
 AliVZERORawStream.h:57
 AliVZERORawStream.h:58
 AliVZERORawStream.h:59
 AliVZERORawStream.h:60
 AliVZERORawStream.h:61
 AliVZERORawStream.h:62
 AliVZERORawStream.h:63
 AliVZERORawStream.h:64
 AliVZERORawStream.h:65
 AliVZERORawStream.h:66
 AliVZERORawStream.h:67
 AliVZERORawStream.h:68
 AliVZERORawStream.h:69
 AliVZERORawStream.h:70
 AliVZERORawStream.h:71
 AliVZERORawStream.h:72
 AliVZERORawStream.h:73
 AliVZERORawStream.h:74
 AliVZERORawStream.h:75
 AliVZERORawStream.h:76
 AliVZERORawStream.h:77
 AliVZERORawStream.h:78
 AliVZERORawStream.h:79
 AliVZERORawStream.h:80
 AliVZERORawStream.h:81
 AliVZERORawStream.h:82
 AliVZERORawStream.h:83
 AliVZERORawStream.h:84
 AliVZERORawStream.h:85
 AliVZERORawStream.h:86
 AliVZERORawStream.h:87
 AliVZERORawStream.h:88
 AliVZERORawStream.h:89
 AliVZERORawStream.h:90
 AliVZERORawStream.h:91
 AliVZERORawStream.h:92
 AliVZERORawStream.h:93
 AliVZERORawStream.h:94
 AliVZERORawStream.h:95
 AliVZERORawStream.h:96
 AliVZERORawStream.h:97
 AliVZERORawStream.h:98
 AliVZERORawStream.h:99
 AliVZERORawStream.h:100
 AliVZERORawStream.h:101
 AliVZERORawStream.h:102
 AliVZERORawStream.h:103
 AliVZERORawStream.h:104
 AliVZERORawStream.h:105
 AliVZERORawStream.h:106
 AliVZERORawStream.h:107
 AliVZERORawStream.h:108
 AliVZERORawStream.h:109
 AliVZERORawStream.h:110
 AliVZERORawStream.h:111
 AliVZERORawStream.h:112
 AliVZERORawStream.h:113
 AliVZERORawStream.h:114
 AliVZERORawStream.h:115
 AliVZERORawStream.h:116
 AliVZERORawStream.h:117
 AliVZERORawStream.h:118
 AliVZERORawStream.h:119
 AliVZERORawStream.h:120
 AliVZERORawStream.h:121
 AliVZERORawStream.h:122
 AliVZERORawStream.h:123
 AliVZERORawStream.h:124
 AliVZERORawStream.h:125
 AliVZERORawStream.h:126
 AliVZERORawStream.h:127
 AliVZERORawStream.h:128
 AliVZERORawStream.h:129
 AliVZERORawStream.h:130
 AliVZERORawStream.h:131
 AliVZERORawStream.h:132
 AliVZERORawStream.h:133
 AliVZERORawStream.h:134
 AliVZERORawStream.h:135
 AliVZERORawStream.h:136
 AliVZERORawStream.h:137
 AliVZERORawStream.h:138
 AliVZERORawStream.h:139
 AliVZERORawStream.h:140
 AliVZERORawStream.h:141
 AliVZERORawStream.h:142
 AliVZERORawStream.h:143
 AliVZERORawStream.h:144
 AliVZERORawStream.h:145
 AliVZERORawStream.h:146
 AliVZERORawStream.h:147