ROOT logo
// $Id: AliEveEventManager.h 64557 2013-10-16 20:03:08Z hristov $
// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/**************************************************************************
 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
 * full copyright notice.                                                 *
 **************************************************************************/

#ifndef AliEveEventManager_H
#define AliEveEventManager_H

#include <TEveEventManager.h>
#include <TQObject.h>
#include <TObjArray.h>
#include <TThread.h>

#include <AliEventInfo.h>
#include <AliESDEvent.h>
#include "AliStorageTypes.h"

class AliEveMacroExecutor;
class AliEveEventSelector; 

class AliRunLoader;
class AliESDEvent;
class AliESDfriend;
class AliAODEvent;
class AliRawReader;

class AliGRPObject;
class AliRecoParam;
class AliMagF;

class TEveElement;
class TFile;
class TTree;
class TGeoManager;
class TString;
class TMap;

//==============================================================================
//
// AliEveEventManager
//
// Interface to ALICE event-data (RunLoader, ESD), magnetic field and
// geometry.
//


class AliEveEventManager : public TEveEventManager, public TQObject
{
public:
    AliEveEventManager(const TString& name="Event", Int_t ev=0);
    virtual ~AliEveEventManager();
	
    enum EVisibleESDTrees{ kOfflineTree, kHLTTree };

    static void SetESDFileName(const TString& esd, EVisibleESDTrees shown=kOfflineTree);
    static void SetESDfriendFileName(const TString& esdf);
    static void SetAODFileName(const TString& aod);
    static void AddAODfriend  (const TString& friendFileName);
    static void SetRawFileName(const TString& raw);
    static void SetCdbUri     (const TString& cdb);
    static void SetGAliceFileName(const TString& galice);

    // set Local Directory or URL where the files are located
    // it can also be a path to root_archive.zip
    // assumes the filenames of ESD, AOD, etc are standard ALICE names
    // (AliESDs.root, AliESDfriends.root, AliAOD.root, AliAODfriend.root, galice.root,raw.root)
    static void SetFilesPath(const TString& path);
    static void SetAssertElements(Bool_t assertRunloader, Bool_t assertEsd,
                                  Bool_t assertAod, Bool_t assertRaw);
    static void SearchRawForCentralReconstruction();

    virtual void  Open();
    virtual Int_t GetMaxEventId(Bool_t refreshESD=kFALSE) const;
    virtual void  GotoEvent(Int_t event);
    virtual void  NextEvent();
    virtual void  PrevEvent();
    void MarkCurrentEvent();
    virtual void  Close();

    void          SetEvent(AliRunLoader *runLoader, AliRawReader *rawReader, AliESDEvent *esd, AliESDfriend *esdf);
    void Timeout(); // * SIGNAL*

    Int_t         GetEventId()         const { return fEventId; }
    AliRunLoader* GetRunLoader()       const { return fRunLoader; }
    TFile*        GetESDFile()         const { return fESDFile; }
    TTree*        GetESDTree()         const { return fESDTree; }
    TTree*        GetHLTESDTree()      const { return fHLTESDTree; }
    AliESDEvent*  GetESD()             const { return fESD;     }
    AliESDfriend* GetESDfriend()       const { return fESDfriend; }
    Bool_t        GetESDfriendExists() const { return fESDfriendExists; }
    TFile*        GetAODFile()         const { return fAODFile; }
    TTree*        GetAODTree()         const { return fAODTree; }
    AliAODEvent*  GetAOD()             const { return fAOD;     }
    AliEveEventSelector* GetEventSelector() const { return fPEventSelector; }
    TString       GetEventInfoHorizontal() const;
    TString       GetEventInfoVertical()   const;
    const AliEventInfo*	GetEventInfo();

    static Int_t  CurrentEventId();
    static Bool_t HasRunLoader();
    static Bool_t HasESD();
    static Bool_t HasESDfriend();
    static Bool_t HasAOD();
    static Bool_t HasRawReader();

    static AliRunLoader* AssertRunLoader();
    static AliESDEvent*  AssertESD();
    static AliESDfriend* AssertESDfriend();
    static AliAODEvent*  AssertAOD();
    static AliRawReader* AssertRawReader();
    static AliMagF*      AssertMagField();
    static TGeoManager*  AssertGeometry();
    static AliRecoParam* AssertRecoParams();

    static AliEveEventManager* AddDependentManager(const TString& name, const TString& path);
    static AliEveEventManager* GetDependentManager(const TString& name);
    static AliEveEventManager* GetMaster();
    static AliEveEventManager* GetCurrent();
    static void                RegisterTransient    (TEveElement* element);
    static void                RegisterTransientList(TEveElement* element);

    Double_t      GetAutoLoadTime()        const { return fAutoLoadTime; }
    Bool_t        GetAutoLoad()            const { return fAutoLoad;     }
    Bool_t        GetLoopMarked()            const { return fLoopMarked;     }
    void          SetAutoLoadTime(Float_t time);
    void          SetAutoLoad(Bool_t autoLoad);
    void          SetLoopMarked(Bool_t loopMarked);
    void          SetTrigSel(Int_t trig);
    void          AutoLoadNextEvent();

    Bool_t        AreEventFilesOpened()    const { return fIsOpen;       }
    Bool_t        IsEventAvailable()       const { return fHasEvent;     }
    Bool_t        IsUnderExternalControl() const { return fExternalCtrl; }

    Bool_t        IsOnlineMode() const { return fOnlineMode; }

