// @(#)root/tree:$Id$
// 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.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// A Branch for the case of an array of clone objects                   //
//                                                                      //
// See TTree.                                                           //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TBranchClones.h"

#include "TBasket.h"
#include "TClass.h"
#include "TClonesArray.h"
#include "TDataMember.h"
#include "TDataType.h"
#include "TFile.h"
#include "TLeafI.h"
#include "TRealData.h"
#include "TTree.h"

#include <cstring>

ClassImp(TBranchClones)

//______________________________________________________________________________
TBranchClones::TBranchClones()
: TBranch()
, fList(0)
, fRead(0)
, fN(0)
, fNdataMax(0)
, fBranchCount(0)
{
   // -- Default and i/o constructor.

}

//______________________________________________________________________________
TBranchClones::TBranchClones(TTree *tree, const char* name, void* pointer, Int_t basketsize, Int_t compress, Int_t splitlevel)
: TBranch()
, fList(0)
, fRead(0)
, fN(0)
, fNdataMax(0)
, fBranchCount(0)
{
   // -- Constructor.

   Init(tree,0,name,pointer,basketsize,compress,splitlevel);
}

//______________________________________________________________________________
TBranchClones::TBranchClones(TBranch *parent, const char* name, void* pointer, Int_t basketsize, Int_t compress, Int_t splitlevel)
: TBranch()
, fList(0)
, fRead(0)
, fN(0)
, fNdataMax(0)
, fBranchCount(0)
{
   // -- Constructor.

   Init(0,parent,name,pointer,basketsize,compress,splitlevel);
}

//______________________________________________________________________________
void TBranchClones::Init(TTree *tree, TBranch *parent, const char* name, void* pointer, Int_t basketsize, Int_t compress, Int_t splitlevel)
{
   // Initialization (non-virtual, to be called from constructor).

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

   TString leaflist;
   TString branchname;
   TString branchcount;
   SetName(name);
   if ((compress == -1) && tree->GetDirectory()) {
      TFile* bfile = 0;
      if (tree->GetDirectory()) {
         bfile = tree->GetDirectory()->GetFile();
      }
      if (bfile) {
         compress = bfile->GetCompressionSettings();
      }
   }
   char* cpointer = (char*) pointer;
   char** ppointer = (char**) pointer;
   fList = (TClonesArray*) *ppointer;
   fAddress = cpointer;
   TClass* cl = fList->GetClass();
   if (!cl) {
      return;
   }
   tree->BuildStreamerInfo(cl);
   fClassName = cl->GetName();
   fSplitLevel = splitlevel;

   // Create a branch to store the array count.
   if (basketsize < 100) {
      basketsize = 100;
   }
   leaflist.Form("%s_/I", name);
   branchcount.Form("%s_", name);
   fBranchCount = new TBranch(this, branchcount, &fN, leaflist, basketsize);
   fBranchCount->SetBit(kIsClone);
   TLeaf* leafcount = (TLeaf*) fBranchCount->GetListOfLeaves()->UncheckedAt(0);
   fDirectory = fTree->GetDirectory();
   fFileName = "";

   // Loop on all public data members of the class and its base classes.
   const char* itype = 0;
   TRealData* rd = 0;
   TIter next(cl->GetListOfRealData());
   while ((rd = (TRealData *) next())) {
      if (rd->TestBit(TRealData::kTransient)) continue;

      if (rd->IsObject()) {
         continue;
      }
      TDataMember* member = rd->GetDataMember();
      if (!member->IsPersistent()) {
         // -- Skip non-persistent members.
         continue;
      }
      if (!member->IsBasic() || member->IsaPointer()) {
         Warning("BranchClones", "Cannot process: %s::%s", cl->GetName(), member->GetName());
         continue;
      }
      // Forget TObject part if splitlevel = 2.
      if ((splitlevel > 1) || fList->TestBit(TClonesArray::kForgetBits) || cl->CanIgnoreTObjectStreamer()) {
         if (!std::strcmp(member->GetName(), "fBits")) {
            continue;
         }
         if (!std::strcmp(member->GetName(), "fUniqueID")) {
            continue;
         }
      }
      tree->BuildStreamerInfo(TClass::GetClass(member->GetFullTypeName()));
      TDataType* membertype = member->GetDataType();
      Int_t type = membertype->GetType();
      if (!type) {
         Warning("BranchClones", "Cannot process: %s::%s of type zero!", cl->GetName(), member->GetName());
         continue;
      }

      if (type ==  1) {
         itype = "B";
      } else if (type == 2) {
         itype = "S";
      } else if (type == 3) {
         itype = "I";
      } else if (type == 5) {
         itype = "F";
      } else if (type == 8) {
         itype = "D";
      } else if (type == 9) {
         itype = "D";
      } else if (type == 11) {
         itype = "b";
      } if (type == 12) {
         itype = "s";
      } if (type == 13) {
         itype = "i";
      }

      leaflist.Form("%s[%s]/%s", member->GetName(), branchcount.Data(), itype);
      Int_t comp = compress;
      branchname.Form("%s.%s", name, rd->GetName());
      TBranch* branch  = new TBranch(this, branchname, this, leaflist, basketsize, comp);
      branch->SetBit(kIsClone);
      TObjArray* leaves = branch->GetListOfLeaves();
      TLeaf* leaf = (TLeaf*) leaves->UncheckedAt(0);
      leaf->SetOffset(rd->GetThisOffset());
      leaf->SetLeafCount(leafcount);
      Int_t arraydim = member->GetArrayDim();
      if (arraydim) {
         Int_t maxindex = 1;
         while (arraydim) {
            maxindex *= member->GetMaxIndex(--arraydim);
         }
         leaf->SetLen(maxindex);
      }
      fBranches.Add(branch);
   }
}

