1 /**************************************************************************
2 * Copyright(c) 1998-2007, 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 **************************************************************************/
18 //-------------------------------------------------------------------------
19 // Offline Analysis Database Container and Service Class
20 // Author: Andreas Morsch, CERN
21 //-------------------------------------------------------------------------
26 #include "AliOADBContainer.h"
28 #include <TObjArray.h>
34 ClassImp(AliOADBContainer);
36 //______________________________________________________________________________
37 AliOADBContainer::AliOADBContainer() :
45 // Default constructor
48 AliOADBContainer::AliOADBContainer(char* name) :
49 TNamed(name, "OADBContainer"),
50 fArray(new TObjArray(100)),
51 fDefaultList(new TList()),
60 //______________________________________________________________________________
61 AliOADBContainer::~AliOADBContainer()
66 //______________________________________________________________________________
67 AliOADBContainer::AliOADBContainer(const AliOADBContainer& cont) :
70 fDefaultList(cont.fDefaultList),
71 fLowerLimits(cont.fLowerLimits),
72 fUpperLimits(cont.fUpperLimits),
73 fEntries(cont.fEntries)
78 //______________________________________________________________________________
79 AliOADBContainer& AliOADBContainer::operator=(const AliOADBContainer& cont)
82 // Assignment operator
83 // Copy objects related to run ranges
85 TNamed::operator=(cont);
86 fEntries = cont.fEntries;
87 fLowerLimits.Set(fEntries);
88 fUpperLimits.Set(fEntries);
89 for (Int_t i = 0; i < fEntries; i++) {
90 fLowerLimits[i] = cont.fLowerLimits[i];
91 fUpperLimits[i] = cont.fUpperLimits[i];
92 fArray->AddAt(cont.fArray->At(i), i);
96 // Copy default objects
97 TList* list = cont.GetDefaultList();
100 while((obj = next())) fDefaultList->Add(obj);
105 void AliOADBContainer::AppendObject(TObject* obj, Int_t lower, Int_t upper)
108 // Append a new object to the list
110 // Check that there is no overlap with existing run ranges
111 Int_t index = HasOverlap(lower, upper);
114 AliFatal(Form("Ambiguos validity range (%5d, %5.5d-%5.5d) !\n", index,lower,upper));
120 fLowerLimits.Set(fEntries);
121 fUpperLimits.Set(fEntries);
124 fLowerLimits[fEntries - 1] = lower;
125 fUpperLimits[fEntries - 1] = upper;
129 void AliOADBContainer::RemoveObject(Int_t idx)
132 // Remove object from the list
135 // Check that index is inside range
136 if (idx < 0 || idx >= fEntries)
138 AliError(Form("Index out of Range %5d >= %5d", idx, fEntries));
143 TObject* obj = fArray->RemoveAt(idx);
146 // Adjust the run ranges and shrink the array
147 for (Int_t i = idx; i < (fEntries-1); i++) {
148 fLowerLimits[i] = fLowerLimits[i + 1];
149 fUpperLimits[i] = fUpperLimits[i + 1];
150 fArray->AddAt(fArray->At(i+1), i);
152 fArray->RemoveAt(fEntries - 1);
156 void AliOADBContainer::UpdateObject(Int_t idx, TObject* obj, Int_t lower, Int_t upper)
159 // Append a new object to the list
161 // Check that index is inside range
162 if (idx < 0 || idx >= fEntries)
164 AliError(Form("Index out of Range %5d >= %5d", idx, fEntries));
168 // Remove the old object
171 // Check that there is no overlap with existing run ranges
172 Int_t index = HasOverlap(lower, upper);
174 AliFatal(Form("Ambiguos validity range (%5d) !\n", index));
179 fLowerLimits[idx] = lower;
180 fUpperLimits[idx] = upper;
181 fArray->AddAt(obj, idx);
185 void AliOADBContainer::AddDefaultObject(TObject* obj)
187 // Add a default object
188 fDefaultList->Add(obj);
191 void AliOADBContainer::CleanDefaultList()
193 // Clean default list
194 fDefaultList->Delete();
197 Int_t AliOADBContainer::GetIndexForRun(Int_t run) const
200 // Find the index for a given run
203 for (Int_t i = 0; i < fEntries; i++)
205 if (run >= fLowerLimits[i] && run <= fUpperLimits[i])
213 AliError(Form("More than one (%5d) object found; return last (%5d) !\n", found, index));
214 } else if (index == -1) {
215 AliWarning(Form("No object found for run %5d !\n", run));
221 TObject* AliOADBContainer::GetObject(Int_t run, char* def) const
223 // Return object for given run or default if not found
225 Int_t idx = GetIndexForRun(run);
227 // no object found, try default
228 obj = fDefaultList->FindObject(def);
230 AliError("Default Object not found !\n");
236 return (fArray->At(idx));
240 TObject* AliOADBContainer::GetObjectByIndex(Int_t run) const
242 // Return object for given index
243 return (fArray->At(run));
246 void AliOADBContainer::WriteToFile(char* fname) const
249 // Write object to file
250 TFile* f = new TFile(fname, "update");
256 Int_t AliOADBContainer::InitFromFile(char* fname, char* key)
259 // Initialize object from file
260 TFile* file = TFile::Open(fname);
261 if (!file) return (1);
262 AliOADBContainer* cont = 0;
263 file->GetObject(key, cont);
266 AliError("Object not found in file \n");
270 SetName(cont->GetName());
271 SetTitle(cont->GetTitle());
273 fEntries = cont->GetNumberOfEntries();
274 fLowerLimits.Set(fEntries);
275 fUpperLimits.Set(fEntries);
276 for (Int_t i = 0; i < fEntries; i++) {
277 fLowerLimits[i] = cont->LowerLimit(i);
278 fUpperLimits[i] = cont->UpperLimit(i);
279 fArray->AddAt(cont->GetObjectByIndex(i), i);
281 if (!fDefaultList) fDefaultList = new TList();
282 TIter next(cont->GetDefaultList());
284 while((obj = next())) fDefaultList->Add(obj);
291 void AliOADBContainer::List()
295 for (Int_t i = 0; i < fEntries; i++) {
296 printf("Lower %5d Upper %5d \n", fLowerLimits[i], fUpperLimits[i]);
297 (fArray->At(i))->Dump();
299 TIter next(fDefaultList);
301 while((obj = next())) obj->Dump();
305 Int_t AliOADBContainer::HasOverlap(Int_t lower, Int_t upper) const
308 // Checks for overlpapping validity regions
309 for (Int_t i = 0; i < fEntries; i++) {
310 if ((lower >= fLowerLimits[i] && lower <= fUpperLimits[i]) ||
311 (upper >= fLowerLimits[i] && upper <= fUpperLimits[i]))
319 void AliOADBContainer::Browse(TBrowser *b)
321 // Browse this object.
322 // If b=0, there is no Browse call TObject::Browse(0) instead.
323 // This means TObject::Inspect() will be invoked indirectly
327 for (Int_t i = 0; i < fEntries; i++) {
328 b->Add(fArray->At(i),Form("%9.9d - %9.9d", fLowerLimits[i], fUpperLimits[i]));
330 TIter next(fDefaultList);
332 while((obj = next())) b->Add(obj);