]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/BASE/AliHLTHOMERManager.h
code cleanup, documentation, placement of 'using' statements
[u/mrichter/AliRoot.git] / HLT / BASE / AliHLTHOMERManager.h
1 //-*- Mode: C++ -*-
2
3 // $Id$
4
5 #ifndef ALIHLTHOMERMANAGER_H
6 #define ALIHLTHOMERMANAGER_H
7
8 /* This file is property of and copyright by the ALICE HLT Project        * 
9  * ALICE Experiment at CERN, All rights reserved.                         *
10  * See cxx source for full Copyright notice     
11  */
12
13 /** @file   AliHLTHOMERManager.h
14     @author Jochen Thaeder
15     @author Svein Lindal <slindal@fys.uio.no>
16     @date   October 2010
17     @brief  Manager for HOMER in aliroot
18 */
19
20
21 #include "TClonesArray.h"
22 #include "TString.h"
23 #include "TList.h"
24
25 #include "AliHLTHOMERSourceDesc.h"
26 #include "AliHLTHOMERBlockDesc.h"
27 #include "AliHLTHOMERReader.h"
28 #include "AliHLTHOMERProxyHandler.h"
29
30 #include "AliHLTLoggingVariadicFree.h"
31
32 #define BUFFERSIZE 15
33
34 class AliHLTHOMERLibManager;
35
36 /**
37  * @class AliHLTHOMERManager
38  * This Class should handle the communication
39  * from the HLT to aliroot. The HLT sends data via 
40  * the HOMER interface on several TCP ports of nodes 
41  * in the CERN GPN and DCS network.
42  * All this communication is hidden from the user.
43  * 
44  * Right now, a xml file ( SCC1 ) is used to get the
45  * configuration, this will/ has to change to a proxy
46  * running on dedicated nodes.
47  *
48  * @ingroup alihlt_homer
49  */
50
51 class AliHLTHOMERManager : public AliHLTLogging 
52 {
53 public:
54   
55   /** default constructor */
56   AliHLTHOMERManager();
57
58   /** destructor */
59   virtual ~AliHLTHOMERManager();
60
61   /** Initialize */
62   Int_t Initialize();
63
64   /** Create Sources List from HOMER-Proxy */
65   virtual Int_t CreateSourcesList();
66
67   /** Set state of a source */
68   void   SetSourceState( AliHLTHOMERSourceDesc* source, Bool_t state);
69
70   /** Get pointer to source List */
71   TList* GetSourceList() { return fSourceList; }
72
73   /** Connect to HOMER sources, of a certain detector. */
74   Int_t ConnectHOMER( TString detector="ALL" );
75
76   /** Disconnect from HOMER sources */
77   void  DisconnectHOMER();
78
79   /** Reconnect from HOMER sources */
80   Int_t ReconnectHOMER( TString detector);
81
82
83   /** Loads the next Event, after being connected */
84   virtual Int_t NextEvent();
85
86   /** Loads the next Cycle, after being connected */
87   virtual Int_t NextCycle() { return NextEvent(); }
88
89   /** Get event ID */
90   ULong_t GetEventID() { return fEventId; }
91
92   Int_t GetNAvailableEvents() { return fNEventsAvailable;}
93   
94   /** Get pointer to last requested BlockList */
95   TList* GetBlockList() { return fBlockList; }
96   TList* GetAsyncBlockList() { return fAsyncBlockList; }
97
98   /** Navigate backwards in event buffer */
99   Int_t  NavigateEventBufferBack();
100
101   /** Navigate forwards in event buffer */
102   Int_t  NavigateEventBufferFwd();
103
104   /** Set and get the string used to select triggers */
105   void SetTriggerString ( TString triggerString ) { fTriggerString = triggerString; }
106
107   /** Get TriggerString */
108   TString GetTriggerString () { return fTriggerString; }
109
110   void SetBlockOwner(Bool_t owner) { fBlockList->SetOwner(owner); }
111   Bool_t GetBlockOwner() const { return fBlockList->IsOwner(); }
112
113 protected:
114
115   /** Dynamic loader manager for the HOMER library */
116   AliHLTHOMERLibManager* fLibManager;             //! transient
117
118   /** Indicates, if a sources have changes,  so that one has to reconnect. */
119   Bool_t    fStateHasChanged;                     //  see above
120
121   Bool_t Connected() const { return fConnected; }
122
123 private:
124
125   /** copy constructor prohibited */
126   AliHLTHOMERManager(const AliHLTHOMERManager&);
127
128   /** assignment operator prohibited */
129   AliHLTHOMERManager& operator=(const AliHLTHOMERManager&);
130
131   //==============Connection to homer ==========================
132
133   /** Create a readout list for Hostname and ports */
134   void CreateReadoutList( const char** sourceHostnames, UShort_t* sourcePorts, 
135                           UInt_t &sourceCount, TString detector );
136
137   /** Checks if already connected to HOMER sources */
138   Bool_t IsConnected() { return fConnected; }  
139
140   /** Create and add Block List to Buffer */
141   void AddBlockListToBuffer();
142
143   /** Add bocks to asynchronous BlockList */
144   void AddToAsyncBlockList();
145   void AddToBlockList();
146
147
148   //============ Block Handling ====================
149
150   /** Get pointer to block list in event buffer */
151   TList* GetBlockListEventBuffer( );
152     
153   /** Get Number of blocks in current event */
154   ULong_t GetNBlks() { return fNBlks; }
155
156   /** Handle Blocks and fill them in event buffer or asyncronous BlockList */
157   Int_t HandleBlocks();
158
159   /** Check is block are from syncronous source */
160   Bool_t IsSyncBlocks();
161
162   /** Get pointer to block ndx in current event */
163   void* GetBlk( Int_t ndx );
164
165   /** Get pointer to current block in current event */
166   void* GetBlk() { return GetBlk(fCurrentBlk); }
167
168   /** Get first block in current event */
169   void* GetFirstBlk() { fCurrentBlk=0; return GetBlk(0); }
170
171   /** Get next block in current event */
172   void* GetNextBlk() { return GetBlk(++fCurrentBlk); }
173
174   /** Get size of block ndx */
175   ULong_t GetBlkSize( Int_t ndx );
176
177   /** Get size of current block */ 
178   ULong_t GetBlkSize() { return GetBlkSize( fCurrentBlk ); }
179
180   /** Get origin of block ndx  */
181   TString GetBlkOrigin( Int_t ndx );
182
183   /** Get origin of current block */
184   TString GetBlkOrigin(){ return GetBlkOrigin( fCurrentBlk ); }
185
186   /** Get type of block ndx */
187   TString GetBlkType( Int_t ndx ); 
188
189   /** Get type of current block */
190   TString GetBlkType() { return GetBlkType( fCurrentBlk ); } 
191   
192   //Get specification of block at ndx in bufferindex
193   ULong_t GetBlkSpecification( Int_t ndx );
194
195   /** Get specification of current block */
196   ULong_t GetBlkSpecification() { return GetBlkSpecification( fCurrentBlk ); } 
197
198   //Check if requested in eve
199   Bool_t CheckIfRequested( AliHLTHOMERBlockDesc* block );
200     
201   //Check trigger decision
202   Bool_t CheckTriggerDecision();
203   
204   AliHLTHOMERProxyHandler * fProxyHandler;  /** Proxy Handler to get the list of sources */  //! transient 
205   AliHLTHOMERReader* fCurrentReader;   /** Pointer to current HOMER reader */ //! transient 
206   TList* fReaderList;                 /** List to pointer of HOMER readers */
207
208   // == sources ==
209   TList* fSourceList;                /** List to HOMER sources */
210   ULong_t fNBlks;                    /** Number of blockes in current event */
211   ULong64_t fEventID[BUFFERSIZE];    /** EventID of current event */
212   ULong64_t fEventId;
213   ULong_t fCurrentBlk;               /** Current block in current event */
214   TList* fAsyncBlockList;            /** List containing asychronous blocks */
215   TList* fBlockList;            /** List containing asychronous blocks */
216
217   // == event buffer ==
218   TClonesArray     * fEventBuffer;  /** Event Buffer */
219   Int_t  fBufferTopIdx;             /** Buffer index to last received event */
220   Int_t  fBufferLowIdx;             /** Buffer index to last received event */
221   Int_t  fCurrentBufferIdx;         /** Buffer index to current event */
222   Int_t  fNavigateBufferIdx;        //  Navigate index through event buffer */
223   Int_t  fNEventsAvailable;         //Number of available events
224   
225   Bool_t fConnected;                /** Shows connection status */
226   TString fTriggerString;           /** String indicating which trigger should be used to select events */
227   Int_t  fNEventsNotTriggered;      /** Number Events not triggered, before next triggered event is found */
228   
229   Bool_t fRetryNextEvent;           /** Retry reading next event */
230
231   Bool_t fIsBlockOwner;
232
233   ClassDef(AliHLTHOMERManager, 1); // Manage connections to HLT data-sources.
234 };
235
236 #endif