//______________________________________________________________________________
TBranchClones::~TBranchClones()
{
   // -- Destructor.

   delete fBranchCount;
   fBranchCount = 0;
   fBranches.Delete();
   // FIXME: We might own this, possible memory leak.
   fList = 0;
}

//______________________________________________________________________________
void TBranchClones::Browse(TBrowser* b)
{
   // -- Browse this branch.

   fBranches.Browse(b);
}

//______________________________________________________________________________
Int_t TBranchClones::Fill()
{
   // -- Loop on all branches and fill Basket buffer.

   Int_t i = 0;
   Int_t nbytes = 0;
   Int_t nbranches = fBranches.GetEntriesFast();
   char** ppointer = (char**) fAddress;
   if (!ppointer) {
      return 0;
   }
   fList = (TClonesArray*) *ppointer;
   fN = fList->GetEntriesFast();
   fEntries++;
   if (fN > fNdataMax) {
      fNdataMax = fList->GetSize();
      TString branchcount;
      branchcount.Form("%s_", GetName());
      TLeafI* leafi = (TLeafI*) fBranchCount->GetLeaf(branchcount);
      leafi->SetMaximum(fNdataMax);
      for (i = 0; i < nbranches; i++) {
         TBranch* branch = (TBranch*) fBranches.UncheckedAt(i);
         TObjArray* leaves = branch->GetListOfLeaves();
         TLeaf* leaf = (TLeaf*) leaves->UncheckedAt(0);
         leaf->SetAddress();
      }
   }
   nbytes += fBranchCount->Fill();
   for (i = 0; i < nbranches; i++)  {
      TBranch* branch = (TBranch*) fBranches.UncheckedAt(i);
      TObjArray* leaves = branch->GetListOfLeaves();
      TLeaf* leaf = (TLeaf*) leaves->UncheckedAt(0);
      leaf->Import(fList, fN);
      nbytes += branch->Fill();
   }
   return nbytes;
}

