]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliCDBStorage.cxx
Base class (AliMisaligner); each detector will provide its derived class,
[u/mrichter/AliRoot.git] / STEER / AliCDBStorage.cxx
index 351ba43eb827484392453119075c04165f7786f0..d7dc53b062351ccf7f6a3f403f8eaad4065a1efc 100644 (file)
 
 #include <TKey.h>
 #include <TH1.h>
-#include "AliCDBManager.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);
 }
 
@@ -34,11 +48,15 @@ AliCDBStorage::AliCDBStorage() {
 AliCDBStorage::~AliCDBStorage() {
 // destructor
 
+       RemoveAllSelections();
+       fValidFileIds.Clear();
+       delete fMetaDataFilter;
+
 }
 
 //_____________________________________________________________________________
 void AliCDBStorage::GetSelection(/*const*/ AliCDBId* id) {
-// return required version and subversion from the list of selection criteria 
+// return required version and subversion from the list of selection criteria
        
        TIter iter(&fSelections);
        AliCDBId* aSelection;
@@ -108,7 +126,7 @@ void AliCDBStorage::AddSelection(const AliCDBId& selection) {
 }
 
 //_____________________________________________________________________________
-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
 
@@ -157,14 +175,14 @@ void AliCDBStorage::RemoveSelection(const AliCDBPath& path,
 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();
 }
 
 //_____________________________________________________________________________
@@ -173,7 +191,7 @@ void AliCDBStorage::PrintSelectionList(){
 
        TIter iter(&fSelections);
        AliCDBId* aSelection;
-        
+
        // loop on the list of selection criteria
        int index=0;
        while ((aSelection = (AliCDBId*) iter.Next())) {
@@ -183,9 +201,9 @@ void AliCDBStorage::PrintSelectionList(){
 }
 
 //_____________________________________________________________________________
-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()) {
@@ -193,13 +211,13 @@ AliCDBEntry* AliCDBStorage::Get(const AliCDBId& query) {
                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);
@@ -208,23 +226,26 @@ AliCDBEntry* AliCDBStorage::Get(const AliCDBId& query) {
 
        if (oldStatus != kFALSE)
                TH1::AddDirectory(kTRUE);
-               
+
        if (entry) {
-               AliInfo(Form("CDB object retrieved: %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("No valid CDB object found! request was: name = <%s>, run = %d", 
-                       (query.GetPath()).Data(), query.GetFirstRun()));
+               // this is to make the SHUTTLE output lighter
+               if(!(query.GetPath().Contains("SHUTTLE/STATUS")))
+                       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
 
@@ -232,7 +253,7 @@ AliCDBEntry* AliCDBStorage::Get(const AliCDBPath& path, Int_t runNumber,
 }
 
 //_____________________________________________________________________________
-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
@@ -266,18 +287,15 @@ TList* AliCDBStorage::GetAll(const AliCDBId& query) {
                TH1::AddDirectory(kTRUE);
 
        Int_t nEntries = result->GetEntries();
-       if (nEntries) {
-                AliInfo(Form("%d AliCDBEntry objects retrieved.",nEntries));
-                for(int i=0; i<nEntries;i++){
-                       AliCDBEntry *entry = (AliCDBEntry*) result->At(i);
-                       AliInfo(Form("%s",entry->GetId().ToString().Data()));
-                
-                }
-       } else {
-                AliInfo(Form("No valid CDB object found! request was: name = <%s>, run = %d, version = %d", 
-                       (query.GetPath()).Data(), query.GetFirstRun(), query.GetVersion()));
+
+       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++){
@@ -307,18 +325,62 @@ TList* AliCDBStorage::GetAll(const AliCDBPath& path,
        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;
+}
+
+//_____________________________________________________________________________
+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));
+}
 
 //_____________________________________________________________________________
-Bool_t AliCDBStorage::Put(TObject* object, AliCDBId& id, AliCDBMetaData* metaData) {
+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) {
+Bool_t AliCDBStorage::Put(AliCDBEntry* entry, AliCDBManager::DataType type) {
 // store an AliCDBEntry object into the database
 
        if (!entry){
@@ -326,21 +388,164 @@ Bool_t AliCDBStorage::Put(AliCDBEntry* entry) {
                return kFALSE;
        }
        
+       if (entry->GetObject()==0x0){
+               AliError("No valid object in CDB entry!");
+               return kFALSE;
+       }
+
        if (!entry->GetId().IsValid()) {
-               AliError(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;
+       }
+
        // set object's class name into metaData!
        entry->GetMetaData()->SetObjectClassName(entry->GetObject()->ClassName());
 
        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;
+// }