//5.) and now see results in file tteststreamer.root
}
-
+void TTreeSRedirector::Test2()
+{
+ //
+ //Example test function to show functionality of TTreeSRedirector
+ //
+ //
+ //1.)create the redirector associated with file (testredirector.root)
+ //
+ //
+ TFile* file = new TFile("test.root","recreate");
+ TTreeSRedirector *pmistream= new TTreeSRedirector();
+ TTreeSRedirector &mistream = *pmistream;
+ Char_t ch='s';
+ Float_t f=3.;
+ Float_t f2=1;
+ TObject *po = new TObject;
+ TObject *po2 = new TObject;
+ for (Int_t i=0;i<100000;i++) {
+ f=i*100;
+ po->SetUniqueID(i);
+ po2->SetUniqueID(i*100);
+ ch=i%120;
+ //
+ //2.) create the tree with identifier specified by first argument
+ // layout specified by sequence of arguments
+ // Tree identifier has to be specified as first argument !!!
+ // if the tree and layout was already defined the consistency if layout is checked
+ // if the data are consisten fill given tree
+ // the name of branch can be specified using strings with = at the the end
+ // if string is not specified use automatic convention B0, B1, ...Bn
+ mistream<<"TreeIdentifier"<<"i="<<i<<"ch="<<ch<<"f="<<f<<"po="<<po<<"\n";
+ f = 1./(100.1+i);
+ f2 = -f;
+
+ //3.) just another example - we can fill the same tree with different objects
+ //
+ mistream<<"TreeK"<<f<<po<<"\n";
+ mistream<<"TreeK"<<f2<<po2<<"\n";
+ }
+ //
+ //4.) write the streamed tree's to the file and close the corresponding file in destructor
+ //
+ delete pmistream;
+ delete file;
+ //
+ //5.) and now see results in file testredirector.root
+}
void TTreeSRedirector::Test()
{
TTreeSRedirector::TTreeSRedirector(const char *fname,const char * option) :
- fFile(new TFile(fname,option)),
- fDataLayouts(0)
+ fDirectory(NULL),
+ fDirectoryOwner(kTRUE),
+ fDataLayouts(NULL)
{
//
// Constructor
//
- if (!fFile){
- fFile = new TFile(fname,option);
+ TString name(fname);
+ if (!name.IsNull()){
+ fDirectory = new TFile(fname,option);
+ }
+ else
+ {
+ fDirectory = gDirectory;
+ fDirectoryOwner = kFALSE;
}
}
-
-
TTreeSRedirector::~TTreeSRedirector()
{
//
// Destructor
//
Close(); //write the tree to the selected file
- fFile->Close();
- delete fFile;
+ if (fDirectoryOwner)
+ {
+ fDirectory->Close();
+ delete fDirectory;
+ }
}
void TTreeSRedirector::StoreObject(TObject* object){
//
//
//
TDirectory * backup = gDirectory;
- fFile->cd();
+ fDirectory->cd();
object->Write();
if (backup) backup->cd();
}
-
-void TTreeSRedirector::SetFile(TFile *sfile){
+void TTreeSRedirector::SetDirectory(TDirectory *sfile){
//
// Set the external file
// In case other file already attached old file is closed before
// Redirector will be the owner of file ?
- if (fFile) {
- fFile->Close();
- delete fFile;
+ if (fDirectory && fDirectoryOwner) {
+ fDirectory->Close();
+ delete fDirectory;
}
- fFile=sfile;
+ fDirectory=sfile;
}
-
TTreeStream & TTreeSRedirector::operator<<(Int_t id)
{
//
}
if (!clayout){
TDirectory * backup = gDirectory;
- fFile->cd();
+ fDirectory->cd();
char chname[100];
snprintf(chname,100,"Tree%d",id);
clayout = new TTreeStream(chname);
return *clayout;
}
+void TTreeSRedirector::SetExternalTree(const char* name, TTree* externalTree)
+{
+ TTreeStream *clayout=(TTreeStream*)fDataLayouts->FindObject(name);
+
+ if (!clayout){
+ TDirectory * backup = gDirectory;
+ fDirectory->cd();
+ clayout = new TTreeStream(name,externalTree);
+ clayout->fId=-1;
+ clayout->SetName(name);
+ Int_t entries = fDataLayouts->GetEntriesFast();
+ fDataLayouts->AddAt(clayout,entries);
+ if (backup) backup->cd();
+ }
+ //else
+ // AliError(Form("identifier %s already associated",name));
+}
+
TTreeStream & TTreeSRedirector::operator<<(const char* name)
{
if (!clayout){
TDirectory * backup = gDirectory;
- fFile->cd();
+ fDirectory->cd();
clayout = new TTreeStream(name);
clayout->fId=-1;
clayout->SetName(name);
//
//
TDirectory * backup = gDirectory;
- fFile->cd();
+ fDirectory->cd();
if (fDataLayouts){
Int_t entries = fDataLayouts->GetEntriesFast();
for (Int_t i=0;i<entries;i++){
if (backup) backup->cd();
}
-
-
//-------------------------------------------------------------
TTreeDataElement:: TTreeDataElement(Char_t type) :
TNamed(),
}
//-------------------------------------------------------------------
-TTreeStream::TTreeStream(const char *treename):
+TTreeStream::TTreeStream(const char *treename, TTree* externalTree):
TNamed(treename,treename),
fElements(0),
fBranches(0),
- fTree(new TTree(treename, treename)),
+ fTree(externalTree),
fCurrentIndex(0),
fId(0),
fNextName(),
//
// Standard ctor
//
+ if (!fTree) fTree = new TTree(treename, treename);
}
TTreeStream::~TTreeStream()
#include "TObject.h"
#include "TString.h"
#include "TTree.h"
-class TFile;
+#include "TDirectory.h"
+#include "TFile.h"
class TObjArray;
class TTree;
class TDataType;
class TTreeStream: public TNamed {
friend class TTreeSRedirector;
public:
- TTreeStream(const char *treename);
+ TTreeStream(const char *treename, TTree* externalTree=NULL);
~TTreeStream();
void Close();
static void Test();
class TTreeSRedirector: public TObject {
public:
- TTreeSRedirector(const char *fname, const char * option="new");
+ TTreeSRedirector(const char *fname="", const char * option="new");
virtual ~TTreeSRedirector();
void Close();
static void Test();
+ static void Test2();
void StoreObject(TObject* object);
- TFile * GetFile() {return fFile;};
+ TFile * GetFile() {return fDirectory->GetFile();}
+ TDirectory * GetDirectory() {return fDirectory;}
virtual TTreeStream &operator<<(Int_t id);
virtual TTreeStream &operator<<(const char *name);
- void SetFile(TFile *sfile);
- private:
+ void SetDirectory(TDirectory *sfile);
+ void SetFile(TFile *sfile) {SetDirectory(sfile);}
+ void SetExternalTree(const char* name, TTree* externalTree);
+
+private:
TTreeSRedirector(const TTreeSRedirector & tsr);
TTreeSRedirector & operator=(const TTreeSRedirector & tsr);
- TFile* fFile; //file
+ TDirectory* fDirectory; //file
+ Bool_t fDirectoryOwner; //do we own the directory?
TObjArray *fDataLayouts; //array of data layouts
- ClassDef(TTreeSRedirector,1)
+ ClassDef(TTreeSRedirector,2)
};