ROOT logo
// @(#)root/tree:$Id: TBranchObject.cxx 39696 2011-06-13 21:35:34Z pcanal $
// Author: Rene Brun   11/02/96

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TBranchObject                                                        //
//                                                                      //
// A Branch for the case of an object                                   //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TBranchObject.h"

#include "TBasket.h"
#include "TBranchClones.h"
#include "TBrowser.h"
#include "TClass.h"
#include "TClonesArray.h"
#include "TDataMember.h"
#include "TDataType.h"
#include "TFile.h"
#include "TLeafObject.h"
#include "TRealData.h"
#include "TStreamerInfo.h"
#include "TTree.h"
#include "TVirtualPad.h"

ClassImp(TBranchObject)

//______________________________________________________________________________
TBranchObject::TBranchObject()
: TBranch()
{
   // Default constructor for BranchObject.

   fNleaves = 1;
   fOldObject = 0;
}

//______________________________________________________________________________
TBranchObject::TBranchObject(TTree *tree, const char* name, const char* classname, void* addobj, Int_t basketsize, Int_t splitlevel, Int_t compress, Bool_t isptrptr /* = kTRUE */)
: TBranch()
{
   // Create a BranchObject.

   Init(tree,0,name,classname,addobj,basketsize,splitlevel,compress,isptrptr);
}

//______________________________________________________________________________
TBranchObject::TBranchObject(TBranch *parent, const char* name, const char* classname, void* addobj, Int_t basketsize, Int_t splitlevel, Int_t compress, Bool_t isptrptr /* = kTRUE */)
: TBranch()
{
   // Create a BranchObject.

   Init(0,parent,name,classname,addobj,basketsize,splitlevel,compress,isptrptr);
}

//______________________________________________________________________________
void TBranchObject::Init(TTree *tree, TBranch *parent, const char* name, const char* classname, void* addobj, Int_t basketsize, Int_t /*splitlevel*/, Int_t compress, Bool_t isptrptr)
{
   // Initialization routine (run from the constructor so do not make this function virtual)

   if (tree==0 && parent!=0) tree = parent->GetTree();
   fTree   = tree;
   fMother = parent ? parent->GetMother() : this;
   fParent = parent;

   TClass* cl = TClass::GetClass(classname);

   if (!cl) {
      Error("TBranchObject", "Cannot find class:%s", classname);
      return;
   }

   if (!isptrptr) {
      fOldObject = (TObject*)addobj;
      addobj = &fOldObject;
   }

   char** apointer = (char**) addobj;
   TObject* obj = (TObject*) (*apointer);

   Bool_t delobj = kFALSE;
   if (!obj) {
      obj = (TObject*) cl->New();
      delobj = kTRUE;
   }

   tree->BuildStreamerInfo(cl, obj);

   if (delobj) {
      cl->Destructor(obj);
   }

   SetName(name);
   SetTitle(name);

   fCompress = compress;
   if ((compress == -1) && tree->GetDirectory()) {
      TFile* bfile = tree->GetDirectory()->GetFile();
      if (bfile) {
         fCompress = bfile->GetCompressionSettings();
      }
   }
   if (basketsize < 100) {
      basketsize = 100;
   }
   fBasketSize = basketsize;
   fAddress = (char*) addobj;
   fClassName = classname;
   fBasketBytes = new Int_t[fMaxBaskets];
   fBasketEntry = new Long64_t[fMaxBaskets];
   fBasketSeek = new Long64_t[fMaxBaskets];
   fOldObject = 0;

   for (Int_t i = 0; i < fMaxBaskets; ++i) {
      fBasketBytes[i] = 0;
      fBasketEntry[i] = 0;
      fBasketSeek[i] = 0;
   }

   TLeaf* leaf = new TLeafObject(this, name, classname);
   leaf->SetAddress(addobj);
   fNleaves = 1;
   fLeaves.Add(leaf);
   tree->GetListOfLeaves()->Add(leaf);

   // Set the bit kAutoDelete to specify that when reading
   // in TLeafObject::ReadBasket, the object should be deleted
   // before calling Streamer.
   // It is foreseen to not set this bit in a future version.
   SetAutoDelete(kTRUE);

   fDirectory = fTree->GetDirectory();
   fFileName = "";

}

//______________________________________________________________________________
TBranchObject::~TBranchObject()
{
   // Destructor for a BranchObject.
   fBranches.Delete();
}

//______________________________________________________________________________
void TBranchObject::Browse(TBrowser* b)
{
   // Browse the branch content.

   Int_t nbranches = fBranches.GetEntriesFast();
   if (nbranches > 1) {
      fBranches.Browse(b);
   }
   if (GetBrowsables() && GetBrowsables()->GetSize()) {
      GetBrowsables()->Browse(b);
   }
}

