]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliSegmentArray.cxx
skim task first usable version
[u/mrichter/AliRoot.git] / TPC / AliSegmentArray.cxx
index 4c62ad59a94f2264d8c97911c467d0369a97f7b4..61b97b0a8a0927c6903ae452093ecabd382d3c8c 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/*
-$Log$
-Revision 1.2.4.1  2000/06/25 08:38:41  kowal2
-Splitted from AliTPCtracking
-
-Revision 1.2  2000/04/17 09:37:33  kowal2
-removed obsolete AliTPCDigitsDisplay.C
-
-Revision 1.1.4.2  2000/04/10 11:39:36  kowal2
-
-New data structure handling
-
-*/
+/* $Id$ */
 
 ///////////////////////////////////////////////////////////////////////////////
 //                                                                           //
 //  Alice segment manager object                                             //
-//                                
-//  AliSegmentIDArray object  is array of pointers to object derived from 
-//  AliSegmentID object                                                     //
-//  AliSegmentID - object in comparison with TObject enhalt
-//  additional information fSegmentID
-//  
 //                                                                           //
-//                                                                          //
 ///////////////////////////////////////////////////////////////////////////////
+#include <Riostream.h>
 
-#include  <TROOT.h>
 #include <TTree.h>
+#include <TROOT.h>
+#include "AliRun.h"
+
 #include "TClonesArray.h"
 #include "TDirectory.h"
-#include "AliArrayI.h"
+#include <TArrayI.h>
 #include "TError.h"
 #include "TClass.h"
+#include "TFile.h"
 
 #include "AliSegmentID.h"
 #include "AliSegmentArray.h"
@@ -56,19 +41,31 @@ New data structure handling
 //_____________________________________________________________________________
 ClassImp(AliSegmentArray)
   
-AliSegmentArray::AliSegmentArray()
+  AliSegmentArray::AliSegmentArray()
+                  :TNamed(),
+                   fSegment(0),
+                   fTreeIndex(0),
+                   fNSegment(0),
+                   fTree(0),
+                   fTreeOwner(kFALSE),
+                   fBranch(0),
+                   fClass(0)                                      
 {
   //
+  // constructor
   //
-  //
-  fNSegment=0;
-  fSegment =0; 
-  fTreeIndex = 0;
-  fTree  = 0;
-  fClass = 0;
+
 }
 
-AliSegmentArray::AliSegmentArray(Text_t *classname, Int_t n)
+AliSegmentArray::AliSegmentArray(const char *classname, Int_t n)
+                :TNamed("SegmentArray","SegmentArray"),
+                 fSegment(0),
+                 fTreeIndex(0),
+                 fNSegment(0),
+                 fTree(0),
+                 fTreeOwner(kFALSE),
+                 fBranch(0),
+                 fClass(0) 
 {
   //
   //constructor which 
@@ -76,13 +73,7 @@ AliSegmentArray::AliSegmentArray(Text_t *classname, Int_t n)
   //  Create an array of objects of classname. The class must inherit from
   //  AliSegmentID .  The second argument adjust number of entries in 
   //  the array.
-  fNSegment=0;
-  fSegment =0; 
-  fTreeIndex = 0;
-  fTree  = 0;
-  fClass = 0;
-  SetName("SegmentArray");
-  SetTitle("SegmentArray");
 
   SetClass(classname);
   if (MakeArray(n)==kFALSE){
@@ -92,13 +83,22 @@ AliSegmentArray::AliSegmentArray(Text_t *classname, Int_t n)
 }
 
 AliSegmentArray::AliSegmentArray(const AliSegmentArray &segment)
+                :TNamed(segment),
+                 fSegment(0),
+                 fTreeIndex(0),
+                 fNSegment(0),
+                 fTree(0),
+                 fTreeOwner(kFALSE),
+                 fBranch(0),
+                 fClass(0)                                      
+               
 {
   //
   //copy constructor
   // to be later implemented
 }
 
-AliSegmentArray &AliSegmentArray::operator = (const AliSegmentArray & segment)
+AliSegmentArray &AliSegmentArray::operator = (const AliSegmentArray & /*segment*/)
 {
   //assignment operator
   //to be later implemented
@@ -113,32 +113,38 @@ AliSegmentArray::~AliSegmentArray()
     fSegment->Delete();
     delete fSegment;
   }
-  if (fTree) delete fTree;
+  if (fTree) { 
+   if (fTreeOwner) delete fTree;
+   else fTree->Reset();}
+
   if (fTreeIndex) delete fTreeIndex;
-  if (fClass!=0) delete fClass;
+  //  if (fClass!=0) delete fClass;
 }
 
 
