]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDsegmentArrayBase.cxx
Adding include files where needed for latest ROOT
[u/mrichter/AliRoot.git] / TRD / AliTRDsegmentArrayBase.cxx
index b0e4564b92e874ea58212b2d627d2b65abcf499c..c8f9110c15d690f2ca077d9a19d8fbd3af3d6b04 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/*
-$Log$
-Revision 1.1.4.1  2000/05/08 14:55:03  cblume
-Bug fixes
-
-Revision 1.1  2000/02/28 19:02:56  cblume
-Add new TRD classes
-
-*/
+/* $Id$ */
 
 ///////////////////////////////////////////////////////////////////////////////
 //                                                                           //
-//  Alice segment manager object                                             //
-//                                                                           //
-//  AliTRDsegmentIDArray object  is array of pointers to object derived from //
-//  AliTRDsegmentID object                                                   //
-//  AliTRDsegmentID - object in comparison with TObject enhalt               //
-//  additional information fSegmentID                                        //
+//  Alice segment manager base class                                         //
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 
-#include  <TROOT.h>
+#include <TROOT.h>
 #include <TTree.h>
-#include "TClonesArray.h"
-#include "TDirectory.h"
-#include "AliTRDarrayI.h"
-#include "TError.h"
-#include "TClass.h"
+#include <TClonesArray.h>
+#include <TDirectory.h>
+#include <TError.h>
+#include <TClass.h>
+
+#include "AliLog.h"
 
-#include "AliTRDsegmentID.h"
 #include "AliTRDsegmentArrayBase.h"
+#include "AliTRDarrayI.h"
+#include "AliTRDsegmentID.h"
 
 ClassImp(AliTRDsegmentArrayBase)
   
 //_____________________________________________________________________________
 AliTRDsegmentArrayBase::AliTRDsegmentArrayBase()
+  :TNamed()
+  ,fSegment(0) 
+  ,fTreeIndex(0)
+  ,fNSegment(0)
+  ,fTree(0)
+  ,fBranch(0)
+  ,fClass(0)
 {
   //
-  //
+  // AliTRDsegmentArrayBase default constructor
   //
 
-  fNSegment  = 0;
-  fSegment   = 0; 
-  fTreeIndex = 0;
-  fTree      = 0;
-  fClass     = 0;
-
 }
 
 //_____________________________________________________________________________
-AliTRDsegmentArrayBase::AliTRDsegmentArrayBase(Text_t *classname, Int_t n)
+AliTRDsegmentArrayBase::AliTRDsegmentArrayBase(const char *classname, Int_t n)
+  :TNamed()
+  ,fSegment(0) 
+  ,fTreeIndex(0)
+  ,fNSegment(0)
+  ,fTree(0)
+  ,fBranch(0)
+  ,fClass(0)
 {
   //
-  //constructor which 
-  // 
-  //  Create an array of objects of classname. The class must inherit from
-  //  AliTRDsegmentID .  The second argument adjust number of entries in 
+  //  Create an array of objects of <classname>. The class must inherit from
+  //  AliTRDsegmentID. The second argument sets the number of entries in 
   //  the array.
-  fNSegment=0;
-  fSegment =0; 
-  fTreeIndex = 0;
-  fTree  = 0;
-  fClass = 0;
+  //
+
   SetClass(classname);
-  if (MakeArray(n)==kFALSE){
-     Error("AliTRDsegmentArrayBase", "can't allocate %d segments in memory",n);
-     return;
-   }
+
+  if (MakeArray(n) == kFALSE) {
+    Error("AliTRDsegmentArrayBase","Cannot allocate %d segments in memory",n);
+    return;
+  }
+
 }
 
 //_____________________________________________________________________________