//______________________________________________________________________________
Int_t TBranchObject::Fill()
{
   // Loop on all leaves of this branch to fill Basket buffer.

   Int_t nbytes = 0;
   Int_t nbranches = fBranches.GetEntriesFast();
   if (nbranches) {
      ++fEntries;
      UpdateAddress();
      for (Int_t i = 0; i < nbranches; ++i)  {
         TBranch* branch = (TBranch*) fBranches[i];
         if (!branch->TestBit(kDoNotProcess)) {
            Int_t bc = branch->Fill();
            nbytes += bc;
         }
      }
   } else {
      if (!TestBit(kDoNotProcess)) {
         Int_t bc = TBranch::Fill();
         nbytes += bc;
      }
   }
   return nbytes;
}

//______________________________________________________________________________
Int_t TBranchObject::GetEntry(Long64_t entry, Int_t getall)
{
   // Read all branches of a BranchObject and return total number of bytes.
   //
   //   If entry = 0 take current entry number + 1
   //   If entry < 0 reset entry number to 0
   //
   //  The function returns the number of bytes read from the input buffer.
   //  If entry does not exist  the function returns 0.
   //  If an I/O error occurs,  the function returns -1.

   if (TestBit(kDoNotProcess) && !getall) {
      return 0;
   }
   Int_t nbytes;
   Int_t nbranches = fBranches.GetEntriesFast();

   if (nbranches) {
      if (fAddress == 0) {
         SetupAddresses();
      }
      nbytes = 0;
      Int_t nb;
      for (Int_t i = 0; i < nbranches; ++i)  {
         TBranch* branch = (TBranch*) fBranches[i];
         if (branch) {
            nb = branch->GetEntry(entry, getall);
            if (nb < 0) {
               return nb;
            }
            nbytes += nb;
         }
      }
   } else {
      nbytes = TBranch::GetEntry(entry, getall);
   }
   return nbytes;
}

//______________________________________________________________________________
Int_t TBranchObject::GetExpectedType(TClass *&expectedClass,EDataType &expectedType)
{
   // Fill expectedClass and expectedType with information on the data type of the 
   // object/values contained in this branch (and thus the type of pointers
   // expected to be passed to Set[Branch]Address
   // return 0 in case of success and > 0 in case of failure.
   
   expectedClass = 0;
   expectedType = kOther_t;
   TLeafObject* lobj = (TLeafObject*) GetListOfLeaves()->At(0);
   if (!lobj) {
      Error("GetExpectedType", "Did not find any leaves in %s",GetName());
      return 1;
   }
   expectedClass = lobj->GetClass();
   return 0;
}

//______________________________________________________________________________
Bool_t TBranchObject::IsFolder() const
{
   // Return TRUE if more than one leaf or if fBrowsables, FALSE otherwise.

   Int_t nbranches = fBranches.GetEntriesFast();

   if (nbranches >= 1) {
      return kTRUE;
   }

   TList* browsables = const_cast<TBranchObject*>(this)->GetBrowsables();

   return browsables && browsables->GetSize();
}

//______________________________________________________________________________
void TBranchObject::Print(Option_t* option) const
{
   // Print TBranch parameters.

   Int_t nbranches = fBranches.GetEntriesFast();
   if (nbranches) {
      Printf("*Branch  :%-9s : %-54s *", GetName(), GetTitle());
      Printf("*Entries : %8d : BranchObject (see below)                               *", Int_t(fEntries));
      Printf("*............................................................................*");
      for (Int_t i = 0; i < nbranches; ++i)  {
         TBranch* branch = (TBranch*) fBranches.At(i);
         if (branch) {
            branch->Print(option);
         }
      }
   } else {
      TBranch::Print(option);
   }
}

//______________________________________________________________________________
void TBranchObject::Reset(Option_t* option)
{
   // Reset a branch.
   //
   // Existing buffers are deleted.
   // Entries, max and min are reset.
   
   TBranch::Reset(option);
   
   Int_t nbranches = fBranches.GetEntriesFast();
   for (Int_t i = 0; i < nbranches; ++i)  {
      TBranch* branch = (TBranch*) fBranches[i];
      branch->Reset(option);
   }
}

///______________________________________________________________________________
void TBranchObject::ResetAfterMerge(TFileMergeInfo *info)
{
   // Reset a Branch after a Merge operation (drop data but keep customizations)
   //

   TBranch::ResetAfterMerge(info);
   
   Int_t nbranches = fBranches.GetEntriesFast();
   for (Int_t i = 0; i < nbranches; ++i)  {
      TBranch* branch = (TBranch*) fBranches[i];
      branch->ResetAfterMerge(info);
   }
}

