//  
// Author: Oliver Maria Kind <mailto: kind@mail.desy.de>
// Update: $Id: AtlTriggerConf.h,v 1.13 2011/07/20 04:05:24 kind Exp $
// Copyright: 2008 (C) Oliver Maria Kind
//
#ifndef ATLAS_AtlTriggerConf
#define ATLAS_AtlTriggerConf
#ifndef ROOT_TObject
#include <TObject.h>
#endif
#ifndef ROOT_TTree
#include <TTree.h>
#endif
#ifndef ROOT_TSystem
#include <TSystem.h>
#endif
#ifndef ATLAS_AtlTriggerConfItem
#include <AtlTriggerConfItem.h>
#endif

class THashTable;
class TClonesArray;
class TDirectory;

class AtlTriggerConf : public TObject {

  public:
    static const Int_t fgL1MaxBits;
    static const Int_t fgHLTMaxBits;
    static const char* fgTreeName;
    static const char* fgTreeTitle;
    enum ETrigger { kL1, kHLT };
    
  private:
    static AtlTriggerConf *fgInstance; // Trigger configuration singleton
    TTree         *fConfigTree;        // Tree containing the configuration
    Int_t          fN_L1TriggerItems;  // No. of items filled in L1 clones array
                                       // (internal use only)
    Int_t          fN_HLTTriggerItems; // No. of items filled in HLT clones array
                                       // (internal use only)
    TClonesArray  *fL1TriggerItemsCA;  // Array of L1 trigger items in config tree
    TClonesArray  *fHLTTriggerItemsCA; // Array of HLT trigger items in config tree
    THashTable    *fL1TriggerItemsHT;  // Hash table of L1 trigger items for fast access
    THashTable    *fHLTTriggerItemsHT; // Hash table of HLT trigger items for fast access
    Int_t          fRunStart;          // Begin of run range
                                       // valid for the current configuration
    Int_t          fRunEnd;            // End of run range
                                       // valid for the current configuration

  public:
    AtlTriggerConf();
    virtual ~AtlTriggerConf();
    static AtlTriggerConf* Instance();
    virtual void Clear(Option_t *option = "");
    virtual void Print(Option_t *option = "ALL");
    AtlTriggerConf* LoadTree(TDirectory *dir);
    TTree* CreateTree();
    AtlTriggerConfItem* GetTriggerItem(ETrigger trigger,
				       const char* name,
				       Int_t RunNr);
    AtlTriggerConfItem* GetTriggerItem(ETrigger trigger,
				       const char* name,
				       Bool_t CheckValidity = kFALSE);
    void ReadConfiguration(Int_t RunNr);
    AtlTriggerConfItem* AddTriggerItem(ETrigger trigger,
				       const char* name,
				       const char* title,
				       Int_t bit);
    void WriteConfiguration();
    void Rehash();
    TClonesArray* GetTriggerItemsCA(ETrigger trigger) const;
    Int_t GetN_TriggerItems(ETrigger trigger, Int_t RunNr);
    Int_t GetN_TriggerItems(ETrigger trigger) const;
    const char* GetL1ItemName(Int_t Bit, Int_t RunNr);
    const char* GetHLTItemName(Int_t Bit, Int_t RunNr);
    const char* GetL1ItemName(Int_t Bit);
    const char* GetHLTItemName(Int_t Bit);

    inline TTree* GetConfigTree() const { return fConfigTree; }
    inline Int_t GetL1TriggerBit(const char* name, Int_t RunNr) {
	//
	// Return bit number of L1 trigger item <name>.
	// Check if the present configuration is still valid for the
	// given run - load appropiate config otherwise.
	//
	// Return -1 in case the given item could not be found/
	//
	AtlTriggerConfItem *item = GetTriggerItem(kL1, name, RunNr);
	return ( item == 0 ) ? -1 : item->fBit;
    }
    inline Int_t GetHLTTriggerBit(const char* name, Int_t RunNr) {
	//
	// Return bit number of HLT trigger item <name>
	// Check if the present configuration is still valid for the
	// given run - load appropiate config otherwise.
	//
	// Return -1 in case the given item could not be found/
	//
	AtlTriggerConfItem *item  = GetTriggerItem(kHLT, name, RunNr);
	return ( item == 0 ) ? -1 : item->fBit;
    }
    inline Int_t GetL1TriggerBit(const char* name) {
	//
	// Return bit number of L1 trigger item <name>
	// from the current configuration.
	//
	return GetTriggerItem(kL1, name)->fBit;
    }
    inline Int_t GetHLTTriggerBit(const char* name) {
	//
	// Return bit number of HLT trigger item <name>
	// from the current configuration.
	//
	return GetTriggerItem(kHLT, name)->fBit;
    }
    inline Int_t GetRunStart() const { return fRunStart; }
    inline Int_t GetRunEnd() const { return fRunEnd; }
    inline void SetRunStart(Int_t RunStart) {
	// Set begin of valid run range for the current configuration
	fRunStart = RunStart;
    }
    inline void SetRunEnd(Int_t RunEnd) {
	// Set end of valid run range for the current configuration
	// Check that the given end run number is larger than the already
	// given start run number of the run range
	if ( RunEnd < fRunStart ) {
	    Error("WriteConfig", "Given end run number (%d) is smaller than the start run number of the configuration run range (%d). Abort!", RunEnd, fRunStart);
	    gSystem->Abort();
	}
	fRunEnd = RunEnd;
    }
    