-Bool_t AliTRDsegmentArrayBase:: SetClass(Text_t *classname)
+AliTRDsegmentArrayBase::AliTRDsegmentArrayBase(const AliTRDsegmentArrayBase &a)
+  :TNamed(a)
+  ,fSegment(a.fSegment) 
+  ,fTreeIndex(a.fTreeIndex)
+  ,fNSegment(a.fNSegment)
+  ,fTree(a.fTree)
+  ,fBranch(a.fBranch)
+  ,fClass(a.fClass)
 {
   //
-  //set class of stored object
-  if ( fClass !=0 ) {
-    delete fClass;
-    fClass = 0;
-  }
-  if (fTree !=0) {
-    delete fTree;
-    fTree = 0;
-    fBranch = 0;
-    delete fTreeIndex;
-    fTreeIndex = 0;
-  } 
-  if (fSegment != 0) {
+  // AliTRDsegmentArrayBase copy constructor
+  //
+
+}
+
+//_____________________________________________________________________________
+AliTRDsegmentArrayBase::~AliTRDsegmentArrayBase()
+{
+  //
+  // AliTRDsegmentArrayBase destructor
+  //
+
+  if (fNSegment) {
     fSegment->Delete();
     delete fSegment;
-    fSegment = 0;
-  }
-  if (!gROOT)
-      ::Fatal("AliTRDsegmentArrayBase::AliTRDsegmentArrayBase", "ROOT system not initialized");
-   
-   fClass = gROOT->GetClass(classname);
-   if (!fClass) {
-      Error("AliTRDsegmentArrayBase", "%s is not a valid class name", classname);
-      return kFALSE;
-   }
-   if (!fClass->InheritsFrom(AliTRDsegmentID::Class())) {
-      Error("AliTRDsegmentArrayBase", "%s does not inherit from AliTRDsegmentID", classname);
-      return kFALSE;
-   }  
-   return kTRUE;
+  }
+
+  if (fTreeIndex) {
+    delete fTreeIndex;
+  }
+
 }
 
 //_____________________________________________________________________________
-//Bool_t AliTRDsegmentArrayBase::ClassError( )
-//{
-  //signalize class error 
-  //  if (!fClass) {
-  //    Error("AliTRDsegmentArrayBase", "%s is not a valid class name", classname);
-  //    return kFALSE;
-  // }
-////  return kFALSE;
-//}
+AliTRDsegmentArrayBase &AliTRDsegmentArrayBase
+                        ::operator=(const AliTRDsegmentArrayBase &a)
+{
+  //
+  // Assignment operator
+  //
+
+  if (this != &a) ((AliTRDsegmentArrayBase &) a).Copy(*this);
+  return *this;
+
+}
 
 //_____________________________________________________________________________
