ROOT logo
#include "AliOADBForward.h"
#include <TBrowser.h>
#include <TROOT.h>
#include <TKey.h>
#include <TList.h>
#include <TDatime.h>
#include <TTree.h>
#include <TFile.h>
#include <TError.h>
#include <TSystem.h>

#ifndef ALIROOT_SVN_REVISION
# define ALIROOT_SVN_REVISION 0
#endif


ClassImp(AliOADBForward)
#if 0
; // Do not remove - for Emacs
#endif

//====================================================================
const char* 
AliOADBForward::Mode2String(ERunSelectMode mode)
{
  switch (mode) { 
  case kDefault:   return "default"; 
  case kExact:     return "exact"; 
  case kNewest:    return "newest";
  case kNear:      return "near";
  case kOlder:     return "older";
  case kNewer:     return "newer";
  }
  return "?"; // Should never get here 
}
AliOADBForward::ERunSelectMode
AliOADBForward::String2Mode(const TString& str)
{
  if      (str.EqualTo("default", TString::kIgnoreCase)) return kDefault;
  else if (str.EqualTo("exact",   TString::kIgnoreCase)) return kExact;
  else if (str.EqualTo("newest",  TString::kIgnoreCase)) return kNewest;
  else if (str.EqualTo("near",    TString::kIgnoreCase)) return kNear;
  else if (str.EqualTo("older",   TString::kIgnoreCase)) return kOlder;
  else if (str.EqualTo("newer",   TString::kIgnoreCase)) return kNewer;
  return kDefault;
}
AliOADBForward::ERunSelectMode
AliOADBForward::Int2Mode(Int_t mode)
{
  switch (mode) { 
  case kDefault:   return kDefault; 
  case kExact:     return kExact; 
  case kNewest:    return kNewest;
  case kNear:      return kNear;
  case kOlder:     return kOlder;
  case kNewer:     return kNewer;
  }
  return kDefault; // Should never get here 
}


//====================================================================
AliOADBForward::Entry::Entry(ULong_t  runNo, 
			     UShort_t sys, 
			     UShort_t sNN, 
			     Short_t  field, 
			     Bool_t   mc, 
			     Bool_t   sat,
			     TObject* o)
  : fRunNo(runNo), 
    fSys(sys), 
    fSNN(sNN), 
    fField(field),
    fMC(mc), 
    fSatellite(sat),
    fData(o),
    fTimestamp(0), 
    fAliROOTRevision(0),
    fAuthor("unknown")
{
  // 
  // Constructor 
  // 
}

//____________________________________________________________________
AliOADBForward::Entry::Entry(const Entry& o)
  : TObject(o), 
    fRunNo(o.fRunNo), 
    fSys(o.fSys), 
    fSNN(o.fSNN), 
    fField(o.fField),
    fMC(o.fMC), 
    fSatellite(o.fSatellite), 
    fData(o.fData),
    fTimestamp(0), 
    fAliROOTRevision(0),
    fAuthor(o.fAuthor)
{
  // 
  // Copy constructor 
  //
}
//____________________________________________________________________
AliOADBForward::Entry&
AliOADBForward::Entry::operator=(const Entry& o)
{
  // 
  // Assignment operator 
  //
  if (this == &o) return *this;
  fRunNo	      = o.fRunNo; 
  fSys	 	      = o.fSys; 
  fSNN	     	      = o.fSNN; 
  fField	      = o.fField;
  fMC	              = o.fMC; 
  fSatellite          = o.fSatellite;
  fData	              = o.fData;
  fTimestamp          = o.fTimestamp;
  fAliROOTRevision    = o.fAliROOTRevision;
  fAuthor             = o.fAuthor;

  return *this;
}
//____________________________________________________________________
const char*
AliOADBForward::Entry::GetTitle() const
{
  TDatime d(fTimestamp);
  return Form("%09ld, %4s, %4huGeV, %+4hd, %4s, %3s, %19s: %p (%s) by %s", 
	      (fRunNo == 0xFFFFFFFF ? -1 : fRunNo), 
	      (fSys == 1 ? "pp"   : 
	       fSys == 2 ? "PbPb" : 
	       fSys == 3 ? "pPb"  : "?"), 
	      fSNN, fField, (fMC ? "mc" : "real"),
	      (fSatellite ? "sat" : "nom"), d.AsSQLString(), fData,
	      (fData ? fData->GetName() : "?"), fAuthor.Data());
  
}
//____________________________________________________________________
void
AliOADBForward::Entry::Print(Option_t* /*option*/) const 
{
  Printf("%s", GetTitle());
}
//====================================================================
AliOADBForward::Table::Table(TTree* tree, Bool_t isNew, ERunSelectMode mode)
  : fTree(tree), fEntry(0), fVerbose(false), fMode(mode), fFallBack(false)
{
  if (!tree) return;

#if 0
  Info("Table", "Making table %s (%s) with mode %s (%s)", 
       tree->GetName(), (isNew ? "new" : "old"), tree->GetTitle(), 
       Mode2String(fMode));
#endif
  if (isNew) {
    fTree->Branch("e", "AliOADBForward::Entry", &fEntry);
    fMode = String2Mode(fTree->GetTitle());
  }
  else {
    if (fMode <= kDefault || fMode > kNewer) {
      fMode = String2Mode(fTree->GetTitle());
      if (fMode == kDefault) fMode = kNear;
    }
    fTree->SetBranchAddress("e", &fEntry);
  }
#if 0
  Info("", "Mode set to %d (%s)", fMode, Mode2String(fMode));
#endif
}
//____________________________________________________________________
AliOADBForward::Table::Table(const Table& o)
  : TObject(o), 
    fTree(o.fTree), 
    fEntry(o.fEntry), 
    fVerbose(o.fVerbose),
    fMode(o.fMode), 
    fFallBack(o.fFallBack)
{
  //
  // Copy constructor 
  if (!fTree) return;
  fTree->SetBranchAddress("e", &fEntry);
}

//____________________________________________________________________
AliOADBForward::Table::~Table()
{
  // 
  // Close this table 
  //
  Close();
}
//____________________________________________________________________
AliOADBForward::Table&
AliOADBForward::Table::operator=(const Table& o)
{
  // 
  // Assignment operator 
  // 
  if (this == &o) return *this;
  fTree    = o.fTree;
  fEntry   = o.fEntry;
  fVerbose = o.fVerbose;
  fMode    = o.fMode;
  if (fTree) fTree->SetBranchAddress("e", &fEntry);

  return *this;
}

//____________________________________________________________________
const Char_t*
AliOADBForward::Table::GetTableName() const
{
  // 
  // Get the table name or null
  if (!fTree) return 0;
  return fTree->GetName();
}
//____________________________________________________________________
const Char_t*
AliOADBForward::Table::GetName() const
{
  // 
  // Overload of TObject::GetName
  //
  if (!fTree) return TObject::GetName();
  return GetTableName();
}
//____________________________________________________________________
Bool_t
AliOADBForward::Table::Update()
{
  // 
  // Flush to disk 
  //
  if (!IsOpen()) { 
    Error("Update", "No tree associated");
    return false;
  }
      
  TFile* file = fTree->GetCurrentFile();
  if (!file) { 
    Error("Update", "No file associated with tree");
    return false;
  }
  if (!file->IsWritable()) { 
    Error("Update", "File %s not writeable", file->GetName());
    return false;
  }
      
  Int_t nBytes = file->Write();
      
  return (nBytes >= 0);
}
//____________________________________________________________________
Bool_t
AliOADBForward::Table::Close()
{
  // 
  // Close the connection 
  //
  if (!IsOpen()) { 
    Error("Close", "No tree associated");
    return false;
  }
  
  // if (fTree)  delete fTree; 
  // if (fEntry) delete fEntry;
  fTree  = 0;
  fEntry = 0;
  return true;
} 
//____________________________________________________________________
Int_t
AliOADBForward::Table::Query(ULong_t        runNo,
			     ERunSelectMode mode,
			     UShort_t       sys,
			     UShort_t       sNN, 
			     Short_t        fld,
			     Bool_t         mc,
			     Bool_t         sat) const
{
  // 
  // Query the tree 
  //
  return Query(runNo, mode, Conditions(sys, sNN, fld, mc, sat));
}

