using namespace 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(){
AliCDBManager * man = AliCDBManager::Instance();
AliOCDBtoolkit::LoadOCDBFromLog("rec.log",0);
const TMap *cdbMapLog= man->GetStorageMap();
const TList *cdbListLog=man->GetRetrievedIds();
TFile *fmc = TFile::Open("galice.root");
TMap *cdbMapMC= (TMap*)fmc->Get("cdbMap");
TList *cdbListMC0= (TList*)fmc->Get("cdbList");
TList *cdbListMC = AliOCDBtoolkit::ConvertListStringToCDBId(cdbListMC0);
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");
TList *cdbListESD = AliOCDBtoolkit::ConvertListStringToCDBId(cdbListESD0);
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://");
if(myGrid->GetPort()==0){
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");
cdbList = AliOCDBtoolkit::ConvertListStringToCDBId(cdbListMC0);
}
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");
cdbList = ConvertListStringToCDBId(cdbListESD0);
}
else if(fType.EqualTo("log",TString::kIgnoreCase)){
LoadOCDBFromLog(fInput.Data(),0);
cdbMap = man->GetStorageMap();
cdbList =man->GetRetrievedIds();
}
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){
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);
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);
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){
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){
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){
AliCDBManager * man = AliCDBManager::Instance();
TString defaultOCDB = gSystem->GetFromPipe(TString::Format("cat %s| grep \"Storage URI:\"",logName).Data());
TObjArray *array = defaultOCDB.Tokenize("\"");
man->SetDefaultStorage(array->Last()->GetName());
delete array;
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){
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;
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);
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){
AliCDBManager * man = AliCDBManager::Instance();
TIter iter(cdbMap->GetTable());
TPair* aPair=0;
while ((aPair = (TPair*) iter.Next())) {
TString urlOrig = aPair->Value()->GetName();
TString url=urlOrig;
man->ExtractBaseFolder(url);
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){
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 {
man->Get(*cdbId,kTRUE);
} catch(const exception &e){
cerr << "OCDB retrieval failed!" << endl;
cerr << "Detailes: " << e.what() << endl;
}
}
}
void AliOCDBtoolkit::LoadOCDBFromESD(const char *fname){
TFile * fesd = TFile::Open(fname);
TList *listESD = ((TTree*)fesd->Get("esdTree"))->GetUserInfo();
TMap *cdbMapESD= (TMap*)listESD->FindObject("cdbMap");
TList *cdbListESD0= (TList*)listESD->FindObject("cdbList");
AliOCDBtoolkit::SetStorage(cdbMapESD);
AliOCDBtoolkit::LoadOCDBFromMap(cdbMapESD, cdbListESD0);
}
void AliOCDBtoolkit::MakeDiff(const TMap *cdbMap0, const TList *cdbList0, const TMap *, const TList *cdbList1, Int_t ){
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));
if (cid1->GetPath().Contains(id0->GetPath().Data())==0) continue;
id1=cid1;
}
if (!id1) {
printf("Missing entry\t");
id0->Print();
continue;
}
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){
AliCDBManager * man = AliCDBManager::Instance();
AliOCDBtoolkit::SetStorage(cdbMap0);
TList * cdbList = (TList*) cdbList0;
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://")){
myGrid = TGrid::Connect("alien://");
if(myGrid->GetPort()==0){
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
);
delete file;
}
fclose(ofs);
}
void AliOCDBtoolkit::DumpOCDBFile(const char *finput , const char *foutput, Bool_t dumpMetaData, Bool_t xml){
if (finput==0) return ;
if (TString(finput).Contains("alien://") && gGrid==0){
TGrid *myGrid = TGrid::Connect("alien://");
if(myGrid->GetPort()==0){
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){
if (!obj) return;
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()) {
TClass* clobj = 0;
if (!dm->IsBasic()) {
clobj = TClass::GetClass(dm->GetTypeName());
}
if (clobj) {
if (!clobj->InheritsFrom(TObject::Class())) {
continue;
}
char** apointer = (char**) pointer;
TObject* robj = (TObject*) *apointer;
if(!robj)
printf("M:%s%s\n",prefix.Data(),dm->GetName());
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);
if (robj==obj){
printf("R:%s\t%s%s\n",clobj->GetName(),prefix.Data(), dm->GetName());
}
}
}
} else if (dm->IsBasic()) {
const char* index = dm->GetArrayIndex();
if (dm->GetArrayDim()==0){
printf("B:\t%s%s\t%s\n", prefix.Data(),rd->GetName(), dtype->AsString(pointer));
}
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++){
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");
}
if (dm->GetArrayDim()>0 && strlen(index) != 0){
printf("B:\t%s%s\t%s\n",prefix.Data(),rd->GetName(), dtype->AsString(pointer));
}
} else {
}
}
}
void DumpDataSimple(){
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(){
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;
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){
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());
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){
AliCDBManager * man = AliCDBManager::Instance();
LoadOCDBFromList(fInput.Data());
man->DumpToSnapshotFile(outfile.Data(), singleKeys);
}