ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/*

  Primary goal of the proposal was to provide functionality to browse and compare the content of the OCDB
  specified by different means.

  a.) galice.root               - as currently implemented by Ruben in MC (or any file with cdbMap, and cdbList)
  b.) AliESDs.root              - for the reconstructed data
  c.) ocdb snapshot             - as used for grid productions
  d.) TMap(s)                   - as used internally in galice.root and AliESDs,root  
  e.) log file (if possible)    - looks logs aways used similar syntax, tested and working
  f.) C macro                   - custom macro

  Content comparison should be done:
  a.) on the level of symbolic links 
  b.) on the level of content itself 
  - by by byte comparison dif
  - data member by data member comparison

  Implementation assumption:
  All input formats (a .. f) will  be converted to the TMap storages and TList if AliCDBIds 

  Example usage:
  AliOCDBtoolkit::MakeDiffExampleUseCase();
  or from the AliOCDBtoolkit.sh in propmpt
  ocdbMakeTable AliESDs.root ESD OCDBrec.list
  ocdbMakeTable galice.root MC OCDBsim.list

  
   



  //=============================================================================
  // Functionality to dump content of  objects in human readable format
  //=============================================================================
  Use case examples 
  1.) compare oontent of alignent OCDB files for differnt yers
  2.) compare ClusterParam for different periods
  
  
   
  =================================================================================================================
  // 1.)
  // Compare alignment example:
  // Compare TPC alignemnt 2013 and 2010
  //
  AliOCDBtoolkit::DumpOCDBFile("/cvmfs/alice.gsi.de/alice/data/2013/OCDB/TPC/Align/Data/Run0_999999999_v1_s0.root","TPCalign2013.dump",1,1);
  AliOCDBtoolkit::DumpOCDBFile("/cvmfs/alice.gsi.de/alice/data/2010/OCDB/TPC/Align/Data/Run0_999999999_v1_s0.root","TPCalign2010.dump",1,1);
  diff  TPCalign2013.dump TPCalign2010.dump > TPCalign2013_TPCalign2010.diff
  //
  //    
  =================================================================================================================
  //  2.) 
  // Compare CluterParam OCDB etry
  //
  AliOCDBtoolkit::DumpOCDBFile("/cvmfs/alice.gsi.de/alice/data/2010/OCDB/TPC/Calib/ClusterParam/Run131541_999999999_v2_s0.root","2010_TPC_Calib_ClusterParam_Run131541_999999999_v2_s0.dump",1);
  AliOCDBtoolkit:: AliOCDBtoolkit::DumpOCDBFile("/cvmfs/alice.gsi.de/alice/data/2010/OCDB/TPC/Calib/ClusterParam/Run0_999999999_v1_s0.root","2010_TPC_Calib_ClusterParam_Run0_999999999_v1_s0.dump",1);
  AliOCDBtoolkit::DumpOCDBFile("/cvmfs/alice.gsi.de/alice/data/2013/OCDB/TPC/Calib/ClusterParam/Run0_999999999_v1_s0.root","2013_TPC_Calib_ClusterParam_Run0_999999999_v1_s0.dump",1);
  diff 2010_TPC_Calib_ClusterParam_Run131541_999999999_v2_s0.dump 2010_TPC_Calib_ClusterParam_Run0_999999999_v1_s0.dump
 

*/

/*
  To check:
  1.) Verify hash value uasge as and MD5 sum - 

 */

using namespace std;

// STD
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdexcept>
#include <functional>
#include "TRealData.h"
#include "TDataMember.h"
#include "TClass.h"
#include "TROOT.h"
#include <TVectorD.h>
//
#include "TSystem.h"
#include "TObjArray.h"
#include "TString.h"
#include "TTree.h"
#include "TMessage.h"
#include <TGrid.h>
//
#include "AliCDBManager.h"
#include "AliCDBEntry.h"
#include "AliOCDBtoolkit.h"
#include "AliCDBStorage.h"
#include "TRegexp.h"

