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

/* $Id$ */

///////////////////////////////////////////////////////////////////////////////
///
/// This is the base class for reading raw data.
///
///////////////////////////////////////////////////////////////////////////////

#include <TObject.h>
#include <TArrayI.h>
#include <TClonesArray.h>

#include "AliRawDataErrorLog.h"
#include "AliRawDataHeader.h"
#include "AliRawDataHeaderV3.h"

class THashList;
class TChain;
class AliRawEventHeaderBase;
class AliRawVEvent;

class AliRawReader: public TObject {
  friend class AliEveEventManager;
  public :
    AliRawReader();
    AliRawReader(const AliRawReader& rawReader);
    AliRawReader& operator = (const AliRawReader& rawReader);
    virtual ~AliRawReader();

    static  AliRawReader* Create(const char *uri);

    virtual void     Select(Int_t detectorID, 
			    Int_t minDDLID = -1, Int_t maxDDLID = -1);
    virtual void     Select(const char *detectorName, 
			    Int_t minDDLID = -1, Int_t maxDDLID = -1);
    virtual void     SelectEquipment(Int_t equipmentType, 
				     Int_t minEquipmentId = -1, 
				     Int_t maxEquipmentId = -1);
    virtual void     SkipInvalid(Bool_t skip = kTRUE)
      {fSkipInvalid = skip;};
    virtual void     RequireHeader(Bool_t required)
      {fRequireHeader = required;};

    virtual const AliRawEventHeaderBase* GetEventHeader() const {return NULL;};
    virtual const AliRawVEvent* GetEvent() const {return NULL;}

    virtual UInt_t   GetType() const = 0;
    virtual UInt_t   GetRunNumber() const = 0;
    virtual const UInt_t* GetEventId() const = 0;
    UInt_t                GetPeriod() const {
      const UInt_t *id = GetEventId();
      return id ? (((id)[0]>>4)&0x0fffffff): 0;
    }
    UInt_t                GetOrbitID() const {
      const UInt_t *id = GetEventId();
      return id ? ((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff)) : 0;
    }
    UShort_t              GetBCID() const {
      const UInt_t *id = GetEventId();
      return id ? ((id)[1]&0x00000fff) : 0;
    }
    ULong64_t             GetEventIdAsLong() const {
      return (((ULong64_t)GetPeriod() << 36) |
	      ((ULong64_t)GetOrbitID() << 12) |
	      (ULong64_t)GetBCID()); 
    }
    virtual const UInt_t* GetTriggerPattern() const = 0;
    ULong64_t             GetClassMask() const {
      const UInt_t *pattern = GetTriggerPattern();
      return pattern ? (((ULong64_t)pattern[1] & 0x3ffff) << 32)|(pattern[0]) : 0;
    }
    ULong64_t GetClassMaskNext50() const  { 
      const UInt_t *pattern = GetTriggerPattern();
      return pattern ? ((ULong64_t)(pattern[1]>>18) & 0x3fff)|((ULong64_t)(pattern[2]&0xffffffff)<<14)|((ULong64_t)(pattern[3]&0xf)<<46): 0; 
    } 
    virtual const UInt_t* GetDetectorPattern() const = 0;
    virtual const UInt_t* GetAttributes() const = 0;
    virtual const UInt_t* GetSubEventAttributes() const = 0;
    virtual UInt_t   GetLDCId() const = 0;
    virtual UInt_t   GetGDCId() const = 0;
    virtual UInt_t   GetTimestamp() const = 0;

    virtual Int_t    GetEquipmentSize() const = 0;
    virtual Int_t    GetEquipmentType() const = 0;
    virtual Int_t    GetEquipmentId() const = 0;
    Int_t            GetMappedEquipmentId() const;
    Bool_t           LoadEquipmentIdsMap(const char *fileName);
    virtual const UInt_t* GetEquipmentAttributes() const = 0;
    virtual Int_t    GetEquipmentElementSize() const = 0;
    virtual Int_t    GetEquipmentHeaderSize() const = 0;

    Int_t            GetDetectorID() const;
    Int_t            GetDDLID() const;

    Int_t            GetDataSize() const 
      {if (fHeader) {
	  if (fHeader->fSize != 0xFFFFFFFF) return fHeader->fSize - sizeof(AliRawDataHeader); 
	  else return GetEquipmentSize() - GetEquipmentHeaderSize() - sizeof(AliRawDataHeader);
	} else if(fHeaderV3){
	  if (fHeaderV3->fSize != 0xFFFFFFFF) return fHeaderV3->fSize - sizeof(AliRawDataHeaderV3); 
	  else return GetEquipmentSize() - GetEquipmentHeaderSize() - sizeof(AliRawDataHeaderV3);
	}
	else return GetEquipmentSize() - GetEquipmentHeaderSize();};