//____________________________________________________________________
Int_t
AliOADBForward::Table::Query(ULong_t        runNo,
			     ERunSelectMode mode,
			     const TString& q) const
{
  // 
  // Run a query against the table 
  // 
  
  // Check the tree 
  if (!IsOpen()) { 
    Error("Close", "No tree associated");
    return -1;
  }
      
  TString query = q;
  const char* smode = "latest";
  if (runNo > 0) {
    if (mode <= kDefault || mode > kNewer) mode = fMode;
    smode = Mode2String(mode);
    switch (mode) { 
    case kExact:  
      AppendToQuery(query, Form("fRunNo == %lu", runNo)); 
      break;
    case kNewest: 
      break;
    case kNear:   
      AppendToQuery(query, Form("abs(fRunNo-%lu)<=%d",
				runNo,kMaxNearDistance)); 
      break;
    case kOlder: 
      AppendToQuery(query, Form("fRunNo <= %lu", runNo));
      break;
    case kNewer: 
      AppendToQuery(query, Form("fRunNo >= %lu", runNo));
      break;
    case kDefault: 
      Fatal("Query", "Mode should never be 'default'");
      break;
    }
  }
      
  if (query.IsNull()) {
    Warning("Query", "Empty query!");
    return -1;
  }

  if (fVerbose) 
    Printf("%s: Query is '%s'", GetName(), query.Data());
  fTree->Draw("Entry$:fRunNo:fTimestamp", query, "goff");
  Int_t nRows = fTree->GetSelectedRows();
  if (nRows <= 0) return -1;
      
  if (fVerbose) 
    Printf("Query: %s (%s)\n"
	   " Entry  |    Run    | Timestamp \n"
	   "--------+-----------+------------------------", 
	   query.Data(), smode);
      
  ULong_t  oldRun  = (mode == kNewer ? 0xFFFFFFFF : 0);
  ULong_t  oldTim  = 0;
  ULong_t  oldDist = 0xFFFFFFFF;
  Int_t    entry  = -1;
  for (Int_t row = 0; row < nRows; row++) {
    Int_t    ent  = Int_t(fTree->GetV1()[row]);
    ULong_t  run  = ULong_t(fTree->GetV2()[row]);
    ULong_t  tim  = ULong_t(fTree->GetV3()[row]);
    ULong_t  dist = (run > runNo ? run - runNo : runNo - run);
	
    if (fVerbose) {
      TDatime t(tim);
      Printf(" %6d | %9ld | %19s ", ent, run > 0x7FFFFFFF ? -1 : run, 
	     t.AsSQLString());
    }

    switch (mode) { 
    case kExact: break; // Done in the draw `query' 
    case kNewest: // Fall-through 
    case kOlder: 
      if (run < oldRun) continue;
      break;
    case kNewer: 
      if (run > oldRun) continue;
      break;
    case kNear: 
      if (runNo > 0 && dist > oldDist) continue;
      break;
    case kDefault:
      break;
    }
    // If we get here, then we have the best run according to the 
    // criteria 
	    
    // Finally, check the timestamp 
    if (tim < oldTim) continue;
	
    // Now update last values and set current best entry 
    oldTim  = tim;
    oldDist = dist;
    oldRun  = run;
    entry   = ent;
  }

  if (fVerbose) {
    Printf("Returning entry # %d", entry);
  }
  return entry;
}

//____________________________________________________________________
Bool_t
AliOADBForward::Table::Insert(TObject* o, 
			      ULong_t  runNo, 
			      UShort_t sys, 
			      UShort_t sNN, 
			      Short_t  field, 
			      Bool_t   mc, 
			      Bool_t   sat,
			      ULong_t  aliRev,
			      const TString& author) 
{
  // 
  // Insert a new row in the table 
  //

  // Check if the file is read/write 
  if (fVerbose) 
    Info("Insert", "Inserting object %p for run=%lu, sys=%hu, sNN=%4hu, "
	 "field=%+2hd, mc=%d, sat=%d", o,runNo, sys, sNN, field, mc, sat);

  if (!IsOpen(true)) {
    Warning("Insert", "No tree, or not write-able");
    return false;
  }
      
  // If the entry doesn't exists 
  if (!fEntry) fEntry = new Entry;

  // Make author 
  TString auth(author);
  if (auth.IsNull()) { 
    UserGroup_t* u = gSystem->GetUserInfo();
    TInetAddress i = gSystem->GetHostByName(gSystem->HostName());
    auth = TString::Format("%s <%s@%s>", u->fRealName.Data(), 
			   u->fUser.Data(), i.GetHostName());
  }
    
  // Set fields 
  fEntry->fData            = o;
  fEntry->fRunNo           = runNo; // (runNo <= 0 ? 0xFFFFFFFF : runNo);
  fEntry->fSys             = sys;
  fEntry->fSNN             = sNN;
  fEntry->fField           = field;
  fEntry->fMC              = mc;
  fEntry->fSatellite       = sat;
  fEntry->fAliROOTRevision = (aliRev != 0 ? aliRev : ALIROOT_SVN_REVISION);
  fEntry->fAuthor          = auth;

  TDatime now;
  fEntry->fTimestamp       = now.Convert(true);

  // Fill into tree 
  Int_t nBytes = fTree->Fill();
  if (nBytes <= 0) {
    Warning("Insert", "Failed to insert new entry");
    return false;
  }
    
  // do an Auto-save and flush-baskets now 
  fTree->AutoSave("FlushBaskets SaveSelf");

  return true;
}

//____________________________________________________________________
Int_t
AliOADBForward::Table::GetEntry(ULong_t        run,
				ERunSelectMode mode,
				UShort_t       sys,
				UShort_t       sNN, 
				Short_t        fld,
				Bool_t         mc,
				Bool_t         sat) 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 -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.
  //

  if (fVerbose)
    Printf("run=%lu mode=%s sys=%hu sNN=%hu fld=%hd mc=%d sat=%d (fall=%d)",
	   run, Mode2String(mode), sys, sNN, fld, mc, sat, fFallBack);
  Int_t entry = Query(run, mode, sys, sNN, fld, mc, sat);
  if (entry < 0 && run > 0) 
    entry = Query(0, mode, sys, sNN, fld, mc, sat);
  if (entry < 0 && fFallBack && fld != kInvalidField) {
    if (fVerbose) 
      Printf("Fall-back enabled, trying without field=%d", fld);
    entry = Query(run, mode, sys, sNN, fld, mc, sat);
  }
  if (entry < 0 && fFallBack && sNN > 0) {
    if (fVerbose)
      Printf("Fall-back enabled, will try without sNN=%d", sNN);
    entry = Query(run, mode, sys, 0, fld, mc, sat);
  }
  if (entry < 0 && fFallBack) {
    if (fVerbose)
      Printf("Fall-back enabled, will try without any fields");
    entry = Query(0, mode, 0, 0, kInvalidField, false, false);	
  }
  if (entry < 0) {
    Warning("Get", "No valid object could be found");
    return -1;
  }
  return entry;
}

//____________________________________________________________________
AliOADBForward::Entry*
AliOADBForward::Table::Get(ULong_t        run,
			   ERunSelectMode mode,
			   UShort_t       sys,
			   UShort_t       sNN, 
			   Short_t        fld,
			   Bool_t         mc,
			   Bool_t         sat) 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.
  //
  Int_t entry  = GetEntry(run, mode, sys, sNN, fld, mc, sat);
  if (entry < 0) return 0;

  Int_t nBytes = fTree->GetEntry(entry);
  if (nBytes <= 0) { 
    Warning("Get", "Failed to get entry # %d\n", entry);
    return 0;
  }
  if (fVerbose) fEntry->Print();
  return fEntry;
}
//____________________________________________________________________
TObject*
AliOADBForward::Table::GetData(ULong_t        run,
			       ERunSelectMode mode,
			       UShort_t       sys,
			       UShort_t       sNN, 
			       Short_t        fld,
			       Bool_t         mc,
			       Bool_t         sat) const
{
  // 
  // Get data associated with a row or null. 
  // See also AliOADBForward::Get
  // 
  Entry* e = Get(run, mode, sys, sNN, fld, mc, sat);
  if (!e) return 0;
  return e->fData;
}
//____________________________________________________________________
void
AliOADBForward::Table::Print(Option_t* option) const
{
  // 
  // Print the full table 
  //
  if (!IsOpen()) return;

  Printf("Table %s (default mode: %s)", GetName(), Mode2String(fMode));
  Int_t n = fTree->GetEntries();
  for (Int_t i = 0; i < n; i++) { 
    fTree->GetEntry(i);
    printf("%4d/%4d: ", i, n);
    fEntry->Print(option);
  }
}
//____________________________________________________________________
void
AliOADBForward::Table::Browse(TBrowser* b) 
{
  // Browse this table 
  if (fTree) b->Add(fTree);
}
//____________________________________________________________________
Bool_t
AliOADBForward::Table::IsOpen(Bool_t rw) const 
{ 
  if (!fTree) return false;
  if (!rw)    return true;
  
  return fTree->GetCurrentFile()->IsWritable();
}
//====================================================================
AliOADBForward::AliOADBForward() 
  : TObject(),
    fTables()
{
  //
  // Constructor 
  //
}
#if 0
//____________________________________________________________________
AliOADBForward::AliOADBForward(const AliOADBForward& other)
  : TObject(other), 
    fTables(other.fTables)
{
  // 
  // Copy constructor 
  // 
}
#endif
//____________________________________________________________________
AliOADBForward::~AliOADBForward()
{
  // 
  // Destructor 
  // 
  Close();
}
#if 0
//____________________________________________________________________
AliOADBForward&
AliOADBForward::operator=(const AliOADBForward& other)
{
  // 
  // Copy constructor 
  // 
  if (&other == this) return *this;

  fTables = other.fTables;

  return *this;
}
#endif 