void AliOCDBtoolkit::MakeDiffExampleUseCase(){
  //
  // Example usage for the MC 
  // To run example case, assuming presence of following files in working directory: 
  //    - rec.log        
  //    - galice.root   
  //    - AliESDs.root
  //
  AliCDBManager * man = AliCDBManager::Instance();
  AliOCDBtoolkit::LoadOCDBFromLog("rec.log",0);
  const TMap *cdbMapLog= man->GetStorageMap();        // this is map of 
  const TList *cdbListLog=man->GetRetrievedIds();     // this is list of AliCDBId
  //  TList *cdbListLog0=man->GetRetrievedIds();     // this is list of AliCDBId
  //
  TFile *fmc = TFile::Open("galice.root");
  TMap *cdbMapMC= (TMap*)fmc->Get("cdbMap");          // 
  TList *cdbListMC0= (TList*)fmc->Get("cdbList");     // this is list of TObjStrings
  TList *cdbListMC = AliOCDBtoolkit::ConvertListStringToCDBId(cdbListMC0);        // convert to the TObjArray of AliCDBids
  //
  TFile *fesd = TFile::Open("AliESDs.root");
  TList *listESD = ((TTree*)fesd->Get("esdTree"))->GetUserInfo();
  TMap *cdbMapESD= (TMap*)listESD->FindObject("cdbMap");  
  TList *cdbListESD0= (TList*)listESD->FindObject("cdbList"); // this is list of TObjStrings
  TList *cdbListESD = AliOCDBtoolkit::ConvertListStringToCDBId(cdbListESD0);              // convert to the TObjArray  of AliCDBids
  //
  //
  //
  printf("\n\n");
  printf("Diff log>>>ESD\n\n:");
  MakeDiff(cdbMapLog, cdbListLog, cdbMapESD, cdbListESD,0);
  printf("\n\n");
  printf("Diff ESD>>>log\n\n:");
  MakeDiff(cdbMapESD, cdbListESD,cdbMapLog, cdbListLog,0);
  // 
  printf("\n\n");
  printf("Diff ESD>>>MC\n\n:");
  MakeDiff(cdbMapMC, cdbListMC, cdbMapESD, cdbListESD,0);
}


void AliOCDBtoolkit::DumpOCDBAsTxt(const TString fInput, const TString fType, const TString outfile){
  //
  //
  //
  TFile *file;
  const TMap *cdbMap=0;
  const TList *cdbList=0;
  //
  //
  AliCDBManager * man = AliCDBManager::Instance();
  if (fInput.Contains("alien://") && gGrid==0){
    TGrid *myGrid = TGrid::Connect("alien://");            //Oddly this will return also a pointer if connection fails
    if(myGrid->GetPort()==0){                       //if connection fails port 0 is saved, using this to check for successful connection
      cerr << "Cannot connect to grid!" << endl;
      return;
    }
  }
  if(fType.EqualTo("MC",TString::kIgnoreCase)){
        file = TFile::Open(fInput.Data());
        cdbMap = (TMap*)file->Get("cdbMap");
	if (!cdbMap){
	  printf("cdbMap does not exist in input file\t%s. Exiting\n",fInput.Data());
	  return;
	}
	// 
	man->SetDefaultStorage(((TPair*)cdbMap->FindObject("default"))->Value()->GetName());
        TList *cdbListMC0 = (TList*)file->Get("cdbList");     // this is list of TObjStrings
        cdbList = AliOCDBtoolkit::ConvertListStringToCDBId(cdbListMC0);        // convert to the TObjArray of AliCDBids
  } 
    else if(fType.EqualTo("ESD",TString::kIgnoreCase)){
      file = TFile::Open(fInput.Data());
      if (!file) {
	printf("Input file  does not exist %s. Exiting\n",fInput.Data());
	return;
      }
      TList *listESD = ((TTree*)file->Get("esdTree"))->GetUserInfo();
      cdbMap = (TMap*)listESD->FindObject("cdbMap");  
      if (!cdbMap){
	printf("cdbMap does not exist in input file\t%s. Exiting\n",fInput.Data());
	return;
      }
      AliOCDBtoolkit::SetStorage(cdbMap);
      TList *cdbListESD0= (TList*)listESD->FindObject("cdbList"); // this is list of TObjStrings
      cdbList = ConvertListStringToCDBId(cdbListESD0);              // convert to the TObjArray  of AliCDBids
    }
    else if(fType.EqualTo("log",TString::kIgnoreCase)){
        LoadOCDBFromLog(fInput.Data(),0);
        cdbMap = man->GetStorageMap();        // this is map of 
        cdbList =man->GetRetrievedIds();     // this is list of AliCDBId
    }
    else{
        printf("unsupported option: %s",fType.Data());
        return;
    }
  cout <<"BEGINDUMP:" << endl;
  DumpOCDB(cdbMap,cdbList,outfile);
}


