ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

//-------------------------------------------------------------------------
//     Offline Analysis Database Container and Service Class 
//     Author: Andreas Morsch, CERN
//-------------------------------------------------------------------------

#include "AliOADBContainer.h"
#include "AliLog.h"
#include <TObjArray.h>
#include <TArrayI.h>
#include <TFile.h>
#include <TList.h>
#include <TBrowser.h>
#include <TSystem.h>
#include <TError.h>
#include <TROOT.h>
#include "TObjString.h"

ClassImp(AliOADBContainer);

//______________________________________________________________________________
AliOADBContainer::AliOADBContainer() : 
  TNamed(),
  fArray(0),
  fDefaultList(0),
  fPassNames(0),
  fLowerLimits(),
  fUpperLimits(),
  fEntries(0)
{
  // Default constructor
}

AliOADBContainer::AliOADBContainer(const char* name) : 
  TNamed(name, "OADBContainer"),
  fArray(new TObjArray(100)),
  fDefaultList(new TList()),
  fPassNames(new TObjArray(100)),
  fLowerLimits(),
  fUpperLimits(),
  fEntries(0)
{
  // Constructor
}


//______________________________________________________________________________
AliOADBContainer::~AliOADBContainer() 
{
  // destructor
  if (fArray)       delete fArray;
  if (fDefaultList) delete fDefaultList;
  if (fPassNames)   delete fPassNames;

}

//______________________________________________________________________________
AliOADBContainer::AliOADBContainer(const AliOADBContainer& cont) :
  TNamed(cont),
  fArray(cont.fArray),
  fDefaultList(cont.fDefaultList),
  fPassNames(cont.fPassNames),
  fLowerLimits(cont.fLowerLimits),
  fUpperLimits(cont.fUpperLimits),
  fEntries(cont.fEntries)
{
  // Copy constructor.
}

//______________________________________________________________________________
AliOADBContainer& AliOADBContainer::operator=(const AliOADBContainer& cont)
{
  //
  // Assignment operator
  // Copy objects related to run ranges
  if(this!=&cont) {
    TNamed::operator=(cont);
    fEntries = cont.fEntries;
    fLowerLimits.Set(fEntries);
    fUpperLimits.Set(fEntries);
    for (Int_t i = 0; i < fEntries; i++) {
	fLowerLimits[i] = cont.fLowerLimits[i]; 
	fUpperLimits[i] = cont.fUpperLimits[i];
	fArray->AddAt(cont.fArray->At(i), i);
	if (cont.fPassNames) if (cont.fPassNames->At(i)) fPassNames->AddAt(cont.fPassNames->At(i), i);
    }
  }
  //
  // Copy default objects
  TList* list = cont.GetDefaultList();
  TIter next(list);
  TObject* obj;
  while((obj = next())) fDefaultList->Add(obj);
  //
  return *this;
}

void AliOADBContainer::AppendObject(TObject* obj, Int_t lower, Int_t upper, TString passName)
{
  if (!fPassNames) { // create array of pass names for compatibility with old format
    fPassNames = new TObjArray(100);
    for (Int_t i=0;i<fArray->GetEntriesFast();i++) fPassNames->Add(new TObjString(""));
  }
  //
  // Append a new object to the list 
  //
  // Check that there is no overlap with existing run ranges
  Int_t index = HasOverlap(lower, upper, passName);
  
  if (index != -1) {
    AliFatal(Form("Ambiguos validity range (%5d, %5.5d-%5.5d) !\n", index,lower,upper));
    return;
  }
  //
  // Adjust arrays
  fEntries++;
  fLowerLimits.Set(fEntries);
  fUpperLimits.Set(fEntries);
  // Add the object
  fLowerLimits[fEntries - 1] = lower;
  fUpperLimits[fEntries - 1] = upper;
  fArray->Add(obj);
  fPassNames->Add(new TObjString(passName.Data()));
}

