* provided "as is" without express or implied warranty. *
**************************************************************************/
-#include "AliCDBManager.h"
+#include <TKey.h>
+#include <TH1.h>
+#include <TTree.h>
+#include <TNtuple.h>
+#include <TFile.h>
#include "AliCDBStorage.h"
+#include "AliCDBGrid.h"
#include "AliCDBEntry.h"
#include "AliLog.h"
ClassImp(AliCDBStorage)
//_____________________________________________________________________________
-AliCDBStorage::AliCDBStorage() {
+AliCDBStorage::AliCDBStorage():
+fValidFileIds(),
+fRun(-1),
+fPathFilter(),
+fVersion(-1),
+fMetaDataFilter(0),
+fSelections(),
+fURI(),
+fType(),
+fBaseFolder()
+{
// constructor
+ fValidFileIds.SetOwner(1);
fSelections.SetOwner(1);
}
AliCDBStorage::~AliCDBStorage() {
// destructor
+ RemoveAllSelections();
+ fValidFileIds.Clear();
+ delete fMetaDataFilter;
+
}
//_____________________________________________________________________________
-AliCDBId AliCDBStorage::GetSelection(const AliCDBId& id) {
-// return required version and subversion from the list of selection criteria
+void AliCDBStorage::GetSelection(/*const*/ AliCDBId* id) {
+// return required version and subversion from the list of selection criteria
TIter iter(&fSelections);
AliCDBId* aSelection;
// loop on the list of selection criteria
while ((aSelection = (AliCDBId*) iter.Next())) {
// check if selection element contains id's path and run (range)
- if (aSelection->Comprises(id)) {
- AliInfo(Form("Using selection criterion: %s ", aSelection->ToString().Data()));
+ if (aSelection->Comprises(*id)) {
+ AliDebug(2,Form("Using selection criterion: %s ", aSelection->ToString().Data()));
// return required version and subversion
- return AliCDBId(id.GetAliCDBPath(),
- id.GetAliCDBRunRange(),
- aSelection->GetVersion(),
- aSelection->GetSubVersion());
+
+ id->SetVersion(aSelection->GetVersion());
+ id->SetSubVersion(aSelection->GetSubVersion());
+ return;
}
}
// no valid element is found in the list of selection criteria -> return
- AliInfo("No matching selection criteria: highest version will be seeked!");
- return AliCDBId(id.GetAliCDBPath(), id.GetAliCDBRunRange());
+ AliDebug(2,"Looking for objects with most recent version");
+ return;
+}
+
+//_____________________________________________________________________________
+void AliCDBStorage::ReadSelectionFromFile(const char *fileName){
+// read selection criteria list from file
+
+ RemoveAllSelections();
+
+ TList *list = GetIdListFromFile(fileName);
+ if(!list) return;
+
+ list->SetOwner();
+ Int_t nId = list->GetEntries();
+ AliCDBId *id;
+ TKey *key;
+
+ for(int i=nId-1;i>=0;i--){
+ key = (TKey*) list->At(i);
+ id = (AliCDBId*) key->ReadObj();
+ if(id) AddSelection(*id);
+ }
+ delete list;
+ AliInfo(Form("Selection criteria list filled with %d entries",fSelections.GetEntries()));
+ PrintSelectionList();
+
}
//_____________________________________________________________________________
}
//_____________________________________________________________________________
-void AliCDBStorage::AddSelection(const AliCDBPath& path,
+void AliCDBStorage::AddSelection(const AliCDBPath& path,
const AliCDBRunRange& runRange, Int_t version, Int_t subVersion){
// add a selection criterion
void AliCDBStorage::RemoveSelection(int position){
// remove a selection criterion from its position in the list
- fSelections.RemoveAt(position);
+ delete fSelections.RemoveAt(position);
}
//_____________________________________________________________________________
void AliCDBStorage::RemoveAllSelections(){
// remove all selection criteria
- fSelections.RemoveAll();
+ fSelections.Clear();
}
//_____________________________________________________________________________
TIter iter(&fSelections);
AliCDBId* aSelection;
-
+
// loop on the list of selection criteria
int index=0;
while ((aSelection = (AliCDBId*) iter.Next())) {
}
//_____________________________________________________________________________
-AliCDBEntry* AliCDBStorage::Get(const AliCDBId& query) {
+AliCDBEntry* AliCDBStorage::Get(const AliCDBId& query) {
// get an AliCDBEntry object from the database
-
+
// check if query's path and runRange are valid
// query is invalid also if version is not specified and subversion is!
if (!query.IsValid()) {
return NULL;
}
- // query is not specified if path contains wildcard or runrange = [-1,-1]
+ // query is not specified if path contains wildcard or runrange = [-1,-1]
if (!query.IsSpecified()) {
- AliError(Form("Unspecified query: %s",
+ AliError(Form("Unspecified query: %s",
query.ToString().Data()));
return NULL;
}
+ // This is needed otherwise TH1 objects (histos, TTree's) are lost when file is closed!
+ Bool_t oldStatus = TH1::AddDirectoryStatus();
+ TH1::AddDirectory(kFALSE);
+
AliCDBEntry* entry = GetEntry(query);
-
+
+ if (oldStatus != kFALSE)
+ TH1::AddDirectory(kTRUE);
+
if (entry) {
- AliInfo(Form("Valid AliCDBEntry object found! %s", entry->GetId().ToString().Data()));
+ // this is to make the SHUTTLE output lighter
+ if(!(query.GetPath().Contains("SHUTTLE/STATUS")))
+ AliDebug(2, Form("CDB object retrieved: %s", entry->GetId().ToString().Data()));
} else {
- AliInfo(Form("Sorry, found no object valid for: name = <%s>, run = %d",
- (query.GetPath()).Data(), query.GetFirstRun()));
+ // this is to make the SHUTTLE output lighter
+ if(!(query.GetPath().Contains("SHUTTLE/STATUS"))){
+
+ if(!(query.GetPath().Contains("SHUTTLE"))){
+ AliFatal(Form("No valid CDB object found! request was: %s", query.ToString().Data()));
+ }
+ else {
+ AliInfo(Form("No valid CDB object found! request was: %s", query.ToString().Data()));
+ }
+ }
}
-
+
// if drain storage is set, drain entry into drain storage
if(entry && (AliCDBManager::Instance())->IsDrainSet())
AliCDBManager::Instance()->Drain(entry);
-
+
return entry;
}
//_____________________________________________________________________________
-AliCDBEntry* AliCDBStorage::Get(const AliCDBPath& path, Int_t runNumber,
+AliCDBEntry* AliCDBStorage::Get(const AliCDBPath& path, Int_t runNumber,
Int_t version, Int_t subVersion) {
// get an AliCDBEntry object from the database
}
//_____________________________________________________________________________
-AliCDBEntry* AliCDBStorage::Get(const AliCDBPath& path,
+AliCDBEntry* AliCDBStorage::Get(const AliCDBPath& path,
const AliCDBRunRange& runRange, Int_t version,
Int_t subVersion) {
// get an AliCDBEntry object from the database
return NULL;
}
+ // This is needed otherwise TH1 objects (histos, TTree's) are lost when file is closed!
+ Bool_t oldStatus = TH1::AddDirectoryStatus();
+ TH1::AddDirectory(kFALSE);
+
TList *result = GetEntries(query);
+ if (oldStatus != kFALSE)
+ TH1::AddDirectory(kTRUE);
+
Int_t nEntries = result->GetEntries();
- if (nEntries) {
- AliInfo(Form("%d AliCDBEntry objects found!",nEntries));
- for(int i=0; i<nEntries;i++){
- AliCDBEntry *entry = (AliCDBEntry*) result->At(i);
- AliInfo(Form("%s",entry->GetId().ToString().Data()));
-
- }
- } else {
- AliInfo(Form("Sorry, found no object valid for: name = <%s>, run = %d",
- (query.GetPath()).Data(), query.GetFirstRun()));
+
+ AliInfo(Form("%d objects retrieved. Request was: %s",
+ nEntries, query.ToString().Data()));
+ for(int i=0; i<nEntries;i++){
+ AliCDBEntry *entry = (AliCDBEntry*) result->At(i);
+ AliInfo(Form("%s",entry->GetId().ToString().Data()));
}
+
// if drain storage is set, drain entries into drain storage
if((AliCDBManager::Instance())->IsDrainSet()){
for(int i = 0; i<result->GetEntries(); i++){
return GetAll(AliCDBId(path, runRange, version, subVersion));
}
+//_____________________________________________________________________________
+AliCDBId* AliCDBStorage::GetId(const AliCDBId& query) {
+// get the Id of the valid object from the database (does not open the file)
+
+ // check if query's path and runRange are valid
+ // query is invalid also if version is not specified and subversion is!
+ if (!query.IsValid()) {
+ AliError(Form("Invalid query: %s", query.ToString().Data()));
+ return NULL;
+ }
+
+ // query is not specified if path contains wildcard or runrange = [-1,-1]
+ if (!query.IsSpecified()) {
+ AliError(Form("Unspecified query: %s",
+ query.ToString().Data()));
+ return NULL;
+ }
+
+ AliCDBId* id = GetEntryId(query);
+
+ return id;
+}
//_____________________________________________________________________________
-Bool_t AliCDBStorage::Put(TObject* object, AliCDBId& id, AliCDBMetaData* metaData) {
-// put an AliCDBEntry object from the database
+AliCDBId* AliCDBStorage::GetId(const AliCDBPath& path, Int_t runNumber,
+ Int_t version, Int_t subVersion) {
+// get the Id of the valid object from the database (does not open the file)
+
+ return GetId(AliCDBId(path, runNumber, runNumber, version, subVersion));
+}
+
+//_____________________________________________________________________________
+AliCDBId* AliCDBStorage::GetId(const AliCDBPath& path,
+ const AliCDBRunRange& runRange, Int_t version,
+ Int_t subVersion) {
+// get the Id of the valid object from the database (does not open the file)
+
+ return GetId(AliCDBId(path, runRange, version, subVersion));
+}
+
+//_____________________________________________________________________________
+Bool_t AliCDBStorage::Put(TObject* object, AliCDBId& id, AliCDBMetaData* metaData, AliCDBManager::DataType type) {
+// store an AliCDBEntry object into the database
+ if (object==0x0) {
+ AliError("Null Entry! No storage will be done!");
+ return kFALSE;
+ }
+
AliCDBEntry anEntry(object, id, metaData);
- return Put(&anEntry);
-}
+ return Put(&anEntry, type);
+}
//_____________________________________________________________________________
-Bool_t AliCDBStorage::Put(AliCDBEntry* entry) {
-// put an AliCDBEntry object from the database
+Bool_t AliCDBStorage::Put(AliCDBEntry* entry, AliCDBManager::DataType type) {
+// store an AliCDBEntry object into the database
+
+ if (!entry){
+ AliError("No entry!");
+ return kFALSE;
+ }
+
+ if (entry->GetObject()==0x0){
+ AliError("No valid object in CDB entry!");
+ return kFALSE;
+ }
if (!entry->GetId().IsValid()) {
- AliWarning(Form("Invalid entry ID: %s",
+ AliError(Form("Invalid entry ID: %s",
entry->GetId().ToString().Data()));
return kFALSE;
}
if (!entry->GetId().IsSpecified()) {
- AliError(Form("Unspecified entry ID: %s",
+ AliError(Form("Unspecified entry ID: %s",
entry->GetId().ToString().Data()));
return kFALSE;
}
+ AliCDBManager::DataType expectedType = GetDataType();
+
+ if(expectedType != AliCDBManager::kPrivate && type != expectedType) {
+ AliError(Form("It is forbidden to store %s data into a folder of type %s!",
+ AliCDBManager::GetDataTypeName(type),
+ AliCDBManager::GetDataTypeName(expectedType)));
+ return 0;
+ }
+
return PutEntry(entry);
}
+//_____________________________________________________________________________
+void AliCDBStorage::QueryCDB(Int_t run, const char* pathFilter,
+ Int_t version, AliCDBMetaData* md){
+// query CDB for files valid for given run, and fill list fValidFileIds
+// Actual query is done in virtual function QueryValidFiles()
+
+ fRun = run;
+
+ fPathFilter = pathFilter;
+ if(!fPathFilter.IsValid()) {
+ AliError(Form("Filter not valid: %s", pathFilter));
+ fPathFilter = "*";
+ return;
+ }
+
+ fVersion = version;
+
+ AliInfo(Form("Querying files valid for run %d and path \"%s\" into CDB storage \"%s://%s\"",
+ fRun, pathFilter, fType.Data(), fBaseFolder.Data()));
+
+ // Clear fValidFileIds list (it cannot be filled twice!
+ AliDebug(2, "Clearing list of CDB Id's previously loaded");
+ fValidFileIds.Clear();
+
+ if(fMetaDataFilter) {delete fMetaDataFilter; fMetaDataFilter=0;}
+ if(md) fMetaDataFilter = dynamic_cast<AliCDBMetaData*> (md->Clone());
+
+ QueryValidFiles();
+ AliCDBId queryId(pathFilter,run,run,version);
+
+ AliInfo(Form("%d valid files found!", fValidFileIds.GetEntriesFast()));
+
+}
+
+//_____________________________________________________________________________
+void AliCDBStorage::PrintQueryCDB(){
+// print parameters used to load list of CDB Id's (fRun, fPathFilter, fVersion)
+
+ AliCDBId paramId(fPathFilter, fRun, fRun, fVersion);
+ AliInfo(Form("**** QueryCDB Parameters **** \n\t<%s>\n",
+ paramId.ToString().Data()));
+
+ if(fMetaDataFilter) fMetaDataFilter->PrintMetaData();
+
+
+ TString message = "**** Id's of valid objects found *****\n";
+ TIter iter(&fValidFileIds);
+ AliCDBId* anId=0;
+
+ // loop on the list of selection criteria
+ while ((anId = dynamic_cast<AliCDBId*>(iter.Next()))) {
+ message += Form("\t%s\n", anId->ToString().Data());
+ }
+ message += Form("\n\tTotal: %d objects found\n", fValidFileIds.GetEntriesFast());
+ AliInfo(Form("%s", message.Data()));
+}
+
+//_____________________________________________________________________________
+AliCDBManager::DataType AliCDBStorage::GetDataType() const {
+// returns the type of the data that should be stored into this storage:
+// kConditions: conditions data; kReference: reference data; kPrivate: private (user-defined) data type
+
+ if(GetType() != "alien") return AliCDBManager::kPrivate;
+
+ TString condFolder = ((AliCDBGridParam*) AliCDBManager::Instance()->GetCondParam())->GetDBFolder();
+ TString refFolder = ((AliCDBGridParam*) AliCDBManager::Instance()->GetRefParam())->GetDBFolder();
+
+ if(GetBaseFolder().Contains(condFolder)) return AliCDBManager::kCondition;
+ if(GetBaseFolder().Contains(refFolder)) return AliCDBManager::kReference;
+
+ return AliCDBManager::kPrivate;
+}
+
+//_____________________________________________________________________________
+void AliCDBStorage::LoadTreeFromFile(AliCDBEntry *entry) const {
+// Checks whether entry contains a TTree and in case loads it into memory
+
+ TObject *obj = (TObject*) entry->GetObject();
+ if (!obj) {
+ AliError("Cannot retrieve the object:");
+ entry->PrintMetaData();
+ return;
+ }
+
+ if (!strcmp(obj->ClassName(),TTree::Class_Name())) {
+
+ AliWarning("Entry contains a TTree! Loading baskets...");
+
+ TTree* tree = dynamic_cast<TTree*> (obj);
+
+ if(!tree) return;
+
+ tree->LoadBaskets();
+ tree->SetDirectory(0);
+ }
+ else if (!strcmp(obj->ClassName(),TNtuple::Class_Name())){
+
+ AliWarning("Entry contains a TNtuple! Loading baskets...");
+
+ TNtuple* ntu = dynamic_cast<TNtuple*> (obj);
+
+ if(!ntu) return;
+
+ ntu->LoadBaskets();
+ ntu->SetDirectory(0);
+ }
+
+ return;
+}
+
+// //_____________________________________________________________________________
+// void AliCDBStorage::SetTreeToFile(AliCDBEntry *entry, TFile* file) const {
+// // Checks whether entry contains a TTree and in case assigns it to memory
+//
+// AliCDBMetaData *md = dynamic_cast<AliCDBMetaData*> (entry->GetMetaData());
+// if(!md) return;
+// TString objStr = md->GetObjectClassName();
+// if(objStr != "TTree") return;
+// AliWarning("Entry contains a TTree! Setting file...");
+//
+// TTree* tree = dynamic_cast<TTree*> (entry->GetObject());
+//
+// if(!tree) return;
+//
+// // tree->SetDirectory(file);
+// tree->SetDirectory(0);
+//
+// return;
+// }