    Bool_t        InsertGlobal(const TString& tag, TEveElement* model);
    Bool_t        InsertGlobal(const TString& tag, TEveElement* model,
                               Bool_t replace, Bool_t update);
    TEveElement*  FindGlobal(const TString& tag);

    virtual void  AfterNewEventLoaded();
    void          NewEventDataLoaded();  // *SIGNAL*
    void          NewEventLoaded();      // *SIGNAL*
    void          NoEventLoaded();      // *SIGNAL*
    void          StorageManagerOk();    // *SIGNAL*
    void          StorageManagerDown();  // *SIGNAL*

    AliEveMacroExecutor* GetExecutor() const { return fExecutor; }
    void InitOCDB(int runNo=-1);

    void PrepareForNewEvent(AliESDEvent *event);
    Int_t NewEventAvailable();

protected:
    Int_t         fEventId;		// Id of current event.

    AliRunLoader* fRunLoader;		// Run loader.

    TFile        *fESDFile;		// ESD file.
    TTree        *fESDTree;		// ESD tree.
    TTree        *fHLTESDTree;	// HLT ESD tree.
    AliESDEvent  *fESD;			// ESDEvent object.
    AliESDfriend *fESDfriend;		// ESDfriend object.
    Bool_t        fESDfriendExists;	// Flag specifying if ESDfriend was found during opening of the event-data.
    TFile        *fAODFile;		// AOD file.
    TTree        *fAODTree;		// AOD tree.
    AliAODEvent  *fAOD;			// AODEvent object.

    AliRawReader *fRawReader;             // Raw-data reader.
    AliEventInfo	fEventInfo;		// Current Event Info

    Bool_t        fAutoLoad;              // Automatic loading of events (online)
    Bool_t        fLoopMarked;            // Automatic loading of marked events
    Float_t       fAutoLoadTime;          // Auto-load time in seconds
    TTimer       *fAutoLoadTimer;         // Timer for automatic event loading

    Bool_t        fIsOpen;                // Are event-files opened.
    Bool_t        fHasEvent;              // Is an event available.
    Bool_t        fExternalCtrl;          // Are we under external event-loop.

    TMap*         fGlobal;
    Bool_t        fGlobalReplace;         // Are global replace
    Bool_t        fGlobalUpdate;          // Are global updates

    AliEveMacroExecutor *fExecutor;       // Executor for std macros

    TEveElementList     *fTransients;     // Container for additional transient (per event) elements.
    TEveElementList     *fTransientLists; // Container for lists of transient (per event) elements.

    AliEveEventSelector* fPEventSelector; // Event filter

    TList        *fSubManagers;           // Dependent event-managers, used for event embedding.

    static TString  fgGAliceFileName;        // galice.root file
    static TString  fgESDFileName;        // Name by which to open ESD.
    static EVisibleESDTrees  fgESDvisibleTrees; // trees to open from ESD
    static TString  fgESDfriendsFileName;
    static TString  fgAODFileName;        // Name by which to open AOD.
    static TString  fgRawFileName;        // Name by which to open raw-data file.
    static TString  fgCdbUri;		// Global URI to CDB.
    static Bool_t   fgAssertRunLoader;	// Global flag specifying if AliRunLoader must be asserted during opening of the event-data.
    static Bool_t   fgAssertESD;		// Global flag specifying if ESDEvent must be asserted during opening of the event-data.
    static Bool_t   fgAssertAOD;		// Global flag specifying if AODEvent must be asserted during opening of the event-data.
    static Bool_t   fgAssertRaw;		// Global flag specifying if raw-data presence must be asserted during opening of the event-data.

    static TList   *fgAODfriends;         // Global list of AOD friend names to be attached during opening of the event-data (empty by default).

    static Bool_t   fgRawFromStandardLoc; // Global flag to enable looking for raw data in ../../../raw/, as it is stored for central reco.

    static Bool_t        fgGRPLoaded;     // Global run parameters loaded?
    static AliMagF      *fgMagField;      // Global pointer to magnetic field.
    static AliRecoParam* fgRecoParam;
    static Bool_t        fgUniformField;  // Track with uniform field.


private:
    void InitInternals();

    void StartAutoLoadTimer();
    void StopAutoLoadTimer();
    Bool_t fAutoLoadTimerRunning; // State of auto-load timer.

    static Bool_t InitGRP();
    static Bool_t InitRecoParam();
    TTree* readESDTree(const char* treeName, int &run);

    static AliEveEventManager* fgMaster;
    static AliEveEventManager* fgCurrent;

    static void* DispatchEventListener(void *arg){static_cast<AliEveEventManager*>(arg)->GetNextEvent();return nullptr;}
    static void* DispatchStorageManagerWatcher(void *arg){static_cast<AliEveEventManager*>(arg)->CheckStorageStatus();return nullptr;}
    void GetNextEvent();
    void CheckStorageStatus();
    TThread *fEventListenerThread;
    TThread *fStorageManagerWatcherThread;
    TMutex *fMutex;
    AliESDEvent *fCurrentEvent[2];
    TTree *fCurrentTree[2];
    int fEventInUse;
    int fWritingToEventIndex;
    bool fIsNewEventAvaliable;
    storageSockets fgSubSock;

    Bool_t fOnlineMode;
    Bool_t fStorageDown;
    Bool_t fFinished;

    AliEveEventManager(const AliEveEventManager&);            // Not implemented
    AliEveEventManager& operator=(const AliEveEventManager&); // Not implemented
    
    ClassDef(AliEveEventManager, 0); // Interface for getting all event components in a uniform way.
};

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