1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 Revision 1.1.4.2 2000/04/10 11:39:36 kowal2
20 New data structure handling
24 ///////////////////////////////////////////////////////////////////////////////
26 // Alice segment manager object //
28 // AliSegmentIDArray object is array of pointers to object derived from
29 // AliSegmentID object //
30 // AliSegmentID - object in comparison with TObject enhalt
31 // additional information fSegmentID
35 ///////////////////////////////////////////////////////////////////////////////
39 #include "TClonesArray.h"
40 #include "TDirectory.h"
41 #include "AliArrayI.h"
45 #include "AliSegmentID.h"
46 #include "AliSegmentArray.h"
47 #include "TObjString.h"
50 //_____________________________________________________________________________
51 ClassImp(AliSegmentArray)
53 AliSegmentArray::AliSegmentArray()
65 AliSegmentArray::AliSegmentArray(Text_t *classname, Int_t n)
70 // Create an array of objects of classname. The class must inherit from
71 // AliSegmentID . The second argument adjust number of entries in
78 SetName("SegmentArray");
79 SetTitle("SegmentArray");
82 if (MakeArray(n)==kFALSE){
83 Error("AliSegmentArray", "can't allocate %d segments in memory",n);
88 Bool_t AliSegmentArray::SetClass(Text_t *classname)
91 //set class of stored object
109 ::Fatal("AliSegmentArray::AliSegmentArray", "ROOT system not initialized");
111 fClass = gROOT->GetClass(classname);
113 Error("AliSegmentArray", "%s is not a valid class name", classname);
116 if (!fClass->InheritsFrom(AliSegmentID::Class())) {
117 Error("AliSegmentArray", "%s does not inherit from AliSegmentID", classname);
123 AliSegmentArray::~AliSegmentArray()
129 if (fTree) delete fTree;
130 if (fTreeIndex) delete fTreeIndex;
131 if (fClass!=0) delete fClass;
134 AliSegmentID * AliSegmentArray::NewSegment()
137 //create object according class information
138 if (fClass==0) return 0;
139 AliSegmentID * segment = (AliSegmentID * )fClass->New();
140 if (segment == 0) return 0;
145 Bool_t AliSegmentArray::AddSegment(AliSegmentID *segment)
148 // add segment to array
150 if (segment==0) return kFALSE;
151 if (fSegment==0) return kFALSE;
152 if (fClass==0) return kFALSE;
153 if (!(segment->IsA()->InheritsFrom(fClass))){
154 Error("AliSegmentArray", "added class %s is not of proper type ",
155 segment->IsA()->GetName());
158 fSegment->AddAt(segment,segment->GetID());
159 fNSegment = fSegment->GetLast()+1;
163 AliSegmentID * AliSegmentArray::AddSegment(Int_t index)
166 // add segment to array
168 if (fSegment==0) return 0;
169 if (fClass==0) return 0;
170 AliSegmentID * segment = NewSegment();
171 if (segment == 0) return 0;
172 fSegment->AddAt(segment,index);
173 segment->SetID(index);
174 fNSegment = fSegment->GetLast()+1;
179 void AliSegmentArray::ClearSegment(Int_t index)
182 //remove segment from active memory
184 if ((*fSegment)[index]){
185 // (*fSegment)[index]->Delete(); //not working for TClonesArray
186 delete (*fSegment)[index]; //because problem with deleting TClonesArray
187 fSegment->RemoveAt(index);
192 Bool_t AliSegmentArray::MakeArray(Int_t n)
195 //make array of pointers to Segments
201 fSegment = new TObjArray(n);
203 if (fSegment) return kTRUE;
208 void AliSegmentArray::MakeTree()
210 // AliSegmentID segment;
211 AliSegmentID * psegment = NewSegment();
212 if (fTree) delete fTree;
213 fTree = new TTree("Segment Tree","Tree with segments");
214 fBranch = fTree->Branch("Segment",psegment->IsA()->GetName(),&psegment,64000,1);
218 Bool_t AliSegmentArray::MakeDictionary(Int_t size)
221 //create index table for tree
223 if (size<1) return kFALSE;
224 if (fTreeIndex) delete fTreeIndex;
225 fTreeIndex = new AliArrayI();
226 fTreeIndex->Set(size);
228 AliSegmentID segment;
229 AliSegmentID * psegment = &segment;
230 fBranch->SetAddress(&psegment);
231 TBranch * brindix = fTree->GetBranch("fSegmentID");
232 Int_t nevent = (Int_t)fTree->GetEntries();
233 for (Int_t i = 0; i<nevent; i++){
234 brindix->GetEvent(i);
235 Int_t treeIndex=segment.GetID();
236 if (fTreeIndex->fN<treeIndex) fTreeIndex->Expand(Int_t(Float_t(treeIndex)*1.5)+1);
237 // Int_t index = segment.GetID();
238 (*fTreeIndex)[treeIndex]=i+1; //
243 Bool_t AliSegmentArray::ConnectTree(const char * treeName)
245 //connect tree from current directory
251 fTree =(TTree*)gDirectory->Get(treeName);
252 if (fTree == 0) return kFALSE;
253 fBranch = fTree->GetBranch("Segment");
254 if (fBranch==0) return kFALSE;
255 MakeDictionary(TMath::Max(fNSegment,Int_t(fTree->GetEntries())));
256 MakeArray(fTreeIndex->fN);
260 AliSegmentID *AliSegmentArray::LoadSegment(Int_t index)
263 //load segment with index to the memory
266 if (fTreeIndex ==0 ) MakeDictionary(3000);
267 //firstly try to load dictionary
268 if (fTreeIndex ==0 ) return 0;
269 if (fBranch==0) return 0;
270 if (index>fTreeIndex->fN) return 0;
271 AliSegmentID *s = (AliSegmentID*)(*fSegment)[index];
272 if (s==0) s= NewSegment();
274 // new AliSegmentID(index);
277 Int_t treeIndex =(*fTreeIndex)[index];
278 if (treeIndex<1) return 0;
279 else treeIndex--; //I don't like it Int table I have index shifted by 1
280 fBranch->SetAddress(&s);
281 fTree->GetEvent(treeIndex);
282 (*fSegment)[index] = (TObject*) s;
289 AliSegmentID *AliSegmentArray::LoadEntry(Int_t index)
292 //load segment at position inex in tree to the memory
295 if (fBranch==0) return 0;
296 if (index>fTree->GetEntries()) return 0;
297 AliSegmentID * s = NewSegment();
300 fBranch->SetAddress(&s);
301 fTree->GetEvent(index);
305 Int_t nindex = s->GetID();
306 ClearSegment(nindex);
307 (*fSegment)[nindex] = (TObject*) s;
311 void AliSegmentArray::StoreSegment(Int_t index)
314 //make segment persistent
316 const AliSegmentID * segment = (*this)[index];
317 if (segment == 0 ) return;
318 if (fTree==0) MakeTree();
319 fBranch->SetAddress(&segment);
324 void AliSegmentArray::Streamer(TBuffer &R__b)
326 TObjString treeName, * ptreeName=&treeName;
327 if (R__b.IsReading()) {
328 Version_t R__v = R__b.ReadVersion(); if (R__v) { }
329 TNamed::Streamer(R__b);
331 if (fTree) delete fTree;
332 ConnectTree(ptreeName->String());
334 R__b.WriteVersion(AliSegmentArray::IsA());
335 TNamed::Streamer(R__b);
337 // sprintf(ch,"%s",fTrre->GetTitle());
338 treeName.String() = fTree->GetTitle();