ROOT logo
/**************************************************************************
 * 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"
// includes for test procedures
#include "TVectorD.h"
#include "TRandom.h"

ClassImp(TTreeDataElement)
ClassImp(TTreeStream)
ClassImp(TTreeSRedirector)



void TTreeStream::Test()
{
  //
  // 
  TFile *ftest = new TFile("teststreamer.root","recreate");
  if (!ftest) ftest = new TFile("teststreamer.root","new");
  //
  //create to streems Tree1 and Tree2
  TTreeStream stream1("Tree1");
  TTreeStream stream2("Tree2");
  //
  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;
    //
    //    Stream the data
    //    The data layout of stream is defined during first invocation of streamer.
    //    Endl is the trigger which define the end of structure.
    // 
    //    The name of branch can be specified using strings with = at the the end
    //    if string is not specified automatic convention is u (sed B0, B1, ...Bn)
    stream1<<"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
    //
    stream2<<f<<po<<"\n";
    stream2<<f2<<po2<<"\n";
  }
  //
  //4.) Close the streeamers (Write the streamed tree's to the file) and close the corresponding file.
  //
  stream1.Close();
  stream2.Close();
  ftest->Close();
  delete ftest;
  //
  //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()
{
  //
  //Example test function to show functionality of TTreeSRedirector
  //
  //
  //1.)create the  redirector associated with file (testredirector.root)
  //
  //
  TTreeSRedirector *pmistream= new TTreeSRedirector("testredirector.root");
  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;
  //
  //5.) and now see results in file testredirector.root 
}

void TTreeSRedirector::UnitTest(Int_t testEntries){
  //
  //
  //
  UnitTestSparse(0.5,testEntries);
  UnitTestSparse(0.1,testEntries);
  UnitTestSparse(0.01,testEntries);
}

void TTreeSRedirector::UnitTestSparse(Double_t scale, Int_t testEntries){
  //
  // Unit test for the TTreeSRedirector
  // 1.) Test TTreeRedirector 
  //      a.) Fill tree with random vectors
  //      b.) Fill downscaled version of vectors
  //      c.) The same skipping first entry
  // 2.) Check results wtitten to terminale
  //     a.) Disk consumption 
  //             skip data should be scale time smaller than full
  //             zerro replaced  ata should be compresed time smaller than full
  //     b.) Test invariants
  // Input parameter scale => downscaling of sprse element 
  //            
  if (scale<=0) scale=1;
  if (scale>1) scale=1;
  TTreeSRedirector *pcstream = new TTreeSRedirector("testpcstreamSparse.root","recreate");
  for (Int_t ientry=0; ientry<testEntries; ientry++){
    TVectorD vecRandom(200);
    TVectorD vecZerro(200);   // zerro vector
    for (Int_t j=0; j<200; j++) vecRandom[j]=j+ientry+0.1*gRandom->Rndm();
    Bool_t isSelected= (gRandom->Rndm()<scale);
    TVectorD *pvecFull   = &vecRandom;
    TVectorD *pvecSparse = isSelected ? &vecRandom:0;
    TVectorD *pvecSparse0 = isSelected ? &vecRandom:0;
    TVectorD *pvecSparse1 = isSelected ? &vecRandom:&vecZerro;

    if (ientry==0) {
      pvecSparse0=0;
      pvecSparse=&vecRandom;
    }
    (*pcstream)<<"Full"<<                  // stored all vectors
      "ientry="<<ientry<<
      "vec.="<<pvecFull<<                  
      "\n";
    (*pcstream)<<"SparseSkip"<<                // fraction of vectors stored
      "ientry="<<ientry<<
      "vec.="<<pvecSparse<<                
      "\n";
    (*pcstream)<<"SparseSkip0"<<               // fraction with -pointer
      "ientry="<<ientry<<
      "vec.="<<pvecSparse0<<
      "\n";
    (*pcstream)<<"SparseZerro"<<               // all vectors filled, franction filled with 0
      "ientry="<<ientry<<
      "vec.="<<pvecSparse1<<
      "\n";
  }
  delete pcstream;
  //
  // 2.) check results
  //
  TFile* f = TFile::Open("testpcstreamSparse.root");
  TTree * treeFull = (TTree*)f->Get("Full");
  TTree * treeSparseSkip = (TTree*)f->Get("SparseSkip");
  TTree * treeSparseSkip0 = (TTree*)f->Get("SparseSkip0");
  TTree * treeSparseZerro = (TTree*)f->Get("SparseZerro");
  //    a.) data volume
  //
  Double_t ratio=(1./scale)*treeSparseSkip->GetZipBytes()/Double_t(treeFull->GetZipBytes());
  Double_t ratio0=(1./scale)*treeSparseSkip0->GetZipBytes()/Double_t(treeFull->GetZipBytes());
  Double_t ratio1=(1./scale)*treeSparseZerro->GetZipBytes()/Double_t(treeFull->GetZipBytes());
  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tRatioSkip\t%f\n",scale,ratio);
  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tRatioSkip0\t%f\n",scale,ratio0);
  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tRatioZerro\t%f\n",scale,ratio1);
  //    b.) Integrity 
  Int_t outlyersSparseSkip=treeSparseSkip->Draw("1","(vec.fElements-ientry-Iteration$-0.5)>0.5","goff");
  Int_t outlyersSparseSkip0=treeSparseSkip0->Draw("1","(vec.fElements-ientry-Iteration$-0.5)>0.5","goff");
  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tOutlyersSkip\t%d\n",scale,outlyersSparseSkip!=0);
  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tOutlyersSkip0\t%d\n",scale,outlyersSparseSkip0!=0);
  //    c.) Number of entries
  //
  Int_t entries=treeFull->GetEntries();
  Int_t entries0=treeSparseSkip0->GetEntries();
  Bool_t  isOKStat =(entries==entries0);
  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tEntries\t%d\n",scale,isOKStat);
  //
  //   d.)Reading test
  TVectorD *pvecRead   = 0;
  treeSparseSkip0->SetBranchAddress("vec.",&pvecRead);
  Bool_t readOK=kTRUE;
  for (Int_t ientry=0; ientry<testEntries; ientry++){
    if (!pvecRead) continue;
    if (pvecRead->GetNrows()==0) continue;
    if (TMath::Abs((*pvecRead)[0]-ientry)>0.5) readOK=kFALSE;
  }
  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tReadOK\t%d\n",scale,readOK);
  //
  //   e.)Global test
  Bool_t isOK=(outlyersSparseSkip0==0)&&isOKStat&&readOK;
  printf("#UnitTest:\tTTreeSRedirector::TestSparse(%f)\tisOk\t%d\n",scale,isOK);  

}

TTreeSRedirector::TTreeSRedirector(const char *fname,const char * option) :
  fDirectory(NULL),
  fDirectoryOwner(kTRUE),
  fDataLayouts(NULL)
{
  //
  // Constructor
  //
  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
  if (fDirectoryOwner)
  {
    fDirectory->Close();
    delete fDirectory;
  }
}
void TTreeSRedirector::StoreObject(TObject* object){
  //
  //
  //
  TDirectory * backup = gDirectory;
  fDirectory->cd();
  object->Write();
  if (backup) backup->cd();
}

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 (fDirectory && fDirectoryOwner) {
    fDirectory->Close();
    delete fDirectory;
  }
  fDirectory=sfile;
}

TTreeStream  & TTreeSRedirector::operator<<(Int_t id)
{
  //
  // 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 entries = fDataLayouts->GetEntriesFast();
  for (Int_t i=0;i<entries;i++){
    TTreeStream * layout = (TTreeStream*)fDataLayouts->At(i);
    if (!layout) continue;
    if (layout->fId==id) {
      clayout = layout;
      break;
    }
  }
  if (!clayout){
    TDirectory * backup = gDirectory;
    fDirectory->cd();
    char chname[100];
    snprintf(chname,100,"Tree%d",id);
    clayout = new TTreeStream(chname);
    clayout->fId=id;
    fDataLayouts->AddAt(clayout,entries);
    if (backup) backup->cd();
  }
  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)
{
  //
  // return reference to the data layout with given identifier
  // if not existing - creates new
  if (!fDataLayouts) fDataLayouts = new TObjArray(10000);
  TTreeStream *clayout=(TTreeStream*)fDataLayouts->FindObject(name);
  Int_t entries = fDataLayouts->GetEntriesFast();

  if (!clayout){
    TDirectory * backup = gDirectory;
    fDirectory->cd();
    clayout = new TTreeStream(name);
    clayout->fId=-1;
    clayout->SetName(name);
    fDataLayouts->AddAt(clayout,entries);    
    if (backup) backup->cd();
  }
  return *clayout;
}




void TTreeSRedirector::Close(){
  //
  //
  TDirectory * backup = gDirectory;
  fDirectory->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) :
  TNamed(),
  fType(type),
  fDType(0),
  fClass(0),
  fPointer(0)
{
  //
  //
  //
}

TTreeDataElement:: TTreeDataElement(TDataType* type) :
  TNamed(),
  fType(0),
  fDType(type),
  fClass(0),
  fPointer(0)
{
  //
  //
  //
}

TTreeDataElement:: TTreeDataElement(TClass* cl) :
  TNamed(),
  fType(0),
  fDType(0),
  fClass(cl),
  fPointer(0)
{
  //
  //
  //
}

//-------------------------------------------------------------------
TTreeStream::TTreeStream(const char *treename, TTree* externalTree):
  TNamed(treename,treename),
  fElements(0),
  fBranches(0),
  fTree(externalTree),
  fCurrentIndex(0),
  fId(0),
  fNextName(),
  fNextNameCounter(),
  fStatus(0)
{
  //
  // Standard ctor
  //
  if (!fTree) fTree = new TTree(treename, treename);
}

TTreeStream::~TTreeStream()
{
  //
  // Class dtor
  //
  fElements->Delete();
  fBranches->Clear();
  delete fElements;
  delete fBranches;
}

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(10000);
  if (fElements->GetSize()<=fCurrentIndex) fElements->Expand(fCurrentIndex*2);
  TTreeDataElement* element = (TTreeDataElement*)fElements->At(fCurrentIndex);
  if (!element) {
    element = new TTreeDataElement(type);
    //
    char name[1000];
    if (fNextName.Length()>0){
      if (fNextNameCounter==0){
	snprintf(name,1000,"%s",(const char*)fNextName);
      }
      if (fNextNameCounter>0){
	snprintf(name,1000,"%s%d",(const char*)fNextName,fNextNameCounter);
      }      
    }
    else{
      snprintf(name,1000,"B%d.",fCurrentIndex);
    }
    element->SetName(name);
    //
    element->SetPointer(pointer);
    fElements->AddAt(element,fCurrentIndex);
    fCurrentIndex++;
    return 0; //new element added
  }
  if (element->GetType()!=type){
    fStatus++;
    return 1; //mismatched data element
  }
  element->SetPointer(pointer);
  fCurrentIndex++;
  return 0;
}

Int_t TTreeStream::CheckIn(TObject *pObject){
  //
  // Insert TObject
  //
  TClass *pClass = 0;
  if (pObject) pClass=pObject->IsA();
  if (!fElements) fElements = new TObjArray(1000);
  TTreeDataElement* element = (TTreeDataElement*)fElements->At(fCurrentIndex);
  if (!element) {
    element = new TTreeDataElement(pClass);
    //
    char name[1000];
    if (fNextName.Length()>0){
      if (fNextNameCounter==0){
	snprintf(name,1000,"%s",(const char*)fNextName);
      }
      if (fNextNameCounter>0){
	snprintf(name,1000,"%s%d",(const char*)fNextName,fNextNameCounter);
      }      
    }
    else{
      snprintf(name,1000,"B%d",fCurrentIndex);
    }
    element->SetName(name);
    
    element->SetPointer(pObject);
    fElements->AddAt(element,fCurrentIndex);
    fCurrentIndex++;
    return 0; //new element added
  }
  if (element->fClass==0) {
    element->fClass=pClass;
  }else{
    if (element->fClass!=pClass && pClass!=0){
      fStatus++;
      return 1; //mismatched data element
    }
  }
  element->SetPointer(pObject);
  fCurrentIndex++;
  return 0;  
}

void TTreeStream::BuildTree(){
  //
  // Build the Tree
  //
  //if (fTree && fTree->GetEntries()>0) return;
  Int_t entriesFilled=0;
  if (!fTree)  {
    fTree = new TTree(GetName(),GetName());
  }else{
    entriesFilled=fTree->GetEntries();
  }
  Int_t entries = fElements->GetEntriesFast();  
  if (!fBranches) fBranches = new TObjArray(entries);
  
  for (Int_t i=0;i<entries;i++){
    //
    TTreeDataElement* element = (TTreeDataElement*)fElements->At(i);
    if (fBranches->At(i)) continue;
    char bname1[1000];
    if (element->GetName()[0]==0){
      snprintf(bname1,1000,"B%d",i);
    }
    else{
      snprintf(bname1,1000,"%s",element->GetName());
    }
    if (element->fClass){
      if (element->fClass->GetBaseClass("TClonesArray")){
	TBranch * br = fTree->Branch(bname1,element->fClass->GetName(),&(element->fPointer));
	if (entriesFilled!=0) {
	  br->SetAddress(0);
	  for (Int_t ientry=0; ientry<entriesFilled;ientry++) br->Fill();
	  br->SetAddress(&(element->fPointer));
	}
	fBranches->AddAt(br,i);
      }else
	{
	  TBranch * br = fTree->Branch(bname1,element->fClass->GetName(),&(element->fPointer));
	  if (entriesFilled!=0) {
	    br->SetAddress(0);
	    for (Int_t ientry=0; ientry<entriesFilled;ientry++) br->Fill();
	    br->SetAddress(&(element->fPointer));
	  }
	  fBranches->AddAt(br,i);
	}
    }
    if (element->GetType()>0){
      char bname2[1000];
      snprintf(bname2,1000,"B%d/%c",i,element->GetType());
      TBranch * br = fTree->Branch(bname1,element->fPointer,bname2);
      if (entriesFilled!=0) {
	br->SetAddress(0);
	for (Int_t ientry=0; ientry<entriesFilled;ientry++) br->Fill();
	br->SetAddress(element->fPointer);
      }

      fBranches->AddAt(br,i);
    }
  }
}

void TTreeStream::Fill(){
  //
  // Fill the tree
  //
  if (fTree) { 
    Int_t entries=fElements->GetEntriesFast();
    if (entries>fTree->GetNbranches()) BuildTree();
    for (Int_t i=0;i<entries;i++){    
      TTreeDataElement* el  = (TTreeDataElement*)fElements->At(i);
      if (!el) continue;
      if (!el->GetType()) continue;
      TBranch      * br  = (TBranch*)fBranches->At(i);
      if (br &&el){
	if (el->GetType())  br->SetAddress(el->fPointer);
      }
    }
    if (fStatus==0) fTree->Fill(); //fill only in case of non conflicts
    fStatus=0;
  }
}

TTreeStream & TTreeStream::Endl()
{
  //
  // Perform pseudo endl operation
  //
  if (fTree->GetNbranches()==0) BuildTree();
  Fill();
  fStatus =0;
  fCurrentIndex=0;
  return *this;
}


TTreeStream  &TTreeStream::operator<<(const Char_t *name)
{
  //
  // Endl 
  //
  if (name[0]=='\n'){
    return Endl();
  }
  //
  //if tree was already defined ignore
  if (fTree->GetEntries()>0) return *this;
  //check branch name if tree was not 
  //
  Int_t last=0;
  for (last=0;;last++){
    if (name[last]==0) break;    
  }
  
  if (last>0&&name[last-1]=='='){
    fNextName = name;
    fNextName[last-1]=0;
    fNextNameCounter=0;
  }
  return *this;
}

 TTreeStream.cxx:1
 TTreeStream.cxx:2
 TTreeStream.cxx:3
 TTreeStream.cxx:4
 TTreeStream.cxx:5
 TTreeStream.cxx:6
 TTreeStream.cxx:7
 TTreeStream.cxx:8
 TTreeStream.cxx:9
 TTreeStream.cxx:10
 TTreeStream.cxx:11
 TTreeStream.cxx:12
 TTreeStream.cxx:13
 TTreeStream.cxx:14
 TTreeStream.cxx:15
 TTreeStream.cxx:16
 TTreeStream.cxx:17
 TTreeStream.cxx:18
 TTreeStream.cxx:19
 TTreeStream.cxx:20
 TTreeStream.cxx:21
 TTreeStream.cxx:22
 TTreeStream.cxx:23
 TTreeStream.cxx:24
 TTreeStream.cxx:25
 TTreeStream.cxx:26
 TTreeStream.cxx:27
 TTreeStream.cxx:28
 TTreeStream.cxx:29
 TTreeStream.cxx:30
 TTreeStream.cxx:31
 TTreeStream.cxx:32
 TTreeStream.cxx:33
 TTreeStream.cxx:34
 TTreeStream.cxx:35
 TTreeStream.cxx:36
 TTreeStream.cxx:37
 TTreeStream.cxx:38
 TTreeStream.cxx:39
 TTreeStream.cxx:40
 TTreeStream.cxx:41
 TTreeStream.cxx:42
 TTreeStream.cxx:43
 TTreeStream.cxx:44
 TTreeStream.cxx:45
 TTreeStream.cxx:46
 TTreeStream.cxx:47
 TTreeStream.cxx:48
 TTreeStream.cxx:49
 TTreeStream.cxx:50
 TTreeStream.cxx:51
 TTreeStream.cxx:52
 TTreeStream.cxx:53
 TTreeStream.cxx:54
 TTreeStream.cxx:55
 TTreeStream.cxx:56
 TTreeStream.cxx:57
 TTreeStream.cxx:58
 TTreeStream.cxx:59
 TTreeStream.cxx:60
 TTreeStream.cxx:61
 TTreeStream.cxx:62
 TTreeStream.cxx:63
 TTreeStream.cxx:64
 TTreeStream.cxx:65
 TTreeStream.cxx:66
 TTreeStream.cxx:67
 TTreeStream.cxx:68
 TTreeStream.cxx:69
 TTreeStream.cxx:70
 TTreeStream.cxx:71
 TTreeStream.cxx:72
 TTreeStream.cxx:73
 TTreeStream.cxx:74
 TTreeStream.cxx:75
 TTreeStream.cxx:76
 TTreeStream.cxx:77
 TTreeStream.cxx:78
 TTreeStream.cxx:79
 TTreeStream.cxx:80
 TTreeStream.cxx:81
 TTreeStream.cxx:82
 TTreeStream.cxx:83
 TTreeStream.cxx:84
 TTreeStream.cxx:85
 TTreeStream.cxx:86
 TTreeStream.cxx:87
 TTreeStream.cxx:88
 TTreeStream.cxx:89
 TTreeStream.cxx:90
 TTreeStream.cxx:91
 TTreeStream.cxx:92
 TTreeStream.cxx:93
 TTreeStream.cxx:94
 TTreeStream.cxx:95
 TTreeStream.cxx:96
 TTreeStream.cxx:97
 TTreeStream.cxx:98
 TTreeStream.cxx:99
 TTreeStream.cxx:100
 TTreeStream.cxx:101
 TTreeStream.cxx:102
 TTreeStream.cxx:103
 TTreeStream.cxx:104
 TTreeStream.cxx:105
 TTreeStream.cxx:106
 TTreeStream.cxx:107
 TTreeStream.cxx:108
 TTreeStream.cxx:109
 TTreeStream.cxx:110
 TTreeStream.cxx:111
 TTreeStream.cxx:112
 TTreeStream.cxx:113
 TTreeStream.cxx:114
 TTreeStream.cxx:115
 TTreeStream.cxx:116
 TTreeStream.cxx:117
 TTreeStream.cxx:118
 TTreeStream.cxx:119
 TTreeStream.cxx:120
 TTreeStream.cxx:121
 TTreeStream.cxx:122
 TTreeStream.cxx:123
 TTreeStream.cxx:124
 TTreeStream.cxx:125
 TTreeStream.cxx:126
 TTreeStream.cxx:127
 TTreeStream.cxx:128
 TTreeStream.cxx:129
 TTreeStream.cxx:130
 TTreeStream.cxx:131
 TTreeStream.cxx:132
 TTreeStream.cxx:133
 TTreeStream.cxx:134
 TTreeStream.cxx:135
 TTreeStream.cxx:136
 TTreeStream.cxx:137
 TTreeStream.cxx:138
 TTreeStream.cxx:139
 TTreeStream.cxx:140
 TTreeStream.cxx:141
 TTreeStream.cxx:142
 TTreeStream.cxx:143
 TTreeStream.cxx:144
 TTreeStream.cxx:145
 TTreeStream.cxx:146
 TTreeStream.cxx:147
 TTreeStream.cxx:148
 TTreeStream.cxx:149
 TTreeStream.cxx:150
 TTreeStream.cxx:151
 TTreeStream.cxx:152
 TTreeStream.cxx:153
 TTreeStream.cxx:154
 TTreeStream.cxx:155
 TTreeStream.cxx:156
 TTreeStream.cxx:157
 TTreeStream.cxx:158
 TTreeStream.cxx:159
 TTreeStream.cxx:160
 TTreeStream.cxx:161
 TTreeStream.cxx:162
 TTreeStream.cxx:163
 TTreeStream.cxx:164
 TTreeStream.cxx:165
 TTreeStream.cxx:166
 TTreeStream.cxx:167
 TTreeStream.cxx:168
 TTreeStream.cxx:169
 TTreeStream.cxx:170
 TTreeStream.cxx:171
 TTreeStream.cxx:172
 TTreeStream.cxx:173
 TTreeStream.cxx:174
 TTreeStream.cxx:175
 TTreeStream.cxx:176
 TTreeStream.cxx:177
 TTreeStream.cxx:178
 TTreeStream.cxx:179
 TTreeStream.cxx:180
 TTreeStream.cxx:181
 TTreeStream.cxx:182
 TTreeStream.cxx:183
 TTreeStream.cxx:184
 TTreeStream.cxx:185
 TTreeStream.cxx:186
 TTreeStream.cxx:187
 TTreeStream.cxx:188
 TTreeStream.cxx:189
 TTreeStream.cxx:190
 TTreeStream.cxx:191
 TTreeStream.cxx:192
 TTreeStream.cxx:193
 TTreeStream.cxx:194
 TTreeStream.cxx:195
 TTreeStream.cxx:196
 TTreeStream.cxx:197
 TTreeStream.cxx:198
 TTreeStream.cxx:199
 TTreeStream.cxx:200
 TTreeStream.cxx:201
 TTreeStream.cxx:202
 TTreeStream.cxx:203
 TTreeStream.cxx:204
 TTreeStream.cxx:205
 TTreeStream.cxx:206
 TTreeStream.cxx:207
 TTreeStream.cxx:208
 TTreeStream.cxx:209
 TTreeStream.cxx:210
 TTreeStream.cxx:211
 TTreeStream.cxx:212
 TTreeStream.cxx:213
 TTreeStream.cxx:214
 TTreeStream.cxx:215
 TTreeStream.cxx:216
 TTreeStream.cxx:217
 TTreeStream.cxx:218
 TTreeStream.cxx:219
 TTreeStream.cxx:220
 TTreeStream.cxx:221
 TTreeStream.cxx:222
 TTreeStream.cxx:223
 TTreeStream.cxx:224
 TTreeStream.cxx:225
 TTreeStream.cxx:226
 TTreeStream.cxx:227
 TTreeStream.cxx:228
 TTreeStream.cxx:229
 TTreeStream.cxx:230
 TTreeStream.cxx:231
 TTreeStream.cxx:232
 TTreeStream.cxx:233
 TTreeStream.cxx:234
 TTreeStream.cxx:235
 TTreeStream.cxx:236
 TTreeStream.cxx:237
 TTreeStream.cxx:238
 TTreeStream.cxx:239
 TTreeStream.cxx:240
 TTreeStream.cxx:241
 TTreeStream.cxx:242
 TTreeStream.cxx:243
 TTreeStream.cxx:244
 TTreeStream.cxx:245
 TTreeStream.cxx:246
 TTreeStream.cxx:247
 TTreeStream.cxx:248
 TTreeStream.cxx:249
 TTreeStream.cxx:250
 TTreeStream.cxx:251
 TTreeStream.cxx:252
 TTreeStream.cxx:253
 TTreeStream.cxx:254
 TTreeStream.cxx:255
 TTreeStream.cxx:256
 TTreeStream.cxx:257
 TTreeStream.cxx:258
 TTreeStream.cxx:259
 TTreeStream.cxx:260
 TTreeStream.cxx:261
 TTreeStream.cxx:262
 TTreeStream.cxx:263
 TTreeStream.cxx:264
 TTreeStream.cxx:265
 TTreeStream.cxx:266
 TTreeStream.cxx:267
 TTreeStream.cxx:268
 TTreeStream.cxx:269
 TTreeStream.cxx:270
 TTreeStream.cxx:271
 TTreeStream.cxx:272
 TTreeStream.cxx:273
 TTreeStream.cxx:274
 TTreeStream.cxx:275
 TTreeStream.cxx:276
 TTreeStream.cxx:277
 TTreeStream.cxx:278
 TTreeStream.cxx:279
 TTreeStream.cxx:280
 TTreeStream.cxx:281
 TTreeStream.cxx:282
 TTreeStream.cxx:283
 TTreeStream.cxx:284
 TTreeStream.cxx:285
 TTreeStream.cxx:286
 TTreeStream.cxx:287
 TTreeStream.cxx:288
 TTreeStream.cxx:289
 TTreeStream.cxx:290
 TTreeStream.cxx:291
 TTreeStream.cxx:292
 TTreeStream.cxx:293
 TTreeStream.cxx:294
 TTreeStream.cxx:295
 TTreeStream.cxx:296
 TTreeStream.cxx:297
 TTreeStream.cxx:298
 TTreeStream.cxx:299
 TTreeStream.cxx:300
 TTreeStream.cxx:301
 TTreeStream.cxx:302
 TTreeStream.cxx:303
 TTreeStream.cxx:304
 TTreeStream.cxx:305
 TTreeStream.cxx:306
 TTreeStream.cxx:307
 TTreeStream.cxx:308
 TTreeStream.cxx:309
 TTreeStream.cxx:310
 TTreeStream.cxx:311
 TTreeStream.cxx:312
 TTreeStream.cxx:313
 TTreeStream.cxx:314
 TTreeStream.cxx:315
 TTreeStream.cxx:316
 TTreeStream.cxx:317
 TTreeStream.cxx:318
 TTreeStream.cxx:319
 TTreeStream.cxx:320
 TTreeStream.cxx:321
 TTreeStream.cxx:322
 TTreeStream.cxx:323
 TTreeStream.cxx:324
 TTreeStream.cxx:325
 TTreeStream.cxx:326
 TTreeStream.cxx:327
 TTreeStream.cxx:328
 TTreeStream.cxx:329
 TTreeStream.cxx:330
 TTreeStream.cxx:331
 TTreeStream.cxx:332
 TTreeStream.cxx:333
 TTreeStream.cxx:334
 TTreeStream.cxx:335
 TTreeStream.cxx:336
 TTreeStream.cxx:337
 TTreeStream.cxx:338
 TTreeStream.cxx:339
 TTreeStream.cxx:340
 TTreeStream.cxx:341
 TTreeStream.cxx:342
 TTreeStream.cxx:343
 TTreeStream.cxx:344
 TTreeStream.cxx:345
 TTreeStream.cxx:346
 TTreeStream.cxx:347
 TTreeStream.cxx:348
 TTreeStream.cxx:349
 TTreeStream.cxx:350
 TTreeStream.cxx:351
 TTreeStream.cxx:352
 TTreeStream.cxx:353
 TTreeStream.cxx:354
 TTreeStream.cxx:355
 TTreeStream.cxx:356
 TTreeStream.cxx:357
 TTreeStream.cxx:358
 TTreeStream.cxx:359
 TTreeStream.cxx:360
 TTreeStream.cxx:361
 TTreeStream.cxx:362
 TTreeStream.cxx:363
 TTreeStream.cxx:364
 TTreeStream.cxx:365
 TTreeStream.cxx:366
 TTreeStream.cxx:367
 TTreeStream.cxx:368
 TTreeStream.cxx:369
 TTreeStream.cxx:370
 TTreeStream.cxx:371
 TTreeStream.cxx:372
 TTreeStream.cxx:373
 TTreeStream.cxx:374
 TTreeStream.cxx:375
 TTreeStream.cxx:376
 TTreeStream.cxx:377
 TTreeStream.cxx:378
 TTreeStream.cxx:379
 TTreeStream.cxx:380
 TTreeStream.cxx:381
 TTreeStream.cxx:382
 TTreeStream.cxx:383
 TTreeStream.cxx:384
 TTreeStream.cxx:385
 TTreeStream.cxx:386
 TTreeStream.cxx:387
 TTreeStream.cxx:388
 TTreeStream.cxx:389
 TTreeStream.cxx:390
 TTreeStream.cxx:391
 TTreeStream.cxx:392
 TTreeStream.cxx:393
 TTreeStream.cxx:394
 TTreeStream.cxx:395
 TTreeStream.cxx:396
 TTreeStream.cxx:397
 TTreeStream.cxx:398
 TTreeStream.cxx:399
 TTreeStream.cxx:400
 TTreeStream.cxx:401
 TTreeStream.cxx:402
 TTreeStream.cxx:403
 TTreeStream.cxx:404
 TTreeStream.cxx:405
 TTreeStream.cxx:406
 TTreeStream.cxx:407
 TTreeStream.cxx:408
 TTreeStream.cxx:409
 TTreeStream.cxx:410
 TTreeStream.cxx:411
 TTreeStream.cxx:412
 TTreeStream.cxx:413
 TTreeStream.cxx:414
 TTreeStream.cxx:415
 TTreeStream.cxx:416
 TTreeStream.cxx:417
 TTreeStream.cxx:418
 TTreeStream.cxx:419
 TTreeStream.cxx:420
 TTreeStream.cxx:421
 TTreeStream.cxx:422
 TTreeStream.cxx:423
 TTreeStream.cxx:424
 TTreeStream.cxx:425
 TTreeStream.cxx:426
 TTreeStream.cxx:427
 TTreeStream.cxx:428
 TTreeStream.cxx:429
 TTreeStream.cxx:430
 TTreeStream.cxx:431
 TTreeStream.cxx:432
 TTreeStream.cxx:433
 TTreeStream.cxx:434
 TTreeStream.cxx:435
 TTreeStream.cxx:436
 TTreeStream.cxx:437
 TTreeStream.cxx:438
 TTreeStream.cxx:439
 TTreeStream.cxx:440
 TTreeStream.cxx:441
 TTreeStream.cxx:442
 TTreeStream.cxx:443
 TTreeStream.cxx:444
 TTreeStream.cxx:445
 TTreeStream.cxx:446
 TTreeStream.cxx:447
 TTreeStream.cxx:448
 TTreeStream.cxx:449
 TTreeStream.cxx:450
 TTreeStream.cxx:451
 TTreeStream.cxx:452
 TTreeStream.cxx:453
 TTreeStream.cxx:454
 TTreeStream.cxx:455
 TTreeStream.cxx:456
 TTreeStream.cxx:457
 TTreeStream.cxx:458
 TTreeStream.cxx:459
 TTreeStream.cxx:460
 TTreeStream.cxx:461
 TTreeStream.cxx:462
 TTreeStream.cxx:463
 TTreeStream.cxx:464
 TTreeStream.cxx:465
 TTreeStream.cxx:466
 TTreeStream.cxx:467
 TTreeStream.cxx:468
 TTreeStream.cxx:469
 TTreeStream.cxx:470
 TTreeStream.cxx:471
 TTreeStream.cxx:472
 TTreeStream.cxx:473
 TTreeStream.cxx:474
 TTreeStream.cxx:475
 TTreeStream.cxx:476
 TTreeStream.cxx:477
 TTreeStream.cxx:478
 TTreeStream.cxx:479
 TTreeStream.cxx:480
 TTreeStream.cxx:481
 TTreeStream.cxx:482
 TTreeStream.cxx:483
 TTreeStream.cxx:484
 TTreeStream.cxx:485
 TTreeStream.cxx:486
 TTreeStream.cxx:487
 TTreeStream.cxx:488
 TTreeStream.cxx:489
 TTreeStream.cxx:490
 TTreeStream.cxx:491
 TTreeStream.cxx:492
 TTreeStream.cxx:493
 TTreeStream.cxx:494
 TTreeStream.cxx:495
 TTreeStream.cxx:496
 TTreeStream.cxx:497
 TTreeStream.cxx:498
 TTreeStream.cxx:499
 TTreeStream.cxx:500
 TTreeStream.cxx:501
 TTreeStream.cxx:502
 TTreeStream.cxx:503
 TTreeStream.cxx:504
 TTreeStream.cxx:505
 TTreeStream.cxx:506
 TTreeStream.cxx:507
 TTreeStream.cxx:508
 TTreeStream.cxx:509
 TTreeStream.cxx:510
 TTreeStream.cxx:511
 TTreeStream.cxx:512
 TTreeStream.cxx:513
 TTreeStream.cxx:514
 TTreeStream.cxx:515
 TTreeStream.cxx:516
 TTreeStream.cxx:517
 TTreeStream.cxx:518
 TTreeStream.cxx:519
 TTreeStream.cxx:520
 TTreeStream.cxx:521
 TTreeStream.cxx:522
 TTreeStream.cxx:523
 TTreeStream.cxx:524
 TTreeStream.cxx:525
 TTreeStream.cxx:526
 TTreeStream.cxx:527
 TTreeStream.cxx:528
 TTreeStream.cxx:529
 TTreeStream.cxx:530
 TTreeStream.cxx:531
 TTreeStream.cxx:532
 TTreeStream.cxx:533
 TTreeStream.cxx:534
 TTreeStream.cxx:535
 TTreeStream.cxx:536
 TTreeStream.cxx:537
 TTreeStream.cxx:538
 TTreeStream.cxx:539
 TTreeStream.cxx:540
 TTreeStream.cxx:541
 TTreeStream.cxx:542
 TTreeStream.cxx:543
 TTreeStream.cxx:544
 TTreeStream.cxx:545
 TTreeStream.cxx:546
 TTreeStream.cxx:547
 TTreeStream.cxx:548
 TTreeStream.cxx:549
 TTreeStream.cxx:550
 TTreeStream.cxx:551
 TTreeStream.cxx:552
 TTreeStream.cxx:553
 TTreeStream.cxx:554
 TTreeStream.cxx:555
 TTreeStream.cxx:556
 TTreeStream.cxx:557
 TTreeStream.cxx:558
 TTreeStream.cxx:559
 TTreeStream.cxx:560
 TTreeStream.cxx:561
 TTreeStream.cxx:562
 TTreeStream.cxx:563
 TTreeStream.cxx:564
 TTreeStream.cxx:565
 TTreeStream.cxx:566
 TTreeStream.cxx:567
 TTreeStream.cxx:568
 TTreeStream.cxx:569
 TTreeStream.cxx:570
 TTreeStream.cxx:571
 TTreeStream.cxx:572
 TTreeStream.cxx:573
 TTreeStream.cxx:574
 TTreeStream.cxx:575
 TTreeStream.cxx:576
 TTreeStream.cxx:577
 TTreeStream.cxx:578
 TTreeStream.cxx:579
 TTreeStream.cxx:580
 TTreeStream.cxx:581
 TTreeStream.cxx:582
 TTreeStream.cxx:583
 TTreeStream.cxx:584
 TTreeStream.cxx:585
 TTreeStream.cxx:586
 TTreeStream.cxx:587
 TTreeStream.cxx:588
 TTreeStream.cxx:589
 TTreeStream.cxx:590
 TTreeStream.cxx:591
 TTreeStream.cxx:592
 TTreeStream.cxx:593
 TTreeStream.cxx:594
 TTreeStream.cxx:595
 TTreeStream.cxx:596
 TTreeStream.cxx:597
 TTreeStream.cxx:598
 TTreeStream.cxx:599
 TTreeStream.cxx:600
 TTreeStream.cxx:601
 TTreeStream.cxx:602
 TTreeStream.cxx:603
 TTreeStream.cxx:604
 TTreeStream.cxx:605
 TTreeStream.cxx:606
 TTreeStream.cxx:607
 TTreeStream.cxx:608
 TTreeStream.cxx:609
 TTreeStream.cxx:610
 TTreeStream.cxx:611
 TTreeStream.cxx:612
 TTreeStream.cxx:613
 TTreeStream.cxx:614
 TTreeStream.cxx:615
 TTreeStream.cxx:616
 TTreeStream.cxx:617
 TTreeStream.cxx:618
 TTreeStream.cxx:619
 TTreeStream.cxx:620
 TTreeStream.cxx:621
 TTreeStream.cxx:622
 TTreeStream.cxx:623
 TTreeStream.cxx:624
 TTreeStream.cxx:625
 TTreeStream.cxx:626
 TTreeStream.cxx:627
 TTreeStream.cxx:628
 TTreeStream.cxx:629
 TTreeStream.cxx:630
 TTreeStream.cxx:631
 TTreeStream.cxx:632
 TTreeStream.cxx:633
 TTreeStream.cxx:634
 TTreeStream.cxx:635
 TTreeStream.cxx:636
 TTreeStream.cxx:637
 TTreeStream.cxx:638
 TTreeStream.cxx:639
 TTreeStream.cxx:640
 TTreeStream.cxx:641
 TTreeStream.cxx:642
 TTreeStream.cxx:643
 TTreeStream.cxx:644
 TTreeStream.cxx:645
 TTreeStream.cxx:646
 TTreeStream.cxx:647
 TTreeStream.cxx:648
 TTreeStream.cxx:649
 TTreeStream.cxx:650
 TTreeStream.cxx:651
 TTreeStream.cxx:652
 TTreeStream.cxx:653
 TTreeStream.cxx:654
 TTreeStream.cxx:655
 TTreeStream.cxx:656
 TTreeStream.cxx:657
 TTreeStream.cxx:658
 TTreeStream.cxx:659
 TTreeStream.cxx:660
 TTreeStream.cxx:661
 TTreeStream.cxx:662
 TTreeStream.cxx:663
 TTreeStream.cxx:664
 TTreeStream.cxx:665
 TTreeStream.cxx:666
 TTreeStream.cxx:667
 TTreeStream.cxx:668
 TTreeStream.cxx:669
 TTreeStream.cxx:670
 TTreeStream.cxx:671
 TTreeStream.cxx:672
 TTreeStream.cxx:673
 TTreeStream.cxx:674
 TTreeStream.cxx:675
 TTreeStream.cxx:676
 TTreeStream.cxx:677
 TTreeStream.cxx:678
 TTreeStream.cxx:679
 TTreeStream.cxx:680
 TTreeStream.cxx:681
 TTreeStream.cxx:682
 TTreeStream.cxx:683
 TTreeStream.cxx:684
 TTreeStream.cxx:685
 TTreeStream.cxx:686
 TTreeStream.cxx:687
 TTreeStream.cxx:688
 TTreeStream.cxx:689
 TTreeStream.cxx:690
 TTreeStream.cxx:691
 TTreeStream.cxx:692
 TTreeStream.cxx:693
 TTreeStream.cxx:694
 TTreeStream.cxx:695
 TTreeStream.cxx:696
 TTreeStream.cxx:697
 TTreeStream.cxx:698
 TTreeStream.cxx:699
 TTreeStream.cxx:700
 TTreeStream.cxx:701
 TTreeStream.cxx:702
 TTreeStream.cxx:703
 TTreeStream.cxx:704
 TTreeStream.cxx:705
 TTreeStream.cxx:706
 TTreeStream.cxx:707
 TTreeStream.cxx:708
 TTreeStream.cxx:709
 TTreeStream.cxx:710
 TTreeStream.cxx:711
 TTreeStream.cxx:712