]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Extended functionality of the TTreeSRedirector (Mikolaj)
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 11 Dec 2012 16:04:38 +0000 (16:04 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 11 Dec 2012 16:04:38 +0000 (16:04 +0000)
STEER/STEERBase/TTreeStream.cxx
STEER/STEERBase/TTreeStream.h

index acd1487ba1db95913a6c29a7e65ee57ec8ddedfd..b70bb178b4f2a4cfc5a5fb404d7434140a412adb 100644 (file)
@@ -90,7 +90,53 @@ void TTreeStream::Test()
   //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()
 {
@@ -140,52 +186,58 @@ 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)
 {
   //
@@ -204,7 +256,7 @@ 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);
@@ -215,6 +267,24 @@ TTreeStream  & TTreeSRedirector::operator<<(Int_t id)
   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)
 {
@@ -227,7 +297,7 @@ 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);
@@ -244,7 +314,7 @@ void TTreeSRedirector::Close(){
   //
   //
   TDirectory * backup = gDirectory;
-  fFile->cd();
+  fDirectory->cd();
   if (fDataLayouts){
     Int_t entries = fDataLayouts->GetEntriesFast();
     for (Int_t i=0;i<entries;i++){
@@ -259,8 +329,6 @@ void TTreeSRedirector::Close(){
   if (backup) backup->cd();
 }
 
-
-
 //-------------------------------------------------------------
 TTreeDataElement:: TTreeDataElement(Char_t type) :
   TNamed(),
@@ -299,11 +367,11 @@ TTreeDataElement:: TTreeDataElement(TClass* cl) :
 }
 
 //-------------------------------------------------------------------
-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(),
@@ -313,6 +381,7 @@ TTreeStream::TTreeStream(const char *treename):
   //
   // Standard ctor
   //
+  if (!fTree) fTree = new TTree(treename, treename);
 }
 
 TTreeStream::~TTreeStream()
index 6e4538b5a23c7a636aee2ca92dbd9ae390862b37..d791861abba6886646448cb85c1ee643e10380e9 100644 (file)
@@ -7,7 +7,8 @@
 #include "TObject.h"
 #include "TString.h"
 #include "TTree.h"
-class TFile;
+#include "TDirectory.h"
+#include "TFile.h"
 class TObjArray;
 class TTree;
 class TDataType;
@@ -35,7 +36,7 @@ class TTreeDataElement: public TNamed {
 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();
@@ -84,23 +85,29 @@ public:
 
 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
 };