X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliSegmentArray.cxx;h=61b97b0a8a0927c6903ae452093ecabd382d3c8c;hb=bc8264387693a9e1f97d45233ffc8cd6d52f606a;hp=4c62ad59a94f2264d8c97911c467d0369a97f7b4;hpb=73042f0190050b5b5f317a6327d5ae1849e730d5;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliSegmentArray.cxx b/TPC/AliSegmentArray.cxx index 4c62ad59a94..61b97b0a8a0 100644 --- a/TPC/AliSegmentArray.cxx +++ b/TPC/AliSegmentArray.cxx @@ -13,40 +13,25 @@ * 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 -#include #include +#include +#include "AliRun.h" + #include "TClonesArray.h" #include "TDirectory.h" -#include "AliArrayI.h" +#include #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"<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; iGetEvent(i); - Int_t treeIndex=segment.GetID(); - if (fTreeIndex->fNExpand(Int_t(Float_t(treeIndex)*1.5)+1); + Int_t treeIndex=psegment->GetID(); + if (fTreeIndex->fNSet(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(); } } +