Bool_t AliOCDBtoolkit::ParseInfoFromOcdbString(TString ocdbString, TString &ocdbPath, Int_t &run0, Int_t &run1, Int_t &version, Int_t &subVersion){
  // Functionalit
  // Parse OCDB id string and provide basic ocdb information
  //
  //  a.) parse ocdbPath
  Int_t indexBeginPath= ocdbString.Index("path: ")+7;
  if (indexBeginPath<0) return kFALSE;
  Int_t indexEndPath=ocdbString.Index(";",indexBeginPath);
  if (indexEndPath<0) return kFALSE;
  ocdbPath=TString(&(ocdbString.Data()[indexBeginPath]), indexEndPath-indexBeginPath-1);
  // b.) parse runRange
  Int_t indexRun0= ocdbString.Index(": [",indexEndPath)+3;
  if (indexRun0<0) return kFALSE;
  Int_t indexRun1= ocdbString.Index(",",indexRun0)+1;
  if (indexRun1<0) return kFALSE;
  run0=atoi(&(ocdbString.Data()[indexRun0]));
  run1=atoi(&(ocdbString.Data()[indexRun1]));
  AliCDBRunRange runRange(run0,run1);
  //c.) parse version, subversion
  Int_t indexVersion= ocdbString.Index("version: v",indexRun1)+10;
  if (indexVersion<0) return kFALSE;
  Int_t indexSubVersion= ocdbString.Index("_s",indexVersion)+2;
  if (indexSubVersion<0) return kFALSE;
  version=atoi(&(ocdbString.Data()[indexVersion]));
  subVersion=atoi(&(ocdbString.Data()[indexSubVersion]));
  return kTRUE;
}

Bool_t AliOCDBtoolkit::ParseInfoFromOcdbString(TString ocdbString, AliCDBId &cdbId){
  //
  // Parse OCDB id string and provide basic ocdb information and fillcdbID object
  //
  TString ocdbPath;
  Int_t run0=0, run1=0;
  Int_t version=0, subVersion=0;
  Bool_t parseStatus = ParseInfoFromOcdbString(ocdbString, ocdbPath, run0,run1,version,subVersion); 
  if (parseStatus) {
    AliCDBRunRange runRange(run0,run1);
    cdbId=AliCDBId(ocdbPath.Data(),runRange,version,subVersion);
    AliCDBId* id = AliCDBId::MakeFromString(ocdbString);
    cdbId=*id;
    delete id;
  }
  //
  return parseStatus;
}

TList  * AliOCDBtoolkit::ConvertListStringToCDBId(const TList *cdbList0){
  //
  // Convert input  list of the TObjString to list to AliCDBid 
  //
  Int_t entriesList0=cdbList0->GetEntries();
  TList * array0 = new TList();
  AliCDBId tmp0;
  for (Int_t ientry0=0; ientry0<entriesList0; ientry0++){
    if (cdbList0->At(ientry0)==0) continue;
    Bool_t isId =  cdbList0->At(ientry0)->IsA()->InheritsFrom("AliCDBId");
    if (isId){
      array0->AddLast(cdbList0->At(ientry0));
    }else{
      Bool_t isString =  cdbList0->At(ientry0)->IsA()->InheritsFrom("TObjString");
      if (isString){
	TObjString* sid0 = dynamic_cast<TObjString*> (cdbList0->At(ientry0));
	Bool_t status =  ParseInfoFromOcdbString(sid0->String(), tmp0);
	if (!status) continue; 
	array0->AddLast(new AliCDBId(tmp0));
      }
    }
  }
  return array0;  
}



