X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;ds=sidebyside;f=STEER%2FTTreeStream.cxx;h=2287454cc2d547bb73d2acd071c97f16970298bd;hb=16f844aab9b6f26d743f8a8436cae6eccc5248fb;hp=690164465ed256acaf6c787708ccf78fedff1ac3;hpb=2fca8fe06b8a9fe344d640bd3e2973971d77beea;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/TTreeStream.cxx b/STEER/TTreeStream.cxx index 690164465ed..2287454cc2d 100644 --- a/STEER/TTreeStream.cxx +++ b/STEER/TTreeStream.cxx @@ -1,29 +1,46 @@ -#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 +#include +#include +#include +#include +#include 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() @@ -122,27 +139,38 @@ void TTreeSRedirector::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) { @@ -161,12 +189,14 @@ 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; } @@ -182,11 +212,13 @@ TTreeStream & TTreeSRedirector::operator<<(const char* name) Int_t entries = fDataLayouts->GetEntriesFast(); if (!clayout){ + TDirectory * backup = gDirectory; fFile->cd(); clayout = new TTreeStream(name); clayout->fId=-1; clayout->SetName(name); fDataLayouts->AddAt(clayout,entries); + if (backup) backup->cd(); } return *clayout; } @@ -197,7 +229,7 @@ TTreeStream & TTreeSRedirector::operator<<(const char* name) void TTreeSRedirector::Close(){ // // - TFile * backup = gFile; + TDirectory * backup = gDirectory; fFile->cd(); if (fDataLayouts){ Int_t entries = fDataLayouts->GetEntriesFast(); @@ -210,49 +242,70 @@ void TTreeSRedirector::Close(){ delete fDataLayouts; fDataLayouts=0; } - backup->cd(); + 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; @@ -261,12 +314,17 @@ TTreeStream::~TTreeStream() void TTreeStream::Close() { + // + // Flush data to disk and close // fTree->Write(); } Int_t TTreeStream::CheckIn(Char_t type, void *pointer) { + // + // Insert object of given type + // if (!fElements) fElements = new TObjArray(1000); TTreeDataElement* element = (TTreeDataElement*)fElements->At(fCurrentIndex); if (!element) { @@ -302,6 +360,7 @@ Int_t TTreeStream::CheckIn(Char_t type, void *pointer) Int_t TTreeStream::CheckIn(TObject *o){ // + // Insert TObject // if (!o) return 0; if (!fElements) fElements = new TObjArray(1000); @@ -339,9 +398,10 @@ Int_t TTreeStream::CheckIn(TObject *o){ 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); @@ -357,7 +417,7 @@ void TTreeStream::BuildTree(){ } if (element->fClass){ if (element->fClass->GetBaseClass("TClonesArray")){ - TBranch * br = fTree->Branch(bname1,&(element->fPointer)); + TBranch * br = fTree->Branch(bname1,element->fClass->GetName(),&(element->fPointer)); fBranches->AddAt(br,i); }else { @@ -376,6 +436,7 @@ void TTreeStream::BuildTree(){ void TTreeStream::Fill(){ // + // Fill the tree // if (fTree) { Int_t entries=fElements->GetEntriesFast(); @@ -394,7 +455,11 @@ void TTreeStream::Fill(){ } } -TTreeStream & TTreeStream::Endl(){ +TTreeStream & TTreeStream::Endl() +{ + // + // Perform pseudo endl operation + // if (fTree->GetNbranches()==0) BuildTree(); Fill(); fStatus =0; @@ -406,9 +471,8 @@ TTreeStream & TTreeStream::Endl(){ TTreeStream &TTreeStream::operator<<(Char_t *name) { // + // Endl // - // - //Endl if (name[0]=='\n'){ return Endl(); }