ROOT logo
// -*- mode: C++ -*-
#ifndef ALIOADBFORWARD_H
#define ALIOADBFORWARD_H
#include <TNamed.h>
#include <TString.h>
#include <TMap.h>
class TFile;
class TTree;
class TBrowser;
class TList;

/**
 * Container/handler of Forward calibration objects. 
 */
class AliOADBForward : public TObject
{
public:
  //=== Options ======================================================
  /**
   * Options for selecting the entries according to the run number
   * given in the query. 
   */
  enum ERunSelectMode { 
    kDefault = 0,
    /** 
     * Select only entries from exactly the run given. 
     */
    kExact = 1,
    /** 
     * Select the entry with the largest run number 
     */
    kNewest = 2,
    /**
     * Select entries from the run nearest (possibly constrained to be
     * older or newer) to the run given in the query 
     */ 
    kNear = 3, 
    /** 
     * Select entries from runs that are older than the run given in
     * the query. The oldest entry with the largest run number
     * smaller than the given run is selected.  
     */
    kOlder = 4, 
    /**
     * Select entries from runs that are newer than the run given.
     * Select the entries with the smallest run number which is larger
     * than the given run.
     */
    kNewer = 5
  };
  /** 
   * Return the mode as a string 
   * 
   * @param mode Mode 
   * 
   * @return Stringified mode 
   */
  static const char* Mode2String(ERunSelectMode mode);
  /** 
   * Parse a string to get the mode 
   * 
   * @param str Input string 
   * 
   * @return Mode 
   */
  static ERunSelectMode String2Mode(const TString& str);
  /** 
   * Return mode as an integer 
   * 
   * @param mode Mode 
   * 
   * @return Mode identifier 
   */
  static ERunSelectMode Int2Mode(Int_t mode);
  /**
   * Various flags
   * 
   */
  enum { 
    /** 
     * The maximum distance to the given run when selecting in kNear
     * mode.  Currently this is set to a large number to allow
     * selection of any entry.  This should change 
     */
    kMaxNearDistance = 1000000,
    kInvalidField    = 999
  };
  //=== Entry ========================================================
  /**
   * An entry in the FORWARD OADB database tables
   * 
   */
  class Entry : public TObject
  {
  public:
    /** 
     * Constructor 
     * 
     * @param runNo   Run number 
     * @param sys     Collision system (1:pp, 2:pbpb, 3:ppb) 
     * @param sNN     Center of mass energy (GeV)
     * @param field   L3 magnetic field (kG)
     * @param mc      True if for MC only
     * @param sat     For satellite events
     * @param o       Correction object
     */
    Entry(ULong_t  runNo  = 0, 
	  UShort_t sys    = 0, 
	  UShort_t sNN    = 0, 
	  Short_t  field  = 0, 
	  Bool_t   mc     = false, 
	  Bool_t   sat    = false,
	  TObject* o      = 0);
    /** 
     * Copy constructor
     * 
     * @param o Object to copy from
     */
    Entry(const Entry& o);
    /** 
     * Destructor 
     */
    virtual ~Entry() {}
    /** 
     * Assignment operator 
     * 
     * @param o Object to assign from 
     * 
     * @return Reference to this object
     */
    Entry& operator=(const Entry& o);
    /** 
     * Get the title of the entry 
     * 
     * @return stringified fields
     */
    const char* GetTitle() const;
    /** 
     * Print this entry 
     * 
     * @param option Not used 
     */
    void Print(Option_t* option="") const; //*MENU*
    ULong_t  fRunNo;           // Run number 
    UShort_t fSys;             // Collision system (1: pp, 2: pbpb, 3: ppb)
    UShort_t fSNN;             // Center of mass energy 
    Short_t  fField;           // L3 magnetic field
    Bool_t   fMC;              // True if only for MC 
    Bool_t   fSatellite;       // Satelitte events
    TObject* fData;            // Correction object
    UInt_t   fTimestamp;       // When the object was stored 
    ULong_t  fAliROOTRevision; // Revision of AliROOT used 
    TString  fAuthor;          // Author of calibration/correction

    ClassDef(Entry,2); // Entry in PWGLF/Forward OADB
  };

  //=== Table ========================================================
  /** 
   * A table on the Forward OADB - the underlying storage is a TTree
   * containing Entry objects.
   * 
   */
  class Table : public TObject
  {
  public:
    /** 
     * Constructor 
     * 
     * @param tree   Tree 
     * @param isNew  Whether to make the branch 
     * @param mode   How to select on the run number 
     * 
     * @return 
     */    
    Table(TTree* tree, Bool_t isNew, ERunSelectMode mode=kNear);
    /** 
     * Copy constructor 
     * 
     * @param other Object to copy from 
     */
    Table(const Table& other);
    /** 
     * Destructor. 
     *
     * Closes the corresponding file 
     */
    ~Table();
    /** 
     * Assignemt operator
     * 
     * @param other Object to assign form 
     * 
     * @return Reference to this object 
     */
    Table& operator=(const Table& other);
    /** 
     * Set the verbosity
     * 
     * @param verb 
     */
    void SetVerbose(Bool_t verb=true) { fVerbose = verb; }
    /** 
     * Set wheter to enable fall-back queries  
     * 
     * @param use If true, enable fall-back queries
     */
    void SetEnableFallBack(Bool_t use=true) { fFallBack = use; }
    // -----------------------------------------------------------------
    /** 
     * Get the name of the tree 
     * 
     * @return Table name 
     */
    const Char_t* GetTableName() const;
    /** 
     * Overload TObject::GetName 
     * 
     * @return Name 
     */
    const Char_t* GetName() const;