//____________________________________________________________________
Bool_t
AliOADBForward::Open(const  TString& fileName, 
		     const  TString& tables, 
		     Bool_t          rw, 
		     Bool_t          verb,
		     Bool_t          fallback)
{
  TString  absPath(gSystem->ExpandPathName(fileName));
  if (absPath.IsNull()) { 
    Error("Open", "Empty path for tables %s", tables.Data());
    return false;
  }
  TObject* previous = gROOT->GetListOfFiles()->FindObject(absPath);
  TFile*   file     = 0;
  if (previous) {
    file = static_cast<TFile*>(previous);
  }
  else { 
    file = TFile::Open(fileName, (rw ? "UPDATE" : "READ"));
  }
  if (!file)  { 
    Error("Open", "Failed to open %s", GetName());
    return false;
  }
  return Open(file, tables, rw, verb, fallback);
}

//____________________________________________________________________
Bool_t
AliOADBForward::Open(TFile*         file,
		     const TString& tables,
		     Bool_t         rw, 
		     Bool_t         verb,
		     Bool_t         fallback) 
{
  // 
  // Open database file and find or create listed tables 
  // 
  if (!file) return false;
  if (rw && !file->IsWritable()) {
    Warning("Open", "Read+write access requested, but %s opened read-only",
	    file->GetName());
    if (file->ReOpen("UPDATE") < 0) { 
      Error("Open", "Failed to reopen file in read+write access mode");
      return false;
    }
  }

  if (tables.EqualTo("*")) {
    if (rw) { 
      Error("Open", "Cannot open with '*' in read/write mode");
      return false;
    }
    TList* l = file->GetListOfKeys();
    TIter  next(l);
    TKey*  key = 0;
    while ((key = static_cast<TKey*>(next()))) { 
      TClass* cl = gROOT->GetClass(key->GetClassName());
      if (!cl) continue; 
      if (!cl->InheritsFrom(TTree::Class())) continue; 
	
      OpenTable(file, rw, key->GetName(), "DEFAULT", verb, fallback);
    }
    // file->Close();
    return true;
  }
  TObjArray*  tokens = tables.Tokenize(":,");
  TObjString* token  = 0;
  TIter       nextToken(tokens);
  while ((token = static_cast<TObjString*>(nextToken()))) {
    TString& tn = token->String();
    if (tn.IsNull()) continue;
     
    TObjArray*  parts = tn.Tokenize("/");
    TObjString* onam  = static_cast<TObjString*>(parts->At(0));
    TString&    name  = onam->String();
    TString     mode  = "DEFAULT";
    if (parts->GetEntries() > 1) 
      mode = static_cast<TObjString*>(parts->At(1))->String();
    mode.ToUpper();

    OpenTable(file, rw, name, mode, verb, fallback);

    delete parts;
  }
  delete tokens;

  return true;
}

//____________________________________________________________________
Bool_t
AliOADBForward::Close()
{
  // 
  // Flush all tables and close all files 
  // 
  TList  files;
  Int_t nFiles = GetFiles(files);
  if (nFiles <= 0) { 
    // Nothing to close 
    return true;
  }

  TIter nextFile(&files);
  TFile* file = 0;
  while ((file = static_cast<TFile*>(nextFile()))) {
    // if (file->IsWritable()) file->Write();

    file->Close();
  }
    
  fTables.DeleteAll();

  return true;
}
//____________________________________________________________________
Bool_t
AliOADBForward::Update()
{
  // 
  // Flush all tables 
  // 
  TList  files;
  Int_t nFiles = GetFiles(files);
  if (nFiles <= 0) { 
    // Nothing to close 
    return true;
  }

  TIter nextFile(&files);
  TFile* file = 0;
  Int_t  nBytes = 0;
  while ((file = static_cast<TFile*>(nextFile()))) {
    if (!file->IsWritable()) { 
      Error("Update", "File %s not writeable", file->GetName());
      continue;
    }

    nBytes += file->Write();
  }
  return (nBytes >= 0);
}
//____________________________________________________________________
AliOADBForward::Entry*
AliOADBForward::Get(const TString& table, 
		    ULong_t        run,
		    ERunSelectMode mode, 
		    UShort_t       sys,
		    UShort_t       sNN, 
		    Short_t        fld,
		    Bool_t         mc,
		    Bool_t         sat) const
{
  // 
  // Get a row from selected table 
  // 
  Table* t = FindTable(table);
  if (!t) return 0;
    
  return t->Get(run, mode, sys, sNN, fld, mc, sat);
}
//____________________________________________________________________
TObject*
AliOADBForward::GetData(const TString& table, 
			ULong_t        run,
			ERunSelectMode mode, 
			UShort_t       sys,
			UShort_t       sNN, 
			Short_t        fld,
			Bool_t         mc,
			Bool_t         sat) const
{
  Table* t = FindTable(table);
  if (!t) return 0;

  return t->GetData(run, mode, sys, sNN, fld, mc, sat);
}
//____________________________________________________________________
Bool_t
AliOADBForward::Insert(const TString& table, 
		       TObject* o, 
		       ULong_t  runNo, 
		       UShort_t sys, 
		       UShort_t sNN, 
		       Short_t  field, 
		       Bool_t   mc, 
		       Bool_t   sat,
		       ULong_t  aliRev,
		       const TString& author) 
{
  // 
  // Insert a row into the selected table 
  //
  Table* t = FindTable(table);
  if (!t) return false;

  return t->Insert(o, runNo, sys, sNN, field, mc, sat, aliRev, author);
}	    
//____________________________________________________________________
Bool_t
AliOADBForward::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)
{
  Table* t = FindTable(table);
  if (!t) return false;

  Entry* e = t->Get(oldRunNo, t->fMode, oldSys, oldSNN, oldField, mc, sat);
  if (!e) return false;

  return t->Insert(e->fData, newRunNo, newSys, newSNN, newField, mc, sat, 
		e->fAliROOTRevision, e->fAuthor);
}

//____________________________________________________________________
void
AliOADBForward::Print(const Option_t* option) const
{
  // 
  // Print everything 
  //
  TIter       nextTable(&fTables);
  TObjString* key   = 0;
  Table*      table  = 0;
  while ((key = static_cast<TObjString*>(nextTable()))) {
    Printf("Table: %p", key->GetName());
    table = static_cast<Table*>(fTables.GetValue(key));
    if (!table) continue;
    table->Print(option);
  }
}

//____________________________________________________________________
void
AliOADBForward::Browse(TBrowser* b) 
{
  // 
  // Browse this object
  // 
  TIter       nextTable(&fTables);
  TObjString* key   = 0;
  Table*      table  = 0;
  while ((key = static_cast<TObjString*>(nextTable()))) {
    table = static_cast<Table*>(fTables.GetValue(key));
    if (!table) continue;
    b->Add(table, key->GetName());
  }
}
//____________________________________________________________________
AliOADBForward::Table*
AliOADBForward::FindTable(const TString& name, Bool_t quite) const
{
  //
  // Find a table by name 
  // 
  TPair* p = static_cast<TPair*>(fTables.FindObject(name));
  if (!p) {
    if (!quite)
      Warning("FindTable", "Table %s not registered", name.Data());
    return 0; 
  }
  return static_cast<Table*>(p->Value());
}
//____________________________________________________________________
Int_t
AliOADBForward::GetFiles(TList& files) const
{
  // 
  // Get all associated files 
  // 
  Int_t  ret    = 0;
  TIter       nextTable(&fTables);
  TObjString* key   = 0;
  Table*      table  = 0;
  while ((key = static_cast<TObjString*>(nextTable()))) {
    table = static_cast<Table*>(fTables.GetValue(key));
    if (!table->fTree) continue; 

    TFile* f = table->fTree->GetCurrentFile();
    if (!f) continue;

    if (files.FindObject(f)) continue;
    files.Add(f);
    ret++;
  }
  return ret;
}
//____________________________________________________________________
AliOADBForward::Table*
AliOADBForward::GetTableFromFile(TFile*         file, 
				 Bool_t         rw, 
				 const TString& name,
				 const TString& mode) const
{
  // 
  // Get a table from a file, or make a new table 
  // 
  if (!file) return 0;
  if (FindTable(name, true)) return 0;

  TObject* o = file->Get(name);
  TTree*   t = 0;
  Bool_t   n = false;
  if (!o) { 
    if (!rw) { 
      // We only fail if in read-only mode 
      Error("Open", "No such object: %s in %s", name.Data(),
	    file->GetName());
      return 0;
    }
    // Create the tree in the file 
    t = new TTree(name, mode);
    t->SetDirectory(file);
    n = true;
  }
  else {
    // Get the tree, and set the branch
    t = static_cast<TTree*>(o);
  }
  Table* ret = new Table(t, n, String2Mode(mode));
  return ret;
}

//____________________________________________________________________
void
AliOADBForward::OpenTable(TFile*         file, 
			  Bool_t         rw, 
			  const TString& name,
			  const TString& mode,
			  Bool_t         verb, 
			  Bool_t         fallback)
{
  if (!file) return;

  Table* t = GetTableFromFile(file, rw, name, mode);
  if (!t) return;

  fTables.Add(new TObjString(name), t);
  t->SetVerbose(verb);
  t->SetEnableFallBack(fallback);
  if (verb) 
    Printf("Found table %s. Opened with verbose=%d, fallback=%d", 
	   name.Data(), verb, fallback);
}

