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.4 2001/06/07 18:23:52 buncic
19 TPC branches now correctly diverted into Digits.TPS.root file
21 Revision 1.3 2001/02/05 14:34:54 hristov
22 Avoid deleting of Root class dictionary (R.Brun, M.Ivanov)
24 Revision 1.2 2001/01/26 20:29:00 hristov
25 Major upgrade of AliRoot code
27 Revision 1.1 2000/11/01 15:57:13 kowal2
28 Moved from the TPC directory
30 Revision 1.3 2000/06/30 12:07:49 kowal2
31 Updated from the TPC-PreRelease branch
33 Revision 1.2.4.1 2000/06/25 08:38:41 kowal2
34 Splitted from AliTPCtracking
36 Revision 1.2 2000/04/17 09:37:33 kowal2
37 removed obsolete AliTPCDigitsDisplay.C
39 Revision 1.1.4.2 2000/04/10 11:39:36 kowal2
41 New data structure handling
45 ///////////////////////////////////////////////////////////////////////////////
47 // Alice segment manager object //
49 ///////////////////////////////////////////////////////////////////////////////
54 #include "TClonesArray.h"
55 #include "TDirectory.h"
56 #include "AliArrayI.h"
61 #include "AliSegmentID.h"
62 #include "AliSegmentArray.h"
63 #include "TObjString.h"
66 //_____________________________________________________________________________
67 ClassImp(AliSegmentArray)
69 AliSegmentArray::AliSegmentArray()
81 AliSegmentArray::AliSegmentArray(Text_t *classname, Int_t n)
86 // Create an array of objects of classname. The class must inherit from
87 // AliSegmentID . The second argument adjust number of entries in
94 SetName("SegmentArray");
95 SetTitle("SegmentArray");
98 if (MakeArray(n)==kFALSE){
99 Error("AliSegmentArray", "can't allocate %d segments in memory",n);
104 AliSegmentArray::AliSegmentArray(const AliSegmentArray &segment)
108 // to be later implemented
111 AliSegmentArray &AliSegmentArray::operator = (const AliSegmentArray & segment)
113 //assignment operator
114 //to be later implemented
118 AliSegmentArray::~AliSegmentArray()
121 // default destructor
126 if (fTree) delete fTree;
127 if (fTreeIndex) delete fTreeIndex;
128 // if (fClass!=0) delete fClass;
132 Bool_t AliSegmentArray::SetClass(Text_t *classname)
135 //set class of stored object
137 //delete fClass; not ower of fClass
153 ::Fatal("AliSegmentArray::AliSegmentArray", "ROOT system not initialized");
155 fClass = gROOT->GetClass(classname);
157 Error("AliSegmentArray", "%s is not a valid class name", classname);
160 if (!fClass->InheritsFrom(AliSegmentID::Class())) {
161 Error("AliSegmentArray", "%s does not inherit from AliSegmentID", classname);
168 AliSegmentID * AliSegmentArray::NewSegment()
171 //create object according class information
172 if (fClass==0) return 0;
173 AliSegmentID * segment = (AliSegmentID * )fClass->New();
174 if (segment == 0) return 0;
179 Bool_t AliSegmentArray::AddSegment(AliSegmentID *segment)
182 // add segment to array
184 if (segment==0) return kFALSE;
185 if (fSegment==0) return kFALSE;
186 if (fClass==0) return kFALSE;
187 if (!(segment->IsA()->InheritsFrom(fClass))){
188 Error("AliSegmentArray", "added class %s is not of proper type ",
189 segment->IsA()->GetName());
192 fSegment->AddAt(segment,segment->GetID());
193 fNSegment = fSegment->GetLast()+1;
197 AliSegmentID * AliSegmentArray::AddSegment(Int_t index)
200 // add segment to array
202 if (fSegment==0) return 0;
203 if (fClass==0) return 0;
204 AliSegmentID * segment = NewSegment();
205 if (segment == 0) return 0;
206 fSegment->AddAt(segment,index);
207 segment->SetID(index);
208 fNSegment = fSegment->GetLast()+1;
213 void AliSegmentArray::ClearSegment(Int_t index)
216 //remove segment from active memory
218 if ((*fSegment)[index]){
219 // (*fSegment)[index]->Delete(); //not working for TClonesArray
220 delete (*fSegment)[index]; //because problem with deleting TClonesArray
221 fSegment->RemoveAt(index);
226 Bool_t AliSegmentArray::MakeArray(Int_t n)
229 //make array of pointers to Segments
235 fSegment = new TObjArray(n);
237 if (fSegment) return kTRUE;
242 void AliSegmentArray::MakeTree(char *file)
244 // AliSegmentID segment;
245 AliSegmentID * psegment = NewSegment();
246 if (fTree) delete fTree;
247 fTree = new TTree("Segment Tree","Tree with segments");
248 fBranch = fTree->Branch("Segment",psegment->IsA()->GetName(),&psegment,64000);
250 TString outFile = gAlice->GetBaseFile();
251 outFile = outFile + "/" + file;
252 fBranch->SetFile(outFile.Data());
253 TDirectory *wd = gDirectory;
254 TBranch *b = fBranch;
255 TIter next( b->GetListOfBranches());
256 while ((b=(TBranch*)next())) {
257 b->SetFile(outFile.Data());
259 cout << "Diverting branch " << "Segment" << " to file " << outFile << endl;
265 Bool_t AliSegmentArray::MakeDictionary(Int_t size)
268 //create index table for tree
270 if (size<1) return kFALSE;
271 if (fTreeIndex) delete fTreeIndex;
272 fTreeIndex = new AliArrayI();
273 fTreeIndex->Set(size);
275 AliSegmentID * psegment = NewSegment(); //MI change
276 fBranch->SetAddress(&psegment);
277 TBranch * brindix = fTree->GetBranch("fSegmentID");
278 Int_t nevent = (Int_t)fTree->GetEntries();
279 for (Int_t i = 0; i<nevent; i++){
280 brindix->GetEvent(i);
281 Int_t treeIndex=psegment->GetID();
282 if (fTreeIndex->fN<treeIndex) fTreeIndex->Expand(Int_t(Float_t(treeIndex)*1.5)+1);
283 // Int_t index = segment.GetID();
284 (*fTreeIndex)[treeIndex]=i+1; //
286 if (psegment) delete psegment;
290 Bool_t AliSegmentArray::ConnectTree(const char * treeName)
292 //connect tree from current directory
298 fTree =(TTree*)gDirectory->Get(treeName);
299 if (fTree == 0) return kFALSE;
300 fBranch = fTree->GetBranch("Segment");
301 if (fBranch==0) return kFALSE;
302 MakeDictionary(TMath::Max(fNSegment,Int_t(fTree->GetEntries())));
303 MakeArray(fTreeIndex->fN);
307 AliSegmentID *AliSegmentArray::LoadSegment(Int_t index)
310 //load segment with index to the memory
313 if (fTreeIndex ==0 ) MakeDictionary(3000);
314 //firstly try to load dictionary
315 if (fTreeIndex ==0 ) return 0;
316 if (fBranch==0) return 0;
317 if (index>fTreeIndex->fN) return 0;
318 AliSegmentID *s = (AliSegmentID*)(*fSegment)[index];
319 if (s==0) s= NewSegment();
321 // new AliSegmentID(index);
324 Int_t treeIndex =(*fTreeIndex)[index];
325 if (treeIndex<1) return 0;
326 else treeIndex--; //I don't like it Int table I have index shifted by 1
327 fBranch->SetAddress(&s);
328 fTree->GetEvent(treeIndex);
329 (*fSegment)[index] = (TObject*) s;
336 AliSegmentID *AliSegmentArray::LoadEntry(Int_t index)
339 //load segment at position inex in tree to the memory
342 if (fBranch==0) return 0;
343 if (index>fTree->GetEntries()) return 0;
344 AliSegmentID * s = NewSegment();
347 fBranch->SetAddress(&s);
348 fTree->GetEvent(index);
352 Int_t nindex = s->GetID();
353 ClearSegment(nindex);
354 (*fSegment)[nindex] = (TObject*) s;
358 void AliSegmentArray::StoreSegment(Int_t index)
361 //make segment persistent
363 const AliSegmentID * ksegment = (*this)[index];
364 if (ksegment == 0 ) return;
365 if (fTree==0) MakeTree();
366 fBranch->SetAddress(&ksegment);
371 void AliSegmentArray::Streamer(TBuffer &R__b)
373 TObjString treeName, * ptreeName=&treeName;
374 if (R__b.IsReading()) {
375 Version_t R__v = R__b.ReadVersion(); if (R__v) { }
376 TNamed::Streamer(R__b);
378 if (fTree) delete fTree;
379 ConnectTree(ptreeName->String());
381 R__b.WriteVersion(AliSegmentArray::IsA());
382 TNamed::Streamer(R__b);
384 // sprintf(ch,"%s",fTrre->GetTitle());
385 treeName.String() = fTree->GetTitle();