void AliOCDBtoolkit::LoadOCDBFromLog(const char *logName, Int_t verbose){
  //
  // Initilaize OCDB
  // Load OCDB setting as specified in log
  // Assuming fixed version of the log 
  // AliCDBManager is initilaized - ocdbMap and ID list can be exported
  //

  // Parsing/loading sequence:
  //    0.) SetDefault storage  *** Default Storage URI:
  //    1.) SetSpecific storage  *** Specific storage
  //    2.) SetRunNumber  Run number:
  //    3.) Set used IDs
  //
  AliCDBManager * man = AliCDBManager::Instance();
  //
  // 0.) SetDefault storage  *** Default Storage URI:
  // 
  TString  defaultOCDB = gSystem->GetFromPipe(TString::Format("cat %s| grep \"Storage URI:\"",logName).Data());
  TObjArray *array = defaultOCDB.Tokenize("\"");
  man->SetDefaultStorage(array->Last()->GetName());
  delete array;
  //
  // 1.) SetSpecific storage  *** Specific storage
  //
  TString  specificStorage  = gSystem->GetFromPipe(TString::Format("cat %s| grep \"Specific storage\"",logName).Data());
  array = specificStorage.Tokenize("\"");
  Int_t entries = array->GetEntries();
  for (Int_t i=1; i<entries-2; i+=4){    
    // add protection here line shuld be in expected format
    if ((verbose&2)>0) printf("%s\t%s\n",array->At(i)->GetName(),array->At(i+2)->GetName());    
    man->SetSpecificStorage(array->At(i)->GetName(),array->At(i+2)->GetName());
  }
  delete array;
  //
  // 2.) SetRunNumber  Run number:
  //
  TString  runLine  = gSystem->GetFromPipe(TString::Format("cat %s| grep \"I-AliCDBManager::Print: Run number =\"",logName).Data());
  array = runLine.Tokenize("=");
  Int_t run = 0;
  if (array->GetEntries()>1) run=atoi(array->At(1)->GetName()); 
  delete array;
  man->SetRun(run);  
  //
  // 3.) Set used IDs
  //   
  TString  ids =   gSystem->GetFromPipe(TString::Format("cat %s| grep I-AliCDB | grep path| grep range | grep version", logName).Data());
  array= ids.Tokenize("\n");
  entries = array->GetEntries();
  //
  for (Int_t i=0; i<entries; i++){
    //
    TString ocdbString = array->At(i)->GetName();
    TString ocdbEntry;
    TString ocdbPath;
    Int_t run0=0, run1=0;
    Int_t version=0, subVersion=0;
    Bool_t parseStatus = ParseInfoFromOcdbString(ocdbString, ocdbPath, run0,run1,version,subVersion); 
    if (!parseStatus) continue;
    AliCDBRunRange runRange(run0,run1);
    //
    if ((verbose&2)!=0) {
      printf("%s/Run%d_%d_v%d_s%d.root\n",ocdbPath.Data(),run0,run1,version,subVersion); 
    }
    try {
      man->Get(ocdbPath.Data(),runRange,version,subVersion);      
    } catch(const exception &e){
      cerr << "OCDB retrieval failed!" << endl;
      cerr << "Detailes: " << e.what() << endl;
    }    
  }  
  if ((verbose&1)!=0){
    man->Print();
    man->GetStorageMap()->Print();
    man->GetRetrievedIds()->Print(); 
  }
}

void  AliOCDBtoolkit::SetStorage(const TMap *cdbMap){
  //
  //  Set storages as specified in the map - TO CHECK.. 
  //  Should go to the AliCDBmanager if not alreadyhhere +++MI
  //   
  //  In case OCDB_PATH local variable is defined
  //  alien storage is replaced by OCDB_PATH prefix: e.g:  local:///cvmfs/alice.gsi.de/
  //
  //  Regexp extensivelly used - see documentation in ????
  //       http://wwwacs.gantep.edu.tr/guides/programming/root/htmldoc/examples/tstring.C.html
  AliCDBManager * man = AliCDBManager::Instance();  
  TIter iter(cdbMap->GetTable());
  TPair* aPair=0;
  while ((aPair = (TPair*) iter.Next())) {
    //    aPair->Value();
    //aPair->Print();
    TString urlOrig = aPair->Value()->GetName();
    TString url=urlOrig; // e.g TString  url="alien://?User=?DBFolder=/alice/data/2010/OCDB?SE=default?CacheFolder=?OperateDisconnected=1?CacheSize=1073741824?CleanupInterval=0"
    man->ExtractBaseFolder(url); // url==alien://Folder=/alice/data/2010/OCDB"
    TString ocdbPrefix(gSystem->Getenv("OCDB_PATHTEST"));
    if (url.Length()>0){
      TRegexp alienPrefix("^alien://Folder=");      
      url(alienPrefix)=ocdbPrefix+"";
    }

    printf("%s\t%s\t%s\n", aPair->GetName(), urlOrig.Data(), url.Data());
    if (TString(aPair->GetName())=="default") man->SetDefaultStorage(url);
    else
      man->SetSpecificStorage(aPair->GetName(), url);
  }  
}
 
