1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
21 #include "AliCDBStorage.h"
22 #include "AliCDBGrid.h"
24 #include "AliCDBEntry.h"
27 ClassImp(AliCDBStorage)
29 //_____________________________________________________________________________
30 AliCDBStorage::AliCDBStorage():
45 fValidFileIds.SetOwner(1);
46 fSelections.SetOwner(1);
49 //_____________________________________________________________________________
50 AliCDBStorage::~AliCDBStorage() {
53 RemoveAllSelections();
54 fValidFileIds.Clear();
55 delete fMetaDataFilter;
59 //_____________________________________________________________________________
60 void AliCDBStorage::GetSelection(/*const*/ AliCDBId* id) {
61 // return required version and subversion from the list of selection criteria
63 TIter iter(&fSelections);
66 // loop on the list of selection criteria
67 while ((aSelection = (AliCDBId*) iter.Next())) {
68 // check if selection element contains id's path and run (range)
69 if (aSelection->Comprises(*id)) {
70 AliDebug(2,Form("Using selection criterion: %s ", aSelection->ToString().Data()));
71 // return required version and subversion
73 id->SetVersion(aSelection->GetVersion());
74 id->SetSubVersion(aSelection->GetSubVersion());
79 // no valid element is found in the list of selection criteria -> return
80 AliDebug(2,"Looking for objects with most recent version");
84 //_____________________________________________________________________________
85 void AliCDBStorage::ReadSelectionFromFile(const char *fileName){
86 // read selection criteria list from file
88 RemoveAllSelections();
90 TList *list = GetIdListFromFile(fileName);
94 Int_t nId = list->GetEntries();
98 for(int i=nId-1;i>=0;i--){
99 key = (TKey*) list->At(i);
100 id = (AliCDBId*) key->ReadObj();
101 if(id) AddSelection(*id);
104 AliInfo(Form("Selection criteria list filled with %d entries",fSelections.GetEntries()));
105 PrintSelectionList();
109 //_____________________________________________________________________________
110 void AliCDBStorage::AddSelection(const AliCDBId& selection) {
111 // add a selection criterion
113 AliCDBPath path = selection.GetPath();
114 if(!path.IsValid()) return;
116 TIter iter(&fSelections);
117 const AliCDBId *anId;
118 while((anId = (AliCDBId*) iter.Next())){
119 if(selection.Comprises(*anId)){
120 AliWarning("This selection is more general than a previous one and will hide it!");
121 AliWarning(Form("%s", (anId->ToString()).Data()));
122 fSelections.AddBefore(anId, new AliCDBId(selection));
127 fSelections.AddFirst(new AliCDBId(selection));
130 //_____________________________________________________________________________
131 void AliCDBStorage::AddSelection(const AliCDBPath& path,
132 const AliCDBRunRange& runRange, Int_t version, Int_t subVersion){
133 // add a selection criterion
135 AddSelection(AliCDBId(path, runRange, version, subVersion));
138 //_____________________________________________________________________________
139 void AliCDBStorage::AddSelection(const AliCDBPath& path,
140 Int_t firstRun, Int_t lastRun, Int_t version, Int_t subVersion){
141 // add a selection criterion
143 AddSelection(AliCDBId(path, firstRun, lastRun, version, subVersion));
146 //_____________________________________________________________________________
147 void AliCDBStorage::RemoveSelection(const AliCDBId& selection) {
148 // remove a selection criterion
150 TIter iter(&fSelections);
151 AliCDBId* aSelection;
153 while ((aSelection = (AliCDBId*) iter.Next())) {
154 if (selection.Comprises(*aSelection)) {
155 fSelections.Remove(aSelection);
160 //_____________________________________________________________________________
161 void AliCDBStorage::RemoveSelection(const AliCDBPath& path,
162 const AliCDBRunRange& runRange){
163 // remove a selection criterion
165 RemoveSelection(AliCDBId(path, runRange, -1, -1));
168 //_____________________________________________________________________________
169 void AliCDBStorage::RemoveSelection(const AliCDBPath& path,
170 Int_t firstRun, Int_t lastRun){
171 // remove a selection criterion
173 RemoveSelection(AliCDBId(path, firstRun, lastRun, -1, -1));
176 //_____________________________________________________________________________
177 void AliCDBStorage::RemoveSelection(int position){
178 // remove a selection criterion from its position in the list
180 delete fSelections.RemoveAt(position);
183 //_____________________________________________________________________________
184 void AliCDBStorage::RemoveAllSelections(){
185 // remove all selection criteria
190 //_____________________________________________________________________________
191 void AliCDBStorage::PrintSelectionList(){
192 // prints the list of selection criteria
194 TIter iter(&fSelections);
195 AliCDBId* aSelection;
197 // loop on the list of selection criteria
199 while ((aSelection = (AliCDBId*) iter.Next())) {
200 AliInfo(Form("index %d -> selection: %s",index++, aSelection->ToString().Data()));
205 //_____________________________________________________________________________
206 AliCDBEntry* AliCDBStorage::Get(const AliCDBId& query) {
207 // get an AliCDBEntry object from the database
209 // check if query's path and runRange are valid
210 // query is invalid also if version is not specified and subversion is!
211 if (!query.IsValid()) {
212 AliError(Form("Invalid query: %s", query.ToString().Data()));
216 // query is not specified if path contains wildcard or runrange = [-1,-1]
217 if (!query.IsSpecified()) {
218 AliError(Form("Unspecified query: %s",
219 query.ToString().Data()));
223 // This is needed otherwise TH1 objects (histos, TTree's) are lost when file is closed!
224 Bool_t oldStatus = TH1::AddDirectoryStatus();
225 TH1::AddDirectory(kFALSE);
227 AliCDBEntry* entry = GetEntry(query);
229 if (oldStatus != kFALSE)
230 TH1::AddDirectory(kTRUE);
232 // if drain storage is set, drain entry into drain storage
233 if(entry && (AliCDBManager::Instance())->IsDrainSet())
234 AliCDBManager::Instance()->Drain(entry);
239 //_____________________________________________________________________________
240 AliCDBEntry* AliCDBStorage::Get(const AliCDBPath& path, Int_t runNumber,
241 Int_t version, Int_t subVersion) {
242 // get an AliCDBEntry object from the database
244 return Get(AliCDBId(path, runNumber, runNumber, version, subVersion));
247 //_____________________________________________________________________________
248 AliCDBEntry* AliCDBStorage::Get(const AliCDBPath& path,
249 const AliCDBRunRange& runRange, Int_t version,
251 // get an AliCDBEntry object from the database
253 return Get(AliCDBId(path, runRange, version, subVersion));
256 //_____________________________________________________________________________
257 TList* AliCDBStorage::GetAll(const AliCDBId& query) {
258 // get multiple AliCDBEntry objects from the database
261 if (!query.IsValid()) {
262 AliError(Form("Invalid query: %s", query.ToString().Data()));
266 if (query.IsAnyRange()) {
267 AliError(Form("Unspecified run or runrange: %s",
268 query.ToString().Data()));
272 // This is needed otherwise TH1 objects (histos, TTree's) are lost when file is closed!
273 Bool_t oldStatus = TH1::AddDirectoryStatus();
274 TH1::AddDirectory(kFALSE);
276 TList *result = GetEntries(query);
278 if (oldStatus != kFALSE)
279 TH1::AddDirectory(kTRUE);
281 Int_t nEntries = result->GetEntries();
283 AliInfo(Form("%d objects retrieved. Request was: %s",
284 nEntries, query.ToString().Data()));
285 for(int i=0; i<nEntries;i++){
286 AliCDBEntry *entry = (AliCDBEntry*) result->At(i);
287 AliInfo(Form("%s",entry->GetId().ToString().Data()));
291 // if drain storage is set, drain entries into drain storage
292 if((AliCDBManager::Instance())->IsDrainSet()){
293 for(int i = 0; i<result->GetEntries(); i++){
294 AliCDBEntry* entry = (AliCDBEntry*) result->At(i);
295 AliCDBManager::Instance()->Drain(entry);
303 //_____________________________________________________________________________
304 TList* AliCDBStorage::GetAll(const AliCDBPath& path, Int_t runNumber,
305 Int_t version, Int_t subVersion) {
306 // get multiple AliCDBEntry objects from the database
308 return GetAll(AliCDBId(path, runNumber, runNumber, version,
312 //_____________________________________________________________________________
313 TList* AliCDBStorage::GetAll(const AliCDBPath& path,
314 const AliCDBRunRange& runRange, Int_t version, Int_t subVersion) {
315 // get multiple AliCDBEntry objects from the database
317 return GetAll(AliCDBId(path, runRange, version, subVersion));
320 //_____________________________________________________________________________
321 AliCDBId* AliCDBStorage::GetId(const AliCDBId& query) {
322 // get the Id of the valid object from the database (does not open the file)
324 // check if query's path and runRange are valid
325 // query is invalid also if version is not specified and subversion is!
326 if (!query.IsValid()) {
327 AliError(Form("Invalid query: %s", query.ToString().Data()));
331 // query is not specified if path contains wildcard or runrange = [-1,-1]
332 if (!query.IsSpecified()) {
333 AliError(Form("Unspecified query: %s",
334 query.ToString().Data()));
338 AliCDBId* id = GetEntryId(query);
343 //_____________________________________________________________________________
344 AliCDBId* AliCDBStorage::GetId(const AliCDBPath& path, Int_t runNumber,
345 Int_t version, Int_t subVersion) {
346 // get the Id of the valid object from the database (does not open the file)
348 return GetId(AliCDBId(path, runNumber, runNumber, version, subVersion));
351 //_____________________________________________________________________________
352 AliCDBId* AliCDBStorage::GetId(const AliCDBPath& path,
353 const AliCDBRunRange& runRange, Int_t version,
355 // get the Id of the valid object from the database (does not open the file)
357 return GetId(AliCDBId(path, runRange, version, subVersion));
360 //_____________________________________________________________________________
361 Bool_t AliCDBStorage::Put(TObject* object, AliCDBId& id, AliCDBMetaData* metaData, const char* mirrors, AliCDBManager::DataType type) {
362 // store an AliCDBEntry object into the database
365 AliError("Null Entry! No storage will be done!");
369 AliCDBEntry anEntry(object, id, metaData);
371 return Put(&anEntry, mirrors, type);
374 //_____________________________________________________________________________
375 Bool_t AliCDBStorage::Put(AliCDBEntry* entry, const char* mirrors, AliCDBManager::DataType type) {
376 // store an AliCDBEntry object into the database
379 AliError("No entry!");
383 if (entry->GetObject()==0x0){
384 AliError("No valid object in CDB entry!");
388 if (!entry->GetId().IsValid()) {
389 AliError(Form("Invalid entry ID: %s",
390 entry->GetId().ToString().Data()));
394 if (!entry->GetId().IsSpecified()) {
395 AliError(Form("Unspecified entry ID: %s",
396 entry->GetId().ToString().Data()));
400 AliCDBManager::DataType expectedType = GetDataType();
402 if(expectedType != AliCDBManager::kPrivate && type != expectedType) {
403 AliError(Form("It is forbidden to store %s data into a folder of type %s!",
404 AliCDBManager::GetDataTypeName(type),
405 AliCDBManager::GetDataTypeName(expectedType)));
410 TString strMirrors(mirrors);
411 if(!strMirrors.IsNull() && !strMirrors.IsWhitespace())
412 return PutEntry(entry, mirrors);
414 return PutEntry(entry);
417 //_____________________________________________________________________________
418 void AliCDBStorage::QueryCDB(Int_t run, const char* pathFilter,
419 Int_t version, AliCDBMetaData* md){
420 // query CDB for files valid for given run, and fill list fValidFileIds
421 // Actual query is done in virtual function QueryValidFiles()
422 // If version is not specified, the query will fill fValidFileIds
423 // with highest versions
427 fPathFilter = pathFilter;
428 if(!fPathFilter.IsValid()) {
429 AliError(Form("Filter not valid: %s", pathFilter));
436 AliInfo(Form("Querying files valid for run %d and path \"%s\" into CDB storage \"%s://%s\"",
437 fRun, pathFilter, fType.Data(), fBaseFolder.Data()));
439 // In fValidFileIds, clear id for the same 3level path, if any
440 AliDebug(3, Form("Clearing list of CDB Id's previously loaded for path \"%s\"", pathFilter));
441 AliCDBPath filter(pathFilter);
442 for (Int_t i=fValidFileIds.GetEntries()-1; i>=0; --i) {
443 AliCDBId *rmMe = dynamic_cast<AliCDBId*>(fValidFileIds.At(i));
444 AliCDBPath rmPath = rmMe->GetAliCDBPath();
445 if (filter.Comprises(rmPath)) {
446 AliDebug(3,Form("Removing id \"%s\" matching: \"%s\"", rmPath.GetPath().Data(), pathFilter));
447 delete fValidFileIds.RemoveAt(i);
451 if(fMetaDataFilter) {delete fMetaDataFilter; fMetaDataFilter=0;}
452 if(md) fMetaDataFilter = dynamic_cast<AliCDBMetaData*> (md->Clone());
456 AliInfo(Form("%d valid files found!", fValidFileIds.GetEntries()));
460 //_____________________________________________________________________________
461 void AliCDBStorage::PrintQueryCDB(){
462 // print parameters used to load list of CDB Id's (fRun, fPathFilter, fVersion)
464 AliCDBId paramId(fPathFilter, fRun, fRun, fVersion);
465 AliInfo(Form("**** QueryCDB Parameters **** \n\t<%s>\n",
466 paramId.ToString().Data()));
468 if(fMetaDataFilter) fMetaDataFilter->PrintMetaData();
471 TString message = "**** Id's of valid objects found *****\n";
472 TIter iter(&fValidFileIds);
475 // loop on the list of selection criteria
476 while ((anId = dynamic_cast<AliCDBId*>(iter.Next()))) {
477 message += Form("\t%s\n", anId->ToString().Data());
479 message += Form("\n\tTotal: %d objects found\n", fValidFileIds.GetEntriesFast());
480 AliInfo(Form("%s", message.Data()));
483 //_____________________________________________________________________________
484 AliCDBManager::DataType AliCDBStorage::GetDataType() const {
485 // returns the type of the data that should be stored into this storage:
486 // kConditions: conditions data; kReference: reference data; kPrivate: private (user-defined) data type
488 if(GetType() != "alien") return AliCDBManager::kPrivate;
490 TString condFolder = ((AliCDBGridParam*) AliCDBManager::Instance()->GetCondParam())->GetDBFolder();
491 TString refFolder = ((AliCDBGridParam*) AliCDBManager::Instance()->GetRefParam())->GetDBFolder();
493 if(GetBaseFolder().Contains(condFolder)) return AliCDBManager::kCondition;
494 if(GetBaseFolder().Contains(refFolder)) return AliCDBManager::kReference;
496 return AliCDBManager::kPrivate;
499 //_____________________________________________________________________________
500 void AliCDBStorage::SetMirrorSEs(const char* mirrors) {
501 // if the current storage is not of "alien" type, just issue a warning
502 // AliCDBGrid implements its own SetMirrorSEs method, classes for other storage types do not
504 TString storageType = GetType();
505 if(storageType != "alien"){
506 AliWarning(Form("The current storage is of type \"%s\". Setting of SEs to \"%s\" skipped!",storageType.Data(),mirrors));
509 AliError("We should never get here!! AliCDBGrid must have masked this virtual method!");
513 //_____________________________________________________________________________
514 const char* AliCDBStorage::GetMirrorSEs() const {
515 // if the current storage is not of "alien" type, just issue a warning
516 // AliCDBGrid implements its own GetMirrorSEs method, classes for other storage types do not
518 TString storageType = GetType();
519 if(storageType != "alien"){
520 AliWarning(Form("The current storage is of type \"%s\" and cannot handle SEs. Returning empty string!",storageType.Data()));
523 AliError("We should never get here!! AliCDBGrid must have masked this virtual method!");
527 //_____________________________________________________________________________
528 void AliCDBStorage::LoadTreeFromFile(AliCDBEntry *entry) const {
529 // Checks whether entry contains a TTree and in case loads it into memory
531 TObject *obj = (TObject*) entry->GetObject();
533 AliError("Cannot retrieve the object:");
534 entry->PrintMetaData();
538 if (!strcmp(obj->ClassName(),TTree::Class_Name())) {
540 AliWarning("Entry contains a TTree! Loading baskets...");
542 TTree* tree = dynamic_cast<TTree*> (obj);
547 tree->SetDirectory(0);
549 else if (!strcmp(obj->ClassName(),TNtuple::Class_Name())){
551 AliWarning("Entry contains a TNtuple! Loading baskets...");
553 TNtuple* ntu = dynamic_cast<TNtuple*> (obj);
558 ntu->SetDirectory(0);
564 // //_____________________________________________________________________________
565 // void AliCDBStorage::SetTreeToFile(AliCDBEntry *entry, TFile* file) const {
566 // // Checks whether entry contains a TTree and in case assigns it to memory
568 // AliCDBMetaData *md = dynamic_cast<AliCDBMetaData*> (entry->GetMetaData());
570 // TString objStr = md->GetObjectClassName();
571 // if(objStr != "TTree") return;
572 // AliWarning("Entry contains a TTree! Setting file...");
574 // TTree* tree = dynamic_cast<TTree*> (entry->GetObject());
578 // // tree->SetDirectory(file);
579 // tree->SetDirectory(0);