    // -----------------------------------------------------------------
    /** 
     * @{ 
     * @name Open/close/flush 
     */
    /** 
     * Flush to disk 
     * 
     * @return true on success
     */
    Bool_t Update();
    /** 
     * Close connection
     * 
     * @return true on success 
     */
    Bool_t Close();
    /* @} */
    // -----------------------------------------------------------------
    /** 
     * @{ 
     * @name Queries 
     */
    /** 
     * Query the tree 
     * 
     * @param runNo  Run number 
     * @param mode   Run selection mode 
     * @param sys    Collision system (1: pp, 2: PbPb, 3: pPb)
     * @param sNN    Center of mass energy (GeV)
     * @param fld    L3 magnetic field (kG)
     * @param mc     For MC only 
     * @param sat    For satellite events
     * @param mode   How to select on the run number 
     * 
     * @return Found entry number or negative number in case of problems
     */
    Int_t Query(ULong_t        runNo  = 0,
		ERunSelectMode mode   = kNear,
		UShort_t       sys    = 0,
		UShort_t       sNN    = 0, 
		Short_t        fld    = kInvalidField,
		Bool_t         mc     = false,
		Bool_t         sat    = false) const;
    /** 
     * Run a query with pre-build conditions
     * 
     * @param q     query string 
     * @param runNo The given run number 
     * @param mode  Run selection mode 
     * 
     * @return Entry number of selected entry 
     */
    Int_t Query(ULong_t        runNo,
		ERunSelectMode mode,
		const TString& q) const;
    /** 
     * Insert a new entry into the tree 
     * 
     * @param o         Object to write 
     * @param runNo     Run number 
     * @param sys       Collision system (1: pp, 2:PbPb, 3:pPb)
     * @param sNN       Center of mass energy (GeV)
     * @param field     L3 magnetic field (kG)
     * @param mc        If true, only for MC 
     * @param sat       For satellite interactions 
     * @param aliRev    AliROOT revision
     * @param author    Creater of this correction
     * 
     * @return true on success 
     */
    Bool_t Insert(TObject* o, 
		  ULong_t  runNo, 
		  UShort_t sys, 
		  UShort_t sNN, 
		  Short_t  field, 
		  Bool_t   mc=false, 
		  Bool_t   sat=false,
		  ULong_t  aliRev=0,
		  const TString& author="");
    /** 
     * Query the tree for an object.  The strategy is as follows. 
     * 
     *  - First query with all fields 
     *    - If this returns a single entry, return that. 
     *    - If not, then ignore the run number (if given)
     *      - If this returns a single entry, return that 
     *      - If not, and fall-back is enabled, then 
     *        - Ignore the collision energy (if given) 
     *          - If this returns a single entry, return that.  
     *          - If not, ignore all passed values 
     *            - If this returns a single entry, return that.
     *            - Otherwise, give up and return -1
     *      - Otherwise, give up and return -1
     *
     * This allow us to specify default objects for a period, and for
     * collision system, energy, and field setting.
     *
     * @param run    Run number 
     * @param mode   Run selection mode 
     * @param sys    Collision system (1: pp, 2: PbPb, 3: pPb)
     * @param sNN    Center of mass energy (GeV)
     * @param fld    L3 magnetic field (kG)
     * @param mc     For MC only 
     * @param sat    For satellite interactions 
     * 
     * @return Found entry number, or -1
     */
    Int_t GetEntry(ULong_t        run      = 0,
		   ERunSelectMode mode     = kNear,
		   UShort_t       sys      = 0,
		   UShort_t       sNN      = 0, 
		   Short_t        fld      = 0,
		   Bool_t         mc       = false,
		   Bool_t         sat      = false) const;
    /** 
     * Query the tree for an object.  The strategy is as follows. 
     * 
     *  - First query with all fields 
     *    - If this returns a single entry, return that. 
     *    - If not, then ignore the run number (if given)
     *      - If this returns a single entry, return that 
     *      - If not, and fall-back is enabled, then 
     *        - Ignore the collision energy (if given) 
     *          - If this returns a single entry, return that.  
     *          - If not, ignore all passed values 
     *            - If this returns a single entry, return that.
     *            - Otherwise, give up and return null
     *      - Otherwise, give up and return null
     *
     * This allow us to specify default objects for a period, and for
     * collision system, energy, and field setting.
     *
     * @param run    Run number 
     * @param mode   Run selection mode 
     * @param sys    Collision system (1: pp, 2: PbPb, 3: pPb)
     * @param sNN    Center of mass energy (GeV)
     * @param fld    L3 magnetic field (kG)
     * @param mc     For MC only 
     * @param sat    For satellite interactions 
     * 
     * @return Found entry, or null
     */
    Entry* Get(ULong_t        run      = 0,
	       ERunSelectMode mode     = kNear,
	       UShort_t       sys      = 0,
	       UShort_t       sNN      = 0, 
	       Short_t        fld      = 0,
	       Bool_t         mc       = false,
	       Bool_t         sat      = false) const;
    /** 
     * Query the tree for an object.  The strategy is as follows. 
     * 
     *  - First query with all fields 
     *    - If this returns a single entry, return that. 
     *    - If not, then ignore the run number (if given)
     *      - If this returns a single entry, return that 
     *      - Otherwise, give up and return null
     *
     * This allow us to specify default objects for a period, and for
     * collision system, energy, and field setting.
     *
     * @param run    Run number 
     * @param mode   Run selection mode 
     * @param sys    Collision system (1: pp, 2: PbPb, 3: pPb)
     * @param sNN    Center of mass energy (GeV)
     * @param fld    L3 magnetic field (kG)
     * @param mc     For MC only 
     * @param sat    For satellite interactions 
     * 
     * @return Found data, or null
     */
    TObject* GetData(ULong_t        run      = 0,
		     ERunSelectMode mode     = kNear,
		     UShort_t       sys      = 0,
		     UShort_t       sNN      = 0, 
		     Short_t        fld      = 0,
		     Bool_t         mc       = false,
		     Bool_t         sat      = false) const;
    /* @} */
    /** 
     * Print the contents of the tree 
     * 
     * @param option Passed to TTree::Scan
     */
    void Print(Option_t* option="") const; //*MENU*
    /** 
     * Browse this table 
     */
    void Browse(TBrowser* b); 
    /** 
     * Check if the tree was opened. 
     * 
     * @param rw If true, also check if the file is read/write 
     *
     * @return true if everything is dandy
     */
    Bool_t IsOpen(Bool_t rw=false) const; 