void AliOCDBtoolkit::LoadOCDBFromMap(const TMap *cdbMap, const TList *cdbList){
  //
  // Initilaize OCDB
  // Load OCDB setting as specified in maps
  // Or Do we have already implementation in AliCDBanager?  TO CHECK.. Should go to the AliCDBmanager if not alreadyhhere
  AliCDBManager * man = AliCDBManager::Instance();  
  AliOCDBtoolkit::SetStorage(cdbMap);  
  TIter iter(cdbList);
  TObjString *ocdbString=0;
  while (( ocdbString= (TObjString*) iter.Next())) {
    AliCDBId* cdbId = AliCDBId::MakeFromString(ocdbString->String());
    try {
      //      AliCDBEntry * cdbEntry = (AliCDBEntry*) man->Get(*cdbId,kTRUE);
      man->Get(*cdbId,kTRUE);
    } catch(const exception &e){
      cerr << "OCDB retrieval failed!" << endl;
      cerr << "Detailes: " << e.what() << endl;
    }   
  }    
}

void AliOCDBtoolkit::LoadOCDBFromESD(const char *fname){
  //
  // Load OCDB setup from the ESD file
  // 
  TFile * fesd = TFile::Open(fname);
  TList *listESD = ((TTree*)fesd->Get("esdTree"))->GetUserInfo();
  TMap *cdbMapESD= (TMap*)listESD->FindObject("cdbMap");  
  TList *cdbListESD0= (TList*)listESD->FindObject("cdbList"); // this is list of TObjStrings
  AliOCDBtoolkit::SetStorage(cdbMapESD); 
  AliOCDBtoolkit::LoadOCDBFromMap(cdbMapESD, cdbListESD0);
}


void AliOCDBtoolkit::MakeDiff(const TMap *cdbMap0, const TList *cdbList0, const TMap */*cdbMap1*/, const TList *cdbList1, Int_t /*verbose*/){
  //
  //
  // Print difference between the 2 ocdb maps
  // Input:
  //   maps and list charactireizing OCDB setup  
  // Output:
  //   To be decided.
  //
  AliOCDBtoolkit::SetStorage(cdbMap0);
  Int_t entriesList0=cdbList0->GetEntries();
  Int_t entriesList1=cdbList1->GetEntries();
  //
  for (Int_t ientry0=0; ientry0<entriesList0; ientry0++){
    AliCDBId *id0    = dynamic_cast<AliCDBId*> (cdbList0->At(ientry0));
    AliCDBId *id1=0;
    for (Int_t ientry1=0; ientry1<entriesList1; ientry1++){
      AliCDBId *cid1    = dynamic_cast<AliCDBId*> (cdbList1->At(ientry1));
      //id0.Print();
      //cid1.Print();
      if (cid1->GetPath().Contains(id0->GetPath().Data())==0) continue;
      id1=cid1;
    }
    if (!id1) {
      printf("Missing entry\t");
      id0->Print();
      continue;
    }
    //   Bool_t isOK=kTRUE;
    if (id0->GetFirstRun()!= id1->GetFirstRun() ||id0->GetLastRun()!= id1->GetLastRun()){
      printf("Differrent run range\n");
      id0->Print();
      id1->Print();
    }    
    if (id0->GetVersion()!= id1->GetVersion() ||id0->GetSubVersion()!= id1->GetSubVersion()){
      printf("Differrent version\n");
      id0->Print();
      id1->Print();
    }    
  }
}

