ROOT logo
// @(#)root/base:$Id: TBranchProxy.cxx 23466 2008-04-23 13:52:45Z brun $
// Author: Philippe Canal  13/05/2003

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TBranchProxy                                                         //
//
// Base class for all the proxy object.  It includes the imeplemtation
// of the autoloading of branches as well as all the generic setup 
// routine.
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TBranchProxy.h"
#include "TLeaf.h"
#include "TBranchElement.h"
#include "TStreamerElement.h"
#include "TStreamerInfo.h"

ClassImp(ROOT::TBranchProxy);

ROOT::TBranchProxy::TBranchProxy() :
   fDirector(0), fInitialized(false), fBranchName(""), fParent(0),
   fDataMember(""), fIsMember(false), fIsClone(false), fIsaPointer(0),
   fClassName(""), fClass(0), fElement(0), fMemberOffset(0), fOffset(0),
   fBranch(0), fBranchCount(0),
   fLastTree(0), fRead(-1), fWhere(0),fCollection(0)
{
   // Constructor.
};

ROOT::TBranchProxy::TBranchProxy(TBranchProxyDirector* boss, const char* top,
                                 const char* name) :
   fDirector(boss), fInitialized(false), fBranchName(top), fParent(0),
   fDataMember(""), fIsMember(false), fIsClone(false), fIsaPointer(false),
   fClassName(""), fClass(0), fElement(0), fMemberOffset(0), fOffset(0),
   fBranch(0), fBranchCount(0),
   fLastTree(0), fRead(-1),  fWhere(0),fCollection(0)
{
   // Constructor.

   if (fBranchName.Length() && fBranchName[fBranchName.Length()-1]!='.' && name) {
      ((TString&)fBranchName).Append(".");
   }
   if (name) ((TString&)fBranchName).Append(name);
   boss->Attach(this);
}

ROOT::TBranchProxy::TBranchProxy(TBranchProxyDirector* boss, const char *top, const char *name, const char *membername) :
   fDirector(boss), fInitialized(false),  fBranchName(top), fParent(0),
   fDataMember(membername), fIsMember(true), fIsClone(false), fIsaPointer(false),
   fClassName(""), fClass(0), fElement(0), fMemberOffset(0), fOffset(0),
   fBranch(0), fBranchCount(0),
   fLastTree(0), fRead(-1), fWhere(0),fCollection(0)
{
   // Constructor.

   if (name && strlen(name)) {
      if (fBranchName.Length() && fBranchName[fBranchName.Length()-1]!='.') {
         ((TString&)fBranchName).Append(".");
      }
      ((TString&)fBranchName).Append(name);
   }
   boss->Attach(this);
}

ROOT::TBranchProxy::TBranchProxy(TBranchProxyDirector* boss, TBranchProxy *parent, const char* membername, const char* top,
                                 const char* name) :
   fDirector(boss), fInitialized(false),  fBranchName(top), fParent(parent),
   fDataMember(membername), fIsMember(true), fIsClone(false), fIsaPointer(false),
   fClassName(""), fClass(0), fElement(0), fMemberOffset(0), fOffset(0),
   fBranch(0), fBranchCount(0),
   fLastTree(0), fRead(-1), fWhere(0),fCollection(0)
{
   // Constructor.

   if (name && strlen(name)) {
      if (fBranchName.Length() && fBranchName[fBranchName.Length()-1]!='.') {
         ((TString&)fBranchName).Append(".");
      }
      ((TString&)fBranchName).Append(name);
   }
   boss->Attach(this);
}

ROOT::TBranchProxy::~TBranchProxy()
{
   // Typical Destructor
}

void ROOT::TBranchProxy::Reset()
{
   // Completely reset the object.

   fWhere = 0;
   fBranch = 0;
   fBranchCount = 0;
   fRead = -1;
   fClass = 0;
   fElement = 0;
   fMemberOffset = 0;
   fIsClone = false;
   fInitialized = false;
   fLastTree = 0;
   delete fCollection;
}

void ROOT::TBranchProxy::Print()
{
   // Display the content of the object

   cout << "fBranchName " << fBranchName << endl;
   //cout << "fTree " << fDirector->fTree << endl;
   cout << "fBranch " << fBranch << endl;
   if (fBranchCount) cout << "fBranchCount " << fBranchCount << endl;
}