//____________________________________________________________________
void
AliOADBForward::AppendToQuery(TString& q, const TString& s, Bool_t andNotOr)
{
  // 
  // Helper function 
  // 
  if (!q.IsNull()) q.Append(andNotOr ? " && " : " || ");
  q.Append(s);
}
//____________________________________________________________________
TString
AliOADBForward::Conditions(UShort_t       sys,
			   UShort_t       sNN, 
			   Short_t        fld,
			   Bool_t         mc,
			   Bool_t         sat)
{
  // Build query string 
  TString q;
  if (sys   > 0)    AppendToQuery(q, Form("fSys == %hu",          sys));
  if (sNN   > 0)    AppendToQuery(q, Form("abs(fSNN - %hu) < 11", sNN));
  if (TMath::Abs(fld) < 10) AppendToQuery(q, Form("fField == %hd",fld));
  // Boolean fields always queried.  In cases where these do not matter, 
  // we always write down the false value, so we get the correct query 
  // anyways. 
  AppendToQuery(q, Form("%sfMC",        (mc  ? " " : "!")));
  AppendToQuery(q, Form("%sfSatellite", (sat ? " " : "!")));

  return q;
}

//____________________________________________________________________
void
AliOADBForward::TestGet(AliOADBForward& t, 
			const TString& table,
			ULong_t        runNo,
			ERunSelectMode mode,
			UShort_t       sys,
			UShort_t       sNN, 
			Short_t        fld,
			Bool_t         mc,
			Bool_t         sat)
{

  Printf("=== Test query: t=%s r=%ld s=%d t=%d f=%d m=%d v=%d",
	 table.Data(), runNo, sys, sNN, fld, int(mc), int(sat));
  AliOADBForward::Entry* e = t.Get(table, runNo, mode, sys, sNN, 
				   fld, mc, sat);
  if (!e) return;
  e->Print();
}
//____________________________________________________________________
void
AliOADBForward::TestInsert(AliOADBForward& t, 
			   const TString&  table,
			   ULong_t         runNo,
			   UShort_t        sys,
			   UShort_t        sNN, 
			   Short_t         fld,
			   Bool_t          mc,
			   Bool_t          sat)
{
  static Int_t cnt = 0;
  TString what = TString::Format("%s-%03d", table.Data(), cnt++);
  Printf("=== Insert: t=%s r=%ld s=%d t=%d f=%d m=%d v=%d w=%s",
	 table.Data(), runNo, sys, sNN, fld, int(mc), int(sat), what.Data());
  t.Insert(table, new TObjString(what), runNo, sys, sNN, fld, mc, sat);
  gSystem->Sleep(500);
}

//____________________________________________________________________
void
AliOADBForward::Test()
{
  AliOADBForward* tt = new AliOADBForward();
  if (!tt->Open("db.root", "A,B", true, true)) { 
    ::Error("Test", "Failed to open DB");
    return;
  }
  AliOADBForward& t  = *tt;
  TestInsert(t, "A", 137161);
  TestInsert(t, "A", 137161);
  TestInsert(t, "A", 0     );
  TestInsert(t, "A", 999999);
  TestInsert(t, "A", 137166);


  TestInsert(t, "B", 137161);
  TestInsert(t, "B", 0     );
  t.Print();
  t.Close();

  if (!t.Open("db.root", "A,B",false,true)) {
    ::Error("Test", "Failed to open DB");
    return;
  }

  TestGet(t, "A", 137161);
  TestGet(t, "A", 137160);
  TestGet(t, "A", 0     );
  TestGet(t, "A", 137160, kNewest);
  TestGet(t, "A", 137160, kNewer);
  TestGet(t, "A", 137168, kOlder);
  TestGet(t, "A", 137161, kExact);

  new TBrowser("b", tt);
}

