c9e0b664ec5ad43b6e0cbf5dab8e73563ba699a2
[u/mrichter/AliRoot.git] / HLT / rec / AliRawReaderHLT.h
1 //-*- Mode: C++ -*-
2 // $Id$
3
4 #ifndef ALIRAWREADERHLT_H
5 #define ALIRAWREADERHLT_H
6 //* This file is property of and copyright by the ALICE HLT Project        * 
7 //* ALICE Experiment at CERN, All rights reserved.                         *
8 //* See cxx source for full Copyright notice                               *
9
10 /** @file   AliRawReaderHLT.h
11     @author Matthias Richter
12     @date   
13     @brief  AliRawReader implementation which replaces original input of
14             detectors with the appropriate HLT output.                    */
15
16 // see below for class documentation
17 // or
18 // refer to README to build package
19 // or
20 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
21
22 #include "AliHLTDataTypes.h"
23 #include "AliRawReader.h"      // RAW, base class
24 #include "AliHLTReconstructorBase.h"
25 #include "TString.h"
26 #include <vector>
27
28 class AliHLTOUT;
29 class AliHLTOUTHandler;
30
31 /**
32  * @class AliRawReaderHLT
33  * Handler of HLTOUT data for AliRawReader input.
34  */
35 class AliRawReaderHLT : public AliRawReader, public AliHLTReconstructorBase {
36  public:
37   /** constructor */
38   AliRawReaderHLT(AliRawReader* pParentReader, const char* options=NULL);
39   /** destructor */
40   virtual ~AliRawReaderHLT();
41
42   // interface methods of AliRawReader
43   void     Select(Int_t detectorID, 
44                   Int_t minDDLID = -1, Int_t maxDDLID = -1);
45 //   void     Select(const char *detectorName, 
46 //                Int_t minDDLID = -1, Int_t maxDDLID = -1);
47
48   using AliRawReader::Select;
49
50   void     SelectEquipment(Int_t equipmentType, 
51                            Int_t minEquipmentId = -1, 
52                            Int_t maxEquipmentId = -1);
53   void     SkipInvalid(Bool_t skip = kTRUE);
54   void     SelectEvents(Int_t type);
55
56   UInt_t   GetType() const;
57   UInt_t   GetRunNumber() const;
58   const UInt_t* GetEventId() const;
59   const UInt_t* GetTriggerPattern() const;
60   const UInt_t* GetDetectorPattern() const;
61   const UInt_t* GetAttributes() const;
62   const UInt_t* GetSubEventAttributes() const;
63   UInt_t   GetLDCId() const;
64   UInt_t   GetGDCId() const;
65   UInt_t   GetTimestamp() const;
66
67   const UInt_t* GetEquipmentAttributes() const;
68   Int_t    GetEquipmentElementSize() const;
69   Int_t    GetEquipmentHeaderSize() const;
70
71   Int_t    GetEquipmentSize() const;
72   Int_t    GetEquipmentType() const;
73   Int_t    GetEquipmentId() const;
74   Bool_t   ReadHeader();
75   Bool_t   ReadNextData(UChar_t*& data);
76   Bool_t   ReadNextInt(UInt_t& data);
77   Bool_t   ReadNextShort(UShort_t& data);
78   Bool_t   ReadNextChar(UChar_t& data);
79   Bool_t   ReadNext(UChar_t* data, Int_t size);
80
81   Bool_t   Reset();
82
83   Bool_t   NextEvent();
84   Bool_t   RewindEvents();
85
86  protected:
87
88  private:
89   /** standard constructor prohibited */
90   AliRawReaderHLT();
91   /** copy constructor prohibited */
92   AliRawReaderHLT(const AliRawReaderHLT&);
93   /** assignment operator prohibited */
94   AliRawReaderHLT& operator=(const AliRawReaderHLT&);
95
96   /**
97    * Scan the options.
98    * Set the ids for the specified detectors in the detector
99    * list. Currently, no other options are available.
100    */
101   int ScanOptions(const char* options);
102
103   /**
104    * Read the next data block from the HLT stream
105    */
106   Bool_t ReadNextHLTData();
107
108   /**
109    * Check if a ddlid is part of the ones which are selected for
110    * input replacement.
111    */
112   Bool_t IsHLTInput(int ddlid);
113
114   /**
115    * Check if redirection is enabled for at least one detector in the
116    * selected range.
117    * Set the fbHaveHLTData variable
118    * @return true if data has to be read from the HLT stream.
119    */
120   Bool_t EvaluateSelection();
121
122   /**
123    * Release the current HLT data.
124    * Releases the current buffer of either the active HLTOUT data
125    * block handler or the HLTOUT instance. The latter implies a
126    * reset of the reader concerning the HLT data blocks.
127    * @param bReleaseHLTOUT   release HLTOUT instance if \em true
128    *                         only current data buffer if \em false
129    * @return neg. error code if failed
130    */
131   int ReleaseHLTData(bool bReleaseHLTOUT=true);
132
133   /** the rawreader */
134   AliRawReader* fpParentReader; //!transient
135
136   /** options */
137   TString fOptions; //!transient
138
139   /** system options = options w/o detector strings */
140   TString fSystemOptions; //!transient
141
142   /** current data set, either extracted from the HLT stream or parent raw reader */
143   const AliHLTUInt8_t* fpData; // !transient
144
145   /** size of the current data set */
146   int fDataSize; // !transient
147
148   /** current stream offset in the data set */
149   int fOffset; // !transient
150
151   /** current stream position for the ReadNextData function */
152   int fPosition; // !transient
153
154   /** equipment id of the current data set, >0 indicates data set from HLT stream */
155   int fEquipmentId; // !transient
156
157   /** indicates the availibility of data from the HLT stream */
158   bool fbHaveHLTData; // !transient
159
160   /** list of detectors for which data will be taken from HLT stream */
161   vector<int> fDetectors; // !transient
162
163   /** instance of the HLTOUT handler */
164   AliHLTOUT* fpHLTOUT; // !transient
165
166   /** start reading HLTOUT from beginning */
167   bool fbReadFirst; //!transient
168
169   /** instance of the data handler providing the current data buffer */
170   AliHLTOUTHandler* fpDataHandler; // !transient
171
172   ClassDef(AliRawReaderHLT, 4)
173 };
174
175 #define ALIHLTREC_LIBRARY                   "libHLTrec.so"
176 #define ALIHLTREC_LIBRARY_VERSION           0
177 #define ALIRAWREADERHLT_CREATE_INSTANCE     "AliRawReaderHLTCreateInstance"
178
179 #ifdef __cplusplus
180 extern "C" {
181 #endif
182   typedef AliRawReader* (*AliRawReaderHLTCreateInstance_t)(AliRawReader* pParentReader, const char* options);
183
184   /**
185    * Create an instance of the AliRawReader class
186    */
187   AliRawReader* AliRawReaderHLTCreateInstance(AliRawReader* pParentReader, const char* options);
188 #ifdef __cplusplus
189 }
190 #endif
191 #endif