-Bool_t AliSegmentArray::SetClass(Text_t *classname)
+Bool_t AliSegmentArray::SetClass(const char *classname)
 {
   //
   //set class of stored object
   if ( fClass !=0 ) {
-    delete fClass;
+    //delete fClass; not ower of fClass
     fClass = 0;
   }
   if (fTree !=0) {
-    delete fTree;
+    if (fTreeOwner) delete fTree;
+    else fTree->Reset();
     fTree = 0;
     fBranch = 0;
     delete fTreeIndex;
     fTreeIndex = 0;
   } 
+  
   if (fSegment != 0) {
     fSegment->Delete();
     delete fSegment;
     fSegment = 0;
   }
+  
   if (!gROOT)
       ::Fatal("AliSegmentArray::AliSegmentArray", "ROOT system not initialized");
    
@@ -205,10 +211,12 @@ void AliSegmentArray::ClearSegment(Int_t index)
   //
   //remove segment from active memory    
   //
-  if ((*fSegment)[index]){
+  //PH  if ((*fSegment)[index]){
+  if (fSegment->At(index)){
     //    (*fSegment)[index]->Delete(); //not working for TClonesArray
-    delete (*fSegment)[index]; //because problem with deleting TClonesArray
-    fSegment->RemoveAt(index);
+    //PH    delete (*fSegment)[index]; //because problem with deleting TClonesArray
+    //PH    fSegment->RemoveAt(index);
+    delete fSegment->RemoveAt(index);
   }
 }
 
@@ -227,18 +235,54 @@ Bool_t AliSegmentArray::MakeArray(Int_t n)
   if (fSegment) return kTRUE;  
   else return kFALSE;            
 }
+void AliSegmentArray::MakeTree(TTree* tree)
+{
+             //Make tree with the name
+  AliSegmentID * psegment = NewSegment();  
+  fTree = tree;
+  //PH  fBranch = fTree->Branch("Segment",psegment->IsA()->GetName(),&psegment,64000);
+  fBranch = fTree->Branch("Segment",psegment->IsA()->GetName(),&psegment,64000,99);
 
+}
 
-void AliSegmentArray::MakeTree()
+void AliSegmentArray::MakeTree(char *file)
 {
   //  AliSegmentID  segment;
   AliSegmentID * psegment = NewSegment();  
-  if (fTree) delete fTree;
-  fTree = new TTree("Segment Tree","Tree with segments");
-  fBranch = fTree->Branch("Segment",psegment->IsA()->GetName(),&psegment,64000,1);
+  if (fTree) {
+    if (fTreeOwner) 
+     {
+       delete fTree;
+       fTree = new TTree("Segment Tree","Tree with segments");     
+     }
+    else fTree->Reset();
+  }
+  else {
+    cout << "Tree with segments does not exist"<<endl;
+    return;
+  }
+
+  
+  //PH  fBranch = fTree->Branch("Segment",psegment->IsA()->GetName(),&psegment,64000);
+   fBranch = fTree->Branch("Segment",psegment->IsA()->GetName(),&psegment,64000,99);
+  if (file) {
+        TString outFile = gAlice->GetBaseFile();
+        outFile = outFile + "/" + file;
+        fBranch->SetFile(outFile.Data());
+        TDirectory *wd = gDirectory;
+        TBranch *b = fBranch;
+        TIter next( b->GetListOfBranches());
+        while ((b=(TBranch*)next())) {
+           b->SetFile(outFile.Data());
+        }
+        cout << "Diverting branch " << "Segment" << " to file " << outFile << endl;  
+        wd->cd(); 
+    }
   delete psegment;
 }              
 