-AliTRDsegmentArrayBase::~AliTRDsegmentArrayBase()
+void AliTRDsegmentArrayBase::Copy(TObject &a) const
 {
-  if (fNSegment>0){
+  //
+  // Copy function
+  //
+
+  TNamed::Copy(a);
+
+  fSegment->Copy(*((AliTRDsegmentArrayBase &) a).fSegment);
+  fTreeIndex->Copy(*((AliTRDsegmentArrayBase &) a).fTreeIndex);
+  fClass->Copy(*((AliTRDsegmentArrayBase &) a).fClass);
+
+  ((AliTRDsegmentArrayBase &) a).fNSegment = fNSegment;
+
+}
+
+//_____________________________________________________________________________
+Bool_t AliTRDsegmentArrayBase::SetClass(const char *classname)
+{
+  //
+  // Sets the classname of the stored object
+  //
+
+  if (fTree    != 0) {
+    delete fTree;
+    fTree      = 0;
+    fBranch    = 0;
+    delete fTreeIndex;
+    fTreeIndex = 0;
+  } 
+  if (fSegment != 0) {
     fSegment->Delete();
     delete fSegment;
+    fSegment   = 0;
+  }
+
+  if (!gROOT) {
+    AliFatal("ROOT system not initialized");
+    exit(1);
+  }   
+
+  fClass = gROOT->GetClass(classname);
+  if (!fClass) {
+    AliError(Form("%s is not a valid class name",classname));
+    return kFALSE;
   }
-  if (fTree) delete fTree;
-  if (fTreeIndex) delete fTreeIndex;
-  if (fClass!=0) delete fClass;
+  if (!fClass->InheritsFrom(AliTRDsegmentID::Class())) {
+    AliError(Form("%s does not inherit from AliTRDsegmentID",classname));
+    return kFALSE;
+  }
+  
+  return kTRUE;
+
 }
 
 //_____________________________________________________________________________
-AliTRDsegmentID * AliTRDsegmentArrayBase::NewSegment()
+AliTRDsegmentID *AliTRDsegmentArrayBase::NewSegment()
 {
   //
-  //create object according class information
-  if (fClass==0) return 0;
-  AliTRDsegmentID * segment = (AliTRDsegmentID * )fClass->New();
-  if (segment == 0) return 0;
-  return segment;
+  // Create a new object according to the class information
+  //
+
+  if (fClass  == 0) {
+    return 0;
+  }
+
+  AliTRDsegmentID *segment = (AliTRDsegmentID *) fClass->New();
+
+  if (segment == 0) {
+    return 0;
+  }
+  else {
+    return segment;
+  }
+
 }
 
 //_____________________________________________________________________________
 Bool_t AliTRDsegmentArrayBase::AddSegment(AliTRDsegmentID *segment)
 {
   //
-  // add segment to array
+  // Add a segment to the array
   //
-  if (segment==0) return kFALSE;
-  if (fSegment==0) return kFALSE;
-  if (fClass==0) return kFALSE;
-  if (!(segment->IsA()->InheritsFrom(fClass))){
-    Error("AliTRDsegmentArrayBase", "added class %s  is not of proper type ",
-         segment->IsA()->GetName());
-      return kFALSE;
+
+  if (segment  == 0) {
+    return kFALSE;
+  }
+  if (fSegment == 0) {
+    return kFALSE;
   }
+  if (fClass   == 0) {
+    return kFALSE;
+  }
+
+  if (!(segment->IsA()->InheritsFrom(fClass))) {
+    AliError(Form("added class %s is not of proper type"
+                 ,segment->IsA()->GetName()));
+    return kFALSE;
+  }
+
   fSegment->AddAt(segment,segment->GetID());
-  fNSegment = fSegment->GetLast()+1;
+  fNSegment = fSegment->GetLast() + 1;
+
   return kTRUE;
+
 }
 
 //_____________________________________________________________________________
-AliTRDsegmentID * AliTRDsegmentArrayBase::AddSegment(Int_t index)
+AliTRDsegmentID *AliTRDsegmentArrayBase::AddSegment(Int_t index)
 {
   //
-  // add segment to array
+  // Add a segment to the array
   //
-  if (fSegment==0) return 0;
-  if (fClass==0) return 0;
-  //  AliTRDsegmentID * segment = (AliTRDsegmentID * )fClass->New();
-  AliTRDsegmentID * segment = NewSegment();
-  if (segment == 0) return 0;
+
+  if (fSegment == 0) {
+    return 0;
+  }
+  if (fClass   == 0) {
+    return 0;
+  }
+
+  AliTRDsegmentID *segment = NewSegment();
+  if (segment  == 0) {
+    return 0;
+  }
+
   fSegment->AddAt(segment,index);
   segment->SetID(index);
-  fNSegment = fSegment->GetLast()+1;
+  fNSegment = fSegment->GetLast() + 1;
+
   return segment;
+
 }
 
 //_____________________________________________________________________________
 Bool_t AliTRDsegmentArrayBase::MakeArray(Int_t n)
 {
   //
-  //make array of pointers to Segments
+  // Create an array of pointers to the segments
   //
+
   if (fSegment) {
     fSegment->Delete();
     delete fSegment;
   }
-  if (fTreeIndex) delete   fTreeIndex;  
-  fSegment = new TObjArray(n);
-  fTreeIndex = new AliTRDarrayI;
+  if (fTreeIndex) delete fTreeIndex;  
+
+  fSegment   = new TObjArray(n);
+  fTreeIndex = new AliTRDarrayI();
   fTreeIndex->Set(n);
-  fNSegment=n;
-  if ( (fSegment) && (fTreeIndex)) return kTRUE;
-  else return kFALSE;            
+  fNSegment  = n;
+  if ((fSegment) && (fTreeIndex)) {
+    return kTRUE;
+  }
+  else { 
+    return kFALSE;
+  }
+                 
 }
 
 //_____________________________________________________________________________
 void AliTRDsegmentArrayBase::ClearSegment(Int_t index)
 {
   //
-  //remove segment from active memory    
+  // Remove a segment from the active memory    
   //
-  if ((*fSegment)[index]){
-    //    (*fSegment)[index]->Delete(); //not working for TClonesArray
-    delete (*fSegment)[index]; //because problem with deleting TClonesArray
-    fSegment->RemoveAt(index);
+
+  if (fSegment->At(index)) {
+    delete fSegment->RemoveAt(index);
   }
+
 }
 
 //_____________________________________________________________________________
-void AliTRDsegmentArrayBase::MakeTree()
+void AliTRDsegmentArrayBase::MakeTree(char *file)
 {
-  //  AliTRDsegmentID  segment;
-  AliTRDsegmentID * psegment = NewSegment();  
-  if (fTree) delete fTree;
-  fTree = new TTree("Segment Tree","Tree with segments");
-  fBranch = fTree->Branch("Segment",psegment->IsA()->GetName(),&psegment,64000,1);
+  //
+  // Create a tree for the segment
+  //
+
+  AliTRDsegmentID *psegment = NewSegment();  
+
+  if (fTree) {
+    delete fTree;
+  }
+
+  fTree   = new TTree("Segment Tree","Tree with segments");
+  fBranch = fTree->Branch("Segment",psegment->IsA()->GetName(),&psegment,64000);
+
+  if (file) {
+    fBranch->SetFile(file);      
+  }
+
   delete psegment;
+
 }              
 
 //_____________________________________________________________________________
-Bool_t AliTRDsegmentArrayBase::ConnectTree(const char * treeName)
+Bool_t AliTRDsegmentArrayBase::ConnectTree(const char *treeName)
 {
-  //connect tree from current directory  
-  if (fTree){
+  //
+  // Connect a tree from current directory  
+  //
+
+  if (fTree) {
     delete fTree;
-    fTree = 0;
+    fTree   = 0;
     fBranch = 0;
   }
-  fTree =(TTree*)gDirectory->Get(treeName);
-  if (fTree == 0)    return kFALSE;
+
+  fTree = (TTree *) gDirectory->Get(treeName);
+  if (fTree   == 0) {
+    return kFALSE;
+  }
   fBranch = fTree->GetBranch("Segment");
-  if (fBranch==0) return kFALSE;
+  if (fBranch == 0) {
+    return kFALSE;
+  }
+
   MakeDictionary(TMath::Max(fNSegment,Int_t(fTree->GetEntries())));
+
   return kTRUE;
+
 }
 
 //_____________________________________________________________________________
 AliTRDsegmentID *AliTRDsegmentArrayBase::LoadSegment(Int_t index)
 {
   //
-  //load segment with index to the memory
-  //
+  // Load a segment with index <index> into the memory
   //
-  if (fTreeIndex ==0 ) MakeDictionary(3000);
-  //firstly try to load dictionary 
-  if (fTreeIndex ==0 ) return 0;
-  if (fBranch==0) return 0;
-  if (index>fTreeIndex->fN) return 0;
-  AliTRDsegmentID *s = (AliTRDsegmentID*)(*fSegment)[index];
-  if (s==0)  s=  NewSegment();
+
+  if (fTreeIndex == 0) {
+    MakeDictionary(3000);
+  }
+
+  // First try to load dictionary 
+  if (fTreeIndex == 0) {
+    return 0;
+  }
+  if (fBranch    == 0) {
+    return 0;
+  }
+  if (index > fTreeIndex->fN) {
+    return 0;
+  }
+
+  AliTRDsegmentID *s = (AliTRDsegmentID *) fSegment->At(index);
+  if (s == 0) {
+    s = NewSegment();
+  }
   s->SetID(index);
-  //  new AliTRDsegmentID(index);
   
-  if (s!=0) {
-    Int_t treeIndex =(*fTreeIndex)[index];
-    if (treeIndex<1) return 0;
-    else treeIndex--;   //I don't like it Int table I have index shifted by 1                 
+  if (s != 0) {
+    Int_t treeIndex = (*fTreeIndex)[index];
+    if (treeIndex < 1) {
+      return 0;
+    }
+    else { 
+      treeIndex--;
+    }   
     fBranch->SetAddress(&s);
     fTree->GetEvent(treeIndex);
-    (*fSegment)[index] = (TObject*) s;
+    fSegment->AddAt((TObject*) s, index);
   }
-  else 
+  else 
     return 0;
+  }
+
   return s;
-  //  AbstractMethod("LoadSegment");
+
 }
 
 //_____________________________________________________________________________
 AliTRDsegmentID *AliTRDsegmentArrayBase::LoadEntry(Int_t index)
 {
   //
-  //load segment at position inex in tree  to the memory
+  // Load a segment at position <index> in the tree into the memory
   //
-  //
-  if (fBranch==0) return 0;
-  if (index>fTree->GetEntries()) return 0;
-  AliTRDsegmentID * s =  NewSegment();
-  
+
+  if (fBranch == 0) {
+    return 0;
+  }
+  if (index > fTree->GetEntries()) {
+    return 0;
+  }
+
+  AliTRDsegmentID *s = NewSegment();  
   if (s) {
     fBranch->SetAddress(&s);
     fTree->GetEvent(index);
   }
-  else 
+  else {
     return 0;
+  }
+
   Int_t nindex = s->GetID();
   ClearSegment(nindex);
-  (*fSegment)[nindex] = (TObject*) s;
+  fSegment->AddAt((TObject *) s, nindex);
+
   return s;
-  //  AbstractMethod("LoadSegment");
+
 }
 
+//_____________________________________________________________________________
 void AliTRDsegmentArrayBase::StoreSegment(Int_t index)
 {
   //
-  //make segment persistent 
+  // Make a segment persistent 
   //
-  const AliTRDsegmentID *  segment = (*this)[index];
-  if (segment == 0 ) return;
-  if (fTree==0) MakeTree();
-  fBranch->SetAddress(&segment);
+
+  const AliTRDsegmentID *kSegment = (*this)[index];
+  if (kSegment == 0) {
+    return;
+  }
+  if (fTree    == 0) {
+    MakeTree();
+  }
+  fBranch->SetAddress(&kSegment);
   fTree->Fill();
+
 }
 
 //_____________________________________________________________________________
 Bool_t  AliTRDsegmentArrayBase::MakeDictionary(Int_t size)
 {
   //
-  //create index table for tree
+  // Create an index table for the tree
   //  
-  if (size<1) return kFALSE;
-  if (fTreeIndex) delete fTreeIndex;
+
+  if (size < 1) {
+    return kFALSE;
+  }
+  if (fTreeIndex) {
+    delete fTreeIndex;
+  }
+
   fTreeIndex = new AliTRDarrayI(); 
   fTreeIndex->Set(size);
   
-  AliTRDsegmentID  segment;
-  AliTRDsegmentID * psegment = &segment;
+  AliTRDsegmentID   segment;
+  AliTRDsegmentID *psegment = &segment;
+
   fBranch->SetAddress(&psegment);
-  TBranch * brindix = fTree->GetBranch("fSegmentID");
-  Int_t nevent = (Int_t)fTree->GetEntries();  
-  for (Int_t i = 0; i<nevent; i++){
+  TBranch *brindix = fTree->GetBranch("fSegmentID");
+
+  Int_t nevent = (Int_t) fTree->GetEntries();  
+  for (Int_t i = 0; i < nevent; i++) {
     brindix->GetEvent(i);
-    Int_t treeIndex=segment.GetID();
-    if (fTreeIndex->fN<treeIndex) fTreeIndex->Expand(Int_t(Float_t(treeIndex)*1.5)+1);
-    //    Int_t index = segment.GetID(); 
-    (*fTreeIndex)[treeIndex]=i+1; // MI 19.5. I'm sorry  -index 0 couldn't be use in AliTRDarrayI   
+    Int_t treeIndex = segment.GetID();
+    if (fTreeIndex->fN < treeIndex) {
+      fTreeIndex->Expand(Int_t (Float_t(treeIndex) * 1.5) + 1);
+    }
+    (*fTreeIndex)[treeIndex] = i + 1; 
   }
+
   return kTRUE;
+
+}
+
+//_____________________________________________________________________________
+const AliTRDsegmentID * AliTRDsegmentArrayBase::operator[](Int_t i) const
+{
+  //
+  // Returns a segment with the given index <i>
+  //
+
+  if ((i <          0) || 
+      (i >= fNSegment)) {
+    return 0; 
+  }
+
+  return (AliTRDsegmentID *) fSegment->At(i);
+
+}
+
+//_____________________________________________________________________________
+const AliTRDsegmentID *AliTRDsegmentArrayBase::At(Int_t i) const
+{
+  //
+  // Returns a segment with the given index <i>
+  //
+
+  if ((i <          0) || 
+      (i >= fNSegment)) {
+    return 0; 
+  }
+
+  return (AliTRDsegmentID *) fSegment->At(i);
+
 }