void AliOCDBtoolkit::DumpOCDB(const TMap *cdbMap0, const TList *cdbList0, const TString outfile){
  //
  // Dump the OCDB configuatation as formated text file 
  // with following collumns
  // cdb name  prefix cdb path
  // OCDB entries are sorted alphabetically
  // e.g:
  // TPC/Calib/RecoParam /hera/alice/jwagner/software/aliroot/AliRoot_TPCdev/OCDB/ TPC/Calib/RecoParam/Run0_999999999_v0_s0.root $SIZE_AliCDBEntry_Object $HASH_AliCDBEntry_Object
  
  AliCDBManager * man = AliCDBManager::Instance();
  AliOCDBtoolkit::SetStorage(cdbMap0);  
  TList * cdbList = (TList*) cdbList0;   // sorted array
  cdbList->Sort();

  TIter next(cdbList);
  AliCDBId *CDBId=0;
  TString cdbName="";
  TString cdbPath="";
  TObjString *ostr;
  AliCDBEntry *cdbEntry=0;
  TGrid *myGrid = NULL;
  UInt_t hash;
  TMessage * file;
  Int_t size; 
  FILE *ofs = fopen(outfile.Data(),"w");
  
  while ((CDBId  =(AliCDBId*) next())){
    cdbName = CDBId->GetPath();
    ostr = (TObjString*)cdbMap0->GetValue(cdbName.Data());
    if(!ostr) ostr = (TObjString*)cdbMap0->GetValue("default");
    cdbPath = ostr->GetString();
    if(cdbPath.Contains("local://"))cdbPath=cdbPath(8,cdbPath.Length()).Data();
    if(!myGrid && cdbPath.Contains("alien://")){        //check if connection to alien is initialized
        myGrid = TGrid::Connect("alien://");            //Oddly this will return also a pointer if connection fails
        if(myGrid->GetPort()==0){                       //if connection fails port 0 is saved, using this to check for successful connection
            cerr << "Cannot connect to grid!" << endl;
            continue;
        }
    }
    try {
      cdbEntry = (AliCDBEntry*) man->Get(*CDBId,kTRUE);
    }catch(const exception &e){
      cerr << "OCDB retrieval failed!" << endl;
      cerr << "Detailes: " << e.what() << endl;
      hash=0;
      size=-1;
    }  
    if (!cdbEntry) {
      printf("Object not avaliable\n");
      CDBId->Print();
      continue;
    }
    TObject *obj = cdbEntry->GetObject();
    file = new TMessage(TBuffer::kWrite);
    file->WriteObject(obj);
    size = file->Length();
    if(!obj){
      fprintf(ofs,"object %s empty!\n",cdbName.Data());
      continue;
    }
    hash = TString::Hash(file->Buffer(),size);
    fprintf(ofs,"%s\t%s\t%s/Run%d_%d_v%d_s%d.root\t%d\t%u\n",
	   cdbName.Data(),
	   cdbPath.Data(),
	   cdbName.Data(),
	   CDBId->GetFirstRun(),
	   CDBId->GetLastRun(),
	   CDBId->GetVersion(),
	   CDBId->GetSubVersion(),
	   size,
	   hash
	   );
    //if(!(CDBId->GetPathLevel(0)).Contains("TPC")) continue;
    //cout << CDBId.ToString() << endl;
    delete file;
  }
  fclose(ofs);
}


//====================================================================================================
//  Dump object part
//==================================================================================================== 





void AliOCDBtoolkit::DumpOCDBFile(const char *finput , const char *foutput, Bool_t dumpMetaData, Bool_t xml){
  //
  //  
  //  DumpOCDBFile("$ALICE_ROOT/OCDB/ITS/Align/Data/Run0_999999999_v0_s0.root", "ITS_Align_Data_Run0_999999999_v0_s0.dump")
  //
  if (finput==0) return ;
  if (TString(finput).Contains("alien://") && gGrid==0){
    TGrid *myGrid = TGrid::Connect("alien://");            //Oddly this will return also a pointer if connection fails
    if(myGrid->GetPort()==0){                       //if connection fails port 0 is saved, using this to check for successful connection
      cerr << "Cannot connect to grid!" << endl;
      return;
    }
  }
  TFile *falignITS  = TFile::Open(finput);
  AliCDBEntry *entry  = (AliCDBEntry*)falignITS->Get("AliCDBEntry");
  if (!entry) return; 
  TObject *obj = ((AliCDBEntry*)falignITS->Get("AliCDBEntry"))->GetObject();  

  //
  if (!xml){
    if (dumpMetaData) gROOT->ProcessLine(TString::Format("((TObject*)%p)->Dump(); >%s",entry, foutput).Data());
    if (!obj) return;
    gROOT->ProcessLine(TString::Format("AliOCDBtoolkit::DumpObjectRecursive((TObject*)%p); >>%s",obj, foutput).Data());
  }
  if (xml){
    TFile * f = TFile::Open(TString::Format("%s.xml",foutput).Data(),"recreate");
    if (dumpMetaData) entry->Write("AliCDBEntry");
    else obj->Write("AliCDBEntry");
    f->Close();
  }
}



void AliOCDBtoolkit::DumpObjectRecursive(TObject *obj){
  //
  //
  //
  Int_t counterRec=0;
  printf("==> Dumping object at: %p, name=%s, class=%s)\n", obj, obj->GetName(), (obj->IsA()->GetName()));
  DumpObjectRecursive(obj, TString(obj->IsA()->GetName())+".",counterRec);
}
 
