]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliCDBStorage.cxx
Updates (A. Toia)
[u/mrichter/AliRoot.git] / STEER / AliCDBStorage.cxx
CommitLineData
2c8628dd 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
b05400be 16#include <TKey.h>
02c4845e 17#include <TH1.h>
145f45a2 18#include <TTree.h>
ed343d5e 19#include <TNtuple.h>
145f45a2 20#include <TFile.h>
fe913d8f 21#include "AliCDBStorage.h"
b8ec52f6 22#include "AliCDBGrid.h"
2c8628dd 23
9e1ceb13 24#include "AliCDBEntry.h"
25#include "AliLog.h"
2c8628dd 26
fe913d8f 27ClassImp(AliCDBStorage)
2c8628dd 28
9e1ceb13 29//_____________________________________________________________________________
62032124 30AliCDBStorage::AliCDBStorage():
31fValidFileIds(),
32fRun(-1),
33fPathFilter(),
34fVersion(-1),
35fMetaDataFilter(0),
36fSelections(),
37fURI(),
38fType(),
39fBaseFolder()
40{
9e1ceb13 41// constructor
42
62032124 43 fValidFileIds.SetOwner(1);
9e1ceb13 44 fSelections.SetOwner(1);
45}
2c8628dd 46
9e1ceb13 47//_____________________________________________________________________________
48AliCDBStorage::~AliCDBStorage() {
49// destructor
2c8628dd 50
62032124 51 RemoveAllSelections();
52 fValidFileIds.Clear();
53 delete fMetaDataFilter;
54
9e1ceb13 55}
2c8628dd 56
57//_____________________________________________________________________________
4b5e0dce 58void AliCDBStorage::GetSelection(/*const*/ AliCDBId* id) {
0f678e35 59// return required version and subversion from the list of selection criteria
9e1ceb13 60
61 TIter iter(&fSelections);
62 AliCDBId* aSelection;
63
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)
4b5e0dce 67 if (aSelection->Comprises(*id)) {
b05400be 68 AliDebug(2,Form("Using selection criterion: %s ", aSelection->ToString().Data()));
9e1ceb13 69 // return required version and subversion
4b5e0dce 70
71 id->SetVersion(aSelection->GetVersion());
72 id->SetSubVersion(aSelection->GetSubVersion());
73 return;
9e1ceb13 74 }
75 }
76
77 // no valid element is found in the list of selection criteria -> return
b05400be 78 AliDebug(2,"Looking for objects with most recent version");
4b5e0dce 79 return;
2c8628dd 80}
81
b05400be 82//_____________________________________________________________________________
83void AliCDBStorage::ReadSelectionFromFile(const char *fileName){
84// read selection criteria list from file
85
86 RemoveAllSelections();
87
88 TList *list = GetIdListFromFile(fileName);
89 if(!list) return;
90
91 list->SetOwner();
92 Int_t nId = list->GetEntries();
93 AliCDBId *id;
94 TKey *key;
95
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);
100 }
101 delete list;
102 AliInfo(Form("Selection criteria list filled with %d entries",fSelections.GetEntries()));
103 PrintSelectionList();
104
105}
106
2c8628dd 107//_____________________________________________________________________________
9e1ceb13 108void AliCDBStorage::AddSelection(const AliCDBId& selection) {
109// add a selection criterion
110
111 AliCDBPath path = selection.GetPath();
112 if(!path.IsValid()) return;
113
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));
121 return;
122 }
123
124 }
125 fSelections.AddFirst(new AliCDBId(selection));
126}
2c8628dd 127
128//_____________________________________________________________________________
62032124 129void AliCDBStorage::AddSelection(const AliCDBPath& path,
9e1ceb13 130 const AliCDBRunRange& runRange, Int_t version, Int_t subVersion){
131// add a selection criterion
2c8628dd 132
9e1ceb13 133 AddSelection(AliCDBId(path, runRange, version, subVersion));
2c8628dd 134}
135
9e1ceb13 136//_____________________________________________________________________________
137void AliCDBStorage::AddSelection(const AliCDBPath& path,
138 Int_t firstRun, Int_t lastRun, Int_t version, Int_t subVersion){
139// add a selection criterion
140
141 AddSelection(AliCDBId(path, firstRun, lastRun, version, subVersion));
142}
2c8628dd 143
9e1ceb13 144//_____________________________________________________________________________
145void AliCDBStorage::RemoveSelection(const AliCDBId& selection) {
146// remove a selection criterion
2c8628dd 147
9e1ceb13 148 TIter iter(&fSelections);
149 AliCDBId* aSelection;
2c8628dd 150
9e1ceb13 151 while ((aSelection = (AliCDBId*) iter.Next())) {
152 if (selection.Comprises(*aSelection)) {
153 fSelections.Remove(aSelection);
154 }
155 }
156}
2c8628dd 157
9e1ceb13 158//_____________________________________________________________________________
159void AliCDBStorage::RemoveSelection(const AliCDBPath& path,
160 const AliCDBRunRange& runRange){
161// remove a selection criterion
2c8628dd 162
9e1ceb13 163 RemoveSelection(AliCDBId(path, runRange, -1, -1));
164}
f05209ee 165
9e1ceb13 166//_____________________________________________________________________________
167void AliCDBStorage::RemoveSelection(const AliCDBPath& path,
168 Int_t firstRun, Int_t lastRun){
169// remove a selection criterion
f05209ee 170
9e1ceb13 171 RemoveSelection(AliCDBId(path, firstRun, lastRun, -1, -1));
172}
f05209ee 173
9e1ceb13 174//_____________________________________________________________________________
eb0b1051 175void AliCDBStorage::RemoveSelection(int position){
9e1ceb13 176// remove a selection criterion from its position in the list
2c8628dd 177
62032124 178 delete fSelections.RemoveAt(position);
2c8628dd 179}
180
2c8628dd 181//_____________________________________________________________________________
9e1ceb13 182void AliCDBStorage::RemoveAllSelections(){
183// remove all selection criteria
2c8628dd 184
62032124 185 fSelections.Clear();
9e1ceb13 186}
fe913d8f 187
9e1ceb13 188//_____________________________________________________________________________
189void AliCDBStorage::PrintSelectionList(){
190// prints the list of selection criteria
191
192 TIter iter(&fSelections);
193 AliCDBId* aSelection;
62032124 194
9e1ceb13 195 // loop on the list of selection criteria
196 int index=0;
197 while ((aSelection = (AliCDBId*) iter.Next())) {
198 AliInfo(Form("index %d -> selection: %s",index++, aSelection->ToString().Data()));
199 }
fe913d8f 200
9e1ceb13 201}
fe913d8f 202
9e1ceb13 203//_____________________________________________________________________________
0f678e35 204AliCDBEntry* AliCDBStorage::Get(const AliCDBId& query) {
9e1ceb13 205// get an AliCDBEntry object from the database
4667c116 206
9e1ceb13 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()));
211 return NULL;
212 }
213
4667c116 214 // query is not specified if path contains wildcard or runrange = [-1,-1]
9e1ceb13 215 if (!query.IsSpecified()) {
4667c116 216 AliError(Form("Unspecified query: %s",
9e1ceb13 217 query.ToString().Data()));
218 return NULL;
219 }
62032124 220
02c4845e 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);
9e1ceb13 224
225 AliCDBEntry* entry = GetEntry(query);
02c4845e 226
227 if (oldStatus != kFALSE)
228 TH1::AddDirectory(kTRUE);
0f678e35 229
9e1ceb13 230 if (entry) {
62032124 231 // this is to make the SHUTTLE output lighter
232 if(!(query.GetPath().Contains("SHUTTLE/STATUS")))
b8ec52f6 233 AliDebug(2, Form("CDB object retrieved: %s", entry->GetId().ToString().Data()));
9e1ceb13 234 } else {
62032124 235 // this is to make the SHUTTLE output lighter
f6c857dc 236 if(!(query.GetPath().Contains("SHUTTLE/STATUS"))){
237
238 if(!(query.GetPath().Contains("SHUTTLE"))){
239 AliFatal(Form("No valid CDB object found! request was: %s", query.ToString().Data()));
240 }
241 else {
242 AliInfo(Form("No valid CDB object found! request was: %s", query.ToString().Data()));
243 }
b6102d21 244 }
9e1ceb13 245 }
0f678e35 246
9e1ceb13 247 // if drain storage is set, drain entry into drain storage
248 if(entry && (AliCDBManager::Instance())->IsDrainSet())
249 AliCDBManager::Instance()->Drain(entry);
0f678e35 250
9e1ceb13 251 return entry;
2c8628dd 252}
253
254//_____________________________________________________________________________
4667c116 255AliCDBEntry* AliCDBStorage::Get(const AliCDBPath& path, Int_t runNumber,
9e1ceb13 256 Int_t version, Int_t subVersion) {
257// get an AliCDBEntry object from the database
2c8628dd 258
9e1ceb13 259 return Get(AliCDBId(path, runNumber, runNumber, version, subVersion));
2c8628dd 260}
261
2c8628dd 262//_____________________________________________________________________________
4667c116 263AliCDBEntry* AliCDBStorage::Get(const AliCDBPath& path,
9e1ceb13 264 const AliCDBRunRange& runRange, Int_t version,
265 Int_t subVersion) {
266// get an AliCDBEntry object from the database
2c8628dd 267
9e1ceb13 268 return Get(AliCDBId(path, runRange, version, subVersion));
2c8628dd 269}
270
2c8628dd 271//_____________________________________________________________________________
9e1ceb13 272TList* AliCDBStorage::GetAll(const AliCDBId& query) {
273// get multiple AliCDBEntry objects from the database
274
275
276 if (!query.IsValid()) {
277 AliError(Form("Invalid query: %s", query.ToString().Data()));
278 return NULL;
279 }
280
281 if (query.IsAnyRange()) {
282 AliError(Form("Unspecified run or runrange: %s",
283 query.ToString().Data()));
284 return NULL;
285 }
286
02c4845e 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);
290
9e1ceb13 291 TList *result = GetEntries(query);
292
02c4845e 293 if (oldStatus != kFALSE)
294 TH1::AddDirectory(kTRUE);
295
9e1ceb13 296 Int_t nEntries = result->GetEntries();
b8ec52f6 297
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()));
9e1ceb13 303 }
304
b8ec52f6 305
9e1ceb13 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);
311 }
312 }
313
314
315 return result;
316}
2c8628dd 317
9e1ceb13 318//_____________________________________________________________________________
319TList* AliCDBStorage::GetAll(const AliCDBPath& path, Int_t runNumber,
320 Int_t version, Int_t subVersion) {
321// get multiple AliCDBEntry objects from the database
2c8628dd 322
9e1ceb13 323 return GetAll(AliCDBId(path, runNumber, runNumber, version,
324 subVersion));
2c8628dd 325}
326
2c8628dd 327//_____________________________________________________________________________
9e1ceb13 328TList* AliCDBStorage::GetAll(const AliCDBPath& path,
329 const AliCDBRunRange& runRange, Int_t version, Int_t subVersion) {
330// get multiple AliCDBEntry objects from the database
2c8628dd 331
9e1ceb13 332 return GetAll(AliCDBId(path, runRange, version, subVersion));
2c8628dd 333}
f05209ee 334
4667c116 335//_____________________________________________________________________________
336AliCDBId* AliCDBStorage::GetId(const AliCDBId& query) {
337// get the Id of the valid object from the database (does not open the file)
338
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()));
343 return NULL;
344 }
345
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()));
350 return NULL;
351 }
352
353 AliCDBId* id = GetEntryId(query);
354
355 return id;
356}
357
358//_____________________________________________________________________________
359AliCDBId* 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)
362
363 return GetId(AliCDBId(path, runNumber, runNumber, version, subVersion));
364}
365
366//_____________________________________________________________________________
367AliCDBId* AliCDBStorage::GetId(const AliCDBPath& path,
368 const AliCDBRunRange& runRange, Int_t version,
369 Int_t subVersion) {
370// get the Id of the valid object from the database (does not open the file)
371
372 return GetId(AliCDBId(path, runRange, version, subVersion));
373}
f05209ee 374
375//_____________________________________________________________________________
b8ec52f6 376Bool_t AliCDBStorage::Put(TObject* object, AliCDBId& id, AliCDBMetaData* metaData, AliCDBManager::DataType type) {
02c4845e 377// store an AliCDBEntry object into the database
9e1ceb13 378
968cfa08 379 if (object==0x0) {
380 AliError("Null Entry! No storage will be done!");
381 return kFALSE;
382 }
383
9e1ceb13 384 AliCDBEntry anEntry(object, id, metaData);
f05209ee 385
b8ec52f6 386 return Put(&anEntry, type);
387}
f05209ee 388
9e1ceb13 389//_____________________________________________________________________________
b8ec52f6 390Bool_t AliCDBStorage::Put(AliCDBEntry* entry, AliCDBManager::DataType type) {
02c4845e 391// store an AliCDBEntry object into the database
9e1ceb13 392
02c4845e 393 if (!entry){
394 AliError("No entry!");
395 return kFALSE;
396 }
397
968cfa08 398 if (entry->GetObject()==0x0){
399 AliError("No valid object in CDB entry!");
400 return kFALSE;
401 }
402
9e1ceb13 403 if (!entry->GetId().IsValid()) {
62032124 404 AliError(Form("Invalid entry ID: %s",
9e1ceb13 405 entry->GetId().ToString().Data()));
406 return kFALSE;
407 }
408
409 if (!entry->GetId().IsSpecified()) {
62032124 410 AliError(Form("Unspecified entry ID: %s",
9e1ceb13 411 entry->GetId().ToString().Data()));
412 return kFALSE;
413 }
414
b8ec52f6 415 AliCDBManager::DataType expectedType = GetDataType();
416
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)));
421 return 0;
422 }
423
9e1ceb13 424 return PutEntry(entry);
f05209ee 425}
fe913d8f 426
62032124 427//_____________________________________________________________________________
c3a7b59a 428void AliCDBStorage::QueryCDB(Int_t run, const char* pathFilter,
62032124 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()
432
433 fRun = run;
434
435 fPathFilter = pathFilter;
436 if(!fPathFilter.IsValid()) {
437 AliError(Form("Filter not valid: %s", pathFilter));
438 fPathFilter = "*";
439 return;
440 }
441
442 fVersion = version;
443
6dc56e97 444 AliInfo(Form("Querying files valid for run %d and path \"%s\" into CDB storage \"%s://%s\"",
445 fRun, pathFilter, fType.Data(), fBaseFolder.Data()));
446
62032124 447 // Clear fValidFileIds list (it cannot be filled twice!
448 AliDebug(2, "Clearing list of CDB Id's previously loaded");
449 fValidFileIds.Clear();
450
451 if(fMetaDataFilter) {delete fMetaDataFilter; fMetaDataFilter=0;}
452 if(md) fMetaDataFilter = dynamic_cast<AliCDBMetaData*> (md->Clone());
453
454 QueryValidFiles();
455
6dc56e97 456 AliInfo(Form("%d valid files found!", fValidFileIds.GetEntriesFast()));
62032124 457
458}
459
460//_____________________________________________________________________________
461void AliCDBStorage::PrintQueryCDB(){
462// print parameters used to load list of CDB Id's (fRun, fPathFilter, fVersion)
463
c3a7b59a 464 AliCDBId paramId(fPathFilter, fRun, fRun, fVersion);
465 AliInfo(Form("**** QueryCDB Parameters **** \n\t<%s>\n",
466 paramId.ToString().Data()));
467
468 if(fMetaDataFilter) fMetaDataFilter->PrintMetaData();
62032124 469
62032124 470
c3a7b59a 471 TString message = "**** Id's of valid objects found *****\n";
62032124 472 TIter iter(&fValidFileIds);
473 AliCDBId* anId=0;
474
475 // loop on the list of selection criteria
476 while ((anId = dynamic_cast<AliCDBId*>(iter.Next()))) {
c3a7b59a 477 message += Form("\t%s\n", anId->ToString().Data());
62032124 478 }
6dc56e97 479 message += Form("\n\tTotal: %d objects found\n", fValidFileIds.GetEntriesFast());
c3a7b59a 480 AliInfo(Form("%s", message.Data()));
62032124 481}
482
b8ec52f6 483//_____________________________________________________________________________
484AliCDBManager::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
487
488 if(GetType() != "alien") return AliCDBManager::kPrivate;
489
490 TString condFolder = ((AliCDBGridParam*) AliCDBManager::Instance()->GetCondParam())->GetDBFolder();
491 TString refFolder = ((AliCDBGridParam*) AliCDBManager::Instance()->GetRefParam())->GetDBFolder();
492
493 if(GetBaseFolder().Contains(condFolder)) return AliCDBManager::kCondition;
494 if(GetBaseFolder().Contains(refFolder)) return AliCDBManager::kReference;
495
496 return AliCDBManager::kPrivate;
497}
145f45a2 498
499//_____________________________________________________________________________
500void AliCDBStorage::LoadTreeFromFile(AliCDBEntry *entry) const {
501// Checks whether entry contains a TTree and in case loads it into memory
502
ed343d5e 503 TObject *obj = (TObject*) entry->GetObject();
0a9e4cc8 504 if (!obj) {
505 AliError("Cannot retrieve the object:");
506 entry->PrintMetaData();
507 return;
508 }
145f45a2 509
ed343d5e 510 if (!strcmp(obj->ClassName(),TTree::Class_Name())) {
145f45a2 511
ed343d5e 512 AliWarning("Entry contains a TTree! Loading baskets...");
145f45a2 513
ed343d5e 514 TTree* tree = dynamic_cast<TTree*> (obj);
145f45a2 515
ed343d5e 516 if(!tree) return;
145f45a2 517
ed343d5e 518 tree->LoadBaskets();
519 tree->SetDirectory(0);
520 }
521 else if (!strcmp(obj->ClassName(),TNtuple::Class_Name())){
145f45a2 522
ed343d5e 523 AliWarning("Entry contains a TNtuple! Loading baskets...");
145f45a2 524
ed343d5e 525 TNtuple* ntu = dynamic_cast<TNtuple*> (obj);
145f45a2 526
ed343d5e 527 if(!ntu) return;
145f45a2 528
ed343d5e 529 ntu->LoadBaskets();
530 ntu->SetDirectory(0);
531 }
145f45a2 532
533 return;
534}
ed343d5e 535
536// //_____________________________________________________________________________
537// void AliCDBStorage::SetTreeToFile(AliCDBEntry *entry, TFile* file) const {
538// // Checks whether entry contains a TTree and in case assigns it to memory
539//
540// AliCDBMetaData *md = dynamic_cast<AliCDBMetaData*> (entry->GetMetaData());
541// if(!md) return;
542// TString objStr = md->GetObjectClassName();
543// if(objStr != "TTree") return;
544// AliWarning("Entry contains a TTree! Setting file...");
545//
546// TTree* tree = dynamic_cast<TTree*> (entry->GetObject());
547//
548// if(!tree) return;
549//
550// // tree->SetDirectory(file);
551// tree->SetDirectory(0);
552//
553// return;
554// }