//______________________________________________________________________________
Int_t TBranchClones::GetEntry(Long64_t entry, Int_t getall)
{
   // -- Read all branches and return total number of bytes read.

   if (TestBit(kDoNotProcess) && !getall) {
      return 0;
   }
   Int_t nbytes = fBranchCount->GetEntry(entry, getall);
   TLeaf* leafcount = (TLeaf*) fBranchCount->GetListOfLeaves()->UncheckedAt(0);
   fN = Int_t(leafcount->GetValue());
   if (fN <= 0) {
      if (fList) {
         fList->Clear();
      }
      return 0;
   }
   TBranch* branch = 0;
   Int_t nbranches = fBranches.GetEntriesFast();
   // If fList exists, create clones array objects.
   if (fList) {
      fList->Clear();
      fList->ExpandCreateFast(fN);
      for (Int_t i = 0; i < nbranches; i++)  {
         branch = (TBranch*) fBranches.UncheckedAt(i);
         if (((TLeaf*) branch->GetListOfLeaves()->UncheckedAt(0))->GetOffset() < 0) {
            continue;
         }
         nbytes += branch->GetEntryExport(entry, getall, fList, fN);
      }
   } else {
      for (Int_t i = 0; i < nbranches; i++)  {
         branch = (TBranch*) fBranches.UncheckedAt(i);
         nbytes += branch->GetEntry(entry, getall);
      }
   }
   return nbytes;
}

//______________________________________________________________________________
void TBranchClones::Print(Option_t *option) const
{
   // -- Print branch parameters.

   fBranchCount->Print(option);
   Int_t nbranches = fBranches.GetEntriesFast();
   for (Int_t i = 0; i < nbranches; i++) {
      TBranch* branch = (TBranch*) fBranches.At(i);
      branch->Print(option);
   }
}

//______________________________________________________________________________
void TBranchClones::Reset(Option_t* option)
{
   // -- Reset branch.
   //
   //    Existing buffers are deleted
   //    Entries, max and min are reset
   //

   fEntries = 0;
   fTotBytes = 0;
   fZipBytes = 0;
   Int_t nbranches = fBranches.GetEntriesFast();
   for (Int_t i = 0; i < nbranches; i++) {
      TBranch* branch = (TBranch*) fBranches.At(i);
      branch->Reset(option);
   }
   fBranchCount->Reset();
}

//______________________________________________________________________________
void TBranchClones::ResetAfterMerge(TFileMergeInfo *info)
{
   // -- Reset branch after a merge.
   //
   //    Existing buffers are deleted
   //    Entries, max and min are reset
   //

   fEntries  = 0;
   fTotBytes = 0;
   fZipBytes = 0;
   Int_t nbranches = fBranches.GetEntriesFast();
   for (Int_t i = 0; i < nbranches; i++) {
      TBranch* branch = (TBranch*) fBranches.At(i);
      branch->ResetAfterMerge(info);
   }
   fBranchCount->ResetAfterMerge(info);
}

//______________________________________________________________________________
void TBranchClones::SetAddress(void* addr)
{
   // -- Set address of this branch.

   fReadEntry = -1;
   fAddress = (char*) addr;
   char** pp= (char**) fAddress;
   if (pp && (*pp == 0)) {
      // We've been asked to allocate an object for the user.
      *pp= (char*) new TClonesArray(fClassName);
   }
   fList = 0;
   if (pp) {
      fList = (TClonesArray*) *pp;
   }
   fBranchCount->SetAddress(&fN);
}