void AliOADBContainer::RemoveObject(Int_t idx)
{
  if (!fPassNames) { // create array of pass names for compatibility with old format
    fPassNames = new TObjArray(100);
    for (Int_t i=0;i<fArray->GetEntriesFast();i++) fPassNames->Add(new TObjString(""));
  }

  //
  // Remove object from the list 

  //
  // Check that index is inside range 
  if (idx < 0 || idx >= fEntries) 
    {
      AliError(Form("Index out of Range %5d >= %5d", idx, fEntries));
      return;
    }
  //
  // Remove the object
  TObject* obj = fArray->RemoveAt(idx);
  delete obj;

  TObject* pass = fPassNames->RemoveAt(idx);
  delete pass;
  //
  // Adjust the run ranges and shrink the array
  for (Int_t i = idx; i < (fEntries-1); i++) {
    fLowerLimits[i] = fLowerLimits[i + 1]; 
    fUpperLimits[i] = fUpperLimits[i + 1];
    fArray->AddAt(fArray->At(i+1), i);
    fPassNames->AddAt(fPassNames->At(i+1),i);
  }
  fArray->RemoveAt(fEntries - 1);
  fPassNames->RemoveAt(fEntries - 1);
  fEntries--;
}

void AliOADBContainer::UpdateObject(Int_t idx, TObject* obj, Int_t lower, Int_t upper, TString passName)
{
  //
  // Update an existing object, at a given position 

  // Check that index is inside range
  if (idx < 0 || idx >= fEntries) 
    {
      AliError(Form("Index out of Range %5d >= %5d", idx, fEntries));
      return;
    }
  //
  // Remove the old object and reset the range
  //  TObject* obj2 = 
  fArray->RemoveAt(idx);
  // don't delete it: if you are updating it may be pointing to the same location of obj...
  //  delete obj2;
  fLowerLimits[idx] = -1;
  fUpperLimits[idx] = -1;
  // Check that there is no overlap with existing run ranges  
  Int_t index = HasOverlap(lower, upper,passName);
  if (index != -1) {
    AliFatal(Form("Ambiguos validity range (%5d, %5.5d-%5.5d) !\n", index,lower,upper));
    return;
  }
  //
  // Add object at the same position
  //printf("idx %d obj %llx\n", idx, obj);
  fLowerLimits[idx] = lower;
  fUpperLimits[idx] = upper;
  TObjString* pass = (TObjString*) fPassNames->At(idx);
  pass->SetString(passName.Data());
  fArray->AddAt(obj, idx);

}
 
void  AliOADBContainer::AddDefaultObject(TObject* obj)
{
  // Add a default object
  fDefaultList->Add(obj);
}

void  AliOADBContainer::CleanDefaultList()
{
  // Clean default list
  fDefaultList->Delete();
}

Int_t AliOADBContainer::GetIndexForRun(Int_t run, TString passName) const
{
  //
  // Find the index for a given run 
  
  Int_t found = 0;
  Int_t index = -1;
  for (Int_t i = 0; i < fEntries; i++) 
    {
	if (fPassNames) if (fPassNames->At(i)) if (passName.CompareTo(fPassNames->At(i)->GetName())) continue;
	if (run >= fLowerLimits[i] && run <= fUpperLimits[i])
	{
	  found++;
	  index = i;
	}
    }

  if (found > 1) {
    AliError(Form("More than one (%5d) object found; return last (%5d) !\n", found, index));
  } else if (index == -1) {
    AliWarning(Form("No object (%s) found for run %5d !\n", GetName(), run));
  }
  
  return index;
}

TObject* AliOADBContainer::GetObject(Int_t run, const char* def, TString passName) const
{
  // Return object for given run or default if not found
  TObject* obj = 0;
  Int_t idx = GetIndexForRun(run,passName);
  if (idx == -1) idx = GetIndexForRun(run); // try default pass for this run range
  if (idx == -1) {
    // no object found, try default
    obj = fDefaultList->FindObject(def);
    if (!obj) {
      AliError(Form("Default Object (%s) not found !\n", GetName()));
      return (0);
    } else {
      return (obj);
    }
  } else {
    return (fArray->At(idx));
  }
}

TObject* AliOADBContainer::GetObjectByIndex(Int_t run) const
{
  // Return object for given index
  return (fArray->At(run));
}

TObject* AliOADBContainer::GetPassNameByIndex(Int_t idx) const
{
  // Return object for given index
  if (!fPassNames) return NULL; 
  return (fPassNames->At(idx));
}


void AliOADBContainer::WriteToFile(const char* fname) const
{
  //
  // Write object to file
  TFile* f = new TFile(fname, "update");
  Write();
  f->Purge();
  f->Close();
}