    TTree*         fTree;     // Our tree
    Entry*         fEntry;    // Entry cache 
    Bool_t         fVerbose;  // To be verbose or not 
    ERunSelectMode fMode;     // Run query mode 
    Bool_t         fFallBack; // Enable fall-back

    ClassDef(Table,1); 
  };
  // === Interface ===================================================
  /** 
   * Constructor 
   */
  AliOADBForward();
  /**
   * Destructor
   * 
   */
  ~AliOADBForward();
  // --- Open/close/update -------------------------------------------
  /** 
   * @{ 
   * @name Input/output 
   */
  /** 
   * Open a file containing tables.  Note, this member function can be
   * called multiple times to open tables in different files.
   * 
   * If a table is already associated with this handler, it will not
   * be re-associated.
   *
   * @param fileName  Path to file to get/write tables from/in
   * @param rw        if true, open read+write, otherwise read-only
   * @param tables    Tables to open 
   * @param verb      Verbosity flag 
   * @param fallback  If true allow for fall-backs
   * 
   * @return true on success 
   */
  Bool_t Open(const TString& fileName, 
	      const TString& tables  = "*", 
	      Bool_t         rw      = false, 
	      Bool_t         verb    = false,
	      Bool_t         fallback= false);
  /** 
   * Open a file containing tables.  Note, this member function can be
   * called multiple times to open tables in different files.
   *
   * If a table is already associated with this handler, it will not
   * be re-associated.
   * 
   * @param file    File to get/write tables from/in
   * @param rw      if true, open read+write, otherwise read-only
   * @param tables  Tables to open 
   * @param verb    Verbosity flag 
   * @param fallback  If true allow for fall-backs
   * 
   * @return true on success 
   */
  Bool_t Open(TFile*         file,
	      const TString& tables, 
	      Bool_t         rw      = false, 
	      Bool_t         verb    = false,
	      Bool_t         fallback= false);
  /** 
   * Close this database 
   * 
   * 
   * @return true on success
   */
  Bool_t Close();
  /** 
   * Flush to disk 
   * 
   * @return true on success
   */
  Bool_t Update();
  /* @} */
  // --- Queries -----------------------------------------------------
  /** 
   * @{ 
   * @name Queries 
   */
  /** 
   * Query the table for an object.  The strategy is as follows. 
   * 
   *  - First query with all fields 
   *    - If this returns a single entry, return that. 
   *    - If not, then ignore the run number (if given)
   *      - If this returns a single entry, return that 
   *      - Otherwise, give up and return null
   *
   * This allow us to specify default objects for a period, and for
   * collision system, energy, and field setting.
   *
   * @param table  Table name 
   * @param run    Run number 
   * @param mode   Run selection mode 
   * @param sys    Collision system (1: pp, 2: PbPb, 3: pPb)
   * @param sNN    Center of mass energy (GeV)
   * @param fld    L3 magnetic field (kG)
   * @param mc     For MC only
   * @param sat    For satellite interactions 
   * 
   * @return Found entry, or null
   */
  Entry* Get(const TString& table, 
	     ULong_t        run        = 0,
	     ERunSelectMode mode       = kNear, 
	     UShort_t       sys        = 0,
	     UShort_t       sNN        = 0, 
	     Short_t        fld        = 0,
	     Bool_t         mc         = false,
	     Bool_t         sat        = false) const;
  /** 
   * Query the table for an object.  The strategy is as follows. 
   * 
   *  - First query with all fields 
   *    - If this returns a single entry, return that. 
   *    - If not, then ignore the run number (if given)
   *      - If this returns a single entry, return that 
   *      - Otherwise, give up and return null
   *
   * This allow us to specify default objects for a period, and for
   * collision system, energy, and field setting.
   *
   * @param table  Table name 
   * @param run    Run number 
   * @param mode   Run selection mode 
   * @param sys    Collision system (1: pp, 2: PbPb, 3: pPb)
   * @param sNN    Center of mass energy (GeV)
   * @param fld    L3 magnetic field (kG)
   * @param mc     For MC only 
   * @param sat    For satellite interactions 
   * 
   * @return Found data, or null
   */
  TObject* GetData(const TString& table, 
		   ULong_t        run      = 0,
		   ERunSelectMode mode     = kNear, 
		   UShort_t       sys      = 0,
		   UShort_t       sNN      = 0, 
		   Short_t        fld      = 0,
		   Bool_t         mc       = false,
		   Bool_t         sat      = false) const;
  // --- Insert ------------------------------------------------------
  /** 
   * Insert a new entry into the table 
   * 
   * @param table     Table name 
   * @param o         Object to write 
   * @param runNo     Run number 
   * @param sys       Collision system (1: pp, 2:PbPb, 3:pPb)
   * @param sNN       Center of mass energy (GeV)
   * @param field     L3 magnetic field (kG)
   * @param mc        If true, only for MC 
   * @param sat    For satellite interactions 
   * @param aliRev    AliROOT revision
   * @param author    Creater of this correction
   * 
   * @return true on success 
   */
  Bool_t Insert(const TString& table, 
		TObject*       o, 
		ULong_t        runNo, 
		UShort_t       sys, 
		UShort_t       sNN, 
		Short_t        field, 
		Bool_t         mc=false, 
		Bool_t         sat=false,
		ULong_t        aliRev=0,
		const TString& author="");
  /** 
   * Copy one entry to another entry 
   * 
   * @param table      Table name 
   * @param oldRunNo   Old run number 
   * @param oldSys     Old collision system
   * @param oldSNN     Old center of mass energy 
   * @param oldField   Old L3 magnetic field strength
   * @param newRunNo   New run number 		     
   * @param newSys     New collision system	     
   * @param newSNN     New center of mass energy     
   * @param newField   New L3 magnetic field strength
   * @param mc         True for MC only queries
   * @param sat        True for including satellite queries
   * 
   * @return true on success 
   */
  Bool_t CopyEntry(const TString& table, 
		   ULong_t        oldRunNo, 
		   UShort_t       oldSys,
		   UShort_t       oldSNN, 
		   Short_t        oldField, 
		   ULong_t        newRunNo,
		   UShort_t       newSys,
		   UShort_t       newSNN, 
		   Short_t        newField, 
		   Bool_t         mc, 
		   Bool_t         sat);
  /* @} */
  /** 
   * Print the content of all tables
   * 
   * @param option Passed on to tables 
   */  
  void Print(const Option_t* option="") const; //*MENU*
  /** 
   * Browse this database
   * 
   * @param b Browser 
   */
  void Browse(TBrowser* b); 
  /** 
   * Find a table by name 
   * 
   * @param name  Name of table 
   * @param quite Do not print warning if not found 
   * @return Table or null 
   */
  Table* FindTable(const TString& name, Bool_t quite=false) const;
  /** 
   * Get all tables 
   * 
   * 
   * @return Map of all tables
   */
  const TMap& GetTables() const { return fTables; }
protected:
  /** 
   * Get a list of associated files 
   * 
   * @param files On return, contains list of files 
   * 
   * @return Number of associated files found 
   */
  Int_t GetFiles(TList& files) const;
  /** 
   * Get a table (TTree) from a file 
   * 
   * @param file   File to look in 
   * @param rw     If true, open read/write, false read-only
   * @param name   Name of the table 
   * @param mode   Default mode for new table, or override mode 
   *               for existing tables if not default
   * 
   * @return Table or (if rw=true) possibly newly created table
   */
  Table* GetTableFromFile(TFile* file, Bool_t rw, 
			  const TString& name,
			  const TString& mode) const;

