ROOT logo
//-*- Mode: C++ -*-

// $Id$

#ifndef ALIHLTHOMERMANAGER_H
#define ALIHLTHOMERMANAGER_H

/* This file is property of and copyright by the ALICE HLT Project        * 
 * ALICE Experiment at CERN, All rights reserved.                         *
 * See cxx source for full Copyright notice     
 */

/** @file   AliHLTHOMERManager.h
    @author Jochen Thaeder
    @author Svein Lindal <slindal@fys.uio.no>
    @date   October 2010
    @brief  Manager for HOMER in aliroot
*/


#include "TClonesArray.h"
#include "TString.h"
#include "TList.h"

#include "AliHLTHOMERSourceDesc.h"
#include "AliHLTHOMERBlockDesc.h"
#include "AliHLTHOMERReader.h"
#include "AliHLTHOMERProxyHandler.h"

#include "AliHLTLoggingVariadicFree.h"

#define BUFFERSIZE 15

class AliHLTHOMERLibManager;

/**
 * @class AliHLTHOMERManager
 * This Class should handle the communication
 * from the HLT to aliroot. The HLT sends data via 
 * the HOMER interface on several TCP ports of nodes 
 * in the CERN GPN and DCS network.
 * All this communication is hidden from the user.
 * 
 * Right now, a xml file ( SCC1 ) is used to get the
 * configuration, this will/ has to change to a proxy
 * running on dedicated nodes.
 *
 * @ingroup alihlt_homer
 */

class AliHLTHOMERManager : public AliHLTLogging 
{
public:
  
  /** default constructor */
  AliHLTHOMERManager();

  /** destructor */
  virtual ~AliHLTHOMERManager();

  /** Initialize */
  Int_t Initialize();

  /** Create Sources List from HOMER-Proxy */
  virtual Int_t CreateSourcesList();

  /** Set state of a source */
  void   SetSourceState( AliHLTHOMERSourceDesc* source, Bool_t state);

  /** Get pointer to source List */
  TList* GetSourceList() { return fSourceList; }

  /** Connect to HOMER sources, of a certain detector. */
  Int_t ConnectHOMER( TString detector="ALL" );

  /** Disconnect from HOMER sources */
  void  DisconnectHOMER();

  /** Reconnect from HOMER sources */
  Int_t ReconnectHOMER( TString detector);


  /** Loads the next Event, after being connected */
  virtual Int_t NextEvent();

  /** Loads the next Cycle, after being connected */
  virtual Int_t NextCycle() { return NextEvent(); }

  /** Get event ID */
  ULong_t GetEventID() { return fEventId; }

  Int_t GetNAvailableEvents() { return fNEventsAvailable;}
  
  /** Get pointer to last requested BlockList */
  TList* GetBlockList() { return fBlockList; }
  TList* GetAsyncBlockList() { return fAsyncBlockList; }

  /** Navigate backwards in event buffer */
  Int_t  NavigateEventBufferBack();

  /** Navigate forwards in event buffer */
  Int_t  NavigateEventBufferFwd();

  /** Set and get the string used to select triggers */
  void SetTriggerString ( TString triggerString ) { fTriggerString = triggerString; }

  /** Get TriggerString */
  TString GetTriggerString () { return fTriggerString; }

  void SetBlockOwner(Bool_t owner) { fBlockList->SetOwner(owner); }
  Bool_t GetBlockOwner() const { return fBlockList->IsOwner(); }

protected:

  /** Dynamic loader manager for the HOMER library */
  AliHLTHOMERLibManager* fLibManager;             //! transient

  /** Indicates, if a sources have changes,  so that one has to reconnect. */
  Bool_t    fStateHasChanged;                     //  see above

  Bool_t Connected() const { return fConnected; }

private:

  /** copy constructor prohibited */
  AliHLTHOMERManager(const AliHLTHOMERManager&);

  /** assignment operator prohibited */
  AliHLTHOMERManager& operator=(const AliHLTHOMERManager&);

  //==============Connection to homer ==========================

