Introduced possibility to store pass dependent parameters
authorekryshen <evgeny.kryshen@cern.ch>
Tue, 8 Jul 2014 13:41:29 +0000 (15:41 +0200)
committerekryshen <evgeny.kryshen@cern.ch>
Tue, 8 Jul 2014 13:41:29 +0000 (15:41 +0200)
STEER/STEERBase/AliOADBContainer.cxx
STEER/STEERBase/AliOADBContainer.h

index dc4efd4..9d24645 100644 (file)
@@ -30,6 +30,7 @@
 #include <TSystem.h>
 #include <TError.h>
 #include <TROOT.h>
+#include "TObjString.h"
 
 ClassImp(AliOADBContainer);
 
@@ -38,6 +39,7 @@ AliOADBContainer::AliOADBContainer() :
   TNamed(),
   fArray(0),
   fDefaultList(0),
+  fPassNames(0),
   fLowerLimits(),
   fUpperLimits(),
   fEntries(0)
@@ -49,6 +51,7 @@ AliOADBContainer::AliOADBContainer(const char* name) :
   TNamed(name, "OADBContainer"),
   fArray(new TObjArray(100)),
   fDefaultList(new TList()),
+  fPassNames(new TObjArray(100)),
   fLowerLimits(),
   fUpperLimits(),
   fEntries(0)
@@ -63,6 +66,7 @@ AliOADBContainer::~AliOADBContainer()
   // destructor
   if (fArray)       delete fArray;
   if (fDefaultList) delete fDefaultList;
+  if (fPassNames)   delete fPassNames;
 
 }
 
@@ -71,6 +75,7 @@ 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)
@@ -93,6 +98,7 @@ AliOADBContainer& AliOADBContainer::operator=(const AliOADBContainer& cont)
        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);
     }
   }
   //
@@ -105,13 +111,17 @@ AliOADBContainer& AliOADBContainer::operator=(const AliOADBContainer& cont)
   return *this;
 }
 