Bool_t ROOT::TBranchProxy::Setup()
{
   // Initialize/cache the necessary information.

   // Should we check the type?

   if (!fDirector->GetTree()) {
      return false;
   }
   if (fParent) {

      TClass *pcl = fParent->GetClass();
      R__ASSERT(pcl);

      if (pcl==TClonesArray::Class()) {
         // We always skip the clones array

         Int_t i = fDirector->GetReadEntry();
         if (i<0)  fDirector->SetReadEntry(0);
         fParent->Read();
         if (i<0) fDirector->SetReadEntry(i);

         TClonesArray *clones;
         clones = (TClonesArray*)fParent->GetStart();

         pcl = clones->GetClass();
      } else if (pcl->GetCollectionProxy()) {
         // We always skip the collections.

         if (fCollection) delete fCollection;
         fCollection = pcl->GetCollectionProxy()->Generate();
         pcl = fCollection->GetValueClass();
      }

      fElement = (TStreamerElement*)pcl->GetStreamerInfo()->GetElements()->FindObject(fDataMember);
      fIsaPointer = fElement->IsaPointer();
      fClass = fElement->GetClassPointer();

      R__ASSERT(fElement);

      fIsClone = (fClass==TClonesArray::Class());

      fOffset = fMemberOffset = fElement->GetOffset();

      fWhere = fParent->fWhere; // not really used ... it is reset by GetStart and GetClStart

      if (fParent->IsaPointer()) {
         // fprintf(stderr,"non-split pointer de-referencing non implemented yet \n");
         // nothing to do!
      } else {
         // Accumulate offsets.
         // or not!? fOffset = fMemberOffset = fMemberOffset + fParent->fOffset;
      }

      // This is not sufficient for following pointers

   } else if (!fBranch) {

      // This does not allow (yet) to precede the branch name with
      // its mother's name
      fBranch = fDirector->GetTree()->GetBranch(fBranchName.Data());
      if (!fBranch) return false;

      TLeaf *leaf = (TLeaf*)fBranch->GetListOfLeaves()->At(0); // fBranch->GetLeaf(fLeafname);
      if (leaf) leaf = leaf->GetLeafCount();
      if (leaf) {
         fBranchCount = leaf->GetBranch();
//          fprintf(stderr,"for leaf %s setting up leafcount %s branchcount %s\n",
//                  fBranch->GetName(),leaf->GetName(),fBranchCount->GetName());
         //fBranchCount->Print();
      }

      fWhere = (double*)fBranch->GetAddress();

      if (!fWhere && fBranch->IsA()==TBranchElement::Class()
          && ((TBranchElement*)fBranch)->GetMother()) {

         TBranchElement* be = ((TBranchElement*)fBranch);

         be->GetMother()->SetAddress(0);
         fWhere =  (double*)fBranch->GetAddress();

      }
      if (!fWhere && fBranch->IsA()==TBranch::Class()) {
         TLeaf *leaf2 = (TLeaf*)fBranch->GetListOfLeaves()->At(0); // fBranch->GetLeaf(fLeafname);
         fWhere = leaf2->GetValuePointer();
      }

      if (!fWhere) {
         fBranch->SetAddress(0);
         fWhere =  (double*)fBranch->GetAddress();
      }


      if (fWhere && fBranch->IsA()==TBranchElement::Class()) {

         TBranchElement* be = ((TBranchElement*)fBranch);

         TStreamerInfo * info = be->GetInfo();
         Int_t id = be->GetID();
         if (id>=0) {
            fOffset = info->GetOffsets()[id];
            fElement = (TStreamerElement*)info->GetElements()->At(id);
            fIsaPointer = fElement->IsaPointer();
            fClass = fElement->GetClassPointer();

            if ((fIsMember || (be->GetType()!=3 && be->GetType() !=4)) 
                  && (be->GetType()!=31 && be->GetType()!=41)) {

               if (fClass==TClonesArray::Class()) {
                  Int_t i = be->GetTree()->GetReadEntry();
                  if (i<0) i = 0;
                  be->GetEntry(i);

                  TClonesArray *clones;
                  if ( fIsMember && be->GetType()==3 ) {
                     clones = (TClonesArray*)be->GetObject();
                  } else if (fIsaPointer) {
                     clones = (TClonesArray*)*(void**)((char*)fWhere+fOffset);
                  } else {
                     clones = (TClonesArray*)((char*)fWhere+fOffset);
                  }
                  if (!fIsMember) fIsClone = true;
                  fClass = clones->GetClass();
               } else if (fClass && fClass->GetCollectionProxy()) {
                  delete fCollection;
                  fCollection = fClass->GetCollectionProxy()->Generate();
                  fClass = fCollection->GetValueClass();
               }

            }
            if (fClass) fClassName = fClass->GetName();
         } else {
            fClassName = be->GetClassName();
            fClass = TClass::GetClass(fClassName);
         }

         if (be->GetType()==3) {
            // top level TClonesArray

            if (!fIsMember) fIsClone = true;
            fIsaPointer = false;
            fWhere = be->GetObject();

         } else if (be->GetType()==4) {
            // top level TClonesArray

            fCollection = be->GetCollectionProxy()->Generate();
            fIsaPointer = false;
            fWhere = be->GetObject();

         } else if (id<0) {
            // top level object

            fIsaPointer = false;
            fWhere = be->GetObject();

         } else if (be->GetType()==41) {

            fCollection = be->GetCollectionProxy()->Generate();
            fWhere   = be->GetObject();
            fOffset += be->GetOffset();

         } else if (be->GetType()==31) {

            fWhere   = be->GetObject();
            fOffset += be->GetOffset();

         } else if (be->GetType()==2) {
            // this might also be the right path for GetType()==1

            fWhere = be->GetObject();

         } else {

            // fWhere = ((unsigned char*)fWhere) + fOffset;
            fWhere = ((unsigned char*)be->GetObject()) + fOffset;

         }
      } else {
         fClassName = fBranch->GetClassName();
         fClass = TClass::GetClass(fClassName);
      }


      /*
        fClassName = fBranch->GetClassName(); // What about TClonesArray?
        if ( fBranch->IsA()==TBranchElement::Class() &&
        ((TBranchElement*)fBranch)->GetType()==31 ||((TBranchElement*)fBranch)->GetType()==3 ) {

        Int_t id = ((TBranchElement*)fBranch)->GetID();
        if (id>=0) {

        fElement = ((TStreamerElement*)(((TBranchElement*)fBranch)->GetInfo())->GetElements()->At(id));
        fClass = fElement->GetClassPointer();
        if (fClass) fClassName = fClass->GetName();

        }
        }
        if (fClass==0 && fClassName.Length()) fClass = TClass::GetClass(fClassName);
      */
      //fprintf(stderr,"For %s fClass is %p which is %s\n",
      //        fBranchName.Data(),fClass,fClass==0?"not set":fClass->GetName());

      if ( fBranch->IsA()==TBranchElement::Class() &&
           (((TBranchElement*)fBranch)->GetType()==3 || fClass==TClonesArray::Class()) &&
           !fIsMember ) {
         fIsClone = true;
      } 

      if (fIsMember) {
         if ( fBranch->IsA()==TBranchElement::Class() &&
              fClass==TClonesArray::Class() &&
              (((TBranchElement*)fBranch)->GetType()==31 || ((TBranchElement*)fBranch)->GetType()==3) ) {

            TBranchElement *bcount = ((TBranchElement*)fBranch)->GetBranchCount();
            TString member;
            if (bcount) {
               TString bname = fBranch->GetName();
               TString bcname = bcount->GetName();
               member = bname.Remove(0,bcname.Length()+1);
            } else {
               member = fDataMember;
            }

            fMemberOffset = fClass->GetDataMemberOffset(member);

            if (fMemberOffset<0) {
               Error("Setup",Form("Negative offset %d for %s in %s",
                                  fMemberOffset,fBranch->GetName(),
                                  bcount?bcount->GetName():"unknown"));
            }

         } else if (fClass) {

            fElement = (TStreamerElement*)
               fClass->GetStreamerInfo()->GetElements()->FindObject(fDataMember);
            if (fElement)
               fMemberOffset = fElement->GetOffset();
            else {
               // Need to compose the proper sub name

               TString member;

               Bool_t forgotWhenThisHappens = false;
               R__ASSERT(forgotWhenThisHappens);

               member += fDataMember;
               fMemberOffset = fClass->GetDataMemberOffset(member);

            }

         } else {
            Error("Setup",Form("Missing TClass object for %s\n",fClassName.Data()));
         }

         if ( fBranch->IsA()==TBranchElement::Class()
              && (((TBranchElement*)fBranch)->GetType()==31 || ((TBranchElement*)fBranch)->GetType()==3) ) {

            fOffset = fMemberOffset;

         } else {

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