+
 Bool_t  AliSegmentArray::MakeDictionary(Int_t size)
 {
   //
@@ -246,33 +290,50 @@ Bool_t  AliSegmentArray::MakeDictionary(Int_t size)
   //  
   if (size<1) return kFALSE;
   if (fTreeIndex) delete fTreeIndex;
-  fTreeIndex = new AliArrayI(); 
+  fTreeIndex = new TArrayI(); 
   fTreeIndex->Set(size);
   
-  AliSegmentID  segment;
-  AliSegmentID * psegment = &segment;
+  AliSegmentID * psegment = NewSegment(); //MI change
   fBranch->SetAddress(&psegment);
   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 treeIndex=psegment->GetID();
+    if (fTreeIndex->fN<treeIndex) fTreeIndex->Set(Int_t(Float_t(treeIndex)*1.5)+1);
     //    Int_t index = segment.GetID(); 
     (*fTreeIndex)[treeIndex]=i+1; //  
   }
+  if (psegment) delete psegment;
+  return kTRUE;
+}
+
+Bool_t AliSegmentArray::ConnectTree(TTree* tree)
+{
+  fTree =tree;
+  if (fTree == 0)    return kFALSE;
+  fBranch = fTree->GetBranch("Segment");
+  if (fBranch==0) return kFALSE;
+  MakeDictionary(TMath::Max(fNSegment,Int_t(fTree->GetEntries())));
+  MakeArray(fTreeIndex->fN);
   return kTRUE;
 }
 
+
 Bool_t AliSegmentArray::ConnectTree(const char * treeName)
 {
   //connect tree from current directory  
   if (fTree){
-    delete fTree;
-    fTree = 0;
-    fBranch = 0;
+   if (fTreeOwner) 
+    {
+     delete fTree;
+     fTree = 0;
+    }
+   else fTree->Reset();
+   fBranch = 0;
   }
   fTree =(TTree*)gDirectory->Get(treeName);
+  
   if (fTree == 0)    return kFALSE;
   fBranch = fTree->GetBranch("Segment");
   if (fBranch==0) return kFALSE;
@@ -292,18 +353,21 @@ AliSegmentID *AliSegmentArray::LoadSegment(Int_t index)
   if (fTreeIndex ==0 ) return 0;
   if (fBranch==0) return 0;
   if (index>fTreeIndex->fN) return 0;
-  AliSegmentID *s = (AliSegmentID*)(*fSegment)[index];
+  //PH  AliSegmentID *s = (AliSegmentID*)(*fSegment)[index];
+  AliSegmentID *s = (AliSegmentID*)fSegment->At(index);
   if (s==0)  s=  NewSegment();
-  s->SetID(index);
-  //  new AliSegmentID(index);
+
   
   if (s!=0) {
+    s->SetID(index);
+    //  new AliSegmentID(index);
     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                 
     fBranch->SetAddress(&s);
     fTree->GetEvent(treeIndex);
-    (*fSegment)[index] = (TObject*) s;
+    //PH    (*fSegment)[index] = (TObject*) s;
+    fSegment->AddAt((TObject*) s, index);
   }
   else 
     return 0;
@@ -328,7 +392,8 @@ AliSegmentID *AliSegmentArray::LoadEntry(Int_t index)
     return 0;
   Int_t nindex = s->GetID();
   ClearSegment(nindex);
-  (*fSegment)[nindex] = (TObject*) s;
+  //PH  (*fSegment)[nindex] = (TObject*) s;
+  fSegment->AddAt((TObject*) s, nindex);
   return s;
 }
 
@@ -352,7 +417,7 @@ void AliSegmentArray::Streamer(TBuffer &R__b)
     Version_t R__v = R__b.ReadVersion(); if (R__v) { }
     TNamed::Streamer(R__b);
     R__b>>ptreeName;
-    if (fTree) delete fTree;
+    if (fTree && fTreeOwner) delete fTree;
     ConnectTree(ptreeName->String());   
   } else {
     R__b.WriteVersion(AliSegmentArray::IsA());
@@ -364,3 +429,4 @@ void AliSegmentArray::Streamer(TBuffer &R__b)
     fTree->Write();
   }
 }
+