    Int_t            GetVersion() const 
      {if (fHeader) return fHeader->GetVersion();
	else if (fHeaderV3) return fHeaderV3->GetVersion();
	else return -1;};
    Bool_t           IsValid() const 
      {if (fHeader) return fHeader->TestAttribute(0);
	else if (fHeaderV3) return fHeaderV3->TestAttribute(0);
	else return kFALSE;};
    Bool_t           IsCompressed() const 
      {if (fHeader) return fHeader->TestAttribute(1); 
	else if (fHeaderV3) return fHeaderV3->TestAttribute(1);
      else return kFALSE;};
    Bool_t           TestBlockAttribute(Int_t index) const
      {if (fHeader) return fHeader->TestAttribute(index);
	else if (fHeaderV3) return fHeaderV3->TestAttribute(index);
      else return kFALSE;};
    UChar_t          GetBlockAttributes() const 
      {if (fHeader) return fHeader->GetAttributes(); 
	else if (fHeaderV3) return fHeaderV3->GetAttributes();
      else return 0;};
    UInt_t           GetStatusBits() const
      {if (fHeader) return fHeader->GetStatus(); 
	else if (fHeaderV3) return fHeaderV3->GetStatus();
      else return 0;};
    const AliRawDataHeader* GetDataHeader() const
      {return fHeader;}
    const AliRawDataHeaderV3* GetDataHeaderV3() const
      {return fHeaderV3;}

    virtual Bool_t   ReadHeader() = 0;
    virtual Bool_t   ReadNextData(UChar_t*& data) = 0;
    virtual Bool_t   ReadNextInt(UInt_t& data);
    virtual Bool_t   ReadNextShort(UShort_t& data);
    virtual Bool_t   ReadNextChar(UChar_t& data);
    virtual Bool_t   ReadNext(UChar_t* data, Int_t size) = 0;

    virtual Bool_t   Reset() = 0;

    virtual Bool_t   NextEvent() = 0;
    virtual Bool_t   RewindEvents() = 0;
    virtual Bool_t   GotoEvent(Int_t event);
    virtual Bool_t   GotoEventWithID(Int_t event,
				     UInt_t period,
				     UInt_t orbitID,
				     UShort_t bcID);
    virtual Int_t    GetEventIndex() const { return -1; }
    virtual Int_t    GetNumberOfEvents() const { return -1; }

    enum {kErrMagic=1, kErrNoDataHeader=2, 
	  kErrSize=4, kErrOutOfBounds=8};
    virtual Int_t    CheckData() const;
    Int_t            GetErrorCode() const {return fErrorCode;};

    void             DumpData(Int_t limit = -1);

    void             AddErrorLog(AliRawDataErrorLog::ERawDataErrorLevel level,
				 Int_t code,
				 const char *message = NULL);
    void             AddMinorErrorLog(Int_t code,
				      const char *message = NULL) {
      return AddErrorLog(AliRawDataErrorLog::kMinor,code,message);
    }
    void             AddMajorErrorLog(Int_t code,
				      const char *message = NULL) {
      return AddErrorLog(AliRawDataErrorLog::kMajor,code,message);
    }
    void             AddFatalErrorLog(Int_t code,
				      const char *message = NULL) {
      return AddErrorLog(AliRawDataErrorLog::kFatal,code,message);
    }
    Int_t            GetNumberOfErrorLogs() const { return fErrorLogs.GetEntriesFast(); }
    const TClonesArray &GetAllErrorLogs() const { return fErrorLogs; }
    AliRawDataErrorLog *GetErrorLog(Int_t i) const {
      return (AliRawDataErrorLog *)fErrorLogs.UncheckedAt(i);
    }

    // Method which can be used in order to force the auto-save on
    // ESD tree inside AliReconstruction. For the moment it will be
    // activated only for AliRawReaderDateOnline.
    virtual Bool_t   UseAutoSaveESD() const { return kFALSE; }
    virtual TChain*  GetChain() const { return NULL; }

    Bool_t           IsRawReaderValid() const { return fIsValid; }

    void             LoadTriggerClass(const char* name, Int_t index);
    void             LoadTriggerAlias(const THashList *lst);

    virtual AliRawReader* CloneSingleEvent() const { return NULL; }