//______________________________________________________________________________
void TBranchObject::SetAddress(void* add)
{
   // Set address of this branch.

   if (TestBit(kDoNotProcess)) {
      return;
   }

   // Special case when called from code generated by TTree::MakeClass.
   if (Long_t(add) == -1) {
      SetBit(kWarn);
      return;
   }

   fReadEntry = -1;
   Int_t nbranches = fBranches.GetEntriesFast();

   TLeaf* leaf = (TLeaf*) fLeaves.UncheckedAt(0);
   if (leaf) {
      leaf->SetAddress(add);
   }

   fAddress = (char*) add;
   char** ppointer = (char**) add;

   char* obj = 0;
   if (ppointer) {
      obj = *ppointer;
   }

   TClass* cl = TClass::GetClass(fClassName.Data());

   if (!cl) {
      for (Int_t i = 0; i < nbranches; ++i)  {
         TBranch* br = (TBranch*) fBranches[i];
         br->SetAddress(obj);
      }
      return;
   }

   if (ppointer && !obj) {
      obj = (char*) cl->New();
      *ppointer = obj;
   }

   if (!cl->GetListOfRealData()) {
      cl->BuildRealData(obj);
   }

   if (cl->InheritsFrom(TClonesArray::Class())) {
      if (ppointer) {
         TClonesArray* clones = (TClonesArray*) *ppointer;
         if (!clones) {
            Error("SetAddress", "Pointer to TClonesArray is null");
            return;
         }
         TClass* clm = clones->GetClass();
         if (clm) {
            clm->BuildRealData(); //just in case clm derives from an abstract class
            clm->GetStreamerInfo();
         }
      }
   }

   //
   // Loop over our data members looking
   // for sub-branches for them.  If we
   // find one, set its address.
   //

   char* fullname = new char[200];

   const char* bname = GetName();

   Int_t isDot = 0;
   if (bname[strlen(bname)-1] == '.') {
      isDot = 1;
   }

   char* pointer = 0;
   TRealData* rd = 0;
   TIter next(cl->GetListOfRealData());
   while ((rd = (TRealData*) next())) {
      if (rd->TestBit(TRealData::kTransient)) continue;

      TDataMember* dm = rd->GetDataMember();
      if (!dm || !dm->IsPersistent()) {
         continue;
      }
      const char* rdname = rd->GetName();
      TDataType* dtype = dm->GetDataType();
      Int_t code = 0;
      if (dtype) {
         code = dm->GetDataType()->GetType();
      }
      Int_t offset = rd->GetThisOffset();
      if (ppointer) {
         pointer = obj + offset;
      }
      TBranch* branch = 0;
      if (dm->IsaPointer()) {
         TClass* clobj = 0;
         if (!dm->IsBasic()) {
            clobj = TClass::GetClass(dm->GetTypeName());
         }
         if (clobj && clobj->InheritsFrom(TClonesArray::Class())) {
            if (isDot) {
               snprintf(fullname,200, "%s%s", bname, &rdname[1]);
            } else {
               snprintf(fullname,200, "%s", &rdname[1]);
            }
            branch = (TBranch*) fBranches.FindObject(fullname);
         } else {
            if (!clobj) {
               // this is a basic type we can handle only if
               // he has a dimension:
               const char* index = dm->GetArrayIndex();
               if (strlen(index) == 0) {
                  if (code == 1) {
                     // Case of a string ... we do not need the size
                     if (isDot) {
                        snprintf(fullname,200, "%s%s", bname, &rdname[0]);
                     } else {
                        snprintf(fullname,200, "%s", &rdname[0]);
                     }
                  } else {
                     continue;
                  }
               }
               if (isDot) {
                  snprintf(fullname,200, "%s%s", bname, &rdname[0]);
               } else {
                  snprintf(fullname,200, "%s", &rdname[0]);
               }
               // let's remove the stars!
               UInt_t cursor;
               UInt_t pos;
               for (cursor = 0, pos = 0; cursor < strlen(fullname); ++cursor) {
                  if (fullname[cursor] != '*') {
                     fullname[pos++] = fullname[cursor];
                  }
               }
               fullname[pos] = '\0';
               branch = (TBranch*) fBranches.FindObject(fullname);
            } else {
               if (!clobj->InheritsFrom(TObject::Class())) {
                  continue;
               }
               if (isDot) {
                  snprintf(fullname,200, "%s%s", bname, &rdname[1]);
               } else {
                  snprintf(fullname,200, "%s", &rdname[1]);
               }
               branch = (TBranch*) fBranches.FindObject(fullname);
            }
         }
      } else {
         if (dm->IsBasic()) {
            if (isDot) {
               snprintf(fullname,200, "%s%s", bname, &rdname[0]);
            } else {
               snprintf(fullname,200, "%s", &rdname[0]);
            }
            branch = (TBranch*) fBranches.FindObject(fullname);
         }
      }
      if (branch) {
         branch->SetAddress(pointer);
      }
   }

   delete[] fullname;
}