-void AliOADBContainer::AppendObject(TObject* obj, Int_t lower, Int_t upper)
+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);
+  Int_t index = HasOverlap(lower, upper, passName);
   
   if (index != -1) {
     AliFatal(Form("Ambiguos validity range (%5d, %5.5d-%5.5d) !\n", index,lower,upper));
@@ -122,15 +132,20 @@ void AliOADBContainer::AppendObject(TObject* obj, Int_t lower, Int_t upper)
   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 
 
@@ -145,18 +160,23 @@ void AliOADBContainer::RemoveObject(Int_t idx)
   // 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)
+void AliOADBContainer::UpdateObject(Int_t idx, TObject* obj, Int_t lower, Int_t upper, TString passName)
 {
   //
   // Update an existing object, at a given position 
@@ -176,7 +196,7 @@ void AliOADBContainer::UpdateObject(Int_t idx, TObject* obj, Int_t lower, Int_t
   fLowerLimits[idx] = -1;
   fUpperLimits[idx] = -1;
   // Check that there is no overlap with existing run ranges  
-  Int_t index = HasOverlap(lower, upper);
+  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;
@@ -186,6 +206,8 @@ void AliOADBContainer::UpdateObject(Int_t idx, TObject* obj, Int_t lower, Int_t
   //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);
 
 }
@@ -202,7 +224,7 @@ void  AliOADBContainer::CleanDefaultList()
   fDefaultList->Delete();
 }
 
-Int_t AliOADBContainer::GetIndexForRun(Int_t run) const
+Int_t AliOADBContainer::GetIndexForRun(Int_t run, TString passName) const
 {
   //
   // Find the index for a given run 
@@ -211,7 +233,8 @@ Int_t AliOADBContainer::GetIndexForRun(Int_t run) const
   Int_t index = -1;
   for (Int_t i = 0; i < fEntries; i++) 
     {
-      if (run >= fLowerLimits[i] && run <= fUpperLimits[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;
@@ -227,11 +250,12 @@ Int_t AliOADBContainer::GetIndexForRun(Int_t run) const
   return index;
 }
 
-TObject* AliOADBContainer::GetObject(Int_t run, const char* def) const
+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);
+  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);
@@ -252,6 +276,14 @@ TObject* AliOADBContainer::GetObjectByIndex(Int_t run) const
   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
 {
   //
@@ -294,7 +326,6 @@ Int_t AliOADBContainer::InitFromFile(const char* fname, const char* key)
     file = TFile::Open(fname);
   }
 
-    // 
     // Initialize object from file
     if (!file) return (1);
     AliOADBContainer* cont  = 0;
@@ -312,11 +343,15 @@ Int_t AliOADBContainer::InitFromFile(const char* fname, const char* key)
     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());
@@ -344,11 +379,12 @@ void AliOADBContainer::List()
 
 }
 
-Int_t AliOADBContainer::HasOverlap(Int_t lower, Int_t upper) const
+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]))
       {
@@ -367,7 +403,8 @@ void AliOADBContainer::Browse(TBrowser *b)
 
   if (b) {
     for (Int_t i = 0; i < fEntries; i++) {
-      b->Add(fArray->At(i),Form("%9.9d - %9.9d", fLowerLimits[i], fUpperLimits[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;
index 38e41b9..ef06c19 100644 (file)
@@ -27,8 +27,8 @@ class AliOADBContainer : public TNamed {
   AliOADBContainer(const AliOADBContainer& cont); 
   AliOADBContainer& operator=(const AliOADBContainer& cont);
 // Object adding and removal
-  void   AppendObject(TObject* obj, Int_t lower, Int_t upper);
-  void   UpdateObject(Int_t index, TObject* obj, Int_t lower, Int_t upper);
+  void   AppendObject(TObject* obj, Int_t lower, Int_t upper, TString passName="");
+  void   UpdateObject(Int_t index, TObject* obj, Int_t lower, Int_t upper, TString passName="");
   void   RemoveObject(Int_t index);
   void   AddDefaultObject(TObject* obj);
   void   CleanDefaultList();
@@ -40,8 +40,9 @@ class AliOADBContainer : public TNamed {
   Int_t GetNumberOfEntries()    const {return fEntries;}
   Int_t LowerLimit(Int_t idx)   const {return fLowerLimits[idx];}
   Int_t UpperLimit(Int_t idx)   const {return fUpperLimits[idx];}
-  TObject* GetObject(Int_t run, const char* def = "") const;
+  TObject* GetObject(Int_t run, const char* def = "", TString passName="") const;
   TObject* GetObjectByIndex(Int_t run) const;
+  TObject* GetPassNameByIndex(Int_t idx) const;
   TObject* GetDefaultObject(const char* key) 
   {return(fDefaultList->FindObject(key));}
 // Debugging  
@@ -49,20 +50,21 @@ class AliOADBContainer : public TNamed {
 // Browsable
   virtual Bool_t       IsFolder() const { return kTRUE; }
   void Browse(TBrowser *b);
-  Int_t GetIndexForRun(Int_t run) const;
+  Int_t GetIndexForRun(Int_t run, TString passName="") const;
 //
   static const char*   GetOADBPath();
  private:
-  Int_t HasOverlap(Int_t lower, Int_t upper) const;
+  Int_t HasOverlap(Int_t lower, Int_t upper, TString passName) const;
  private :
   TObjArray*               fArray;         // Array with objects corresponding to run ranges
   TList*                   fDefaultList;   // List with default arrays
+  TObjArray*               fPassNames;     // Pass names
   TArrayI                  fLowerLimits;   // lower limit of run range
   TArrayI                  fUpperLimits;   // upper limit of run range
   Int_t                    fEntries;       // Number of entries
 //  TString                  fRelPath;       // Relative path to object
   
-  ClassDef(AliOADBContainer, 1);
+  ClassDef(AliOADBContainer, 2);
 };
 
 #endif