  /** Create a readout list for Hostname and ports */
  void CreateReadoutList( const char** sourceHostnames, UShort_t* sourcePorts, 
			  UInt_t &sourceCount, TString detector );

  /** Checks if already connected to HOMER sources */
  Bool_t IsConnected() { return fConnected; }  

  /** Create and add Block List to Buffer */
  void AddBlockListToBuffer();

  /** Add bocks to asynchronous BlockList */
  void AddToAsyncBlockList();
  void AddToBlockList();


  //============ Block Handling ====================

  /** Get pointer to block list in event buffer */
  TList* GetBlockListEventBuffer( );
    
  /** Get Number of blocks in current event */
  ULong_t GetNBlks() { return fNBlks; }

  /** Handle Blocks and fill them in event buffer or asyncronous BlockList */
  Int_t HandleBlocks();

  /** Check is block are from syncronous source */
  Bool_t IsSyncBlocks();

  /** Get pointer to block ndx in current event */
  void* GetBlk( Int_t ndx );

  /** Get pointer to current block in current event */
  void* GetBlk() { return GetBlk(fCurrentBlk); }

  /** Get first block in current event */
  void* GetFirstBlk() { fCurrentBlk=0; return GetBlk(0); }

  /** Get next block in current event */
  void* GetNextBlk() { return GetBlk(++fCurrentBlk); }

  /** Get size of block ndx */
  ULong_t GetBlkSize( Int_t ndx );

  /** Get size of current block */ 
  ULong_t GetBlkSize() { return GetBlkSize( fCurrentBlk ); }

  /** Get origin of block ndx  */
  TString GetBlkOrigin( Int_t ndx );

  /** Get origin of current block */
  TString GetBlkOrigin(){ return GetBlkOrigin( fCurrentBlk ); }

  /** Get type of block ndx */
  TString GetBlkType( Int_t ndx ); 

  /** Get type of current block */
  TString GetBlkType() { return GetBlkType( fCurrentBlk ); } 
  
  //Get specification of block at ndx in bufferindex
  ULong_t GetBlkSpecification( Int_t ndx );

  /** Get specification of current block */
  ULong_t GetBlkSpecification() { return GetBlkSpecification( fCurrentBlk ); } 

  //Check if requested in eve
  Bool_t CheckIfRequested( AliHLTHOMERBlockDesc* block );
    
  //Check trigger decision
  Bool_t CheckTriggerDecision();
  
  AliHLTHOMERProxyHandler * fProxyHandler;  /** Proxy Handler to get the list of sources */  //! transient 
  AliHLTHOMERReader* fCurrentReader;   /** Pointer to current HOMER reader */ //! transient 
  TList* fReaderList;                 /** List to pointer of HOMER readers */

  // == sources ==
  TList* fSourceList;                /** List to HOMER sources */
  ULong_t fNBlks;                    /** Number of blockes in current event */
  ULong64_t fEventID[BUFFERSIZE];    /** EventID of current event */
  ULong64_t fEventId;
  ULong_t fCurrentBlk;               /** Current block in current event */
  TList* fAsyncBlockList;            /** List containing asychronous blocks */
  TList* fBlockList;            /** List containing asychronous blocks */

  // == event buffer ==
  TClonesArray     * fEventBuffer;  /** Event Buffer */
  Int_t  fBufferTopIdx;             /** Buffer index to last received event */
  Int_t  fBufferLowIdx;             /** Buffer index to last received event */
  Int_t  fCurrentBufferIdx;         /** Buffer index to current event */
  Int_t  fNavigateBufferIdx;        //  Navigate index through event buffer */
  Int_t  fNEventsAvailable;         //Number of available events
  
  Bool_t fConnected;                /** Shows connection status */
  TString fTriggerString;           /** String indicating which trigger should be used to select events */
  Int_t  fNEventsNotTriggered;      /** Number Events not triggered, before next triggered event is found */
  
  Bool_t fRetryNextEvent;           /** Retry reading next event */

  Bool_t fIsBlockOwner;

  ClassDef(AliHLTHOMERManager, 1); // Manage connections to HLT data-sources.
};

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