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():
43 fValidFileIds.SetOwner(1);
44 fSelections.SetOwner(1);
47 //_____________________________________________________________________________
48 AliCDBStorage::~AliCDBStorage() {
51 RemoveAllSelections();
52 fValidFileIds.Clear();
53 delete fMetaDataFilter;
57 //_____________________________________________________________________________
58 void AliCDBStorage::GetSelection(/*const*/ AliCDBId* id) {
59 // return required version and subversion from the list of selection criteria
61 TIter iter(&fSelections);
64 // loop on the list of selection criteria
65 while ((aSelection = (AliCDBId*) iter.Next())) {
66 // check if selection element contains id's path and run (range)
67 if (aSelection->Comprises(*id)) {
68 AliDebug(2,Form("Using selection criterion: %s ", aSelection->ToString().Data()));
69 // return required version and subversion
71 id->SetVersion(aSelection->GetVersion());
72 id->SetSubVersion(aSelection->GetSubVersion());
77 // no valid element is found in the list of selection criteria -> return
78 AliDebug(2,"Looking for objects with most recent version");
82 //_____________________________________________________________________________
83 void AliCDBStorage::ReadSelectionFromFile(const char *fileName){
84 // read selection criteria list from file
86 RemoveAllSelections();
88 TList *list = GetIdListFromFile(fileName);
92 Int_t nId = list->GetEntries();
96 for(int i=nId-1;i>=0;i--){
97 key = (TKey*) list->At(i);
98 id = (AliCDBId*) key->ReadObj();
99 if(id) AddSelection(*id);
102 AliInfo(Form("Selection criteria list filled with %d entries",fSelections.GetEntries()));
103 PrintSelectionList();
107 //_____________________________________________________________________________
108 void AliCDBStorage::AddSelection(const AliCDBId& selection) {
109 // add a selection criterion
111 AliCDBPath path = selection.GetPath();
112 if(!path.IsValid()) return;
114 TIter iter(&fSelections);
115 const AliCDBId *anId;
116 while((anId = (AliCDBId*) iter.Next())){
117 if(selection.Comprises(*anId)){
118 AliWarning("This selection is more general than a previous one and will hide it!");
119 AliWarning(Form("%s", (anId->ToString()).Data()));
120 fSelections.AddBefore(anId, new AliCDBId(selection));
125 fSelections.AddFirst(new AliCDBId(selection));
128 //_____________________________________________________________________________
129 void AliCDBStorage::AddSelection(const AliCDBPath& path,
130 const AliCDBRunRange& runRange, Int_t version, Int_t subVersion){
131 // add a selection criterion
133 AddSelection(AliCDBId(path, runRange, version, subVersion));
136 //_____________________________________________________________________________
137 void AliCDBStorage::AddSelection(const AliCDBPath& path,
138 Int_t firstRun, Int_t lastRun, Int_t version, Int_t subVersion){
139 // add a selection criterion
141 AddSelection(AliCDBId(path, firstRun, lastRun, version, subVersion));
144 //_____________________________________________________________________________
145 void AliCDBStorage::RemoveSelection(const AliCDBId& selection) {
146 // remove a selection criterion
148 TIter iter(&fSelections);
149 AliCDBId* aSelection;
151 while ((aSelection = (AliCDBId*) iter.Next())) {
152 if (selection.Comprises(*aSelection)) {
153 fSelections.Remove(aSelection);
158 //_____________________________________________________________________________
159 void AliCDBStorage::RemoveSelection(const AliCDBPath& path,
160 const AliCDBRunRange& runRange){
161 // remove a selection criterion
163 RemoveSelection(AliCDBId(path, runRange, -1, -1));
166 //_____________________________________________________________________________
167 void AliCDBStorage::RemoveSelection(const AliCDBPath& path,
168 Int_t firstRun, Int_t lastRun){
169 // remove a selection criterion
171 RemoveSelection(AliCDBId(path, firstRun, lastRun, -1, -1));
174 //_____________________________________________________________________________
175 void AliCDBStorage::RemoveSelection(int position){
176 // remove a selection criterion from its position in the list
178 delete fSelections.RemoveAt(position);
181 //_____________________________________________________________________________
182 void AliCDBStorage::RemoveAllSelections(){
183 // remove all selection criteria
188 //_____________________________________________________________________________
189 void AliCDBStorage::PrintSelectionList(){
190 // prints the list of selection criteria
192 TIter iter(&fSelections);
193 AliCDBId* aSelection;
195 // loop on the list of selection criteria
197 while ((aSelection = (AliCDBId*) iter.Next())) {
198 AliInfo(Form("index %d -> selection: %s",index++, aSelection->ToString().Data()));
203 //_____________________________________________________________________________
204 AliCDBEntry* AliCDBStorage::Get(const AliCDBId& query) {
205 // get an AliCDBEntry object from the database
207 // check if query's path and runRange are valid
208 // query is invalid also if version is not specified and subversion is!
209 if (!query.IsValid()) {
210 AliError(Form("Invalid query: %s", query.ToString().Data()));
214 // query is not specified if path contains wildcard or runrange = [-1,-1]
215 if (!query.IsSpecified()) {
216 AliError(Form("Unspecified query: %s",
217 query.ToString().Data()));
221 // This is needed otherwise TH1 objects (histos, TTree's) are lost when file is closed!
222 Bool_t oldStatus = TH1::AddDirectoryStatus();
223 TH1::AddDirectory(kFALSE);
225 AliCDBEntry* entry = GetEntry(query);
227 if (oldStatus != kFALSE)
228 TH1::AddDirectory(kTRUE);
231 // this is to make the SHUTTLE output lighter
232 if(!(query.GetPath().Contains("SHUTTLE/STATUS")))
233 AliDebug(2, Form("CDB object retrieved: %s", entry->GetId().ToString().Data()));
235 // this is to make the SHUTTLE output lighter
236 if(!(query.GetPath().Contains("SHUTTLE/STATUS"))){
238 if(!(query.GetPath().Contains("SHUTTLE"))){
239 AliFatal(Form("No valid CDB object found! request was: %s", query.ToString().Data()));
242 AliInfo(Form("No valid CDB object found! request was: %s", query.ToString().Data()));
247 // if drain storage is set, drain entry into drain storage
248 if(entry && (AliCDBManager::Instance())->IsDrainSet())
249 AliCDBManager::Instance()->Drain(entry);
254 //_____________________________________________________________________________
255 AliCDBEntry* AliCDBStorage::Get(const AliCDBPath& path, Int_t runNumber,
256 Int_t version, Int_t subVersion) {
257 // get an AliCDBEntry object from the database
259 return Get(AliCDBId(path, runNumber, runNumber, version, subVersion));
262 //_____________________________________________________________________________
263 AliCDBEntry* AliCDBStorage::Get(const AliCDBPath& path,
264 const AliCDBRunRange& runRange, Int_t version,
266 // get an AliCDBEntry object from the database
268 return Get(AliCDBId(path, runRange, version, subVersion));
271 //_____________________________________________________________________________
272 TList* AliCDBStorage::GetAll(const AliCDBId& query) {
273 // get multiple AliCDBEntry objects from the database
276 if (!query.IsValid()) {
277 AliError(Form("Invalid query: %s", query.ToString().Data()));
281 if (query.IsAnyRange()) {
282 AliError(Form("Unspecified run or runrange: %s",
283 query.ToString().Data()));
287 // This is needed otherwise TH1 objects (histos, TTree's) are lost when file is closed!
288 Bool_t oldStatus = TH1::AddDirectoryStatus();
289 TH1::AddDirectory(kFALSE);
291 TList *result = GetEntries(query);
293 if (oldStatus != kFALSE)
294 TH1::AddDirectory(kTRUE);
296 Int_t nEntries = result->GetEntries();
298 AliInfo(Form("%d objects retrieved. Request was: %s",
299 nEntries, query.ToString().Data()));
300 for(int i=0; i<nEntries;i++){
301 AliCDBEntry *entry = (AliCDBEntry*) result->At(i);
302 AliInfo(Form("%s",entry->GetId().ToString().Data()));
306 // if drain storage is set, drain entries into drain storage
307 if((AliCDBManager::Instance())->IsDrainSet()){
308 for(int i = 0; i<result->GetEntries(); i++){
309 AliCDBEntry* entry = (AliCDBEntry*) result->At(i);
310 AliCDBManager::Instance()->Drain(entry);
318 //_____________________________________________________________________________
319 TList* AliCDBStorage::GetAll(const AliCDBPath& path, Int_t runNumber,
320 Int_t version, Int_t subVersion) {
321 // get multiple AliCDBEntry objects from the database
323 return GetAll(AliCDBId(path, runNumber, runNumber, version,
327 //_____________________________________________________________________________
328 TList* AliCDBStorage::GetAll(const AliCDBPath& path,
329 const AliCDBRunRange& runRange, Int_t version, Int_t subVersion) {
330 // get multiple AliCDBEntry objects from the database
332 return GetAll(AliCDBId(path, runRange, version, subVersion));
335 //_____________________________________________________________________________
336 AliCDBId* AliCDBStorage::GetId(const AliCDBId& query) {
337 // get the Id of the valid object from the database (does not open the file)
339 // check if query's path and runRange are valid
340 // query is invalid also if version is not specified and subversion is!
341 if (!query.IsValid()) {
342 AliError(Form("Invalid query: %s", query.ToString().Data()));
346 // query is not specified if path contains wildcard or runrange = [-1,-1]
347 if (!query.IsSpecified()) {
348 AliError(Form("Unspecified query: %s",
349 query.ToString().Data()));
353 AliCDBId* id = GetEntryId(query);
358 //_____________________________________________________________________________
359 AliCDBId* AliCDBStorage::GetId(const AliCDBPath& path, Int_t runNumber,
360 Int_t version, Int_t subVersion) {
361 // get the Id of the valid object from the database (does not open the file)
363 return GetId(AliCDBId(path, runNumber, runNumber, version, subVersion));
366 //_____________________________________________________________________________
367 AliCDBId* AliCDBStorage::GetId(const AliCDBPath& path,
368 const AliCDBRunRange& runRange, Int_t version,
370 // get the Id of the valid object from the database (does not open the file)
372 return GetId(AliCDBId(path, runRange, version, subVersion));
375 //_____________________________________________________________________________
376 Bool_t AliCDBStorage::Put(TObject* object, AliCDBId& id, AliCDBMetaData* metaData, AliCDBManager::DataType type) {
377 // store an AliCDBEntry object into the database
380 AliError("Null Entry! No storage will be done!");
384 AliCDBEntry anEntry(object, id, metaData);
386 return Put(&anEntry, type);
389 //_____________________________________________________________________________
390 Bool_t AliCDBStorage::Put(AliCDBEntry* entry, AliCDBManager::DataType type) {
391 // store an AliCDBEntry object into the database
394 AliError("No entry!");
398 if (entry->GetObject()==0x0){
399 AliError("No valid object in CDB entry!");
403 if (!entry->GetId().IsValid()) {
404 AliError(Form("Invalid entry ID: %s",
405 entry->GetId().ToString().Data()));
409 if (!entry->GetId().IsSpecified()) {
410 AliError(Form("Unspecified entry ID: %s",
411 entry->GetId().ToString().Data()));
415 AliCDBManager::DataType expectedType = GetDataType();
417 if(expectedType != AliCDBManager::kPrivate && type != expectedType) {
418 AliError(Form("It is forbidden to store %s data into a folder of type %s!",
419 AliCDBManager::GetDataTypeName(type),
420 AliCDBManager::GetDataTypeName(expectedType)));
424 return PutEntry(entry);
427 //_____________________________________________________________________________
428 void AliCDBStorage::QueryCDB(Int_t run, const char* pathFilter,
429 Int_t version, AliCDBMetaData* md){
430 // query CDB for files valid for given run, and fill list fValidFileIds
431 // Actual query is done in virtual function QueryValidFiles()
435 fPathFilter = pathFilter;
436 if(!fPathFilter.IsValid()) {
437 AliError(Form("Filter not valid: %s", pathFilter));
444 AliInfo(Form("Querying files valid for run %d and path \"%s\" into CDB storage \"%s://%s\"",
445 fRun, pathFilter, fType.Data(), fBaseFolder.Data()));
447 // Clear fValidFileIds list (it cannot be filled twice!
448 AliDebug(2, "Clearing list of CDB Id's previously loaded");
449 fValidFileIds.Clear();
451 if(fMetaDataFilter) {delete fMetaDataFilter; fMetaDataFilter=0;}
452 if(md) fMetaDataFilter = dynamic_cast<AliCDBMetaData*> (md->Clone());
456 AliInfo(Form("%d valid files found!", fValidFileIds.GetEntriesFast()));
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::LoadTreeFromFile(AliCDBEntry *entry) const {
501 // Checks whether entry contains a TTree and in case loads it into memory
503 TObject *obj = (TObject*) entry->GetObject();
505 AliError("Cannot retrieve the object:");
506 entry->PrintMetaData();
510 if (!strcmp(obj->ClassName(),TTree::Class_Name())) {
512 AliWarning("Entry contains a TTree! Loading baskets...");
514 TTree* tree = dynamic_cast<TTree*> (obj);
519 tree->SetDirectory(0);
521 else if (!strcmp(obj->ClassName(),TNtuple::Class_Name())){
523 AliWarning("Entry contains a TNtuple! Loading baskets...");
525 TNtuple* ntu = dynamic_cast<TNtuple*> (obj);
530 ntu->SetDirectory(0);
536 // //_____________________________________________________________________________
537 // void AliCDBStorage::SetTreeToFile(AliCDBEntry *entry, TFile* file) const {
538 // // Checks whether entry contains a TTree and in case assigns it to memory
540 // AliCDBMetaData *md = dynamic_cast<AliCDBMetaData*> (entry->GetMetaData());
542 // TString objStr = md->GetObjectClassName();
543 // if(objStr != "TTree") return;
544 // AliWarning("Entry contains a TTree! Setting file...");
546 // TTree* tree = dynamic_cast<TTree*> (entry->GetObject());
550 // // tree->SetDirectory(file);
551 // tree->SetDirectory(0);