-#include "TObjArray.h"
-#include "TFile.h"
-#include "TTree.h"
-#include "TBrowser.h"
-#include "TTreeStream.h"
-
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+/* $Id$ */
+
+//
+// marian.ivanov@cern.ch
+//
+// ------------------------------------------------------------------------------------------------
+// TTreeStream
+// Standard stream (cout) like input for the tree
+// Run and see TTreeStreamer::Test() - to see TTreeStreamer functionality
+// ------------------------------------------------------------------------------------------------
+//
+// -------------------------------------------------------------------------------------------------
+// TTreeSRedirector
+// Redirect file to different TTreeStreams
+// Run and see TTreeSRedirector::Test() as an example of TTreeSRedirectorer functionality
+//
+
+#include <TClass.h>
+#include <TFile.h>
+#include <TDirectory.h>
+#include <TObjArray.h>
+#include <TTree.h>
+#include <TTreeStream.h>
ClassImp(TTreeDataElement)
ClassImp(TTreeStream)
ClassImp(TTreeSRedirector)
-/*
- marian.ivanov@cern.ch
- //
- ------------------------------------------------------------------------------------------------
- TTreeStream
- Standard stream (cout) like input for the tree
- Run and see TTreeStreamer::Test() - to see TTreeStreamer functionality
- ------------------------------------------------------------------------------------------------
- //
- -------------------------------------------------------------------------------------------------
- TTreeSRedirector
- Redirect file to different TTreeStreams
- Run and see TTreeSRedirector::Test() as an example of TTreeSRedirectorer functionality
- //
-*/
void TTreeStream::Test()
}
-
-
-
-
-TTreeSRedirector::TTreeSRedirector(const char *fname){
+TTreeSRedirector::TTreeSRedirector(const char *fname) :
+ fFile(new TFile(fname,"recreate")),
+ fDataLayouts(0)
+{
//
+ // Constructor
//
- fFile = new TFile(fname,"recreate");
if (!fFile){
fFile = new TFile(fname,"new");
}
- fDataLayouts =0;
-
}
-TTreeSRedirector::~TTreeSRedirector(){
+TTreeSRedirector::~TTreeSRedirector()
+{
//
+ // Destructor
//
Close(); //write the tree to the selected file
fFile->Close();
delete fFile;
}
+void TTreeSRedirector::StoreObject(TObject* object){
+ //
+ //
+ //
+ TDirectory * backup = gDirectory;
+ fFile->cd();
+ object->Write();
+ if (backup) backup->cd();
+}
+
+
TTreeStream & TTreeSRedirector::operator<<(Int_t id)
{
}
}
if (!clayout){
+ TDirectory * backup = gDirectory;
+ fFile->cd();
char chname[100];
sprintf(chname,"Tree%d",id);
clayout = new TTreeStream(chname);
clayout->fId=id;
fDataLayouts->AddAt(clayout,entries);
+ if (backup) backup->cd();
}
return *clayout;
}
// return reference to the data layout with given identifier
// if not existing - creates new
if (!fDataLayouts) fDataLayouts = new TObjArray(10000);
- TTreeStream *clayout=0;
- Int_t hash = TMath::Hash(name);
+ TTreeStream *clayout=(TTreeStream*)fDataLayouts->FindObject(name);
Int_t entries = fDataLayouts->GetEntriesFast();
- for (Int_t i=0;i<entries;i++){
- TTreeStream * layout = (TTreeStream*)fDataLayouts->At(i);
- if (!layout) continue;
- if (layout->fHash==hash) {
- clayout = layout;
- break;
- }
- }
+
if (!clayout){
+ TDirectory * backup = gDirectory;
+ fFile->cd();
clayout = new TTreeStream(name);
clayout->fId=-1;
clayout->SetName(name);
- clayout->fHash = hash;
fDataLayouts->AddAt(clayout,entries);
+ if (backup) backup->cd();
}
return *clayout;
}
void TTreeSRedirector::Close(){
//
//
- Int_t entries = fDataLayouts->GetEntriesFast();
- for (Int_t i=0;i<entries;i++){
- TTreeStream * layout = (TTreeStream*)fDataLayouts->At(i);
- if (layout){
- if (layout->fTree) layout->fTree->Write();
- }
+ TDirectory * backup = gDirectory;
+ fFile->cd();
+ if (fDataLayouts){
+ Int_t entries = fDataLayouts->GetEntriesFast();
+ for (Int_t i=0;i<entries;i++){
+ TTreeStream * layout = (TTreeStream*)fDataLayouts->At(i);
+ if (layout){
+ if (layout->fTree) layout->fTree->Write(layout->GetName());
+ }
+ }
+ delete fDataLayouts;
+ fDataLayouts=0;
}
+ if (backup) backup->cd();
}
//-------------------------------------------------------------
-TTreeDataElement:: TTreeDataElement(Char_t type){
+TTreeDataElement:: TTreeDataElement(Char_t type) :
+ TNamed(),
+ fType(type),
+ fDType(0),
+ fClass(0),
+ fPointer(0)
+{
+ //
//
//
- fType = type;
- fDType = 0;
- fClass = 0;
- fPointer= 0;
}
-TTreeDataElement:: TTreeDataElement(TDataType* type){
+
+TTreeDataElement:: TTreeDataElement(TDataType* type) :
+ TNamed(),
+ fType(0),
+ fDType(type),
+ fClass(0),
+ fPointer(0)
+{
+ //
//
//
- fType = 0;
- fDType = type;
- fClass = 0;
- fPointer= 0;
}
-TTreeDataElement:: TTreeDataElement(TClass* cl){
+
+TTreeDataElement:: TTreeDataElement(TClass* cl) :
+ TNamed(),
+ fType(0),
+ fDType(0),
+ fClass(cl),
+ fPointer(0)
+{
+ //
//
//
- fType = 0;
- fDType = 0;
- fClass = cl;
- fPointer= 0;
}
//-------------------------------------------------------------------
-TTreeStream::TTreeStream(const char *treename):TNamed(treename,treename){
- fElements =0;
- fTree =0;
- fCurrentIndex =0;
- fNextName="";
- fNextNameCounter=0;
- fTree = new TTree(treename, treename);
+TTreeStream::TTreeStream(const char *treename):
+ TNamed(treename,treename),
+ fElements(0),
+ fBranches(0),
+ fTree(new TTree(treename, treename)),
+ fCurrentIndex(0),
+ fId(0),
+ fNextName(),
+ fNextNameCounter(),
+ fStatus(0)
+{
+ //
+ // Standard ctor
+ //
}
TTreeStream::~TTreeStream()
{
+ //
+ // Class dtor
+ //
fElements->Delete();
fBranches->Clear();
delete fElements;
void TTreeStream::Close()
{
+ //
+ // Flush data to disk and close
//
fTree->Write();
}
Int_t TTreeStream::CheckIn(Char_t type, void *pointer)
{
- if (!fElements) fElements = new TObjArray(1000);
+ //
+ // Insert object of given type
+ //
+ if (!fElements) fElements = new TObjArray(10000);
+ if (fElements->GetSize()<=fCurrentIndex) fElements->Expand(fCurrentIndex*2);
TTreeDataElement* element = (TTreeDataElement*)fElements->At(fCurrentIndex);
if (!element) {
element = new TTreeDataElement(type);
Int_t TTreeStream::CheckIn(TObject *o){
//
+ // Insert TObject
//
if (!o) return 0;
if (!fElements) fElements = new TObjArray(1000);
void TTreeStream::BuildTree(){
//
+ // Build the Tree
//
- if (fTree->GetEntries()>0) return;
- fTree = new TTree(GetName(),GetName());
+ if (fTree && fTree->GetEntries()>0) return;
+ if (!fTree) fTree = new TTree(GetName(),GetName());
Int_t entries = fElements->GetEntriesFast();
fBranches = new TObjArray(entries);
sprintf(bname1,element->GetName());
}
if (element->fClass){
- TBranch * br = fTree->Branch(bname1,element->fClass->GetName(),&(element->fPointer));
- fBranches->AddAt(br,i);
+ if (element->fClass->GetBaseClass("TClonesArray")){
+ TBranch * br = fTree->Branch(bname1,element->fClass->GetName(),&(element->fPointer));
+ fBranches->AddAt(br,i);
+ }else
+ {
+ TBranch * br = fTree->Branch(bname1,element->fClass->GetName(),&(element->fPointer));
+ fBranches->AddAt(br,i);
+ }
}
if (element->GetType()>0){
char bname2[1000];
void TTreeStream::Fill(){
//
+ // Fill the tree
//
if (fTree) {
Int_t entries=fElements->GetEntriesFast();
}
}
-TTreeStream & TTreeStream::Endl(){
+TTreeStream & TTreeStream::Endl()
+{
+ //
+ // Perform pseudo endl operation
+ //
if (fTree->GetNbranches()==0) BuildTree();
Fill();
fStatus =0;
}
-TTreeStream &TTreeStream::operator<<(Char_t *name)
+TTreeStream &TTreeStream::operator<<(const Char_t *name)
{
//
+ // Endl
//
- //
- //Endl
if (name[0]=='\n'){
return Endl();
}