//______________________________________________________________________________
void TBranchObject::SetAutoDelete(Bool_t autodel)
{
   // Set the AutoDelete bit.
   //
   //  This function can be used to instruct Root in TBranchObject::ReadBasket
   //  to not delete the object referenced by a branchobject before reading a
   //  new entry. By default, the object is deleted.
   //  If autodel is kTRUE, this existing object will be deleted, a new object
   //    created by the default constructor, then object->Streamer called.
   //  If autodel is kFALSE, the existing object is not deleted. Root assumes
   //    that the user is taking care of deleting any internal object or array
   //    This can be done in Streamer itself.
   //  If this branch has sub-branches, the function sets autodel for these
   //  branches as well.
   //  We STRONGLY suggest to activate this option by default when you create
   //  the top level branch. This will make the read phase more efficient
   //  because it minimizes the numbers of new/delete operations.
   //  Once this option has been set and the Tree is written to a file, it is
   //  not necessary to specify the option again when reading, unless you
   //  want to set the opposite mode.
   //

   TBranch::SetAutoDelete(autodel);

   Int_t nbranches = fBranches.GetEntriesFast();
   for (Int_t i=0;i<nbranches;i++)  {
      TBranch *branch = (TBranch*)fBranches[i];
      branch->SetAutoDelete(autodel);
   }
}

//______________________________________________________________________________
void TBranchObject::SetBasketSize(Int_t buffsize)
{
   // Reset basket size for all subbranches of this branch.

   TBranch::SetBasketSize(buffsize);

   Int_t nbranches = fBranches.GetEntriesFast();
   for (Int_t i = 0; i < nbranches; ++i)  {
      TBranch* branch = (TBranch*) fBranches[i];
      branch->SetBasketSize(fBasketSize);
   }
}

//______________________________________________________________________________
void TBranchObject::Streamer(TBuffer& R__b)
{
   // Stream an object of class TBranchObject.

   if (R__b.IsReading()) {
      R__b.ReadClassBuffer(TBranchObject::Class(), this);
   } else {
      TDirectory* dirsav = fDirectory;
      fDirectory = 0;  // to avoid recursive calls

      R__b.WriteClassBuffer(TBranchObject::Class(), this);

      // make sure that all TStreamerInfo objects referenced by
      // this class are written to the file
      R__b.ForceWriteInfo(TClass::GetClass(fClassName.Data())->GetStreamerInfo(), kTRUE);

      // if branch is in a separate file save this branch
      // as an independent key
      if (!dirsav) {
         return;
      }
      if (!dirsav->IsWritable()) {
         fDirectory = dirsav;
         return;
      }
      TDirectory* pdirectory = fTree->GetDirectory();
      if (!pdirectory) {
         fDirectory = dirsav;
         return;
      }
      const char* treeFileName = pdirectory->GetFile()->GetName();
      TBranch* mother = GetMother();
      const char* motherFileName = treeFileName;
      if (mother && (mother != this)) {
         motherFileName = mother->GetFileName();
      }
      if ((fFileName.Length() > 0) && strcmp(motherFileName, fFileName.Data())) {
         dirsav->WriteTObject(this);
      }
      fDirectory = dirsav;
   }
}

//______________________________________________________________________________
void TBranchObject::SetupAddresses()
{
   // -- If the branch address is not set,  we set all addresses starting with
   // the top level parent branch.  This is required to be done in order for
   // GetOffset to be correct and for GetEntry to run.
 
   if (fAddress == 0) {
      // try to create object
      if (!TestBit(kWarn)) {
         TClass* cl = TClass::GetClass(fClassName);
         if (cl) {
            TObject** voidobj = (TObject**) new Long_t[1];
            *voidobj = (TObject*) cl->New();
            SetAddress(voidobj);
         } else {
            Warning("GetEntry", "Cannot get class: %s", fClassName.Data());
            SetBit(kWarn);
         }
      }
   }   
}

//______________________________________________________________________________
void TBranchObject::UpdateAddress()
{
   // Update branch addresses if a new object was created.

   void** ppointer = (void**) fAddress;
   if (!ppointer) {
      return;
   }
   TObject* obj = (TObject*) (*ppointer);
   if (obj != fOldObject) {
      fOldObject = obj;
      SetAddress(fAddress);
   }
}

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