  /** 
   * Get a table (TTree) from a file and attach
   * 
   * @param file   File to look in 
   * @param rw     If true, open read/write, false read-only
   * @param name   Name of the table 
   * @param mode   Default mode for new table, or override mode 
   *               for existing tables if not default
   * 
   * @return Table or (if rw=true) possibly newly created table
   */
  void OpenTable(TFile* file, Bool_t rw, const TString& name, 
		 const TString& mode, Bool_t verb, Bool_t fallback);
  /** 
   * Helper function to append to query string 
   * 
   * @param q         String to attach to
   * @param s         What to attach 
   * @param andNotOr  If true, assume @b and, otherwise @b or
   */
  static void AppendToQuery(TString& q, const TString& s, Bool_t andNotOr=true);
  /** 
   * Helper function to build a query string 
   * 
   * @param sys    Collision system (1:pp, 2: PbPb, 3:pPb)
   * @param sNN    Collision energy in GeV
   * @param fld    L3-Field strength and polarity 
   * @param mc     For Monte-carlo
   * @param sat    For satelitte collisions 
   * 
   * @return Query string 
   */
  static TString Conditions(UShort_t       sys    = 0,
			    UShort_t       sNN    = 0, 
			    Short_t        fld    = kInvalidField,
			    Bool_t         mc     = false,
			    Bool_t         sat    = false);
  TMap fTables;
  ClassDef(AliOADBForward,0); // PWGLF/Forward OADB interface

public:
  // =================================================================
  /** 
   * @{ 
   * @name Tests
   */
  static void TestGet(AliOADBForward& t, 
		      const TString& table,
		      ULong_t  runNo      = 0,
		      ERunSelectMode mode = kNear,
		      UShort_t sys        = 2,
		      UShort_t sNN        = 2760, 
		      Short_t  fld        = -5,
		      Bool_t   mc         = false,
		      Bool_t   sat        = false);
  static void TestInsert(AliOADBForward& t, 
			 const TString&  table,
			 ULong_t         runNo  = 0,
			 UShort_t        sys    = 2,
			 UShort_t        sNN    = 2760, 
			 Short_t         fld    = -5,
			 Bool_t          mc     = false,
			 Bool_t          sat    = false);
  static void Test();
  /* @} */
};