//
//
//
void AliOCDBtoolkit::DumpObjectRecursive(TObject *obj, TString prefix, Int_t &counterRec){
  //
  // Recursive dump of the TObject
  // Dump all basic types and follow pointers to the objects
  // current limitation:
  //    a.) clases and structures not derived from TObject not followed (to fix)
  //    b.) dynamic arrays not followed
  //    c.) std maps,array ....  not followed
  //    
  //
  if (!obj) return;
  //
  // Special case of Collection classes
  //
  if (obj->IsA()->InheritsFrom(TCollection::Class())) {
    TIter myiter((TCollection*)obj);
    TObject  *arObject=0;
    Int_t counter=0;
    while ((arObject = (TObject*)myiter.Next())) {
      TString prefixArr = TString::Format("%s[%d]",prefix.Data(),counter);
      DumpObjectRecursive(arObject,prefixArr,counterRec);
      counter++;
    } 
    counterRec++;
    return;
  }

  TClass * cl = obj->IsA();
  if (!(cl->GetListOfRealData())) cl->BuildRealData();
  TRealData* rd = 0;
  TIter next(cl->GetListOfRealData());  
  while ((rd = (TRealData*) next())) {
    counterRec++;
    TDataMember* dm = rd->GetDataMember();
    TDataType* dtype = dm->GetDataType();
    Int_t offset = rd->GetThisOffset();
    char* pointer = ((char*) obj) + offset;
    
    if (dm->IsaPointer()) {
      // We have a pointer to an object or a pointer to an array of basic types.
      TClass* clobj = 0;
      if (!dm->IsBasic()) {
	clobj = TClass::GetClass(dm->GetTypeName());
      }
      if (clobj) {
	// We have a pointer to an object.
	//
	if (!clobj->InheritsFrom(TObject::Class())) {
	  // It must be a TObject object.
	  continue; 
	}
	char** apointer = (char**) pointer;
	TObject* robj = (TObject*) *apointer;
	//	
	if(!robj)
	  printf("M:%s%s\n",prefix.Data(),dm->GetName()); // Missing - 0 pointer
	else{
	  printf("T:%s\t%s%s\n", clobj->GetName(),prefix.Data(), dm->GetName());
	  TString prefixNew=prefix;
	  prefixNew+=dm->GetName();
	  prefixNew+=".";
	  if (robj!=obj) DumpObjectRecursive(robj,prefixNew,counterRec);  // trivial check 
	  if (robj==obj){
	    printf("R:%s\t%s%s\n",clobj->GetName(),prefix.Data(), dm->GetName());
	  }
	}
      }
    } else if (dm->IsBasic()) {
      //
      // Basic data type
      //
      const char* index = dm->GetArrayIndex();
      if (dm->GetArrayDim()==0){
	printf("B:\t%s%s\t%s\n", prefix.Data(),rd->GetName(), dtype->AsString(pointer));
      }
      //
      // Basic array - fixed length
      //
      //      if (dm->GetArrayDim()>0 && strlen(index) != 0){
      if (dm->GetArrayDim()>0 ){
	printf("A:\t%s%s\t",prefix.Data(),rd->GetName());
	Int_t counter=0;
	for  (Int_t idim=0; idim<dm->GetArrayDim(); idim++){
	  //printf("A:%d\t%d\n", dm->GetArrayDim(),dm->GetMaxIndex(idim));
	  for (Int_t j=0; j<dm->GetMaxIndex(idim); j++){
	    printf("%s\t",dtype->AsString(pointer+dm->GetUnitSize()*counter));
	    counter++;
	    if (counter%5==0) printf("\nA:\t%s%s\t",prefix.Data(),rd->GetName());
	  }
	}
	printf("\n");
      }
      //
      // Basic array - dynamic length
      //
      if (dm->GetArrayDim()>0 && strlen(index) != 0){
	//
	// Dump first only for the moment
	//  
	printf("B:\t%s%s\t%s\n",prefix.Data(),rd->GetName(), dtype->AsString(pointer));
      }
    } else {
    }
  }
}  

//
// Small checks to test the TRealData and TDataType
//



void DumpDataSimple(){
  //
  // Dump example for elenatr data types 
  //
  TObject *obj = new TVectorD(20);
  TClass * cl = obj->IsA();
  if (!cl->GetListOfRealData()) cl->BuildRealData();
  //
  TRealData* rd = 0;
  rd = (TRealData*)(cl->GetListOfRealData()->FindObject("fNrows"));
  TDataMember* dm = rd->GetDataMember();
  TDataType* dtype = dm->GetDataType();
  //
  Int_t offset = rd->GetThisOffset();
  char* pointer = ((char*) obj) + offset;
  printf("%s\n",dtype->AsString(pointer));
}