  protected :
    virtual void     SelectEvents(Int_t type, ULong64_t triggerMask = 0, const char *triggerExpr = NULL);
    Bool_t           IsSelected() const;
    Bool_t           IsEventSelected() const;

    TArrayI         *fEquipmentIdsIn;       // array of equipment Ids to be mapped
    TArrayI         *fEquipmentIdsOut;      // array of mapped equipment Ids

    Bool_t           fRequireHeader;        // if false, data without header is accepted

    AliRawDataHeader* fHeader;              // current data header
    AliRawDataHeaderV3* fHeaderV3;              // current data header
    Int_t            fCount;                // counter of bytes to be read for current DDL

    Int_t            fSelectEquipmentType;  // type of selected equipment (<0 = no selection)
    Int_t            fSelectMinEquipmentId; // minimal index of selected equipment (<0 = no selection)
    Int_t            fSelectMaxEquipmentId; // maximal index of selected equipment (<0 = no selection)
    Bool_t           fSkipInvalid;          // skip invalid data
    Int_t            fSelectEventType;      // type of selected events (<0 = no selection)
    ULong64_t        fSelectTriggerMask;    // trigger mask for selecting events (0 = no selection)
    TString          fSelectTriggerExpr;    // trigger expression for selecting events (empty = no selection)

    Int_t            fErrorCode;            // code of last error

    Int_t            fEventNumber;          // current event number
    TClonesArray     fErrorLogs;            // raw data decoding errors

    AliRawDataHeader* fHeaderSwapped;       // temporary buffer for swapping header on PowerPC
    AliRawDataHeaderV3* fHeaderSwappedV3;       // temporary buffer for swapping header on PowerPC

    UInt_t SwapWord(UInt_t x) const;
    UShort_t SwapShort(UShort_t x) const;

    Bool_t           fIsValid;              // is raw-reader created successfully
    Bool_t           fIsTriggerClassLoaded; // flags the call to LoadTriggerClass

    ClassDef(AliRawReader, 0) // base class for reading raw digits
};