//
// EOF
//
 AliOADBForward.cxx:1
 AliOADBForward.cxx:2
 AliOADBForward.cxx:3
 AliOADBForward.cxx:4
 AliOADBForward.cxx:5
 AliOADBForward.cxx:6
 AliOADBForward.cxx:7
 AliOADBForward.cxx:8
 AliOADBForward.cxx:9
 AliOADBForward.cxx:10
 AliOADBForward.cxx:11
 AliOADBForward.cxx:12
 AliOADBForward.cxx:13
 AliOADBForward.cxx:14
 AliOADBForward.cxx:15
 AliOADBForward.cxx:16
 AliOADBForward.cxx:17
 AliOADBForward.cxx:18
 AliOADBForward.cxx:19
 AliOADBForward.cxx:20
 AliOADBForward.cxx:21
 AliOADBForward.cxx:22
 AliOADBForward.cxx:23
 AliOADBForward.cxx:24
 AliOADBForward.cxx:25
 AliOADBForward.cxx:26
 AliOADBForward.cxx:27
 AliOADBForward.cxx:28
 AliOADBForward.cxx:29
 AliOADBForward.cxx:30
 AliOADBForward.cxx:31
 AliOADBForward.cxx:32
 AliOADBForward.cxx:33
 AliOADBForward.cxx:34
 AliOADBForward.cxx:35
 AliOADBForward.cxx:36
 AliOADBForward.cxx:37
 AliOADBForward.cxx:38
 AliOADBForward.cxx:39
 AliOADBForward.cxx:40
 AliOADBForward.cxx:41
 AliOADBForward.cxx:42
 AliOADBForward.cxx:43
 AliOADBForward.cxx:44
 AliOADBForward.cxx:45
 AliOADBForward.cxx:46
 AliOADBForward.cxx:47
 AliOADBForward.cxx:48
 AliOADBForward.cxx:49
 AliOADBForward.cxx:50
 AliOADBForward.cxx:51
 AliOADBForward.cxx:52
 AliOADBForward.cxx:53
 AliOADBForward.cxx:54
 AliOADBForward.cxx:55
 AliOADBForward.cxx:56
 AliOADBForward.cxx:57
 AliOADBForward.cxx:58
 AliOADBForward.cxx:59
 AliOADBForward.cxx:60
 AliOADBForward.cxx:61
 AliOADBForward.cxx:62
 AliOADBForward.cxx:63
 AliOADBForward.cxx:64
 AliOADBForward.cxx:65
 AliOADBForward.cxx:66
 AliOADBForward.cxx:67
 AliOADBForward.cxx:68
 AliOADBForward.cxx:69
 AliOADBForward.cxx:70
 AliOADBForward.cxx:71
 AliOADBForward.cxx:72
 AliOADBForward.cxx:73
 AliOADBForward.cxx:74
 AliOADBForward.cxx:75
 AliOADBForward.cxx:76
 AliOADBForward.cxx:77
 AliOADBForward.cxx:78
 AliOADBForward.cxx:79
 AliOADBForward.cxx:80
 AliOADBForward.cxx:81
 AliOADBForward.cxx:82
 AliOADBForward.cxx:83
 AliOADBForward.cxx:84
 AliOADBForward.cxx:85
 AliOADBForward.cxx:86
 AliOADBForward.cxx:87
 AliOADBForward.cxx:88
 AliOADBForward.cxx:89
 AliOADBForward.cxx:90
 AliOADBForward.cxx:91
 AliOADBForward.cxx:92
 AliOADBForward.cxx:93
 AliOADBForward.cxx:94
 AliOADBForward.cxx:95
 AliOADBForward.cxx:96
 AliOADBForward.cxx:97
 AliOADBForward.cxx:98
 AliOADBForward.cxx:99
 AliOADBForward.cxx:100
 AliOADBForward.cxx:101
 AliOADBForward.cxx:102
 AliOADBForward.cxx:103
 AliOADBForward.cxx:104
 AliOADBForward.cxx:105
 AliOADBForward.cxx:106
 AliOADBForward.cxx:107
 AliOADBForward.cxx:108
 AliOADBForward.cxx:109
 AliOADBForward.cxx:110
 AliOADBForward.cxx:111
 AliOADBForward.cxx:112
 AliOADBForward.cxx:113
 AliOADBForward.cxx:114
 AliOADBForward.cxx:115
 AliOADBForward.cxx:116
 AliOADBForward.cxx:117
 AliOADBForward.cxx:118
 AliOADBForward.cxx:119
 AliOADBForward.cxx:120
 AliOADBForward.cxx:121
 AliOADBForward.cxx:122
 AliOADBForward.cxx:123
 AliOADBForward.cxx:124
 AliOADBForward.cxx:125
 AliOADBForward.cxx:126
 AliOADBForward.cxx:127
 AliOADBForward.cxx:128
 AliOADBForward.cxx:129
 AliOADBForward.cxx:130
 AliOADBForward.cxx:131
 AliOADBForward.cxx:132
 AliOADBForward.cxx:133
 AliOADBForward.cxx:134
 AliOADBForward.cxx:135
 AliOADBForward.cxx:136
 AliOADBForward.cxx:137
 AliOADBForward.cxx:138
 AliOADBForward.cxx:139
 AliOADBForward.cxx:140
 AliOADBForward.cxx:141
 AliOADBForward.cxx:142
 AliOADBForward.cxx:143
 AliOADBForward.cxx:144
 AliOADBForward.cxx:145
 AliOADBForward.cxx:146
 AliOADBForward.cxx:147
 AliOADBForward.cxx:148
 AliOADBForward.cxx:149
 AliOADBForward.cxx:150
 AliOADBForward.cxx:151
 AliOADBForward.cxx:152
 AliOADBForward.cxx:153
 AliOADBForward.cxx:154
 AliOADBForward.cxx:155
 AliOADBForward.cxx:156
 AliOADBForward.cxx:157
 AliOADBForward.cxx:158
 AliOADBForward.cxx:159
 AliOADBForward.cxx:160
 AliOADBForward.cxx:161
 AliOADBForward.cxx:162
 AliOADBForward.cxx:163
 AliOADBForward.cxx:164
 AliOADBForward.cxx:165
 AliOADBForward.cxx:166
 AliOADBForward.cxx:167
 AliOADBForward.cxx:168
 AliOADBForward.cxx:169
 AliOADBForward.cxx:170
 AliOADBForward.cxx:171
 AliOADBForward.cxx:172
 AliOADBForward.cxx:173
 AliOADBForward.cxx:174
 AliOADBForward.cxx:175
 AliOADBForward.cxx:176
 AliOADBForward.cxx:177
 AliOADBForward.cxx:178
 AliOADBForward.cxx:179
 AliOADBForward.cxx:180
 AliOADBForward.cxx:181
 AliOADBForward.cxx:182
 AliOADBForward.cxx:183
 AliOADBForward.cxx:184
 AliOADBForward.cxx:185
 AliOADBForward.cxx:186
 AliOADBForward.cxx:187
 AliOADBForward.cxx:188
 AliOADBForward.cxx:189
 AliOADBForward.cxx:190
 AliOADBForward.cxx:191
 AliOADBForward.cxx:192
 AliOADBForward.cxx:193
 AliOADBForward.cxx:194
 AliOADBForward.cxx:195
 AliOADBForward.cxx:196
 AliOADBForward.cxx:197
 AliOADBForward.cxx:198
 AliOADBForward.cxx:199
 AliOADBForward.cxx:200
 AliOADBForward.cxx:201
 AliOADBForward.cxx:202
 AliOADBForward.cxx:203
 AliOADBForward.cxx:204
 AliOADBForward.cxx:205
 AliOADBForward.cxx:206
 AliOADBForward.cxx:207
 AliOADBForward.cxx:208
 AliOADBForward.cxx:209
 AliOADBForward.cxx:210
 AliOADBForward.cxx:211
 AliOADBForward.cxx:212
 AliOADBForward.cxx:213
 AliOADBForward.cxx:214
 AliOADBForward.cxx:215
 AliOADBForward.cxx:216
 AliOADBForward.cxx:217
 AliOADBForward.cxx:218
 AliOADBForward.cxx:219
 AliOADBForward.cxx:220
 AliOADBForward.cxx:221
 AliOADBForward.cxx:222
 AliOADBForward.cxx:223
 AliOADBForward.cxx:224
 AliOADBForward.cxx:225
 AliOADBForward.cxx:226
 AliOADBForward.cxx:227
 AliOADBForward.cxx:228
 AliOADBForward.cxx:229
 AliOADBForward.cxx:230
 AliOADBForward.cxx:231
 AliOADBForward.cxx:232
 AliOADBForward.cxx:233
 AliOADBForward.cxx:234
 AliOADBForward.cxx:235
 AliOADBForward.cxx:236
 AliOADBForward.cxx:237
 AliOADBForward.cxx:238
 AliOADBForward.cxx:239
 AliOADBForward.cxx:240
 AliOADBForward.cxx:241
 AliOADBForward.cxx:242
 AliOADBForward.cxx:243
 AliOADBForward.cxx:244
 AliOADBForward.cxx:245
 AliOADBForward.cxx:246
 AliOADBForward.cxx:247
 AliOADBForward.cxx:248
 AliOADBForward.cxx:249
 AliOADBForward.cxx:250
 AliOADBForward.cxx:251
 AliOADBForward.cxx:252
 AliOADBForward.cxx:253
 AliOADBForward.cxx:254
 AliOADBForward.cxx:255
 AliOADBForward.cxx:256
 AliOADBForward.cxx:257
 AliOADBForward.cxx:258
 AliOADBForward.cxx:259
 AliOADBForward.cxx:260
 AliOADBForward.cxx:261
 AliOADBForward.cxx:262
 AliOADBForward.cxx:263
 AliOADBForward.cxx:264
 AliOADBForward.cxx:265
 AliOADBForward.cxx:266
 AliOADBForward.cxx:267
 AliOADBForward.cxx:268
 AliOADBForward.cxx:269
 AliOADBForward.cxx:270
 AliOADBForward.cxx:271
 AliOADBForward.cxx:272
 AliOADBForward.cxx:273
 AliOADBForward.cxx:274
 AliOADBForward.cxx:275
 AliOADBForward.cxx:276
 AliOADBForward.cxx:277
 AliOADBForward.cxx:278
 AliOADBForward.cxx:279
 AliOADBForward.cxx:280
 AliOADBForward.cxx:281
 AliOADBForward.cxx:282
 AliOADBForward.cxx:283
 AliOADBForward.cxx:284
 AliOADBForward.cxx:285
 AliOADBForward.cxx:286
 AliOADBForward.cxx:287
 AliOADBForward.cxx:288
 AliOADBForward.cxx:289
 AliOADBForward.cxx:290
 AliOADBForward.cxx:291
 AliOADBForward.cxx:292
 AliOADBForward.cxx:293
 AliOADBForward.cxx:294
 AliOADBForward.cxx:295
 AliOADBForward.cxx:296
 AliOADBForward.cxx:297
 AliOADBForward.cxx:298
 AliOADBForward.cxx:299
 AliOADBForward.cxx:300
 AliOADBForward.cxx:301
 AliOADBForward.cxx:302
 AliOADBForward.cxx:303
 AliOADBForward.cxx:304
 AliOADBForward.cxx:305
 AliOADBForward.cxx:306
 AliOADBForward.cxx:307
 AliOADBForward.cxx:308
 AliOADBForward.cxx:309
 AliOADBForward.cxx:310
 AliOADBForward.cxx:311
 AliOADBForward.cxx:312
 AliOADBForward.cxx:313
 AliOADBForward.cxx:314
 AliOADBForward.cxx:315
 AliOADBForward.cxx:316
 AliOADBForward.cxx:317
 AliOADBForward.cxx:318
 AliOADBForward.cxx:319
 AliOADBForward.cxx:320
 AliOADBForward.cxx:321
 AliOADBForward.cxx:322
 AliOADBForward.cxx:323
 AliOADBForward.cxx:324
 AliOADBForward.cxx:325
 AliOADBForward.cxx:326
 AliOADBForward.cxx:327
 AliOADBForward.cxx:328
 AliOADBForward.cxx:329
 AliOADBForward.cxx:330
 AliOADBForward.cxx:331
 AliOADBForward.cxx:332
 AliOADBForward.cxx:333
 AliOADBForward.cxx:334
 AliOADBForward.cxx:335
 AliOADBForward.cxx:336
 AliOADBForward.cxx:337
 AliOADBForward.cxx:338
 AliOADBForward.cxx:339
 AliOADBForward.cxx:340
 AliOADBForward.cxx:341
 AliOADBForward.cxx:342
 AliOADBForward.cxx:343
 AliOADBForward.cxx:344
 AliOADBForward.cxx:345
 AliOADBForward.cxx:346
 AliOADBForward.cxx:347
 AliOADBForward.cxx:348
 AliOADBForward.cxx:349
 AliOADBForward.cxx:350
 AliOADBForward.cxx:351
 AliOADBForward.cxx:352
 AliOADBForward.cxx:353
 AliOADBForward.cxx:354
 AliOADBForward.cxx:355
 AliOADBForward.cxx:356
 AliOADBForward.cxx:357
 AliOADBForward.cxx:358
 AliOADBForward.cxx:359
 AliOADBForward.cxx:360
 AliOADBForward.cxx:361
 AliOADBForward.cxx:362
 AliOADBForward.cxx:363
 AliOADBForward.cxx:364
 AliOADBForward.cxx:365
 AliOADBForward.cxx:366
 AliOADBForward.cxx:367
 AliOADBForward.cxx:368
 AliOADBForward.cxx:369
 AliOADBForward.cxx:370
 AliOADBForward.cxx:371
 AliOADBForward.cxx:372
 AliOADBForward.cxx:373
 AliOADBForward.cxx:374
 AliOADBForward.cxx:375
 AliOADBForward.cxx:376
 AliOADBForward.cxx:377
 AliOADBForward.cxx:378
 AliOADBForward.cxx:379
 AliOADBForward.cxx:380
 AliOADBForward.cxx:381
 AliOADBForward.cxx:382
 AliOADBForward.cxx:383
 AliOADBForward.cxx:384
 AliOADBForward.cxx:385
 AliOADBForward.cxx:386
 AliOADBForward.cxx:387
 AliOADBForward.cxx:388
 AliOADBForward.cxx:389
 AliOADBForward.cxx:390
 AliOADBForward.cxx:391
 AliOADBForward.cxx:392
 AliOADBForward.cxx:393
 AliOADBForward.cxx:394
 AliOADBForward.cxx:395
 AliOADBForward.cxx:396
 AliOADBForward.cxx:397
 AliOADBForward.cxx:398
 AliOADBForward.cxx:399
 AliOADBForward.cxx:400
 AliOADBForward.cxx:401
 AliOADBForward.cxx:402
 AliOADBForward.cxx:403
 AliOADBForward.cxx:404
 AliOADBForward.cxx:405
 AliOADBForward.cxx:406
 AliOADBForward.cxx:407
 AliOADBForward.cxx:408
 AliOADBForward.cxx:409
 AliOADBForward.cxx:410
 AliOADBForward.cxx:411
 AliOADBForward.cxx:412
 AliOADBForward.cxx:413
 AliOADBForward.cxx:414
 AliOADBForward.cxx:415
 AliOADBForward.cxx:416
 AliOADBForward.cxx:417
 AliOADBForward.cxx:418
 AliOADBForward.cxx:419
 AliOADBForward.cxx:420
 AliOADBForward.cxx:421
 AliOADBForward.cxx:422
 AliOADBForward.cxx:423
 AliOADBForward.cxx:424
 AliOADBForward.cxx:425
 AliOADBForward.cxx:426
 AliOADBForward.cxx:427
 AliOADBForward.cxx:428
 AliOADBForward.cxx:429
 AliOADBForward.cxx:430
 AliOADBForward.cxx:431
 AliOADBForward.cxx:432
 AliOADBForward.cxx:433
 AliOADBForward.cxx:434
 AliOADBForward.cxx:435
 AliOADBForward.cxx:436
 AliOADBForward.cxx:437
 AliOADBForward.cxx:438
 AliOADBForward.cxx:439
 AliOADBForward.cxx:440
 AliOADBForward.cxx:441
 AliOADBForward.cxx:442
 AliOADBForward.cxx:443
 AliOADBForward.cxx:444
 AliOADBForward.cxx:445
 AliOADBForward.cxx:446
 AliOADBForward.cxx:447
 AliOADBForward.cxx:448
 AliOADBForward.cxx:449
 AliOADBForward.cxx:450
 AliOADBForward.cxx:451
 AliOADBForward.cxx:452
 AliOADBForward.cxx:453
 AliOADBForward.cxx:454
 AliOADBForward.cxx:455
 AliOADBForward.cxx:456
 AliOADBForward.cxx:457
 AliOADBForward.cxx:458
 AliOADBForward.cxx:459
 AliOADBForward.cxx:460
 AliOADBForward.cxx:461
 AliOADBForward.cxx:462
 AliOADBForward.cxx:463
 AliOADBForward.cxx:464
 AliOADBForward.cxx:465
 AliOADBForward.cxx:466
 AliOADBForward.cxx:467
 AliOADBForward.cxx:468
 AliOADBForward.cxx:469
 AliOADBForward.cxx:470
 AliOADBForward.cxx:471
 AliOADBForward.cxx:472
 AliOADBForward.cxx:473
 AliOADBForward.cxx:474
 AliOADBForward.cxx:475
 AliOADBForward.cxx:476
 AliOADBForward.cxx:477
 AliOADBForward.cxx:478
 AliOADBForward.cxx:479
 AliOADBForward.cxx:480
 AliOADBForward.cxx:481
 AliOADBForward.cxx:482
 AliOADBForward.cxx:483
 AliOADBForward.cxx:484
 AliOADBForward.cxx:485
 AliOADBForward.cxx:486
 AliOADBForward.cxx:487
 AliOADBForward.cxx:488
 AliOADBForward.cxx:489
 AliOADBForward.cxx:490
 AliOADBForward.cxx:491
 AliOADBForward.cxx:492
 AliOADBForward.cxx:493
 AliOADBForward.cxx:494
 AliOADBForward.cxx:495
 AliOADBForward.cxx:496
 AliOADBForward.cxx:497
 AliOADBForward.cxx:498
 AliOADBForward.cxx:499
 AliOADBForward.cxx:500
 AliOADBForward.cxx:501
 AliOADBForward.cxx:502
 AliOADBForward.cxx:503
 AliOADBForward.cxx:504
 AliOADBForward.cxx:505
 AliOADBForward.cxx:506
 AliOADBForward.cxx:507
 AliOADBForward.cxx:508
 AliOADBForward.cxx:509
 AliOADBForward.cxx:510
 AliOADBForward.cxx:511
 AliOADBForward.cxx:512
 AliOADBForward.cxx:513
 AliOADBForward.cxx:514
 AliOADBForward.cxx:515
 AliOADBForward.cxx:516
 AliOADBForward.cxx:517
 AliOADBForward.cxx:518
 AliOADBForward.cxx:519
 AliOADBForward.cxx:520
 AliOADBForward.cxx:521
 AliOADBForward.cxx:522
 AliOADBForward.cxx:523
 AliOADBForward.cxx:524
 AliOADBForward.cxx:525
 AliOADBForward.cxx:526
 AliOADBForward.cxx:527
 AliOADBForward.cxx:528
 AliOADBForward.cxx:529
 AliOADBForward.cxx:530
 AliOADBForward.cxx:531
 AliOADBForward.cxx:532
 AliOADBForward.cxx:533
 AliOADBForward.cxx:534
 AliOADBForward.cxx:535
 AliOADBForward.cxx:536
 AliOADBForward.cxx:537
 AliOADBForward.cxx:538
 AliOADBForward.cxx:539
 AliOADBForward.cxx:540
 AliOADBForward.cxx:541
 AliOADBForward.cxx:542
 AliOADBForward.cxx:543
 AliOADBForward.cxx:544
 AliOADBForward.cxx:545
 AliOADBForward.cxx:546
 AliOADBForward.cxx:547
 AliOADBForward.cxx:548
 AliOADBForward.cxx:549
 AliOADBForward.cxx:550
 AliOADBForward.cxx:551
 AliOADBForward.cxx:552
 AliOADBForward.cxx:553
 AliOADBForward.cxx:554
 AliOADBForward.cxx:555
 AliOADBForward.cxx:556
 AliOADBForward.cxx:557
 AliOADBForward.cxx:558
 AliOADBForward.cxx:559
 AliOADBForward.cxx:560
 AliOADBForward.cxx:561
 AliOADBForward.cxx:562
 AliOADBForward.cxx:563
 AliOADBForward.cxx:564
 AliOADBForward.cxx:565
 AliOADBForward.cxx:566
 AliOADBForward.cxx:567
 AliOADBForward.cxx:568
 AliOADBForward.cxx:569
 AliOADBForward.cxx:570
 AliOADBForward.cxx:571
 AliOADBForward.cxx:572
 AliOADBForward.cxx:573
 AliOADBForward.cxx:574
 AliOADBForward.cxx:575
 AliOADBForward.cxx:576
 AliOADBForward.cxx:577
 AliOADBForward.cxx:578
 AliOADBForward.cxx:579
 AliOADBForward.cxx:580
 AliOADBForward.cxx:581
 AliOADBForward.cxx:582
 AliOADBForward.cxx:583
 AliOADBForward.cxx:584
 AliOADBForward.cxx:585
 AliOADBForward.cxx:586
 AliOADBForward.cxx:587
 AliOADBForward.cxx:588
 AliOADBForward.cxx:589
 AliOADBForward.cxx:590
 AliOADBForward.cxx:591
 AliOADBForward.cxx:592
 AliOADBForward.cxx:593
 AliOADBForward.cxx:594
 AliOADBForward.cxx:595
 AliOADBForward.cxx:596
 AliOADBForward.cxx:597
 AliOADBForward.cxx:598
 AliOADBForward.cxx:599
 AliOADBForward.cxx:600
 AliOADBForward.cxx:601
 AliOADBForward.cxx:602
 AliOADBForward.cxx:603
 AliOADBForward.cxx:604
 AliOADBForward.cxx:605
 AliOADBForward.cxx:606
 AliOADBForward.cxx:607
 AliOADBForward.cxx:608
 AliOADBForward.cxx:609
 AliOADBForward.cxx:610
 AliOADBForward.cxx:611
 AliOADBForward.cxx:612
 AliOADBForward.cxx:613
 AliOADBForward.cxx:614
 AliOADBForward.cxx:615
 AliOADBForward.cxx:616
 AliOADBForward.cxx:617
 AliOADBForward.cxx:618
 AliOADBForward.cxx:619
 AliOADBForward.cxx:620
 AliOADBForward.cxx:621
 AliOADBForward.cxx:622
 AliOADBForward.cxx:623
 AliOADBForward.cxx:624
 AliOADBForward.cxx:625
 AliOADBForward.cxx:626
 AliOADBForward.cxx:627
 AliOADBForward.cxx:628
 AliOADBForward.cxx:629
 AliOADBForward.cxx:630
 AliOADBForward.cxx:631
 AliOADBForward.cxx:632
 AliOADBForward.cxx:633
 AliOADBForward.cxx:634
 AliOADBForward.cxx:635
 AliOADBForward.cxx:636
 AliOADBForward.cxx:637
 AliOADBForward.cxx:638
 AliOADBForward.cxx:639
 AliOADBForward.cxx:640
 AliOADBForward.cxx:641
 AliOADBForward.cxx:642
 AliOADBForward.cxx:643
 AliOADBForward.cxx:644
 AliOADBForward.cxx:645
 AliOADBForward.cxx:646
 AliOADBForward.cxx:647
 AliOADBForward.cxx:648
 AliOADBForward.cxx:649
 AliOADBForward.cxx:650
 AliOADBForward.cxx:651
 AliOADBForward.cxx:652
 AliOADBForward.cxx:653
 AliOADBForward.cxx:654
 AliOADBForward.cxx:655
 AliOADBForward.cxx:656
 AliOADBForward.cxx:657
 AliOADBForward.cxx:658
 AliOADBForward.cxx:659
 AliOADBForward.cxx:660
 AliOADBForward.cxx:661
 AliOADBForward.cxx:662
 AliOADBForward.cxx:663
 AliOADBForward.cxx:664
 AliOADBForward.cxx:665
 AliOADBForward.cxx:666
 AliOADBForward.cxx:667
 AliOADBForward.cxx:668
 AliOADBForward.cxx:669
 AliOADBForward.cxx:670
 AliOADBForward.cxx:671
 AliOADBForward.cxx:672
 AliOADBForward.cxx:673
 AliOADBForward.cxx:674
 AliOADBForward.cxx:675
 AliOADBForward.cxx:676
 AliOADBForward.cxx:677
 AliOADBForward.cxx:678
 AliOADBForward.cxx:679
 AliOADBForward.cxx:680
 AliOADBForward.cxx:681
 AliOADBForward.cxx:682
 AliOADBForward.cxx:683
 AliOADBForward.cxx:684
 AliOADBForward.cxx:685
 AliOADBForward.cxx:686
 AliOADBForward.cxx:687
 AliOADBForward.cxx:688
 AliOADBForward.cxx:689
 AliOADBForward.cxx:690
 AliOADBForward.cxx:691
 AliOADBForward.cxx:692
 AliOADBForward.cxx:693
 AliOADBForward.cxx:694
 AliOADBForward.cxx:695
 AliOADBForward.cxx:696
 AliOADBForward.cxx:697
 AliOADBForward.cxx:698
 AliOADBForward.cxx:699
 AliOADBForward.cxx:700
 AliOADBForward.cxx:701
 AliOADBForward.cxx:702
 AliOADBForward.cxx:703
 AliOADBForward.cxx:704
 AliOADBForward.cxx:705
 AliOADBForward.cxx:706
 AliOADBForward.cxx:707
 AliOADBForward.cxx:708
 AliOADBForward.cxx:709
 AliOADBForward.cxx:710
 AliOADBForward.cxx:711
 AliOADBForward.cxx:712
 AliOADBForward.cxx:713
 AliOADBForward.cxx:714
 AliOADBForward.cxx:715
 AliOADBForward.cxx:716
 AliOADBForward.cxx:717
 AliOADBForward.cxx:718
 AliOADBForward.cxx:719
 AliOADBForward.cxx:720
 AliOADBForward.cxx:721
 AliOADBForward.cxx:722
 AliOADBForward.cxx:723
 AliOADBForward.cxx:724
 AliOADBForward.cxx:725
 AliOADBForward.cxx:726
 AliOADBForward.cxx:727
 AliOADBForward.cxx:728
 AliOADBForward.cxx:729
 AliOADBForward.cxx:730
 AliOADBForward.cxx:731
 AliOADBForward.cxx:732
 AliOADBForward.cxx:733
 AliOADBForward.cxx:734
 AliOADBForward.cxx:735
 AliOADBForward.cxx:736
 AliOADBForward.cxx:737
 AliOADBForward.cxx:738
 AliOADBForward.cxx:739
 AliOADBForward.cxx:740
 AliOADBForward.cxx:741
 AliOADBForward.cxx:742
 AliOADBForward.cxx:743
 AliOADBForward.cxx:744
 AliOADBForward.cxx:745
 AliOADBForward.cxx:746
 AliOADBForward.cxx:747
 AliOADBForward.cxx:748
 AliOADBForward.cxx:749
 AliOADBForward.cxx:750
 AliOADBForward.cxx:751
 AliOADBForward.cxx:752
 AliOADBForward.cxx:753
 AliOADBForward.cxx:754
 AliOADBForward.cxx:755
 AliOADBForward.cxx:756
 AliOADBForward.cxx:757
 AliOADBForward.cxx:758
 AliOADBForward.cxx:759
 AliOADBForward.cxx:760
 AliOADBForward.cxx:761
 AliOADBForward.cxx:762
 AliOADBForward.cxx:763
 AliOADBForward.cxx:764
 AliOADBForward.cxx:765
 AliOADBForward.cxx:766
 AliOADBForward.cxx:767
 AliOADBForward.cxx:768
 AliOADBForward.cxx:769
 AliOADBForward.cxx:770
 AliOADBForward.cxx:771
 AliOADBForward.cxx:772
 AliOADBForward.cxx:773
 AliOADBForward.cxx:774
 AliOADBForward.cxx:775
 AliOADBForward.cxx:776
 AliOADBForward.cxx:777
 AliOADBForward.cxx:778
 AliOADBForward.cxx:779
 AliOADBForward.cxx:780
 AliOADBForward.cxx:781
 AliOADBForward.cxx:782
 AliOADBForward.cxx:783
 AliOADBForward.cxx:784
 AliOADBForward.cxx:785
 AliOADBForward.cxx:786
 AliOADBForward.cxx:787
 AliOADBForward.cxx:788
 AliOADBForward.cxx:789
 AliOADBForward.cxx:790
 AliOADBForward.cxx:791
 AliOADBForward.cxx:792
 AliOADBForward.cxx:793
 AliOADBForward.cxx:794
 AliOADBForward.cxx:795
 AliOADBForward.cxx:796
 AliOADBForward.cxx:797
 AliOADBForward.cxx:798
 AliOADBForward.cxx:799
 AliOADBForward.cxx:800
 AliOADBForward.cxx:801
 AliOADBForward.cxx:802
 AliOADBForward.cxx:803
 AliOADBForward.cxx:804
 AliOADBForward.cxx:805
 AliOADBForward.cxx:806
 AliOADBForward.cxx:807
 AliOADBForward.cxx:808
 AliOADBForward.cxx:809
 AliOADBForward.cxx:810
 AliOADBForward.cxx:811
 AliOADBForward.cxx:812
 AliOADBForward.cxx:813
 AliOADBForward.cxx:814
 AliOADBForward.cxx:815
 AliOADBForward.cxx:816
 AliOADBForward.cxx:817
 AliOADBForward.cxx:818
 AliOADBForward.cxx:819
 AliOADBForward.cxx:820
 AliOADBForward.cxx:821
 AliOADBForward.cxx:822
 AliOADBForward.cxx:823
 AliOADBForward.cxx:824
 AliOADBForward.cxx:825
 AliOADBForward.cxx:826
 AliOADBForward.cxx:827
 AliOADBForward.cxx:828
 AliOADBForward.cxx:829
 AliOADBForward.cxx:830
 AliOADBForward.cxx:831
 AliOADBForward.cxx:832
 AliOADBForward.cxx:833
 AliOADBForward.cxx:834
 AliOADBForward.cxx:835
 AliOADBForward.cxx:836
 AliOADBForward.cxx:837
 AliOADBForward.cxx:838
 AliOADBForward.cxx:839
 AliOADBForward.cxx:840
 AliOADBForward.cxx:841
 AliOADBForward.cxx:842
 AliOADBForward.cxx:843
 AliOADBForward.cxx:844
 AliOADBForward.cxx:845
 AliOADBForward.cxx:846
 AliOADBForward.cxx:847
 AliOADBForward.cxx:848
 AliOADBForward.cxx:849
 AliOADBForward.cxx:850
 AliOADBForward.cxx:851
 AliOADBForward.cxx:852
 AliOADBForward.cxx:853
 AliOADBForward.cxx:854
 AliOADBForward.cxx:855
 AliOADBForward.cxx:856
 AliOADBForward.cxx:857
 AliOADBForward.cxx:858
 AliOADBForward.cxx:859
 AliOADBForward.cxx:860
 AliOADBForward.cxx:861
 AliOADBForward.cxx:862
 AliOADBForward.cxx:863
 AliOADBForward.cxx:864
 AliOADBForward.cxx:865
 AliOADBForward.cxx:866
 AliOADBForward.cxx:867
 AliOADBForward.cxx:868
 AliOADBForward.cxx:869
 AliOADBForward.cxx:870
 AliOADBForward.cxx:871
 AliOADBForward.cxx:872
 AliOADBForward.cxx:873
 AliOADBForward.cxx:874
 AliOADBForward.cxx:875
 AliOADBForward.cxx:876
 AliOADBForward.cxx:877
 AliOADBForward.cxx:878
 AliOADBForward.cxx:879
 AliOADBForward.cxx:880
 AliOADBForward.cxx:881
 AliOADBForward.cxx:882
 AliOADBForward.cxx:883
 AliOADBForward.cxx:884
 AliOADBForward.cxx:885
 AliOADBForward.cxx:886
 AliOADBForward.cxx:887
 AliOADBForward.cxx:888
 AliOADBForward.cxx:889
 AliOADBForward.cxx:890
 AliOADBForward.cxx:891
 AliOADBForward.cxx:892
 AliOADBForward.cxx:893
 AliOADBForward.cxx:894
 AliOADBForward.cxx:895
 AliOADBForward.cxx:896
 AliOADBForward.cxx:897
 AliOADBForward.cxx:898
 AliOADBForward.cxx:899
 AliOADBForward.cxx:900
 AliOADBForward.cxx:901
 AliOADBForward.cxx:902
 AliOADBForward.cxx:903
 AliOADBForward.cxx:904
 AliOADBForward.cxx:905
 AliOADBForward.cxx:906
 AliOADBForward.cxx:907
 AliOADBForward.cxx:908
 AliOADBForward.cxx:909
 AliOADBForward.cxx:910
 AliOADBForward.cxx:911
 AliOADBForward.cxx:912
 AliOADBForward.cxx:913
 AliOADBForward.cxx:914
 AliOADBForward.cxx:915
 AliOADBForward.cxx:916
 AliOADBForward.cxx:917
 AliOADBForward.cxx:918
 AliOADBForward.cxx:919
 AliOADBForward.cxx:920
 AliOADBForward.cxx:921
 AliOADBForward.cxx:922
 AliOADBForward.cxx:923
 AliOADBForward.cxx:924
 AliOADBForward.cxx:925
 AliOADBForward.cxx:926
 AliOADBForward.cxx:927
 AliOADBForward.cxx:928
 AliOADBForward.cxx:929
 AliOADBForward.cxx:930
 AliOADBForward.cxx:931
 AliOADBForward.cxx:932
 AliOADBForward.cxx:933
 AliOADBForward.cxx:934
 AliOADBForward.cxx:935
 AliOADBForward.cxx:936
 AliOADBForward.cxx:937
 AliOADBForward.cxx:938
 AliOADBForward.cxx:939
 AliOADBForward.cxx:940
 AliOADBForward.cxx:941
 AliOADBForward.cxx:942
 AliOADBForward.cxx:943
 AliOADBForward.cxx:944
 AliOADBForward.cxx:945
 AliOADBForward.cxx:946
 AliOADBForward.cxx:947
 AliOADBForward.cxx:948
 AliOADBForward.cxx:949
 AliOADBForward.cxx:950
 AliOADBForward.cxx:951
 AliOADBForward.cxx:952
 AliOADBForward.cxx:953
 AliOADBForward.cxx:954
 AliOADBForward.cxx:955
 AliOADBForward.cxx:956
 AliOADBForward.cxx:957
 AliOADBForward.cxx:958
 AliOADBForward.cxx:959
 AliOADBForward.cxx:960
 AliOADBForward.cxx:961
 AliOADBForward.cxx:962
 AliOADBForward.cxx:963
 AliOADBForward.cxx:964
 AliOADBForward.cxx:965
 AliOADBForward.cxx:966
 AliOADBForward.cxx:967
 AliOADBForward.cxx:968
 AliOADBForward.cxx:969
 AliOADBForward.cxx:970
 AliOADBForward.cxx:971
 AliOADBForward.cxx:972
 AliOADBForward.cxx:973
 AliOADBForward.cxx:974
 AliOADBForward.cxx:975
 AliOADBForward.cxx:976
 AliOADBForward.cxx:977
 AliOADBForward.cxx:978
 AliOADBForward.cxx:979
 AliOADBForward.cxx:980
 AliOADBForward.cxx:981
 AliOADBForward.cxx:982
 AliOADBForward.cxx:983
 AliOADBForward.cxx:984
 AliOADBForward.cxx:985
 AliOADBForward.cxx:986
 AliOADBForward.cxx:987
 AliOADBForward.cxx:988
 AliOADBForward.cxx:989
 AliOADBForward.cxx:990
 AliOADBForward.cxx:991
 AliOADBForward.cxx:992
 AliOADBForward.cxx:993
 AliOADBForward.cxx:994
 AliOADBForward.cxx:995
 AliOADBForward.cxx:996
 AliOADBForward.cxx:997
 AliOADBForward.cxx:998
 AliOADBForward.cxx:999
 AliOADBForward.cxx:1000
 AliOADBForward.cxx:1001
 AliOADBForward.cxx:1002
 AliOADBForward.cxx:1003
 AliOADBForward.cxx:1004
 AliOADBForward.cxx:1005
 AliOADBForward.cxx:1006
 AliOADBForward.cxx:1007
 AliOADBForward.cxx:1008
 AliOADBForward.cxx:1009
 AliOADBForward.cxx:1010
 AliOADBForward.cxx:1011
 AliOADBForward.cxx:1012
 AliOADBForward.cxx:1013
 AliOADBForward.cxx:1014
 AliOADBForward.cxx:1015
 AliOADBForward.cxx:1016
 AliOADBForward.cxx:1017
 AliOADBForward.cxx:1018
 AliOADBForward.cxx:1019
 AliOADBForward.cxx:1020
 AliOADBForward.cxx:1021
 AliOADBForward.cxx:1022
 AliOADBForward.cxx:1023
 AliOADBForward.cxx:1024
 AliOADBForward.cxx:1025
 AliOADBForward.cxx:1026
 AliOADBForward.cxx:1027
 AliOADBForward.cxx:1028
 AliOADBForward.cxx:1029
 AliOADBForward.cxx:1030
 AliOADBForward.cxx:1031
 AliOADBForward.cxx:1032
 AliOADBForward.cxx:1033
 AliOADBForward.cxx:1034
 AliOADBForward.cxx:1035
 AliOADBForward.cxx:1036
 AliOADBForward.cxx:1037
 AliOADBForward.cxx:1038
 AliOADBForward.cxx:1039
 AliOADBForward.cxx:1040
 AliOADBForward.cxx:1041
 AliOADBForward.cxx:1042
 AliOADBForward.cxx:1043
 AliOADBForward.cxx:1044
 AliOADBForward.cxx:1045
 AliOADBForward.cxx:1046
 AliOADBForward.cxx:1047
 AliOADBForward.cxx:1048
 AliOADBForward.cxx:1049
 AliOADBForward.cxx:1050
 AliOADBForward.cxx:1051
 AliOADBForward.cxx:1052
 AliOADBForward.cxx:1053
 AliOADBForward.cxx:1054
 AliOADBForward.cxx:1055
 AliOADBForward.cxx:1056
 AliOADBForward.cxx:1057
 AliOADBForward.cxx:1058
 AliOADBForward.cxx:1059
 AliOADBForward.cxx:1060
 AliOADBForward.cxx:1061
 AliOADBForward.cxx:1062
 AliOADBForward.cxx:1063
 AliOADBForward.cxx:1064
 AliOADBForward.cxx:1065
 AliOADBForward.cxx:1066
 AliOADBForward.cxx:1067
 AliOADBForward.cxx:1068
 AliOADBForward.cxx:1069
 AliOADBForward.cxx:1070
 AliOADBForward.cxx:1071
 AliOADBForward.cxx:1072
 AliOADBForward.cxx:1073
 AliOADBForward.cxx:1074
 AliOADBForward.cxx:1075
 AliOADBForward.cxx:1076
 AliOADBForward.cxx:1077
 AliOADBForward.cxx:1078
 AliOADBForward.cxx:1079
 AliOADBForward.cxx:1080
 AliOADBForward.cxx:1081
 AliOADBForward.cxx:1082
 AliOADBForward.cxx:1083
 AliOADBForward.cxx:1084
 AliOADBForward.cxx:1085
 AliOADBForward.cxx:1086
 AliOADBForward.cxx:1087
 AliOADBForward.cxx:1088
 AliOADBForward.cxx:1089
 AliOADBForward.cxx:1090
 AliOADBForward.cxx:1091
 AliOADBForward.cxx:1092
 AliOADBForward.cxx:1093
 AliOADBForward.cxx:1094
 AliOADBForward.cxx:1095
 AliOADBForward.cxx:1096
 AliOADBForward.cxx:1097
 AliOADBForward.cxx:1098
 AliOADBForward.cxx:1099
 AliOADBForward.cxx:1100
 AliOADBForward.cxx:1101
 AliOADBForward.cxx:1102
 AliOADBForward.cxx:1103
 AliOADBForward.cxx:1104
 AliOADBForward.cxx:1105
 AliOADBForward.cxx:1106
 AliOADBForward.cxx:1107
 AliOADBForward.cxx:1108
 AliOADBForward.cxx:1109
 AliOADBForward.cxx:1110
 AliOADBForward.cxx:1111
 AliOADBForward.cxx:1112
 AliOADBForward.cxx:1113
 AliOADBForward.cxx:1114
 AliOADBForward.cxx:1115
 AliOADBForward.cxx:1116
 AliOADBForward.cxx:1117
 AliOADBForward.cxx:1118
 AliOADBForward.cxx:1119
 AliOADBForward.cxx:1120
 AliOADBForward.cxx:1121