void DumpDataArray(){
  //
  // print array example
  // 
  TObject *obj = new TVectorD(20);
  TClass * cl = obj->IsA();
  if (!cl->GetListOfRealData()) cl->BuildRealData();
  TRealData* rd = 0;
  rd = (TRealData*)(cl->GetListOfRealData()->FindObject("*fElements"));
  TDataMember* dm = rd->GetDataMember();
  TDataType* dtype = dm->GetDataType();
  dtype->Print();
  //
  Int_t offset = rd->GetThisOffset();
  char* pointer = ((char*) obj) + offset; 
  printf("%s\n",dtype->AsString(pointer));
}

void DumpTObjectArray(){
  //
  //
  //
  TObjArray *array = new TObjArray(10);
  for (Int_t i=0; i<10; i++) array->AddLast(new TNamed(Form("n%d",i), Form("n%d",i)));  
   AliOCDBtoolkit::DumpObjectRecursive(array);
  //
  //
  TObject *obj = array;
  TClass * cl = obj->IsA();
  if (!cl->GetListOfRealData()) cl->BuildRealData();
  TRealData* rd = 0;
  rd = (TRealData*)(cl->GetListOfRealData()->FindObject("*fCont"));
  TDataMember* dm = rd->GetDataMember();
  TDataType* dtype = dm->GetDataType();
  //
  Int_t offset = rd->GetThisOffset();
  char* pointer = ((char*) obj) + offset;
  char** apointer = (char**) pointer;
  //we have pointer to pointer here
  TObject** ppobj = (TObject**) *apointer;
  (*ppobj)->Print();
  //
  TIter myiter(array);
  TObject  *arObject; 
  dtype->Print();
  while ((arObject = (TObject*)myiter.Next())) {
    AliOCDBtoolkit::DumpObjectRecursive(arObject);
  } 
}


Bool_t AliOCDBtoolkit::AddoptOCDBEntry( const char *finput, const char *output,  Int_t ustartRun, Int_t uendRun){
  //
  // Addopt OCDB entry - keeping all of the CDBentry quantities
  // // Example usage: 
  //  AliOCDBtoolkit::AddoptOCDBEntry("/cvmfs/alice.gsi.de/alice/simulation/2008/v4-15-Release/Residual/TPC/Calib/ClusterParam/Run127712_130850_v4_s0.root",0,0,AliCDBRunRange::Infinity())
  TFile * fin = TFile::Open(finput);
  if (!fin) return kFALSE;
  AliCDBEntry * entry = (AliCDBEntry*) fin->Get("AliCDBEntry");
  if (!entry) return kFALSE;
  
  AliCDBStorage* pocdbStorage = 0;
  if (output!=0) AliCDBManager::Instance()->GetStorage(output);
  else{
    TString localStorage = "local://"+gSystem->GetFromPipe("pwd")+"/OCDB";
    pocdbStorage = AliCDBManager::Instance()->GetStorage(localStorage.Data());
  }
  //
  AliCDBId  idIn = entry->GetId();
  AliCDBMetaData *metaDataIn = entry->GetMetaData();

  AliCDBMetaData *metaData= new AliCDBMetaData();
  metaData->SetObjectClassName(metaDataIn->GetObjectClassName());
  metaData->SetResponsible(TString::Format("%s: copy",metaDataIn->GetResponsible()).Data());
  metaData->SetBeamPeriod(metaDataIn->GetBeamPeriod());
  //
  metaData->SetAliRootVersion(metaDataIn->GetAliRootVersion()); //root version
  metaData->SetComment((TString::Format("%s: copy",metaDataIn->GetComment()).Data()));
  AliCDBId* id1=NULL;
  id1=new AliCDBId(idIn.GetPath(), ustartRun, uendRun);
  pocdbStorage->Put(entry->GetObject(), (*id1), metaData);
  return kTRUE;
}


void AliOCDBtoolkit::MakeSnapshotFromTxt(const TString fInput, const TString outfile, Bool_t singleKeys){
  //
  // Make snasphot form the txt file
  //
  AliCDBManager * man = AliCDBManager::Instance();
  LoadOCDBFromList(fInput.Data());
  man->DumpToSnapshotFile(outfile.Data(), singleKeys);

}

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