Int_t AliOADBContainer::InitFromFile(const char* fname, const char* key)
{
  //
  // Hans: See whether the file is already open
  //
  // For now print info
  printf("-----------------------------------------------\n");
  printf("D-InitFromFile for file: %s and key %s\n",fname,key);
  printf("D-List of already open files:\n");
  TIter nextFile(gROOT->GetListOfFiles());
  while (1) {
    TObject *obj = nextFile();
    if(!obj)break;
    printf("%s\n",obj->GetName());
  }
  printf("-----------------------------------------------\n");

  // Declare the file
  TFile* file(0);
  // Try to get the file from the list of already open files
  const TSeqCollection *listOfFiles(gROOT->GetListOfFiles());
  if(listOfFiles){
    file =dynamic_cast<TFile*> (listOfFiles->FindObject(fname));
  }
  if(file){
    printf("Success! File was already open!\n");
  }
  else{
    printf("Couldn't find file, opening it\n");
    file = TFile::Open(fname);
  }

    // Initialize object from file
    if (!file) return (1);
    AliOADBContainer* cont  = 0;
    file->GetObject(key, cont);
    if (!cont)
    {
      AliError(Form("Object (%s) not found in file \n", GetName()));	
	return 1;
    }

    SetName(cont->GetName());
    SetTitle(cont->GetTitle());

    fEntries = cont->GetNumberOfEntries();
    fLowerLimits.Set(fEntries);
    fUpperLimits.Set(fEntries);
    if(fEntries > fArray->GetSize()) fArray->Expand(fEntries);
    if (!fPassNames) fPassNames = new TObjArray(100);
    if(fEntries > fPassNames->GetSize()) fPassNames->Expand(fEntries);

    for (Int_t i = 0; i < fEntries; i++) {
	fLowerLimits[i] = cont->LowerLimit(i); 
	fUpperLimits[i] = cont->UpperLimit(i);
	fArray->AddAt(cont->GetObjectByIndex(i), i);
	TObject* passName = cont->GetPassNameByIndex(i);
	fPassNames->AddAt(passName ? passName : new TObjString(""), i);
    }
    if (!fDefaultList) fDefaultList = new TList(); 
    TIter next(cont->GetDefaultList());
    TObject* obj;
    while((obj = next())) fDefaultList->Add(obj);

    return 0;
    
}


void AliOADBContainer::List()
{
  //
  // List Objects
  printf("Entries %d\n", fEntries);
  
  for (Int_t i = 0; i < fEntries; i++) {
    printf("Lower %5d Upper %5d \n", fLowerLimits[i], fUpperLimits[i]);
    (fArray->At(i))->Dump();
  }
  TIter next(fDefaultList);
  TObject* obj;
  while((obj = next())) obj->Dump();

}

Int_t AliOADBContainer::HasOverlap(Int_t lower, Int_t upper, TString passName) const
{
  //
  // Checks for overlpapping validity regions
  for (Int_t i = 0; i < fEntries; i++) {
    if (fPassNames) if (fPassNames->At(i)) if (passName.CompareTo(fPassNames->At(i)->GetName())) continue;
    if ((lower >= fLowerLimits[i] && lower <= fUpperLimits[i]) ||
	(upper >= fLowerLimits[i] && upper <= fUpperLimits[i]))
      {
	return (i);
      }
  }
  return (-1);
}

void AliOADBContainer::Browse(TBrowser *b)
{
   // Browse this object.
   // If b=0, there is no Browse call TObject::Browse(0) instead.
   //         This means TObject::Inspect() will be invoked indirectly


  if (b) {
    for (Int_t i = 0; i < fEntries; i++) {
      TString pass = !fPassNames ? " - " : (fPassNames->At(i) ? Form(" - %s",fPassNames->At(i)->GetName()) : " - ");
      b->Add(fArray->At(i),Form("%9.9d - %9.9d%s", fLowerLimits[i], fUpperLimits[i],pass.CompareTo(" - ")? pass.Data() :""));
    }
    TIter next(fDefaultList);
    TObject* obj;
    while((obj = next())) b->Add(obj);
        
  }     
   else
      TObject::Browse(b);
}

