]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - STEER/AliCDBStorage.cxx
fix
[u/mrichter/AliRoot.git] / STEER / AliCDBStorage.cxx
... / ...
CommitLineData
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
16#include <TKey.h>
17#include <TH1.h>
18#include <TTree.h>
19#include <TNtuple.h>
20#include <TFile.h>
21#include "AliCDBStorage.h"
22#include "AliCDBGrid.h"
23
24#include "AliCDBEntry.h"
25#include "AliLog.h"
26
27ClassImp(AliCDBStorage)
28
29//_____________________________________________________________________________
30AliCDBStorage::AliCDBStorage():
31fValidFileIds(),
32fRun(-1),
33fPathFilter(),
34fVersion(-1),
35fMetaDataFilter(0),
36fSelections(),
37fURI(),
38fType(),
39fBaseFolder()
40{
41// constructor
42
43 fValidFileIds.SetOwner(1);
44 fSelections.SetOwner(1);
45}
46
47//_____________________________________________________________________________
48AliCDBStorage::~AliCDBStorage() {
49// destructor
50
51 RemoveAllSelections();
52 fValidFileIds.Clear();
53 delete fMetaDataFilter;
54
55}
56
57//_____________________________________________________________________________
58void AliCDBStorage::GetSelection(/*const*/ AliCDBId* id) {
59// return required version and subversion from the list of selection criteria
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)
67 if (aSelection->Comprises(*id)) {
68 AliDebug(2,Form("Using selection criterion: %s ", aSelection->ToString().Data()));
69 // return required version and subversion
70
71 id->SetVersion(aSelection->GetVersion());
72 id->SetSubVersion(aSelection->GetSubVersion());
73 return;
74 }
75 }
76
77 // no valid element is found in the list of selection criteria -> return
78 AliDebug(2,"Looking for objects with most recent version");
79 return;
80}
81
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
107//_____________________________________________________________________________
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}
127
128//_____________________________________________________________________________
129void AliCDBStorage::AddSelection(const AliCDBPath& path,
130 const AliCDBRunRange& runRange, Int_t version, Int_t subVersion){
131// add a selection criterion
132
133 AddSelection(AliCDBId(path, runRange, version, subVersion));
134}
135
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}
143
144//_____________________________________________________________________________
145void AliCDBStorage::RemoveSelection(const AliCDBId& selection) {
146// remove a selection criterion
147
148 TIter iter(&fSelections);
149 AliCDBId* aSelection;
150
151 while ((aSelection = (AliCDBId*) iter.Next())) {
152 if (selection.Comprises(*aSelection)) {
153 fSelections.Remove(aSelection);
154 }
155 }
156}
157
158//_____________________________________________________________________________
159void AliCDBStorage::RemoveSelection(const AliCDBPath& path,
160 const AliCDBRunRange& runRange){
161// remove a selection criterion
162
163 RemoveSelection(AliCDBId(path, runRange, -1, -1));
164}
165
166//_____________________________________________________________________________
167void AliCDBStorage::RemoveSelection(const AliCDBPath& path,
168 Int_t firstRun, Int_t lastRun){
169// remove a selection criterion
170
171 RemoveSelection(AliCDBId(path, firstRun, lastRun, -1, -1));
172}
173
174//_____________________________________________________________________________
175void AliCDBStorage::RemoveSelection(int position){
176// remove a selection criterion from its position in the list
177
178 delete fSelections.RemoveAt(position);
179}
180
181//_____________________________________________________________________________
182void AliCDBStorage::RemoveAllSelections(){
183// remove all selection criteria
184
185 fSelections.Clear();
186}
187
188//_____________________________________________________________________________
189void AliCDBStorage::PrintSelectionList(){
190// prints the list of selection criteria
191
192 TIter iter(&fSelections);
193 AliCDBId* aSelection;
194
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 }
200
201}
202
203//_____________________________________________________________________________
204AliCDBEntry* AliCDBStorage::Get(const AliCDBId& query) {
205// get an AliCDBEntry object from the database
206
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
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()));
218 return NULL;
219 }
220
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);
224
225 AliCDBEntry* entry = GetEntry(query);
226
227 if (oldStatus != kFALSE)
228 TH1::AddDirectory(kTRUE);
229
230 if (entry) {
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()));
234 } else {
235 // this is to make the SHUTTLE output lighter
236 if(!(query.GetPath().Contains("SHUTTLE/STATUS")))
237 AliInfo(Form("No valid CDB object found! request was: %s", query.ToString().Data()));
238 }
239
240 // if drain storage is set, drain entry into drain storage
241 if(entry && (AliCDBManager::Instance())->IsDrainSet())
242 AliCDBManager::Instance()->Drain(entry);
243
244 return entry;
245}
246
247//_____________________________________________________________________________
248AliCDBEntry* AliCDBStorage::Get(const AliCDBPath& path, Int_t runNumber,
249 Int_t version, Int_t subVersion) {
250// get an AliCDBEntry object from the database
251
252 return Get(AliCDBId(path, runNumber, runNumber, version, subVersion));
253}
254
255//_____________________________________________________________________________
256AliCDBEntry* AliCDBStorage::Get(const AliCDBPath& path,
257 const AliCDBRunRange& runRange, Int_t version,
258 Int_t subVersion) {
259// get an AliCDBEntry object from the database
260
261 return Get(AliCDBId(path, runRange, version, subVersion));
262}
263
264//_____________________________________________________________________________
265TList* AliCDBStorage::GetAll(const AliCDBId& query) {
266// get multiple AliCDBEntry objects from the database
267
268
269 if (!query.IsValid()) {
270 AliError(Form("Invalid query: %s", query.ToString().Data()));
271 return NULL;
272 }
273
274 if (query.IsAnyRange()) {
275 AliError(Form("Unspecified run or runrange: %s",
276 query.ToString().Data()));
277 return NULL;
278 }
279
280 // This is needed otherwise TH1 objects (histos, TTree's) are lost when file is closed!
281 Bool_t oldStatus = TH1::AddDirectoryStatus();
282 TH1::AddDirectory(kFALSE);
283
284 TList *result = GetEntries(query);
285
286 if (oldStatus != kFALSE)
287 TH1::AddDirectory(kTRUE);
288
289 Int_t nEntries = result->GetEntries();
290
291 AliInfo(Form("%d objects retrieved. Request was: %s",
292 nEntries, query.ToString().Data()));
293 for(int i=0; i<nEntries;i++){
294 AliCDBEntry *entry = (AliCDBEntry*) result->At(i);
295 AliInfo(Form("%s",entry->GetId().ToString().Data()));
296 }
297
298
299 // if drain storage is set, drain entries into drain storage
300 if((AliCDBManager::Instance())->IsDrainSet()){
301 for(int i = 0; i<result->GetEntries(); i++){
302 AliCDBEntry* entry = (AliCDBEntry*) result->At(i);
303 AliCDBManager::Instance()->Drain(entry);
304 }
305 }
306
307
308 return result;
309}
310
311//_____________________________________________________________________________
312TList* AliCDBStorage::GetAll(const AliCDBPath& path, Int_t runNumber,
313 Int_t version, Int_t subVersion) {
314// get multiple AliCDBEntry objects from the database
315
316 return GetAll(AliCDBId(path, runNumber, runNumber, version,
317 subVersion));
318}
319
320//_____________________________________________________________________________
321TList* AliCDBStorage::GetAll(const AliCDBPath& path,
322 const AliCDBRunRange& runRange, Int_t version, Int_t subVersion) {
323// get multiple AliCDBEntry objects from the database
324
325 return GetAll(AliCDBId(path, runRange, version, subVersion));
326}
327
328//_____________________________________________________________________________
329AliCDBId* AliCDBStorage::GetId(const AliCDBId& query) {
330// get the Id of the valid object from the database (does not open the file)
331
332 // check if query's path and runRange are valid
333 // query is invalid also if version is not specified and subversion is!
334 if (!query.IsValid()) {
335 AliError(Form("Invalid query: %s", query.ToString().Data()));
336 return NULL;
337 }
338
339 // query is not specified if path contains wildcard or runrange = [-1,-1]
340 if (!query.IsSpecified()) {
341 AliError(Form("Unspecified query: %s",
342 query.ToString().Data()));
343 return NULL;
344 }
345
346 AliCDBId* id = GetEntryId(query);
347
348 return id;
349}
350
351//_____________________________________________________________________________
352AliCDBId* AliCDBStorage::GetId(const AliCDBPath& path, Int_t runNumber,
353 Int_t version, Int_t subVersion) {
354// get the Id of the valid object from the database (does not open the file)
355
356 return GetId(AliCDBId(path, runNumber, runNumber, version, subVersion));
357}
358
359//_____________________________________________________________________________
360AliCDBId* AliCDBStorage::GetId(const AliCDBPath& path,
361 const AliCDBRunRange& runRange, Int_t version,
362 Int_t subVersion) {
363// get the Id of the valid object from the database (does not open the file)
364
365 return GetId(AliCDBId(path, runRange, version, subVersion));
366}
367
368//_____________________________________________________________________________
369Bool_t AliCDBStorage::Put(TObject* object, AliCDBId& id, AliCDBMetaData* metaData, AliCDBManager::DataType type) {
370// store an AliCDBEntry object into the database
371
372 if (object==0x0) {
373 AliError("Null Entry! No storage will be done!");
374 return kFALSE;
375 }
376
377 AliCDBEntry anEntry(object, id, metaData);
378
379 return Put(&anEntry, type);
380}
381
382//_____________________________________________________________________________
383Bool_t AliCDBStorage::Put(AliCDBEntry* entry, AliCDBManager::DataType type) {
384// store an AliCDBEntry object into the database
385
386 if (!entry){
387 AliError("No entry!");
388 return kFALSE;
389 }
390
391 if (entry->GetObject()==0x0){
392 AliError("No valid object in CDB entry!");
393 return kFALSE;
394 }
395
396 if (!entry->GetId().IsValid()) {
397 AliError(Form("Invalid entry ID: %s",
398 entry->GetId().ToString().Data()));
399 return kFALSE;
400 }
401
402 if (!entry->GetId().IsSpecified()) {
403 AliError(Form("Unspecified entry ID: %s",
404 entry->GetId().ToString().Data()));
405 return kFALSE;
406 }
407
408 AliCDBManager::DataType expectedType = GetDataType();
409
410 if(expectedType != AliCDBManager::kPrivate && type != expectedType) {
411 AliError(Form("It is forbidden to store %s data into a folder of type %s!",
412 AliCDBManager::GetDataTypeName(type),
413 AliCDBManager::GetDataTypeName(expectedType)));
414 return 0;
415 }
416
417 // set object's class name into metaData!
418 entry->GetMetaData()->SetObjectClassName(entry->GetObject()->ClassName());
419
420 return PutEntry(entry);
421}
422
423//_____________________________________________________________________________
424void AliCDBStorage::QueryCDB(Int_t run, const char* pathFilter,
425 Int_t version, AliCDBMetaData* md){
426// query CDB for files valid for given run, and fill list fValidFileIds
427// Actual query is done in virtual function QueryValidFiles()
428
429 fRun = run;
430
431 fPathFilter = pathFilter;
432 if(!fPathFilter.IsValid()) {
433 AliError(Form("Filter not valid: %s", pathFilter));
434 fPathFilter = "*";
435 return;
436 }
437
438 fVersion = version;
439
440 AliInfo(Form("Querying files valid for run %d and path \"%s\" into CDB storage \"%s://%s\"",
441 fRun, pathFilter, fType.Data(), fBaseFolder.Data()));
442
443 // Clear fValidFileIds list (it cannot be filled twice!
444 AliDebug(2, "Clearing list of CDB Id's previously loaded");
445 fValidFileIds.Clear();
446
447 if(fMetaDataFilter) {delete fMetaDataFilter; fMetaDataFilter=0;}
448 if(md) fMetaDataFilter = dynamic_cast<AliCDBMetaData*> (md->Clone());
449
450 QueryValidFiles();
451 AliCDBId queryId(pathFilter,run,run,version);
452
453 AliInfo(Form("%d valid files found!", fValidFileIds.GetEntriesFast()));
454
455}
456
457//_____________________________________________________________________________
458void AliCDBStorage::PrintQueryCDB(){
459// print parameters used to load list of CDB Id's (fRun, fPathFilter, fVersion)
460
461 AliCDBId paramId(fPathFilter, fRun, fRun, fVersion);
462 AliInfo(Form("**** QueryCDB Parameters **** \n\t<%s>\n",
463 paramId.ToString().Data()));
464
465 if(fMetaDataFilter) fMetaDataFilter->PrintMetaData();
466
467
468 TString message = "**** Id's of valid objects found *****\n";
469 TIter iter(&fValidFileIds);
470 AliCDBId* anId=0;
471
472 // loop on the list of selection criteria
473 while ((anId = dynamic_cast<AliCDBId*>(iter.Next()))) {
474 message += Form("\t%s\n", anId->ToString().Data());
475 }
476 message += Form("\n\tTotal: %d objects found\n", fValidFileIds.GetEntriesFast());
477 AliInfo(Form("%s", message.Data()));
478}
479
480//_____________________________________________________________________________
481AliCDBManager::DataType AliCDBStorage::GetDataType() const {
482// returns the type of the data that should be stored into this storage:
483// kConditions: conditions data; kReference: reference data; kPrivate: private (user-defined) data type
484
485 if(GetType() != "alien") return AliCDBManager::kPrivate;
486
487 TString condFolder = ((AliCDBGridParam*) AliCDBManager::Instance()->GetCondParam())->GetDBFolder();
488 TString refFolder = ((AliCDBGridParam*) AliCDBManager::Instance()->GetRefParam())->GetDBFolder();
489
490 if(GetBaseFolder().Contains(condFolder)) return AliCDBManager::kCondition;
491 if(GetBaseFolder().Contains(refFolder)) return AliCDBManager::kReference;
492
493 return AliCDBManager::kPrivate;
494}
495
496//_____________________________________________________________________________
497void AliCDBStorage::LoadTreeFromFile(AliCDBEntry *entry) const {
498// Checks whether entry contains a TTree and in case loads it into memory
499
500 TObject *obj = (TObject*) entry->GetObject();
501 if (!obj) {
502 AliError("Cannot retrieve the object:");
503 entry->PrintMetaData();
504 return;
505 }
506
507 if (!strcmp(obj->ClassName(),TTree::Class_Name())) {
508
509 AliWarning("Entry contains a TTree! Loading baskets...");
510
511 TTree* tree = dynamic_cast<TTree*> (obj);
512
513 if(!tree) return;
514
515 tree->LoadBaskets();
516 tree->SetDirectory(0);
517 }
518 else if (!strcmp(obj->ClassName(),TNtuple::Class_Name())){
519
520 AliWarning("Entry contains a TNtuple! Loading baskets...");
521
522 TNtuple* ntu = dynamic_cast<TNtuple*> (obj);
523
524 if(!ntu) return;
525
526 ntu->LoadBaskets();
527 ntu->SetDirectory(0);
528 }
529
530 return;
531}
532
533// //_____________________________________________________________________________
534// void AliCDBStorage::SetTreeToFile(AliCDBEntry *entry, TFile* file) const {
535// // Checks whether entry contains a TTree and in case assigns it to memory
536//
537// AliCDBMetaData *md = dynamic_cast<AliCDBMetaData*> (entry->GetMetaData());
538// if(!md) return;
539// TString objStr = md->GetObjectClassName();
540// if(objStr != "TTree") return;
541// AliWarning("Entry contains a TTree! Setting file...");
542//
543// TTree* tree = dynamic_cast<TTree*> (entry->GetObject());
544//
545// if(!tree) return;
546//
547// // tree->SetDirectory(file);
548// tree->SetDirectory(0);
549//
550// return;
551// }