#endif
 AliRawReader.h:1
 AliRawReader.h:2
 AliRawReader.h:3
 AliRawReader.h:4
 AliRawReader.h:5
 AliRawReader.h:6
 AliRawReader.h:7
 AliRawReader.h:8
 AliRawReader.h:9
 AliRawReader.h:10
 AliRawReader.h:11
 AliRawReader.h:12
 AliRawReader.h:13
 AliRawReader.h:14
 AliRawReader.h:15
 AliRawReader.h:16
 AliRawReader.h:17
 AliRawReader.h:18
 AliRawReader.h:19
 AliRawReader.h:20
 AliRawReader.h:21
 AliRawReader.h:22
 AliRawReader.h:23
 AliRawReader.h:24
 AliRawReader.h:25
 AliRawReader.h:26
 AliRawReader.h:27
 AliRawReader.h:28
 AliRawReader.h:29
 AliRawReader.h:30
 AliRawReader.h:31
 AliRawReader.h:32
 AliRawReader.h:33
 AliRawReader.h:34
 AliRawReader.h:35
 AliRawReader.h:36
 AliRawReader.h:37
 AliRawReader.h:38
 AliRawReader.h:39
 AliRawReader.h:40
 AliRawReader.h:41
 AliRawReader.h:42
 AliRawReader.h:43
 AliRawReader.h:44
 AliRawReader.h:45
 AliRawReader.h:46
 AliRawReader.h:47
 AliRawReader.h:48
 AliRawReader.h:49
 AliRawReader.h:50
 AliRawReader.h:51
 AliRawReader.h:52
 AliRawReader.h:53
 AliRawReader.h:54
 AliRawReader.h:55
 AliRawReader.h:56
 AliRawReader.h:57
 AliRawReader.h:58
 AliRawReader.h:59
 AliRawReader.h:60
 AliRawReader.h:61
 AliRawReader.h:62
 AliRawReader.h:63
 AliRawReader.h:64
 AliRawReader.h:65
 AliRawReader.h:66
 AliRawReader.h:67
 AliRawReader.h:68
 AliRawReader.h:69
 AliRawReader.h:70
 AliRawReader.h:71
 AliRawReader.h:72
 AliRawReader.h:73
 AliRawReader.h:74
 AliRawReader.h:75
 AliRawReader.h:76
 AliRawReader.h:77
 AliRawReader.h:78
 AliRawReader.h:79
 AliRawReader.h:80
 AliRawReader.h:81
 AliRawReader.h:82
 AliRawReader.h:83
 AliRawReader.h:84
 AliRawReader.h:85
 AliRawReader.h:86
 AliRawReader.h:87
 AliRawReader.h:88
 AliRawReader.h:89
 AliRawReader.h:90
 AliRawReader.h:91
 AliRawReader.h:92
 AliRawReader.h:93
 AliRawReader.h:94
 AliRawReader.h:95
 AliRawReader.h:96
 AliRawReader.h:97
 AliRawReader.h:98
 AliRawReader.h:99
 AliRawReader.h:100
 AliRawReader.h:101
 AliRawReader.h:102
 AliRawReader.h:103
 AliRawReader.h:104
 AliRawReader.h:105
 AliRawReader.h:106
 AliRawReader.h:107
 AliRawReader.h:108
 AliRawReader.h:109
 AliRawReader.h:110
 AliRawReader.h:111
 AliRawReader.h:112
 AliRawReader.h:113
 AliRawReader.h:114
 AliRawReader.h:115
 AliRawReader.h:116
 AliRawReader.h:117
 AliRawReader.h:118
 AliRawReader.h:119
 AliRawReader.h:120
 AliRawReader.h:121
 AliRawReader.h:122
 AliRawReader.h:123
 AliRawReader.h:124
 AliRawReader.h:125
 AliRawReader.h:126
 AliRawReader.h:127
 AliRawReader.h:128
 AliRawReader.h:129
 AliRawReader.h:130
 AliRawReader.h:131
 AliRawReader.h:132
 AliRawReader.h:133
 AliRawReader.h:134
 AliRawReader.h:135
 AliRawReader.h:136
 AliRawReader.h:137
 AliRawReader.h:138
 AliRawReader.h:139
 AliRawReader.h:140
 AliRawReader.h:141
 AliRawReader.h:142
 AliRawReader.h:143
 AliRawReader.h:144
 AliRawReader.h:145
 AliRawReader.h:146
 AliRawReader.h:147
 AliRawReader.h:148
 AliRawReader.h:149
 AliRawReader.h:150
 AliRawReader.h:151
 AliRawReader.h:152
 AliRawReader.h:153
 AliRawReader.h:154
 AliRawReader.h:155
 AliRawReader.h:156
 AliRawReader.h:157
 AliRawReader.h:158
 AliRawReader.h:159
 AliRawReader.h:160
 AliRawReader.h:161
 AliRawReader.h:162
 AliRawReader.h:163
 AliRawReader.h:164
 AliRawReader.h:165
 AliRawReader.h:166
 AliRawReader.h:167
 AliRawReader.h:168
 AliRawReader.h:169
 AliRawReader.h:170
 AliRawReader.h:171
 AliRawReader.h:172
 AliRawReader.h:173
 AliRawReader.h:174
 AliRawReader.h:175
 AliRawReader.h:176
 AliRawReader.h:177
 AliRawReader.h:178
 AliRawReader.h:179
 AliRawReader.h:180
 AliRawReader.h:181
 AliRawReader.h:182
 AliRawReader.h:183
 AliRawReader.h:184
 AliRawReader.h:185
 AliRawReader.h:186
 AliRawReader.h:187
 AliRawReader.h:188
 AliRawReader.h:189
 AliRawReader.h:190
 AliRawReader.h:191
 AliRawReader.h:192
 AliRawReader.h:193
 AliRawReader.h:194
 AliRawReader.h:195
 AliRawReader.h:196
 AliRawReader.h:197
 AliRawReader.h:198
 AliRawReader.h:199
 AliRawReader.h:200
 AliRawReader.h:201
 AliRawReader.h:202
 AliRawReader.h:203
 AliRawReader.h:204
 AliRawReader.h:205
 AliRawReader.h:206
 AliRawReader.h:207
 AliRawReader.h:208
 AliRawReader.h:209
 AliRawReader.h:210
 AliRawReader.h:211
 AliRawReader.h:212
 AliRawReader.h:213
 AliRawReader.h:214
 AliRawReader.h:215
 AliRawReader.h:216
 AliRawReader.h:217
 AliRawReader.h:218
 AliRawReader.h:219
 AliRawReader.h:220
 AliRawReader.h:221
 AliRawReader.h:222
 AliRawReader.h:223
 AliRawReader.h:224
 AliRawReader.h:225
 AliRawReader.h:226
 AliRawReader.h:227
 AliRawReader.h:228
 AliRawReader.h:229
 AliRawReader.h:230
 AliRawReader.h:231
 AliRawReader.h:232
 AliRawReader.h:233
 AliRawReader.h:234
 AliRawReader.h:235
 AliRawReader.h:236
 AliRawReader.h:237
 AliRawReader.h:238