#endif
/* Local Variables:
 *  mode: C++
 * End:
 */
 AliOADBForward.h:1
 AliOADBForward.h:2
 AliOADBForward.h:3
 AliOADBForward.h:4
 AliOADBForward.h:5
 AliOADBForward.h:6
 AliOADBForward.h:7
 AliOADBForward.h:8
 AliOADBForward.h:9
 AliOADBForward.h:10
 AliOADBForward.h:11
 AliOADBForward.h:12
 AliOADBForward.h:13
 AliOADBForward.h:14
 AliOADBForward.h:15
 AliOADBForward.h:16
 AliOADBForward.h:17
 AliOADBForward.h:18
 AliOADBForward.h:19
 AliOADBForward.h:20
 AliOADBForward.h:21
 AliOADBForward.h:22
 AliOADBForward.h:23
 AliOADBForward.h:24
 AliOADBForward.h:25
 AliOADBForward.h:26
 AliOADBForward.h:27
 AliOADBForward.h:28
 AliOADBForward.h:29
 AliOADBForward.h:30
 AliOADBForward.h:31
 AliOADBForward.h:32
 AliOADBForward.h:33
 AliOADBForward.h:34
 AliOADBForward.h:35
 AliOADBForward.h:36
 AliOADBForward.h:37
 AliOADBForward.h:38
 AliOADBForward.h:39
 AliOADBForward.h:40
 AliOADBForward.h:41
 AliOADBForward.h:42
 AliOADBForward.h:43
 AliOADBForward.h:44
 AliOADBForward.h:45
 AliOADBForward.h:46
 AliOADBForward.h:47
 AliOADBForward.h:48
 AliOADBForward.h:49
 AliOADBForward.h:50
 AliOADBForward.h:51
 AliOADBForward.h:52
 AliOADBForward.h:53
 AliOADBForward.h:54
 AliOADBForward.h:55
 AliOADBForward.h:56
 AliOADBForward.h:57
 AliOADBForward.h:58
 AliOADBForward.h:59
 AliOADBForward.h:60
 AliOADBForward.h:61
 AliOADBForward.h:62
 AliOADBForward.h:63
 AliOADBForward.h:64
 AliOADBForward.h:65
 AliOADBForward.h:66
 AliOADBForward.h:67
 AliOADBForward.h:68
 AliOADBForward.h:69
 AliOADBForward.h:70
 AliOADBForward.h:71
 AliOADBForward.h:72
 AliOADBForward.h:73
 AliOADBForward.h:74
 AliOADBForward.h:75
 AliOADBForward.h:76
 AliOADBForward.h:77
 AliOADBForward.h:78
 AliOADBForward.h:79
 AliOADBForward.h:80
 AliOADBForward.h:81
 AliOADBForward.h:82
 AliOADBForward.h:83
 AliOADBForward.h:84
 AliOADBForward.h:85
 AliOADBForward.h:86
 AliOADBForward.h:87
 AliOADBForward.h:88
 AliOADBForward.h:89
 AliOADBForward.h:90
 AliOADBForward.h:91
 AliOADBForward.h:92
 AliOADBForward.h:93
 AliOADBForward.h:94
 AliOADBForward.h:95
 AliOADBForward.h:96
 AliOADBForward.h:97
 AliOADBForward.h:98
 AliOADBForward.h:99
 AliOADBForward.h:100
 AliOADBForward.h:101
 AliOADBForward.h:102
 AliOADBForward.h:103
 AliOADBForward.h:104
 AliOADBForward.h:105
 AliOADBForward.h:106
 AliOADBForward.h:107
 AliOADBForward.h:108
 AliOADBForward.h:109
 AliOADBForward.h:110
 AliOADBForward.h:111
 AliOADBForward.h:112
 AliOADBForward.h:113
 AliOADBForward.h:114
 AliOADBForward.h:115
 AliOADBForward.h:116
 AliOADBForward.h:117
 AliOADBForward.h:118
 AliOADBForward.h:119
 AliOADBForward.h:120
 AliOADBForward.h:121
 AliOADBForward.h:122
 AliOADBForward.h:123
 AliOADBForward.h:124
 AliOADBForward.h:125
 AliOADBForward.h:126
 AliOADBForward.h:127
 AliOADBForward.h:128
 AliOADBForward.h:129
 AliOADBForward.h:130
 AliOADBForward.h:131
 AliOADBForward.h:132
 AliOADBForward.h:133
 AliOADBForward.h:134
 AliOADBForward.h:135
 AliOADBForward.h:136
 AliOADBForward.h:137
 AliOADBForward.h:138
 AliOADBForward.h:139
 AliOADBForward.h:140
 AliOADBForward.h:141
 AliOADBForward.h:142
 AliOADBForward.h:143
 AliOADBForward.h:144
 AliOADBForward.h:145
 AliOADBForward.h:146
 AliOADBForward.h:147
 AliOADBForward.h:148
 AliOADBForward.h:149
 AliOADBForward.h:150
 AliOADBForward.h:151
 AliOADBForward.h:152
 AliOADBForward.h:153
 AliOADBForward.h:154
 AliOADBForward.h:155
 AliOADBForward.h:156
 AliOADBForward.h:157
 AliOADBForward.h:158
 AliOADBForward.h:159
 AliOADBForward.h:160
 AliOADBForward.h:161
 AliOADBForward.h:162
 AliOADBForward.h:163
 AliOADBForward.h:164
 AliOADBForward.h:165
 AliOADBForward.h:166
 AliOADBForward.h:167
 AliOADBForward.h:168
 AliOADBForward.h:169
 AliOADBForward.h:170
 AliOADBForward.h:171
 AliOADBForward.h:172
 AliOADBForward.h:173
 AliOADBForward.h:174
 AliOADBForward.h:175
 AliOADBForward.h:176
 AliOADBForward.h:177
 AliOADBForward.h:178
 AliOADBForward.h:179
 AliOADBForward.h:180
 AliOADBForward.h:181
 AliOADBForward.h:182
 AliOADBForward.h:183
 AliOADBForward.h:184
 AliOADBForward.h:185
 AliOADBForward.h:186
 AliOADBForward.h:187
 AliOADBForward.h:188
 AliOADBForward.h:189
 AliOADBForward.h:190
 AliOADBForward.h:191
 AliOADBForward.h:192
 AliOADBForward.h:193
 AliOADBForward.h:194
 AliOADBForward.h:195
 AliOADBForward.h:196
 AliOADBForward.h:197
 AliOADBForward.h:198
 AliOADBForward.h:199
 AliOADBForward.h:200
 AliOADBForward.h:201
 AliOADBForward.h:202
 AliOADBForward.h:203
 AliOADBForward.h:204
 AliOADBForward.h:205
 AliOADBForward.h:206
 AliOADBForward.h:207
 AliOADBForward.h:208
 AliOADBForward.h:209
 AliOADBForward.h:210
 AliOADBForward.h:211
 AliOADBForward.h:212
 AliOADBForward.h:213
 AliOADBForward.h:214
 AliOADBForward.h:215
 AliOADBForward.h:216
 AliOADBForward.h:217
 AliOADBForward.h:218
 AliOADBForward.h:219
 AliOADBForward.h:220
 AliOADBForward.h:221
 AliOADBForward.h:222
 AliOADBForward.h:223
 AliOADBForward.h:224
 AliOADBForward.h:225
 AliOADBForward.h:226
 AliOADBForward.h:227
 AliOADBForward.h:228
 AliOADBForward.h:229
 AliOADBForward.h:230
 AliOADBForward.h:231
 AliOADBForward.h:232
 AliOADBForward.h:233
 AliOADBForward.h:234
 AliOADBForward.h:235
 AliOADBForward.h:236
 AliOADBForward.h:237
 AliOADBForward.h:238
 AliOADBForward.h:239
 AliOADBForward.h:240
 AliOADBForward.h:241
 AliOADBForward.h:242
 AliOADBForward.h:243
 AliOADBForward.h:244
 AliOADBForward.h:245
 AliOADBForward.h:246
 AliOADBForward.h:247
 AliOADBForward.h:248
 AliOADBForward.h:249
 AliOADBForward.h:250
 AliOADBForward.h:251
 AliOADBForward.h:252
 AliOADBForward.h:253
 AliOADBForward.h:254
 AliOADBForward.h:255
 AliOADBForward.h:256
 AliOADBForward.h:257
 AliOADBForward.h:258
 AliOADBForward.h:259
 AliOADBForward.h:260
 AliOADBForward.h:261
 AliOADBForward.h:262
 AliOADBForward.h:263
 AliOADBForward.h:264
 AliOADBForward.h:265
 AliOADBForward.h:266
 AliOADBForward.h:267
 AliOADBForward.h:268
 AliOADBForward.h:269
 AliOADBForward.h:270
 AliOADBForward.h:271
 AliOADBForward.h:272
 AliOADBForward.h:273
 AliOADBForward.h:274
 AliOADBForward.h:275
 AliOADBForward.h:276
 AliOADBForward.h:277
 AliOADBForward.h:278
 AliOADBForward.h:279
 AliOADBForward.h:280
 AliOADBForward.h:281
 AliOADBForward.h:282
 AliOADBForward.h:283
 AliOADBForward.h:284
 AliOADBForward.h:285
 AliOADBForward.h:286
 AliOADBForward.h:287
 AliOADBForward.h:288
 AliOADBForward.h:289
 AliOADBForward.h:290
 AliOADBForward.h:291
 AliOADBForward.h:292
 AliOADBForward.h:293
 AliOADBForward.h:294
 AliOADBForward.h:295
 AliOADBForward.h:296
 AliOADBForward.h:297
 AliOADBForward.h:298
 AliOADBForward.h:299
 AliOADBForward.h:300
 AliOADBForward.h:301
 AliOADBForward.h:302
 AliOADBForward.h:303
 AliOADBForward.h:304
 AliOADBForward.h:305
 AliOADBForward.h:306
 AliOADBForward.h:307
 AliOADBForward.h:308
 AliOADBForward.h:309
 AliOADBForward.h:310
 AliOADBForward.h:311
 AliOADBForward.h:312
 AliOADBForward.h:313
 AliOADBForward.h:314
 AliOADBForward.h:315
 AliOADBForward.h:316
 AliOADBForward.h:317
 AliOADBForward.h:318
 AliOADBForward.h:319
 AliOADBForward.h:320
 AliOADBForward.h:321
 AliOADBForward.h:322
 AliOADBForward.h:323
 AliOADBForward.h:324
 AliOADBForward.h:325
 AliOADBForward.h:326
 AliOADBForward.h:327
 AliOADBForward.h:328
 AliOADBForward.h:329
 AliOADBForward.h:330
 AliOADBForward.h:331
 AliOADBForward.h:332
 AliOADBForward.h:333
 AliOADBForward.h:334
 AliOADBForward.h:335
 AliOADBForward.h:336
 AliOADBForward.h:337
 AliOADBForward.h:338
 AliOADBForward.h:339
 AliOADBForward.h:340
 AliOADBForward.h:341
 AliOADBForward.h:342
 AliOADBForward.h:343
 AliOADBForward.h:344
 AliOADBForward.h:345
 AliOADBForward.h:346
 AliOADBForward.h:347
 AliOADBForward.h:348
 AliOADBForward.h:349
 AliOADBForward.h:350
 AliOADBForward.h:351
 AliOADBForward.h:352
 AliOADBForward.h:353
 AliOADBForward.h:354
 AliOADBForward.h:355
 AliOADBForward.h:356
 AliOADBForward.h:357
 AliOADBForward.h:358
 AliOADBForward.h:359
 AliOADBForward.h:360
 AliOADBForward.h:361
 AliOADBForward.h:362
 AliOADBForward.h:363
 AliOADBForward.h:364
 AliOADBForward.h:365
 AliOADBForward.h:366
 AliOADBForward.h:367
 AliOADBForward.h:368
 AliOADBForward.h:369
 AliOADBForward.h:370
 AliOADBForward.h:371
 AliOADBForward.h:372
 AliOADBForward.h:373
 AliOADBForward.h:374
 AliOADBForward.h:375
 AliOADBForward.h:376
 AliOADBForward.h:377
 AliOADBForward.h:378
 AliOADBForward.h:379
 AliOADBForward.h:380
 AliOADBForward.h:381
 AliOADBForward.h:382
 AliOADBForward.h:383
 AliOADBForward.h:384
 AliOADBForward.h:385
 AliOADBForward.h:386
 AliOADBForward.h:387
 AliOADBForward.h:388
 AliOADBForward.h:389
 AliOADBForward.h:390
 AliOADBForward.h:391
 AliOADBForward.h:392
 AliOADBForward.h:393
 AliOADBForward.h:394
 AliOADBForward.h:395
 AliOADBForward.h:396
 AliOADBForward.h:397
 AliOADBForward.h:398
 AliOADBForward.h:399
 AliOADBForward.h:400
 AliOADBForward.h:401
 AliOADBForward.h:402
 AliOADBForward.h:403
 AliOADBForward.h:404
 AliOADBForward.h:405
 AliOADBForward.h:406
 AliOADBForward.h:407
 AliOADBForward.h:408
 AliOADBForward.h:409
 AliOADBForward.h:410
 AliOADBForward.h:411
 AliOADBForward.h:412
 AliOADBForward.h:413
 AliOADBForward.h:414
 AliOADBForward.h:415
 AliOADBForward.h:416
 AliOADBForward.h:417
 AliOADBForward.h:418
 AliOADBForward.h:419
 AliOADBForward.h:420
 AliOADBForward.h:421
 AliOADBForward.h:422
 AliOADBForward.h:423
 AliOADBForward.h:424
 AliOADBForward.h:425
 AliOADBForward.h:426
 AliOADBForward.h:427
 AliOADBForward.h:428
 AliOADBForward.h:429
 AliOADBForward.h:430
 AliOADBForward.h:431
 AliOADBForward.h:432
 AliOADBForward.h:433
 AliOADBForward.h:434
 AliOADBForward.h:435
 AliOADBForward.h:436
 AliOADBForward.h:437
 AliOADBForward.h:438
 AliOADBForward.h:439
 AliOADBForward.h:440
 AliOADBForward.h:441
 AliOADBForward.h:442
 AliOADBForward.h:443
 AliOADBForward.h:444
 AliOADBForward.h:445
 AliOADBForward.h:446
 AliOADBForward.h:447
 AliOADBForward.h:448
 AliOADBForward.h:449
 AliOADBForward.h:450
 AliOADBForward.h:451
 AliOADBForward.h:452
 AliOADBForward.h:453
 AliOADBForward.h:454
 AliOADBForward.h:455
 AliOADBForward.h:456
 AliOADBForward.h:457
 AliOADBForward.h:458
 AliOADBForward.h:459
 AliOADBForward.h:460
 AliOADBForward.h:461
 AliOADBForward.h:462
 AliOADBForward.h:463
 AliOADBForward.h:464
 AliOADBForward.h:465
 AliOADBForward.h:466
 AliOADBForward.h:467
 AliOADBForward.h:468
 AliOADBForward.h:469
 AliOADBForward.h:470
 AliOADBForward.h:471
 AliOADBForward.h:472
 AliOADBForward.h:473
 AliOADBForward.h:474
 AliOADBForward.h:475
 AliOADBForward.h:476
 AliOADBForward.h:477
 AliOADBForward.h:478
 AliOADBForward.h:479
 AliOADBForward.h:480
 AliOADBForward.h:481
 AliOADBForward.h:482
 AliOADBForward.h:483
 AliOADBForward.h:484
 AliOADBForward.h:485
 AliOADBForward.h:486
 AliOADBForward.h:487
 AliOADBForward.h:488
 AliOADBForward.h:489
 AliOADBForward.h:490
 AliOADBForward.h:491
 AliOADBForward.h:492
 AliOADBForward.h:493
 AliOADBForward.h:494
 AliOADBForward.h:495
 AliOADBForward.h:496
 AliOADBForward.h:497
 AliOADBForward.h:498
 AliOADBForward.h:499
 AliOADBForward.h:500
 AliOADBForward.h:501
 AliOADBForward.h:502
 AliOADBForward.h:503
 AliOADBForward.h:504
 AliOADBForward.h:505
 AliOADBForward.h:506
 AliOADBForward.h:507
 AliOADBForward.h:508
 AliOADBForward.h:509
 AliOADBForward.h:510
 AliOADBForward.h:511
 AliOADBForward.h:512
 AliOADBForward.h:513
 AliOADBForward.h:514
 AliOADBForward.h:515
 AliOADBForward.h:516
 AliOADBForward.h:517
 AliOADBForward.h:518
 AliOADBForward.h:519
 AliOADBForward.h:520
 AliOADBForward.h:521
 AliOADBForward.h:522
 AliOADBForward.h:523
 AliOADBForward.h:524
 AliOADBForward.h:525
 AliOADBForward.h:526
 AliOADBForward.h:527
 AliOADBForward.h:528
 AliOADBForward.h:529
 AliOADBForward.h:530
 AliOADBForward.h:531
 AliOADBForward.h:532
 AliOADBForward.h:533
 AliOADBForward.h:534
 AliOADBForward.h:535
 AliOADBForward.h:536
 AliOADBForward.h:537
 AliOADBForward.h:538
 AliOADBForward.h:539
 AliOADBForward.h:540
 AliOADBForward.h:541
 AliOADBForward.h:542
 AliOADBForward.h:543
 AliOADBForward.h:544
 AliOADBForward.h:545
 AliOADBForward.h:546
 AliOADBForward.h:547
 AliOADBForward.h:548
 AliOADBForward.h:549
 AliOADBForward.h:550
 AliOADBForward.h:551
 AliOADBForward.h:552
 AliOADBForward.h:553
 AliOADBForward.h:554
 AliOADBForward.h:555
 AliOADBForward.h:556
 AliOADBForward.h:557
 AliOADBForward.h:558
 AliOADBForward.h:559
 AliOADBForward.h:560
 AliOADBForward.h:561
 AliOADBForward.h:562
 AliOADBForward.h:563
 AliOADBForward.h:564
 AliOADBForward.h:565
 AliOADBForward.h:566
 AliOADBForward.h:567
 AliOADBForward.h:568
 AliOADBForward.h:569
 AliOADBForward.h:570
 AliOADBForward.h:571
 AliOADBForward.h:572
 AliOADBForward.h:573
 AliOADBForward.h:574
 AliOADBForward.h:575
 AliOADBForward.h:576
 AliOADBForward.h:577
 AliOADBForward.h:578
 AliOADBForward.h:579
 AliOADBForward.h:580
 AliOADBForward.h:581
 AliOADBForward.h:582
 AliOADBForward.h:583
 AliOADBForward.h:584
 AliOADBForward.h:585
 AliOADBForward.h:586
 AliOADBForward.h:587
 AliOADBForward.h:588
 AliOADBForward.h:589
 AliOADBForward.h:590
 AliOADBForward.h:591
 AliOADBForward.h:592
 AliOADBForward.h:593
 AliOADBForward.h:594
 AliOADBForward.h:595
 AliOADBForward.h:596
 AliOADBForward.h:597
 AliOADBForward.h:598
 AliOADBForward.h:599
 AliOADBForward.h:600
 AliOADBForward.h:601
 AliOADBForward.h:602
 AliOADBForward.h:603
 AliOADBForward.h:604
 AliOADBForward.h:605
 AliOADBForward.h:606
 AliOADBForward.h:607
 AliOADBForward.h:608
 AliOADBForward.h:609
 AliOADBForward.h:610
 AliOADBForward.h:611
 AliOADBForward.h:612
 AliOADBForward.h:613
 AliOADBForward.h:614
 AliOADBForward.h:615
 AliOADBForward.h:616
 AliOADBForward.h:617
 AliOADBForward.h:618
 AliOADBForward.h:619
 AliOADBForward.h:620
 AliOADBForward.h:621
 AliOADBForward.h:622
 AliOADBForward.h:623
 AliOADBForward.h:624
 AliOADBForward.h:625
 AliOADBForward.h:626
 AliOADBForward.h:627
 AliOADBForward.h:628
 AliOADBForward.h:629
 AliOADBForward.h:630
 AliOADBForward.h:631
 AliOADBForward.h:632
 AliOADBForward.h:633
 AliOADBForward.h:634
 AliOADBForward.h:635
 AliOADBForward.h:636
 AliOADBForward.h:637
 AliOADBForward.h:638
 AliOADBForward.h:639
 AliOADBForward.h:640
 AliOADBForward.h:641
 AliOADBForward.h:642
 AliOADBForward.h:643
 AliOADBForward.h:644
 AliOADBForward.h:645
 AliOADBForward.h:646
 AliOADBForward.h:647
 AliOADBForward.h:648
 AliOADBForward.h:649
 AliOADBForward.h:650
 AliOADBForward.h:651
 AliOADBForward.h:652
 AliOADBForward.h:653
 AliOADBForward.h:654
 AliOADBForward.h:655
 AliOADBForward.h:656
 AliOADBForward.h:657
 AliOADBForward.h:658
 AliOADBForward.h:659
 AliOADBForward.h:660
 AliOADBForward.h:661
 AliOADBForward.h:662
 AliOADBForward.h:663
 AliOADBForward.h:664
 AliOADBForward.h:665
 AliOADBForward.h:666
 AliOADBForward.h:667
 AliOADBForward.h:668
 AliOADBForward.h:669
 AliOADBForward.h:670
 AliOADBForward.h:671
 AliOADBForward.h:672
 AliOADBForward.h:673
 AliOADBForward.h:674
 AliOADBForward.h:675
 AliOADBForward.h:676
 AliOADBForward.h:677
 AliOADBForward.h:678
 AliOADBForward.h:679
 AliOADBForward.h:680
 AliOADBForward.h:681
 AliOADBForward.h:682
 AliOADBForward.h:683
 AliOADBForward.h:684
 AliOADBForward.h:685
 AliOADBForward.h:686
 AliOADBForward.h:687
 AliOADBForward.h:688
 AliOADBForward.h:689
 AliOADBForward.h:690
 AliOADBForward.h:691
 AliOADBForward.h:692
 AliOADBForward.h:693
 AliOADBForward.h:694
 AliOADBForward.h:695
 AliOADBForward.h:696
 AliOADBForward.h:697
 AliOADBForward.h:698
 AliOADBForward.h:699
 AliOADBForward.h:700
 AliOADBForward.h:701
 AliOADBForward.h:702
 AliOADBForward.h:703
 AliOADBForward.h:704
 AliOADBForward.h:705
 AliOADBForward.h:706
 AliOADBForward.h:707
 AliOADBForward.h:708
 AliOADBForward.h:709
 AliOADBForward.h:710
 AliOADBForward.h:711
 AliOADBForward.h:712
 AliOADBForward.h:713
 AliOADBForward.h:714
 AliOADBForward.h:715
 AliOADBForward.h:716
 AliOADBForward.h:717
 AliOADBForward.h:718
 AliOADBForward.h:719
 AliOADBForward.h:720
 AliOADBForward.h:721
 AliOADBForward.h:722
 AliOADBForward.h:723
 AliOADBForward.h:724
 AliOADBForward.h:725
 AliOADBForward.h:726
 AliOADBForward.h:727
 AliOADBForward.h:728
 AliOADBForward.h:729
 AliOADBForward.h:730
 AliOADBForward.h:731
 AliOADBForward.h:732
 AliOADBForward.h:733
 AliOADBForward.h:734
 AliOADBForward.h:735
 AliOADBForward.h:736
 AliOADBForward.h:737
 AliOADBForward.h:738
 AliOADBForward.h:739
 AliOADBForward.h:740
 AliOADBForward.h:741
 AliOADBForward.h:742
 AliOADBForward.h:743
 AliOADBForward.h:744