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>
33 ClassImp(AliOADBContainer);
35 //______________________________________________________________________________
36 AliOADBContainer::AliOADBContainer() :
38 fArray(new TObjArray(100)),
39 fDefaultList(new TList()),
46 AliOADBContainer::AliOADBContainer(char* name) :
47 TNamed(name, "OADBContainer"),
48 fArray(new TObjArray(100)),
49 fDefaultList(new TList()),
57 //______________________________________________________________________________
58 AliOADBContainer::~AliOADBContainer()
63 //______________________________________________________________________________
64 AliOADBContainer::AliOADBContainer(const AliOADBContainer& cont) :
67 fDefaultList(cont.fDefaultList),
68 fLowerLimits(cont.fLowerLimits),
69 fUpperLimits(cont.fUpperLimits),
70 fEntries(cont.fEntries)
75 //______________________________________________________________________________
76 AliOADBContainer& AliOADBContainer::operator=(const AliOADBContainer& cont)
78 // Assignment operator
80 TNamed::operator=(cont);
81 fEntries = cont.fEntries;
82 fLowerLimits.Set(fEntries);
83 fUpperLimits.Set(fEntries);
84 for (Int_t i = 0; i < fEntries; i++) {
85 fLowerLimits[i] = cont.fLowerLimits[i];
86 fUpperLimits[i] = cont.fUpperLimits[i];
87 fArray->AddAt(cont.fArray->At(i), i);
93 void AliOADBContainer::AppendObject(TObject* obj, Int_t lower, Int_t upper)
95 // Append a new object to the list
97 fLowerLimits.Set(fEntries);
98 fUpperLimits.Set(fEntries);
100 fLowerLimits[fEntries - 1] = lower;
101 fUpperLimits[fEntries - 1] = upper;
106 void AliOADBContainer::RemoveObject(Int_t idx)
108 // Remove object from the list
109 if (idx < 0 || idx >= fEntries)
111 AliError(Form("Index out of Range %5d >= %5d", idx, fEntries));
115 TObject* obj = fArray->RemoveAt(idx);
118 for (Int_t i = idx; i < (fEntries-1); i++) {
119 fLowerLimits[i] = fLowerLimits[i + 1];
120 fUpperLimits[i] = fUpperLimits[i + 1];
121 fArray->AddAt(fArray->At(i+1), i);
123 fArray->RemoveAt(fEntries - 1);
127 void AliOADBContainer::UpdateObject(Int_t idx, TObject* obj, Int_t lower, Int_t upper)
129 // Append a new object to the list
130 if (idx < 0 || idx >= fEntries)
132 AliError(Form("Index out of Range %5d >= %5d", idx, fEntries));
136 fLowerLimits[idx] = lower;
137 fUpperLimits[idx] = upper;
138 fArray->AddAt(obj, idx);
141 void AliOADBContainer::AddDefaultObject(TNamed* obj)
143 // Add a default object
144 fDefaultList->Add(obj);
147 void AliOADBContainer::CleanDefaultList()
149 // Clean default list
150 fDefaultList->Delete();
153 Int_t AliOADBContainer::GetIndexForRun(Int_t run) const
156 // Find the index for a given run
159 for (Int_t i = 0; i < fEntries; i++)
161 if (run >= fLowerLimits[i] && run <= fUpperLimits[i])
169 AliError(Form("More than one (%5d) object found; return last (%5d) !\n", found, index));
170 } else if (index == -1) {
171 AliWarning(Form("No object found for run %5d !\n", run));
177 TObject* AliOADBContainer::GetObject(Int_t run, char* def) const
179 // Return object for given run or default if not found
181 Int_t idx = GetIndexForRun(run);
183 // no object found, try default
184 obj = fDefaultList->FindObject(def);
186 AliError("Default Object not found !\n");
192 return (fArray->At(idx));
196 TObject* AliOADBContainer::GetObjectByIndex(Int_t run) const
198 // Return object for given index
199 return (fArray->At(run));
202 void AliOADBContainer::WriteToFile(char* fname) const
205 // Write object to file
206 TFile* f = new TFile(fname, "recreate");
211 Int_t AliOADBContainer::InitFromFile(char* fname, char* key)
214 // Initialize object from file
215 TFile* file = TFile::Open(fname);
216 if (!file) return (1);
217 AliOADBContainer* cont = 0;
218 file->GetObject(key, cont);
221 AliError("Object not found in file \n");
225 fEntries = cont->GetNumberOfEntries();
226 fLowerLimits.Set(fEntries);
227 fUpperLimits.Set(fEntries);
228 for (Int_t i = 0; i < fEntries; i++) {
229 fLowerLimits[i] = cont->LowerLimit(i);
230 fUpperLimits[i] = cont->UpperLimit(i);
231 fArray->AddAt(cont->GetObjectByIndex(i), i);
239 void AliOADBContainer::List()
243 for (Int_t i = 0; i < fEntries; i++) {
244 printf("Lower %5d Upper %5d \n", fLowerLimits[i], fUpperLimits[i]);
245 (fArray->At(i))->Dump();