* 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"
//_____________________________________________________________________________
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
// 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){
}
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
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");
//
//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);
}
}
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)
{
//
//
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;
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;
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;
}
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());
fTree->Write();
}
}
+