  private:
    THashTable* GetTriggerItemsHT(ETrigger trigger) const;
    void SetN_TriggerItems(ETrigger trigger, Int_t NItems);
    
    ClassDef(AtlTriggerConf,0) // ATLAS trigger configuration dbase
};
#endif
 AtlTriggerConf.h:1
 AtlTriggerConf.h:2
 AtlTriggerConf.h:3
 AtlTriggerConf.h:4
 AtlTriggerConf.h:5
 AtlTriggerConf.h:6
 AtlTriggerConf.h:7
 AtlTriggerConf.h:8
 AtlTriggerConf.h:9
 AtlTriggerConf.h:10
 AtlTriggerConf.h:11
 AtlTriggerConf.h:12
 AtlTriggerConf.h:13
 AtlTriggerConf.h:14
 AtlTriggerConf.h:15
 AtlTriggerConf.h:16
 AtlTriggerConf.h:17
 AtlTriggerConf.h:18
 AtlTriggerConf.h:19
 AtlTriggerConf.h:20
 AtlTriggerConf.h:21
 AtlTriggerConf.h:22
 AtlTriggerConf.h:23
 AtlTriggerConf.h:24
 AtlTriggerConf.h:25
 AtlTriggerConf.h:26
 AtlTriggerConf.h:27
 AtlTriggerConf.h:28
 AtlTriggerConf.h:29
 AtlTriggerConf.h:30
 AtlTriggerConf.h:31
 AtlTriggerConf.h:32
 AtlTriggerConf.h:33
 AtlTriggerConf.h:34
 AtlTriggerConf.h:35
 AtlTriggerConf.h:36
 AtlTriggerConf.h:37
 AtlTriggerConf.h:38
 AtlTriggerConf.h:39
 AtlTriggerConf.h:40
 AtlTriggerConf.h:41
 AtlTriggerConf.h:42
 AtlTriggerConf.h:43
 AtlTriggerConf.h:44
 AtlTriggerConf.h:45
 AtlTriggerConf.h:46
 AtlTriggerConf.h:47
 AtlTriggerConf.h:48
 AtlTriggerConf.h:49
 AtlTriggerConf.h:50
 AtlTriggerConf.h:51
 AtlTriggerConf.h:52
 AtlTriggerConf.h:53
 AtlTriggerConf.h:54
 AtlTriggerConf.h:55
 AtlTriggerConf.h:56
 AtlTriggerConf.h:57
 AtlTriggerConf.h:58
 AtlTriggerConf.h:59
 AtlTriggerConf.h:60
 AtlTriggerConf.h:61
 AtlTriggerConf.h:62
 AtlTriggerConf.h:63
 AtlTriggerConf.h:64
 AtlTriggerConf.h:65
 AtlTriggerConf.h:66
 AtlTriggerConf.h:67
 AtlTriggerConf.h:68
 AtlTriggerConf.h:69
 AtlTriggerConf.h:70
 AtlTriggerConf.h:71
 AtlTriggerConf.h:72
 AtlTriggerConf.h:73
 AtlTriggerConf.h:74
 AtlTriggerConf.h:75
 AtlTriggerConf.h:76
 AtlTriggerConf.h:77
 AtlTriggerConf.h:78
 AtlTriggerConf.h:79
 AtlTriggerConf.h:80
 AtlTriggerConf.h:81
 AtlTriggerConf.h:82
 AtlTriggerConf.h:83
 AtlTriggerConf.h:84
 AtlTriggerConf.h:85
 AtlTriggerConf.h:86
 AtlTriggerConf.h:87
 AtlTriggerConf.h:88
 AtlTriggerConf.h:89
 AtlTriggerConf.h:90
 AtlTriggerConf.h:91
 AtlTriggerConf.h:92
 AtlTriggerConf.h:93
 AtlTriggerConf.h:94
 AtlTriggerConf.h:95
 AtlTriggerConf.h:96
 AtlTriggerConf.h:97
 AtlTriggerConf.h:98
 AtlTriggerConf.h:99
 AtlTriggerConf.h:100
 AtlTriggerConf.h:101
 AtlTriggerConf.h:102
 AtlTriggerConf.h:103
 AtlTriggerConf.h:104
 AtlTriggerConf.h:105
 AtlTriggerConf.h:106
 AtlTriggerConf.h:107
 AtlTriggerConf.h:108
 AtlTriggerConf.h:109
 AtlTriggerConf.h:110
 AtlTriggerConf.h:111
 AtlTriggerConf.h:112
 AtlTriggerConf.h:113
 AtlTriggerConf.h:114
 AtlTriggerConf.h:115
 AtlTriggerConf.h:116
 AtlTriggerConf.h:117
 AtlTriggerConf.h:118
 AtlTriggerConf.h:119
 AtlTriggerConf.h:120
 AtlTriggerConf.h:121
 AtlTriggerConf.h:122
 AtlTriggerConf.h:123
 AtlTriggerConf.h:124
 AtlTriggerConf.h:125
 AtlTriggerConf.h:126
 AtlTriggerConf.h:127
 AtlTriggerConf.h:128
 AtlTriggerConf.h:129
 AtlTriggerConf.h:130
 AtlTriggerConf.h:131
 AtlTriggerConf.h:132
 AtlTriggerConf.h:133
 AtlTriggerConf.h:134
 AtlTriggerConf.h:135
 AtlTriggerConf.h:136
 AtlTriggerConf.h:137
 AtlTriggerConf.h:138
 AtlTriggerConf.h:139