//______________________________________________________________________________
const char* AliOADBContainer::GetOADBPath()
{
// returns the path of the OADB
// this static function just depends on environment variables

   static TString oadbPath;

   if (gSystem->Getenv("OADB_PATH"))
      oadbPath = gSystem->Getenv("OADB_PATH");
   else if (gSystem->Getenv("ALICE_ROOT"))
      oadbPath.Form("%s/OADB", gSystem->Getenv("ALICE_ROOT"));
   else
   ::Fatal("AliAnalysisManager::GetOADBPath", "Cannot figure out AODB path. Define ALICE_ROOT or OADB_PATH!");
   return oadbPath;
}
 AliOADBContainer.cxx:1
 AliOADBContainer.cxx:2
 AliOADBContainer.cxx:3
 AliOADBContainer.cxx:4
 AliOADBContainer.cxx:5
 AliOADBContainer.cxx:6
 AliOADBContainer.cxx:7
 AliOADBContainer.cxx:8
 AliOADBContainer.cxx:9
 AliOADBContainer.cxx:10
 AliOADBContainer.cxx:11
 AliOADBContainer.cxx:12
 AliOADBContainer.cxx:13
 AliOADBContainer.cxx:14
 AliOADBContainer.cxx:15
 AliOADBContainer.cxx:16
 AliOADBContainer.cxx:17
 AliOADBContainer.cxx:18
 AliOADBContainer.cxx:19
 AliOADBContainer.cxx:20
 AliOADBContainer.cxx:21
 AliOADBContainer.cxx:22
 AliOADBContainer.cxx:23
 AliOADBContainer.cxx:24
 AliOADBContainer.cxx:25
 AliOADBContainer.cxx:26
 AliOADBContainer.cxx:27
 AliOADBContainer.cxx:28
 AliOADBContainer.cxx:29
 AliOADBContainer.cxx:30
 AliOADBContainer.cxx:31
 AliOADBContainer.cxx:32
 AliOADBContainer.cxx:33
 AliOADBContainer.cxx:34
 AliOADBContainer.cxx:35
 AliOADBContainer.cxx:36
 AliOADBContainer.cxx:37
 AliOADBContainer.cxx:38
 AliOADBContainer.cxx:39
 AliOADBContainer.cxx:40
 AliOADBContainer.cxx:41
 AliOADBContainer.cxx:42
 AliOADBContainer.cxx:43
 AliOADBContainer.cxx:44
 AliOADBContainer.cxx:45
 AliOADBContainer.cxx:46
 AliOADBContainer.cxx:47
 AliOADBContainer.cxx:48
 AliOADBContainer.cxx:49
 AliOADBContainer.cxx:50
 AliOADBContainer.cxx:51
 AliOADBContainer.cxx:52
 AliOADBContainer.cxx:53
 AliOADBContainer.cxx:54
 AliOADBContainer.cxx:55
 AliOADBContainer.cxx:56
 AliOADBContainer.cxx:57
 AliOADBContainer.cxx:58
 AliOADBContainer.cxx:59
 AliOADBContainer.cxx:60
 AliOADBContainer.cxx:61
 AliOADBContainer.cxx:62
 AliOADBContainer.cxx:63
 AliOADBContainer.cxx:64
 AliOADBContainer.cxx:65
 AliOADBContainer.cxx:66
 AliOADBContainer.cxx:67
 AliOADBContainer.cxx:68
 AliOADBContainer.cxx:69
 AliOADBContainer.cxx:70
 AliOADBContainer.cxx:71
 AliOADBContainer.cxx:72
 AliOADBContainer.cxx:73
 AliOADBContainer.cxx:74
 AliOADBContainer.cxx:75
 AliOADBContainer.cxx:76
 AliOADBContainer.cxx:77
 AliOADBContainer.cxx:78
 AliOADBContainer.cxx:79
 AliOADBContainer.cxx:80
 AliOADBContainer.cxx:81
 AliOADBContainer.cxx:82
 AliOADBContainer.cxx:83
 AliOADBContainer.cxx:84
 AliOADBContainer.cxx:85
 AliOADBContainer.cxx:86
 AliOADBContainer.cxx:87
 AliOADBContainer.cxx:88
 AliOADBContainer.cxx:89
 AliOADBContainer.cxx:90
 AliOADBContainer.cxx:91
 AliOADBContainer.cxx:92
 AliOADBContainer.cxx:93
 AliOADBContainer.cxx:94
 AliOADBContainer.cxx:95
 AliOADBContainer.cxx:96
 AliOADBContainer.cxx:97
 AliOADBContainer.cxx:98
 AliOADBContainer.cxx:99
 AliOADBContainer.cxx:100
 AliOADBContainer.cxx:101
 AliOADBContainer.cxx:102
 AliOADBContainer.cxx:103
 AliOADBContainer.cxx:104
 AliOADBContainer.cxx:105
 AliOADBContainer.cxx:106
 AliOADBContainer.cxx:107
 AliOADBContainer.cxx:108
 AliOADBContainer.cxx:109
 AliOADBContainer.cxx:110
 AliOADBContainer.cxx:111
 AliOADBContainer.cxx:112
 AliOADBContainer.cxx:113
 AliOADBContainer.cxx:114
 AliOADBContainer.cxx:115
 AliOADBContainer.cxx:116
 AliOADBContainer.cxx:117
 AliOADBContainer.cxx:118
 AliOADBContainer.cxx:119
 AliOADBContainer.cxx:120
 AliOADBContainer.cxx:121
 AliOADBContainer.cxx:122
 AliOADBContainer.cxx:123
 AliOADBContainer.cxx:124
 AliOADBContainer.cxx:125
 AliOADBContainer.cxx:126
 AliOADBContainer.cxx:127
 AliOADBContainer.cxx:128
 AliOADBContainer.cxx:129
 AliOADBContainer.cxx:130
 AliOADBContainer.cxx:131
 AliOADBContainer.cxx:132
 AliOADBContainer.cxx:133
 AliOADBContainer.cxx:134
 AliOADBContainer.cxx:135
 AliOADBContainer.cxx:136
 AliOADBContainer.cxx:137
 AliOADBContainer.cxx:138
 AliOADBContainer.cxx:139
 AliOADBContainer.cxx:140
 AliOADBContainer.cxx:141
 AliOADBContainer.cxx:142
 AliOADBContainer.cxx:143
 AliOADBContainer.cxx:144
 AliOADBContainer.cxx:145
 AliOADBContainer.cxx:146
 AliOADBContainer.cxx:147
 AliOADBContainer.cxx:148
 AliOADBContainer.cxx:149
 AliOADBContainer.cxx:150
 AliOADBContainer.cxx:151
 AliOADBContainer.cxx:152
 AliOADBContainer.cxx:153
 AliOADBContainer.cxx:154
 AliOADBContainer.cxx:155
 AliOADBContainer.cxx:156
 AliOADBContainer.cxx:157
 AliOADBContainer.cxx:158
 AliOADBContainer.cxx:159
 AliOADBContainer.cxx:160
 AliOADBContainer.cxx:161
 AliOADBContainer.cxx:162
 AliOADBContainer.cxx:163
 AliOADBContainer.cxx:164
 AliOADBContainer.cxx:165
 AliOADBContainer.cxx:166
 AliOADBContainer.cxx:167
 AliOADBContainer.cxx:168
 AliOADBContainer.cxx:169
 AliOADBContainer.cxx:170
 AliOADBContainer.cxx:171
 AliOADBContainer.cxx:172
 AliOADBContainer.cxx:173
 AliOADBContainer.cxx:174
 AliOADBContainer.cxx:175
 AliOADBContainer.cxx:176
 AliOADBContainer.cxx:177
 AliOADBContainer.cxx:178
 AliOADBContainer.cxx:179
 AliOADBContainer.cxx:180
 AliOADBContainer.cxx:181
 AliOADBContainer.cxx:182
 AliOADBContainer.cxx:183
 AliOADBContainer.cxx:184
 AliOADBContainer.cxx:185
 AliOADBContainer.cxx:186
 AliOADBContainer.cxx:187
 AliOADBContainer.cxx:188
 AliOADBContainer.cxx:189
 AliOADBContainer.cxx:190
 AliOADBContainer.cxx:191
 AliOADBContainer.cxx:192
 AliOADBContainer.cxx:193
 AliOADBContainer.cxx:194
 AliOADBContainer.cxx:195
 AliOADBContainer.cxx:196
 AliOADBContainer.cxx:197
 AliOADBContainer.cxx:198
 AliOADBContainer.cxx:199
 AliOADBContainer.cxx:200
 AliOADBContainer.cxx:201
 AliOADBContainer.cxx:202
 AliOADBContainer.cxx:203
 AliOADBContainer.cxx:204
 AliOADBContainer.cxx:205
 AliOADBContainer.cxx:206
 AliOADBContainer.cxx:207
 AliOADBContainer.cxx:208
 AliOADBContainer.cxx:209
 AliOADBContainer.cxx:210
 AliOADBContainer.cxx:211
 AliOADBContainer.cxx:212
 AliOADBContainer.cxx:213
 AliOADBContainer.cxx:214
 AliOADBContainer.cxx:215
 AliOADBContainer.cxx:216
 AliOADBContainer.cxx:217
 AliOADBContainer.cxx:218
 AliOADBContainer.cxx:219
 AliOADBContainer.cxx:220
 AliOADBContainer.cxx:221
 AliOADBContainer.cxx:222
 AliOADBContainer.cxx:223
 AliOADBContainer.cxx:224
 AliOADBContainer.cxx:225
 AliOADBContainer.cxx:226
 AliOADBContainer.cxx:227
 AliOADBContainer.cxx:228
 AliOADBContainer.cxx:229
 AliOADBContainer.cxx:230
 AliOADBContainer.cxx:231
 AliOADBContainer.cxx:232
 AliOADBContainer.cxx:233
 AliOADBContainer.cxx:234
 AliOADBContainer.cxx:235
 AliOADBContainer.cxx:236
 AliOADBContainer.cxx:237
 AliOADBContainer.cxx:238
 AliOADBContainer.cxx:239
 AliOADBContainer.cxx:240
 AliOADBContainer.cxx:241
 AliOADBContainer.cxx:242
 AliOADBContainer.cxx:243
 AliOADBContainer.cxx:244
 AliOADBContainer.cxx:245
 AliOADBContainer.cxx:246
 AliOADBContainer.cxx:247
 AliOADBContainer.cxx:248
 AliOADBContainer.cxx:249
 AliOADBContainer.cxx:250
 AliOADBContainer.cxx:251
 AliOADBContainer.cxx:252
 AliOADBContainer.cxx:253
 AliOADBContainer.cxx:254
 AliOADBContainer.cxx:255
 AliOADBContainer.cxx:256
 AliOADBContainer.cxx:257
 AliOADBContainer.cxx:258
 AliOADBContainer.cxx:259
 AliOADBContainer.cxx:260
 AliOADBContainer.cxx:261
 AliOADBContainer.cxx:262
 AliOADBContainer.cxx:263
 AliOADBContainer.cxx:264
 AliOADBContainer.cxx:265
 AliOADBContainer.cxx:266
 AliOADBContainer.cxx:267
 AliOADBContainer.cxx:268
 AliOADBContainer.cxx:269
 AliOADBContainer.cxx:270
 AliOADBContainer.cxx:271
 AliOADBContainer.cxx:272
 AliOADBContainer.cxx:273
 AliOADBContainer.cxx:274
 AliOADBContainer.cxx:275
 AliOADBContainer.cxx:276
 AliOADBContainer.cxx:277
 AliOADBContainer.cxx:278
 AliOADBContainer.cxx:279
 AliOADBContainer.cxx:280
 AliOADBContainer.cxx:281
 AliOADBContainer.cxx:282
 AliOADBContainer.cxx:283
 AliOADBContainer.cxx:284
 AliOADBContainer.cxx:285
 AliOADBContainer.cxx:286
 AliOADBContainer.cxx:287
 AliOADBContainer.cxx:288
 AliOADBContainer.cxx:289
 AliOADBContainer.cxx:290
 AliOADBContainer.cxx:291
 AliOADBContainer.cxx:292
 AliOADBContainer.cxx:293
 AliOADBContainer.cxx:294
 AliOADBContainer.cxx:295
 AliOADBContainer.cxx:296
 AliOADBContainer.cxx:297
 AliOADBContainer.cxx:298
 AliOADBContainer.cxx:299
 AliOADBContainer.cxx:300
 AliOADBContainer.cxx:301
 AliOADBContainer.cxx:302
 AliOADBContainer.cxx:303
 AliOADBContainer.cxx:304
 AliOADBContainer.cxx:305
 AliOADBContainer.cxx:306
 AliOADBContainer.cxx:307
 AliOADBContainer.cxx:308
 AliOADBContainer.cxx:309
 AliOADBContainer.cxx:310
 AliOADBContainer.cxx:311
 AliOADBContainer.cxx:312
 AliOADBContainer.cxx:313
 AliOADBContainer.cxx:314
 AliOADBContainer.cxx:315
 AliOADBContainer.cxx:316
 AliOADBContainer.cxx:317
 AliOADBContainer.cxx:318
 AliOADBContainer.cxx:319
 AliOADBContainer.cxx:320
 AliOADBContainer.cxx:321
 AliOADBContainer.cxx:322
 AliOADBContainer.cxx:323
 AliOADBContainer.cxx:324
 AliOADBContainer.cxx:325
 AliOADBContainer.cxx:326
 AliOADBContainer.cxx:327
 AliOADBContainer.cxx:328
 AliOADBContainer.cxx:329
 AliOADBContainer.cxx:330
 AliOADBContainer.cxx:331
 AliOADBContainer.cxx:332
 AliOADBContainer.cxx:333
 AliOADBContainer.cxx:334
 AliOADBContainer.cxx:335
 AliOADBContainer.cxx:336
 AliOADBContainer.cxx:337
 AliOADBContainer.cxx:338
 AliOADBContainer.cxx:339
 AliOADBContainer.cxx:340
 AliOADBContainer.cxx:341
 AliOADBContainer.cxx:342
 AliOADBContainer.cxx:343
 AliOADBContainer.cxx:344
 AliOADBContainer.cxx:345
 AliOADBContainer.cxx:346
 AliOADBContainer.cxx:347
 AliOADBContainer.cxx:348
 AliOADBContainer.cxx:349
 AliOADBContainer.cxx:350
 AliOADBContainer.cxx:351
 AliOADBContainer.cxx:352
 AliOADBContainer.cxx:353
 AliOADBContainer.cxx:354
 AliOADBContainer.cxx:355
 AliOADBContainer.cxx:356
 AliOADBContainer.cxx:357
 AliOADBContainer.cxx:358
 AliOADBContainer.cxx:359
 AliOADBContainer.cxx:360
 AliOADBContainer.cxx:361
 AliOADBContainer.cxx:362
 AliOADBContainer.cxx:363
 AliOADBContainer.cxx:364
 AliOADBContainer.cxx:365
 AliOADBContainer.cxx:366
 AliOADBContainer.cxx:367
 AliOADBContainer.cxx:368
 AliOADBContainer.cxx:369
 AliOADBContainer.cxx:370
 AliOADBContainer.cxx:371
 AliOADBContainer.cxx:372
 AliOADBContainer.cxx:373
 AliOADBContainer.cxx:374
 AliOADBContainer.cxx:375
 AliOADBContainer.cxx:376
 AliOADBContainer.cxx:377
 AliOADBContainer.cxx:378
 AliOADBContainer.cxx:379
 AliOADBContainer.cxx:380
 AliOADBContainer.cxx:381
 AliOADBContainer.cxx:382
 AliOADBContainer.cxx:383
 AliOADBContainer.cxx:384
 AliOADBContainer.cxx:385
 AliOADBContainer.cxx:386
 AliOADBContainer.cxx:387
 AliOADBContainer.cxx:388
 AliOADBContainer.cxx:389
 AliOADBContainer.cxx:390
 AliOADBContainer.cxx:391
 AliOADBContainer.cxx:392
 AliOADBContainer.cxx:393
 AliOADBContainer.cxx:394
 AliOADBContainer.cxx:395
 AliOADBContainer.cxx:396
 AliOADBContainer.cxx:397
 AliOADBContainer.cxx:398
 AliOADBContainer.cxx:399
 AliOADBContainer.cxx:400
 AliOADBContainer.cxx:401
 AliOADBContainer.cxx:402
 AliOADBContainer.cxx:403
 AliOADBContainer.cxx:404
 AliOADBContainer.cxx:405
 AliOADBContainer.cxx:406
 AliOADBContainer.cxx:407
 AliOADBContainer.cxx:408
 AliOADBContainer.cxx:409
 AliOADBContainer.cxx:410
 AliOADBContainer.cxx:411
 AliOADBContainer.cxx:412
 AliOADBContainer.cxx:413
 AliOADBContainer.cxx:414
 AliOADBContainer.cxx:415
 AliOADBContainer.cxx:416
 AliOADBContainer.cxx:417
 AliOADBContainer.cxx:418
 AliOADBContainer.cxx:419
 AliOADBContainer.cxx:420
 AliOADBContainer.cxx:421
 AliOADBContainer.cxx:422
 AliOADBContainer.cxx:423
 AliOADBContainer.cxx:424
 AliOADBContainer.cxx:425
 AliOADBContainer.cxx:426
 AliOADBContainer.cxx:427
 AliOADBContainer.cxx:428
 AliOADBContainer.cxx:429
 AliOADBContainer.cxx:430
 AliOADBContainer.cxx:431
 AliOADBContainer.cxx:432
 AliOADBContainer.cxx:433