]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/TTreeStream.cxx
Fixing CONSTANT_EXPRESSION_RESULT Coverity defect
[u/mrichter/AliRoot.git] / STEER / TTreeStream.cxx
index aad023109017f3337f71f06ed66fdd8997b2e4ab..0e2013362015f315d4369e9cb1a99afa7277a81a 100644 (file)
@@ -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 <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()
@@ -122,28 +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)
 {
@@ -162,11 +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;
 }
@@ -178,23 +208,17 @@ TTreeStream  & TTreeSRedirector::operator<<(const char* name)
   // 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;
 }
@@ -205,55 +229,83 @@ TTreeStream  & TTreeSRedirector::operator<<(const char* name)
 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;
@@ -262,13 +314,19 @@ TTreeStream::~TTreeStream()
 
 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);
@@ -303,6 +361,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);
@@ -340,9 +399,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,8 +417,14 @@ void TTreeStream::BuildTree(){
       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];
@@ -371,6 +437,7 @@ void TTreeStream::BuildTree(){
 
 void TTreeStream::Fill(){
   //
+  // Fill the tree
   //
   if (fTree) { 
     Int_t entries=fElements->GetEntriesFast();
@@ -389,7 +456,11 @@ void TTreeStream::Fill(){
   }
 }
 
-TTreeStream & TTreeStream::Endl(){
+TTreeStream & TTreeStream::Endl()
+{
+  //
+  // Perform pseudo endl operation
+  //
   if (fTree->GetNbranches()==0) BuildTree();
   Fill();
   fStatus =0;
@@ -398,12 +469,11 @@ TTreeStream & TTreeStream::Endl(){
 }
 
 
-TTreeStream  &TTreeStream::operator<<(Char_t *name)
+TTreeStream  &TTreeStream::operator<<(const Char_t *name)
 {
   //
+  // Endl 
   //
-  //
-  //Endl 
   if (name[0]=='\n'){
     return Endl();
   }