//______________________________________________________________________________
void TBranchClones::SetBasketSize(Int_t buffsize)
{
   // -- Reset basket size for all sub-branches.

   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 TBranchClones::Streamer(TBuffer& b)
{
   // -- Serialize/Deserialize from a buffer.
   UInt_t R__s, R__c;
   if (b.IsReading()) {
      b.ReadVersion(&R__s, &R__c);
      TNamed::Streamer(b);
      b >> fCompress;
      b >> fBasketSize;
      b >> fEntryOffsetLen;
      b >> fMaxBaskets;
      b >> fWriteBasket;
      b >> fEntryNumber;
      b >> fEntries;
      b >> fTotBytes;
      b >> fZipBytes;
      b >> fOffset;
      b >> fBranchCount;
      fClassName.Streamer(b);
      fBranches.Streamer(b);
      fTree = 0;
      TBranch* branch = 0;
      TLeaf* leaf = 0;
      Int_t nbranches = fBranches.GetEntriesFast();
      for (Int_t i = 0; i < nbranches; i++) {
         branch = (TBranch*) fBranches[i];
         branch->SetBit(kIsClone);
         leaf = (TLeaf*) branch->GetListOfLeaves()->UncheckedAt(0);
         leaf->SetOffset(-1);
      }
      fRead = 1;
      TClass* cl = TClass::GetClass((const char*) fClassName);
      if (!cl) {
         Warning("Streamer", "Unknown class: %s. Cannot read BranchClones: %s", fClassName.Data(), GetName());
         SetBit(kDoNotProcess);
         return;
      }
      if (!cl->GetListOfRealData()) {
         cl->BuildRealData();
      }
      TString branchname;
      TRealData* rd = 0;
      TIter next(cl->GetListOfRealData());
      while ((rd = (TRealData*) next())) {
         if (rd->TestBit(TRealData::kTransient)) continue;

         TDataMember* member = rd->GetDataMember();
         if (!member || !member->IsBasic() || !member->IsPersistent()) {
            continue;
         }
         TDataType* membertype = member->GetDataType();
         if (!membertype->GetType()) {
            continue;
         }
         branchname.Form("%s.%s", GetName(), rd->GetName());
         branch = (TBranch*) fBranches.FindObject(branchname);
         if (!branch) {
            continue;
         }
         TObjArray* leaves = branch->GetListOfLeaves();
         leaf = (TLeaf*) leaves->UncheckedAt(0);
         leaf->SetOffset(rd->GetThisOffset());
      }
      b.CheckByteCount(R__s, R__c, TBranchClones::IsA());
   } else {
      R__c = b.WriteVersion(TBranchClones::IsA(), kTRUE);
      TNamed::Streamer(b);
      b << fCompress;
      b << fBasketSize;
      b << fEntryOffsetLen;
      b << fMaxBaskets;
      b << fWriteBasket;
      b << fEntryNumber;
      b << fEntries;
      b << fTotBytes;
      b << fZipBytes;
      b << fOffset;
      b << fBranchCount;
      fClassName.Streamer(b);
      fBranches.Streamer(b);
      b.SetByteCount(R__c, kTRUE);
   }
}

//______________________________________________________________________________
void TBranchClones::UpdateFile()
{
   // Refresh the value of fDirectory (i.e. where this branch writes/reads its buffers)
   // with the current value of fTree->GetCurrentFile unless this branch has been
   // redirected to a different file.  Also update the sub-branches.

   fBranchCount->UpdateFile();
   TBranch::UpdateFile();
}
 TBranchClones.cxx:1
 TBranchClones.cxx:2
 TBranchClones.cxx:3
 TBranchClones.cxx:4
 TBranchClones.cxx:5
 TBranchClones.cxx:6
 TBranchClones.cxx:7
 TBranchClones.cxx:8
 TBranchClones.cxx:9
 TBranchClones.cxx:10
 TBranchClones.cxx:11
 TBranchClones.cxx:12
 TBranchClones.cxx:13
 TBranchClones.cxx:14
 TBranchClones.cxx:15
 TBranchClones.cxx:16
 TBranchClones.cxx:17
 TBranchClones.cxx:18
 TBranchClones.cxx:19
 TBranchClones.cxx:20
 TBranchClones.cxx:21
 TBranchClones.cxx:22
 TBranchClones.cxx:23
 TBranchClones.cxx:24
 TBranchClones.cxx:25
 TBranchClones.cxx:26
 TBranchClones.cxx:27
 TBranchClones.cxx:28
 TBranchClones.cxx:29
 TBranchClones.cxx:30
 TBranchClones.cxx:31
 TBranchClones.cxx:32
 TBranchClones.cxx:33
 TBranchClones.cxx:34
 TBranchClones.cxx:35
 TBranchClones.cxx:36
 TBranchClones.cxx:37
 TBranchClones.cxx:38
 TBranchClones.cxx:39
 TBranchClones.cxx:40
 TBranchClones.cxx:41
 TBranchClones.cxx:42
 TBranchClones.cxx:43
 TBranchClones.cxx:44
 TBranchClones.cxx:45
 TBranchClones.cxx:46
 TBranchClones.cxx:47
 TBranchClones.cxx:48
 TBranchClones.cxx:49
 TBranchClones.cxx:50
 TBranchClones.cxx:51
 TBranchClones.cxx:52
 TBranchClones.cxx:53
 TBranchClones.cxx:54
 TBranchClones.cxx:55
 TBranchClones.cxx:56
 TBranchClones.cxx:57
 TBranchClones.cxx:58
 TBranchClones.cxx:59
 TBranchClones.cxx:60
 TBranchClones.cxx:61
 TBranchClones.cxx:62
 TBranchClones.cxx:63
 TBranchClones.cxx:64
 TBranchClones.cxx:65
 TBranchClones.cxx:66
 TBranchClones.cxx:67
 TBranchClones.cxx:68
 TBranchClones.cxx:69
 TBranchClones.cxx:70
 TBranchClones.cxx:71
 TBranchClones.cxx:72
 TBranchClones.cxx:73
 TBranchClones.cxx:74
 TBranchClones.cxx:75
 TBranchClones.cxx:76
 TBranchClones.cxx:77
 TBranchClones.cxx:78
 TBranchClones.cxx:79
 TBranchClones.cxx:80
 TBranchClones.cxx:81
 TBranchClones.cxx:82
 TBranchClones.cxx:83
 TBranchClones.cxx:84
 TBranchClones.cxx:85
 TBranchClones.cxx:86
 TBranchClones.cxx:87
 TBranchClones.cxx:88
 TBranchClones.cxx:89
 TBranchClones.cxx:90
 TBranchClones.cxx:91
 TBranchClones.cxx:92
 TBranchClones.cxx:93
 TBranchClones.cxx:94
 TBranchClones.cxx:95
 TBranchClones.cxx:96
 TBranchClones.cxx:97
 TBranchClones.cxx:98
 TBranchClones.cxx:99
 TBranchClones.cxx:100
 TBranchClones.cxx:101
 TBranchClones.cxx:102
 TBranchClones.cxx:103
 TBranchClones.cxx:104
 TBranchClones.cxx:105
 TBranchClones.cxx:106
 TBranchClones.cxx:107
 TBranchClones.cxx:108
 TBranchClones.cxx:109
 TBranchClones.cxx:110
 TBranchClones.cxx:111
 TBranchClones.cxx:112
 TBranchClones.cxx:113
 TBranchClones.cxx:114
 TBranchClones.cxx:115
 TBranchClones.cxx:116
 TBranchClones.cxx:117
 TBranchClones.cxx:118
 TBranchClones.cxx:119
 TBranchClones.cxx:120
 TBranchClones.cxx:121
 TBranchClones.cxx:122
 TBranchClones.cxx:123
 TBranchClones.cxx:124
 TBranchClones.cxx:125
 TBranchClones.cxx:126
 TBranchClones.cxx:127
 TBranchClones.cxx:128
 TBranchClones.cxx:129
 TBranchClones.cxx:130
 TBranchClones.cxx:131
 TBranchClones.cxx:132
 TBranchClones.cxx:133
 TBranchClones.cxx:134
 TBranchClones.cxx:135
 TBranchClones.cxx:136
 TBranchClones.cxx:137
 TBranchClones.cxx:138
 TBranchClones.cxx:139
 TBranchClones.cxx:140
 TBranchClones.cxx:141
 TBranchClones.cxx:142
 TBranchClones.cxx:143
 TBranchClones.cxx:144
 TBranchClones.cxx:145
 TBranchClones.cxx:146
 TBranchClones.cxx:147
 TBranchClones.cxx:148
 TBranchClones.cxx:149
 TBranchClones.cxx:150
 TBranchClones.cxx:151
 TBranchClones.cxx:152
 TBranchClones.cxx:153
 TBranchClones.cxx:154
 TBranchClones.cxx:155
 TBranchClones.cxx:156
 TBranchClones.cxx:157
 TBranchClones.cxx:158
 TBranchClones.cxx:159
 TBranchClones.cxx:160
 TBranchClones.cxx:161
 TBranchClones.cxx:162
 TBranchClones.cxx:163
 TBranchClones.cxx:164
 TBranchClones.cxx:165
 TBranchClones.cxx:166
 TBranchClones.cxx:167
 TBranchClones.cxx:168
 TBranchClones.cxx:169
 TBranchClones.cxx:170
 TBranchClones.cxx:171
 TBranchClones.cxx:172
 TBranchClones.cxx:173
 TBranchClones.cxx:174
 TBranchClones.cxx:175
 TBranchClones.cxx:176
 TBranchClones.cxx:177
 TBranchClones.cxx:178
 TBranchClones.cxx:179
 TBranchClones.cxx:180
 TBranchClones.cxx:181
 TBranchClones.cxx:182
 TBranchClones.cxx:183
 TBranchClones.cxx:184
 TBranchClones.cxx:185
 TBranchClones.cxx:186
 TBranchClones.cxx:187
 TBranchClones.cxx:188
 TBranchClones.cxx:189
 TBranchClones.cxx:190
 TBranchClones.cxx:191
 TBranchClones.cxx:192
 TBranchClones.cxx:193
 TBranchClones.cxx:194
 TBranchClones.cxx:195
 TBranchClones.cxx:196
 TBranchClones.cxx:197
 TBranchClones.cxx:198
 TBranchClones.cxx:199
 TBranchClones.cxx:200
 TBranchClones.cxx:201
 TBranchClones.cxx:202
 TBranchClones.cxx:203
 TBranchClones.cxx:204
 TBranchClones.cxx:205
 TBranchClones.cxx:206
 TBranchClones.cxx:207
 TBranchClones.cxx:208
 TBranchClones.cxx:209
 TBranchClones.cxx:210
 TBranchClones.cxx:211
 TBranchClones.cxx:212
 TBranchClones.cxx:213
 TBranchClones.cxx:214
 TBranchClones.cxx:215
 TBranchClones.cxx:216
 TBranchClones.cxx:217
 TBranchClones.cxx:218
 TBranchClones.cxx:219
 TBranchClones.cxx:220
 TBranchClones.cxx:221
 TBranchClones.cxx:222
 TBranchClones.cxx:223
 TBranchClones.cxx:224
 TBranchClones.cxx:225
 TBranchClones.cxx:226
 TBranchClones.cxx:227
 TBranchClones.cxx:228
 TBranchClones.cxx:229
 TBranchClones.cxx:230
 TBranchClones.cxx:231
 TBranchClones.cxx:232
 TBranchClones.cxx:233
 TBranchClones.cxx:234
 TBranchClones.cxx:235
 TBranchClones.cxx:236
 TBranchClones.cxx:237
 TBranchClones.cxx:238
 TBranchClones.cxx:239
 TBranchClones.cxx:240
 TBranchClones.cxx:241
 TBranchClones.cxx:242
 TBranchClones.cxx:243
 TBranchClones.cxx:244
 TBranchClones.cxx:245
 TBranchClones.cxx:246
 TBranchClones.cxx:247
 TBranchClones.cxx:248
 TBranchClones.cxx:249
 TBranchClones.cxx:250
 TBranchClones.cxx:251
 TBranchClones.cxx:252
 TBranchClones.cxx:253
 TBranchClones.cxx:254
 TBranchClones.cxx:255
 TBranchClones.cxx:256
 TBranchClones.cxx:257
 TBranchClones.cxx:258
 TBranchClones.cxx:259
 TBranchClones.cxx:260
 TBranchClones.cxx:261
 TBranchClones.cxx:262
 TBranchClones.cxx:263
 TBranchClones.cxx:264
 TBranchClones.cxx:265
 TBranchClones.cxx:266
 TBranchClones.cxx:267
 TBranchClones.cxx:268
 TBranchClones.cxx:269
 TBranchClones.cxx:270
 TBranchClones.cxx:271
 TBranchClones.cxx:272
 TBranchClones.cxx:273
 TBranchClones.cxx:274
 TBranchClones.cxx:275
 TBranchClones.cxx:276
 TBranchClones.cxx:277
 TBranchClones.cxx:278
 TBranchClones.cxx:279
 TBranchClones.cxx:280
 TBranchClones.cxx:281
 TBranchClones.cxx:282
 TBranchClones.cxx:283
 TBranchClones.cxx:284
 TBranchClones.cxx:285
 TBranchClones.cxx:286
 TBranchClones.cxx:287
 TBranchClones.cxx:288
 TBranchClones.cxx:289
 TBranchClones.cxx:290
 TBranchClones.cxx:291
 TBranchClones.cxx:292
 TBranchClones.cxx:293
 TBranchClones.cxx:294
 TBranchClones.cxx:295
 TBranchClones.cxx:296
 TBranchClones.cxx:297
 TBranchClones.cxx:298
 TBranchClones.cxx:299
 TBranchClones.cxx:300
 TBranchClones.cxx:301
 TBranchClones.cxx:302
 TBranchClones.cxx:303
 TBranchClones.cxx:304
 TBranchClones.cxx:305
 TBranchClones.cxx:306
 TBranchClones.cxx:307
 TBranchClones.cxx:308
 TBranchClones.cxx:309
 TBranchClones.cxx:310
 TBranchClones.cxx:311
 TBranchClones.cxx:312
 TBranchClones.cxx:313
 TBranchClones.cxx:314
 TBranchClones.cxx:315
 TBranchClones.cxx:316
 TBranchClones.cxx:317
 TBranchClones.cxx:318
 TBranchClones.cxx:319
 TBranchClones.cxx:320
 TBranchClones.cxx:321
 TBranchClones.cxx:322
 TBranchClones.cxx:323
 TBranchClones.cxx:324
 TBranchClones.cxx:325
 TBranchClones.cxx:326
 TBranchClones.cxx:327
 TBranchClones.cxx:328
 TBranchClones.cxx:329
 TBranchClones.cxx:330
 TBranchClones.cxx:331
 TBranchClones.cxx:332
 TBranchClones.cxx:333
 TBranchClones.cxx:334
 TBranchClones.cxx:335
 TBranchClones.cxx:336
 TBranchClones.cxx:337
 TBranchClones.cxx:338
 TBranchClones.cxx:339
 TBranchClones.cxx:340
 TBranchClones.cxx:341
 TBranchClones.cxx:342
 TBranchClones.cxx:343
 TBranchClones.cxx:344
 TBranchClones.cxx:345
 TBranchClones.cxx:346
 TBranchClones.cxx:347
 TBranchClones.cxx:348
 TBranchClones.cxx:349
 TBranchClones.cxx:350
 TBranchClones.cxx:351
 TBranchClones.cxx:352
 TBranchClones.cxx:353
 TBranchClones.cxx:354
 TBranchClones.cxx:355
 TBranchClones.cxx:356
 TBranchClones.cxx:357
 TBranchClones.cxx:358
 TBranchClones.cxx:359
 TBranchClones.cxx:360
 TBranchClones.cxx:361
 TBranchClones.cxx:362
 TBranchClones.cxx:363
 TBranchClones.cxx:364
 TBranchClones.cxx:365
 TBranchClones.cxx:366
 TBranchClones.cxx:367
 TBranchClones.cxx:368
 TBranchClones.cxx:369
 TBranchClones.cxx:370
 TBranchClones.cxx:371
 TBranchClones.cxx:372
 TBranchClones.cxx:373
 TBranchClones.cxx:374
 TBranchClones.cxx:375
 TBranchClones.cxx:376
 TBranchClones.cxx:377
 TBranchClones.cxx:378
 TBranchClones.cxx:379
 TBranchClones.cxx:380
 TBranchClones.cxx:381
 TBranchClones.cxx:382
 TBranchClones.cxx:383
 TBranchClones.cxx:384
 TBranchClones.cxx:385
 TBranchClones.cxx:386
 TBranchClones.cxx:387
 TBranchClones.cxx:388
 TBranchClones.cxx:389
 TBranchClones.cxx:390
 TBranchClones.cxx:391
 TBranchClones.cxx:392
 TBranchClones.cxx:393
 TBranchClones.cxx:394
 TBranchClones.cxx:395
 TBranchClones.cxx:396
 TBranchClones.cxx:397
 TBranchClones.cxx:398
 TBranchClones.cxx:399
 TBranchClones.cxx:400
 TBranchClones.cxx:401
 TBranchClones.cxx:402
 TBranchClones.cxx:403
 TBranchClones.cxx:404
 TBranchClones.cxx:405
 TBranchClones.cxx:406
 TBranchClones.cxx:407
 TBranchClones.cxx:408
 TBranchClones.cxx:409
 TBranchClones.cxx:410
 TBranchClones.cxx:411
 TBranchClones.cxx:412
 TBranchClones.cxx:413
 TBranchClones.cxx:414
 TBranchClones.cxx:415
 TBranchClones.cxx:416
 TBranchClones.cxx:417
 TBranchClones.cxx:418
 TBranchClones.cxx:419
 TBranchClones.cxx:420
 TBranchClones.cxx:421
 TBranchClones.cxx:422
 TBranchClones.cxx:423
 TBranchClones.cxx:424
 TBranchClones.cxx:425
 TBranchClones.cxx:426
 TBranchClones.cxx:427
 TBranchClones.cxx:428
 TBranchClones.cxx:429
 TBranchClones.cxx:430
 TBranchClones.cxx:431
 TBranchClones.cxx:432
 TBranchClones.cxx:433
 TBranchClones.cxx:434
 TBranchClones.cxx:435
 TBranchClones.cxx:436
 TBranchClones.cxx:437
 TBranchClones.cxx:438
 TBranchClones.cxx:439
 TBranchClones.cxx:440
 TBranchClones.cxx:441
 TBranchClones.cxx:442
 TBranchClones.cxx:443
 TBranchClones.cxx:444
 TBranchClones.cxx:445
 TBranchClones.cxx:446
 TBranchClones.cxx:447
 TBranchClones.cxx:448
 TBranchClones.cxx:449
 TBranchClones.cxx:450
 TBranchClones.cxx:451
 TBranchClones.cxx:452
 TBranchClones.cxx:453
 TBranchClones.cxx:454
 TBranchClones.cxx:455
 TBranchClones.cxx:456
 TBranchClones.cxx:457
 TBranchClones.cxx:458
 TBranchClones.cxx:459
 TBranchClones.cxx:460
 TBranchClones.cxx:461
 TBranchClones.cxx:462
 TBranchClones.cxx:463
 TBranchClones.cxx:464
 TBranchClones.cxx:465
 TBranchClones.cxx:466
 TBranchClones.cxx:467
 TBranchClones.cxx:468
 TBranchClones.cxx:469
 TBranchClones.cxx:470
 TBranchClones.cxx:471
 TBranchClones.cxx:472
 TBranchClones.cxx:473
 TBranchClones.cxx:474
 TBranchClones.cxx:475
 TBranchClones.cxx:476
 TBranchClones.cxx:477
 TBranchClones.cxx:478
 TBranchClones.cxx:479