// @(#)root/treeplayer:$Id$
// Author: Philippe Canal 06/06/2004

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TBranchProxyClassDescriptor                                          //
//                                                                      //
// Hold the processed information about a TClass used in a TBranch while//
// TTreeProxyGenerator is parsing the TTree information.                //
// Also contains the routine use to generate the appropriate code       //
// fragment in the result of MakeProxy.                                 //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TBranchProxyDescriptor.h"
#include "TBranchProxyClassDescriptor.h"

#include "TClass.h"
#include "TClassEdit.h"
#include "TError.h"
#include "TVirtualStreamerInfo.h"
#include "TVirtualCollectionProxy.h"

ClassImp(ROOT::TBranchProxyClassDescriptor);

namespace ROOT {

   void TBranchProxyClassDescriptor::NameToSymbol() {

      // Make the typename a proper class name without having the really deal with
      // namespace and templates.

      fRawSymbol = TClassEdit::ShortType(GetName(),2); // Drop default allocator from the name.
      fRawSymbol.ReplaceAll(":","_");
      fRawSymbol.ReplaceAll("<","_");
      fRawSymbol.ReplaceAll(">","_");
      fRawSymbol.ReplaceAll(",","Cm");
      fRawSymbol.ReplaceAll(" ","");
      fRawSymbol.ReplaceAll("*","st");
      fRawSymbol.ReplaceAll("&","rf");
      if (IsClones())
         fRawSymbol.Prepend("TClaPx_");
      else if (IsSTL())
         fRawSymbol.Prepend("TStlPx_");
      else
         fRawSymbol.Prepend("TPx_");
      if (fRawSymbol.Length() && fRawSymbol[fRawSymbol.Length()-1]=='.')
         fRawSymbol.Remove(fRawSymbol.Length()-1);

      SetName(fRawSymbol);
   }

   TBranchProxyClassDescriptor::TBranchProxyClassDescriptor(const char *type,
                                                            TVirtualStreamerInfo *info,
                                                            const char *branchname,
                                                            ELocation isclones,
                                                            UInt_t splitlevel,
                                                            const TString &containerName) :
      TNamed(type,type),
      fIsClones(isclones),
      fContainerName(containerName),
      fIsLeafList(false),
      fSplitLevel(splitlevel),
      fBranchName(branchname),
      fSubBranchPrefix(branchname),
      fInfo(info),
      fMaxDatamemberType(3)
   {
      // Constructor.

      R__ASSERT( strcmp(fInfo->GetName(), type)==0 );
      NameToSymbol();
      if (fSubBranchPrefix.Length() && fSubBranchPrefix[fSubBranchPrefix.Length()-1]=='.') fSubBranchPrefix.Remove(fSubBranchPrefix.Length()-1);
   }

   TBranchProxyClassDescriptor::TBranchProxyClassDescriptor(const char *branchname) :
      TNamed(branchname,branchname),
      fIsClones(kOut),
      fContainerName(),
      fIsLeafList(true),
      fSplitLevel(0),
      fBranchName(branchname),
      fSubBranchPrefix(branchname),
      fInfo(0),
      fMaxDatamemberType(3)
   {
      // Constructor for a branch constructed from a leaf list.

      NameToSymbol();
      if (fSubBranchPrefix.Length() && fSubBranchPrefix[fSubBranchPrefix.Length()-1]=='.') fSubBranchPrefix.Remove(fSubBranchPrefix.Length()-1);
   }

   TBranchProxyClassDescriptor::TBranchProxyClassDescriptor(const char *type, TVirtualStreamerInfo *info,
                                                            const char *branchname,
                                                            const char *branchPrefix, ELocation isclones,
                                                            UInt_t splitlevel,
                                                            const TString &containerName) :
      TNamed(type,type),
      fIsClones(isclones),
      fContainerName(containerName),
      fIsLeafList(true),
      fSplitLevel(splitlevel),
      fBranchName(branchname),
      fSubBranchPrefix(branchPrefix),
      fInfo(info),
      fMaxDatamemberType(3)
   {
      // Constructor.

      R__ASSERT( strcmp(fInfo->GetName(), type)==0 );
      NameToSymbol();
      if (fSubBranchPrefix.Length() && fSubBranchPrefix[fSubBranchPrefix.Length()-1]=='.') fSubBranchPrefix.Remove(fSubBranchPrefix.Length()-1);
   }

   const char* TBranchProxyClassDescriptor::GetBranchName() const
   {
      // Get the branch name
      return fBranchName.Data();
   }

   const char* TBranchProxyClassDescriptor::GetSubBranchPrefix() const
   {
      // Get the prefix from the branch name
      return fSubBranchPrefix.Data();
   }

   const char* TBranchProxyClassDescriptor::GetRawSymbol() const
   {
      // Get the real symbol name

      return fRawSymbol;
   }

   UInt_t TBranchProxyClassDescriptor::GetSplitLevel() const {
      // Return the split level of the branch.
      return fSplitLevel;
   }

   Bool_t TBranchProxyClassDescriptor::IsEquivalent(const TBranchProxyClassDescriptor* other)
   {
      // Return true if this description is the 'same' as the other decription.

      if ( !other ) return kFALSE;
      // Purposely do not test on the name!
      if ( strcmp(GetTitle(),other->GetTitle()) ) return kFALSE;
      // if ( fBranchName != other->fBranchName ) return kFALSE;
      // if ( fSubBranchPrefix != other->fSubBranchPrefix ) return kFALSE;

      if (fIsClones != other->fIsClones) return kFALSE;
      if (fIsClones != kOut) {
         if (fContainerName != other->fContainerName) return kFALSE;
      }

      TBranchProxyDescriptor *desc;
      TBranchProxyDescriptor *othdesc;

      if ( fListOfBaseProxies.GetSize() != other->fListOfBaseProxies.GetSize() ) return kFALSE;
      TIter next(&fListOfBaseProxies);
      TIter othnext(&other->fListOfBaseProxies);
      while ( (desc=(TBranchProxyDescriptor*)next()) ) {
         othdesc=(TBranchProxyDescriptor*)othnext();
         if (!desc->IsEquivalent(othdesc,kTRUE) ) return kFALSE;
      }

      if ( fListOfSubProxies.GetSize() != other->fListOfSubProxies.GetSize() ) return kFALSE;
      next = &fListOfSubProxies;
      othnext = &(other->fListOfSubProxies);

      while ( (desc=(TBranchProxyDescriptor*)next()) ) {
         othdesc=(TBranchProxyDescriptor*)othnext();
         if (!desc->IsEquivalent(othdesc,kTRUE)) return kFALSE;
         if (desc->IsSplit()) {
            TString leftname (  desc->GetBranchName() );
            TString rightname(  othdesc->GetBranchName() );

            if (leftname.Index(GetBranchName())==0) leftname.Remove( 0,strlen(GetBranchName()));
            if (leftname.Length() && leftname[0]=='.') leftname.Remove(0,1);
            if (rightname.Index(other->GetBranchName())==0) rightname.Remove(0,strlen(other->GetBranchName()));
            if (rightname.Length() && rightname[0]=='.') rightname.Remove(0,1);
            if (leftname != rightname ) return kFALSE;
         }
      }
      return true;
   }

   void TBranchProxyClassDescriptor::AddDescriptor(TBranchProxyDescriptor *desc, Bool_t isBase)
   {
      // Add a descriptor to this proxy.

      if (desc) {
         if (isBase) {
            fListOfBaseProxies.Add(desc);
         } else {
            fListOfSubProxies.Add(desc);
            UInt_t len = strlen(desc->GetTypeName());
            if ((len+2)>fMaxDatamemberType) fMaxDatamemberType = len+2;
         }
      }
   }

   Bool_t TBranchProxyClassDescriptor::IsLoaded() const
   {
      // Return true if the class needed by the branch is loaded
      return IsLoaded(GetTitle());
   }

   Bool_t TBranchProxyClassDescriptor::IsLoaded(const char *classname)
   {
      // Return true if the class needed by the branch is loaded
      TClass *cl = TClass::GetClass(classname);
      while (cl) {
         if (cl->IsLoaded()) return kTRUE;
         if (!cl->GetCollectionProxy()) return kFALSE;
         if (!cl->GetCollectionProxy()->GetValueClass()) return kTRUE; // stl container of simple type are always 'loaded'
         cl = cl->GetCollectionProxy()->GetValueClass();
      }
      return kFALSE;
   }

   Bool_t TBranchProxyClassDescriptor::IsClones() const
   {
      // Return true if this proxy is for a TClonesArray.
      return fIsClones==kClones || fIsClones==kInsideClones;
   }

   Bool_t TBranchProxyClassDescriptor::IsSTL() const
   {
      // Return true if this proxy is for a TClonesArray.
      return fIsClones==kSTL || fIsClones==kInsideSTL;
   }

   TBranchProxyClassDescriptor::ELocation TBranchProxyClassDescriptor::GetIsClones() const
   {
      // Return whether the branch is inside, nested in or outside of a TClonesArray
      return fIsClones;
   }

   TString TBranchProxyClassDescriptor::GetContainerName() const
   {
      // Return the name of the container holding this class, if any.
      return fContainerName;
   }

   void TBranchProxyClassDescriptor::OutputDecl(FILE *hf, int offset, UInt_t /* maxVarname */)
   {
      // Output the declaration and implementation of this emulation class

      TBranchProxyDescriptor *desc;


      // Start the class declaration with the eventual list of base classes
      fprintf(hf,"%-*sstruct %s\n", offset," ", GetName() );

      if (fListOfBaseProxies.GetSize()) {
         fprintf(hf,"%-*s   : ", offset," ");

         TIter next(&fListOfBaseProxies);

         desc = (TBranchProxyDescriptor*)next();
         fprintf(hf,"public %s", desc->GetTypeName());

         while ( (desc = (TBranchProxyDescriptor*)next()) ) {
            fprintf(hf,",\n%-*spublic %s", offset+5," ", desc->GetTypeName());
         }

         fprintf(hf,"\n");
      }
      fprintf(hf,"%-*s{\n", offset," ");


      // Write the constructor
      fprintf(hf,"%-*s   %s(TBranchProxyDirector* director,const char *top,const char *mid=0) :",
              offset," ", GetName());

      Bool_t wroteFirst = kFALSE;

      if (fListOfBaseProxies.GetSize()) {

         TIter next(&fListOfBaseProxies);

         desc = (TBranchProxyDescriptor*)next();
         fprintf(hf,"\n%-*s%-*s(director, top, mid)",  offset+6, " ", fMaxDatamemberType,desc->GetTypeName());
         wroteFirst = true;

         while ( (desc = (TBranchProxyDescriptor*)next()) ) {
            fprintf(hf,",\n%-*s%-*s(director, top, mid)",  offset+6, " ", fMaxDatamemberType,desc->GetTypeName());
         }

      }
      fprintf(hf,"%s\n%-*s      %-*s(top,mid)",wroteFirst?",":"",offset," ",fMaxDatamemberType,"ffPrefix");
      wroteFirst = true;

      TString objInit = "top, mid";
      if ( GetIsClones() == kInsideClones || GetIsClones() == kInsideSTL ) {
         if (fListOfSubProxies.GetSize()) {
            desc = (TBranchProxyDescriptor*)fListOfSubProxies.At(0);
            if (desc && desc->IsSplit()) {

               // In the case of a split sub object is TClonesArray, the
               // object itself does not have its own branch, so we need to
               // use its first (semantic) sub-branch as a proxy

               TString main = GetBranchName();
               TString sub = desc->GetBranchName();
               sub.Remove(0,main.Length()+1);

               objInit  = "ffPrefix, ";
               objInit += "\"";
               objInit += sub;
               objInit += "\"";

               objInit = "top, \"\", mid";
            }
         }
      }

      fprintf(hf,"%s\n%-*s      %-*s(director, %s)",
              ",",offset," ",fMaxDatamemberType,"obj",objInit.Data());

      TIter next(&fListOfSubProxies);
      while ( (desc = (TBranchProxyDescriptor*)next()) ) {
         fprintf(hf,",");
         desc->OutputInit(hf,offset,fMaxDatamemberType,GetSubBranchPrefix());
      }
      fprintf(hf,"\n%-*s   {};\n",offset," ");


      // Write the 2nd constructor
      fprintf(hf,"%-*s   %s(TBranchProxyDirector* director, TBranchProxy *parent, const char *membername, const char *top=0, const char *mid=0) :",
              offset," ", GetName());

      wroteFirst = kFALSE;

      if (fListOfBaseProxies.GetSize()) {

         TIter nextbase(&fListOfBaseProxies);

         // This is guarantee to return a non zero value due to the if (fListOfBaseProxies.GetSize())
         desc = (TBranchProxyDescriptor*)nextbase();
         fprintf(hf,"\n%-*s%-*s(director, parent, membername)",  offset+6, " ", fMaxDatamemberType,desc->GetTypeName());
         wroteFirst = true;

         while ( (desc = (TBranchProxyDescriptor*)nextbase()) ) {
            fprintf(hf,",\n%-*s%-*s(director, parent, membername)",  offset+6, " ", fMaxDatamemberType,desc->GetTypeName());
         }

      }
      fprintf(hf,"%s\n%-*s      %-*s(top,mid)",wroteFirst?",":"",offset," ",fMaxDatamemberType,"ffPrefix");
      wroteFirst = true;

      if ( true ||  IsLoaded() || IsClones() || IsSTL() ) {
         fprintf(hf,"%s\n%-*s      %-*s(director, parent, membername)",
                 ",",offset," ",fMaxDatamemberType,"obj");
      }

      next.Reset();
      while ( (desc = (TBranchProxyDescriptor*)next()) ) {
         fprintf(hf,",");
         desc->OutputInit(hf,offset,fMaxDatamemberType,GetSubBranchPrefix());
      }
      fprintf(hf,"\n%-*s   {};\n",offset," ");


      // Declare the data members.
      fprintf(hf,"%-*s%-*s %s;\n",  offset+3," ",  fMaxDatamemberType, "TBranchProxyHelper", "ffPrefix");

      // If the real class is available, make it available via the arrow operator:
      if (IsLoaded()) {

         const char *type = GetTitle(); /* IsClones() ? "TClonesArray" : GetTitle(); */
         fprintf(hf,"%-*sInjecTBranchProxyInterface();\n", offset+3," ");
         //Can the real type contain a leading 'const'? If so the following is incorrect.
         if ( IsClones() ) {
            fprintf(hf,"%-*sconst %s* operator[](Int_t i) { return obj.At(i); }\n", offset+3," ",type);
            fprintf(hf,"%-*sconst %s* operator[](UInt_t i) { return obj.At(i); }\n", offset+3," ",type);
            fprintf(hf,"%-*sInt_t GetEntries() { return obj.GetEntries(); }\n",offset+3," ");
            fprintf(hf,"%-*sconst TClonesArray* operator->() { return obj.GetPtr(); }\n", offset+3," ");
            fprintf(hf,"%-*sTClaObjProxy<%s > obj;\n", offset+3, " ", type);
         } else if ( IsSTL() ) {
            if (fContainerName.Length() && IsLoaded(fContainerName)) {
               fprintf(hf,"%-*sconst %s& At(UInt_t i) {\n",offset+3," ",type);
               TClass *stlCl = TClass::GetClass(fContainerName);
               TClass *cl = TClass::GetClass(GetTitle());
               if (cl->GetMethodWithPrototype(cl->GetName(),"TRootIOCtor*")) {
                  fprintf(hf,"%-*s   static %s default_val((TRootIOCtor*)0);\n",offset+3," ",type);
               } else {
                  fprintf(hf,"%-*s   static %s default_val;\n",offset+3," ",type);
               }
               fprintf(hf,"%-*s   if (!obj.Read()) return default_val;\n",offset+3," ");
               if (stlCl->GetCollectionProxy()->GetValueClass() == cl) {
                  fprintf(hf,"%-*s   %s *temp = & obj.GetPtr()->at(i);\n",offset+3," ",type);
               } else {
                  fprintf(hf,"%-*s   %s *temp = (%s *)( obj.GetProxy()->GetStlStart(i) );\n",offset+3," ",type,type);
               }
               //fprintf(hf,"%-*s   %s *temp = (%s *)( obj.GetPtr()->at(i)) + obj.GetOffset() );\n",offset+3," ",type,type);
                  //fprintf(hf,"%-*s   %s *temp = (%s *)(void*)(&obj.At(i));\n",offset+3," ",type,type);
               fprintf(hf,"%-*s   if (temp) return *temp; else return default_val;\n",offset+3," ");
               fprintf(hf,"%-*s}\n",offset+3," ");

               fprintf(hf,"%-*sconst %s& operator[](Int_t i) { return At(i); }\n", offset+3," ",type);
               fprintf(hf,"%-*sconst %s& operator[](UInt_t i) { return At(i); }\n", offset+3," ",type);
               fprintf(hf,"%-*sInt_t GetEntries() { return obj.GetPtr()->size(); }\n",offset+3," ");
               fprintf(hf,"%-*sconst %s* operator->() { return obj.GetPtr(); }\n", offset+3," ",fContainerName.Data());
               fprintf(hf,"%-*soperator %s*() { return obj.GetPtr(); }\n", offset+3," ",fContainerName.Data());
               fprintf(hf,"%-*sTObjProxy<%s > obj;\n", offset+3, " ", fContainerName.Data());
            } else {
               fprintf(hf,"%-*sconst %s& operator[](Int_t i) { return obj.At(i); }\n", offset+3," ",type);
               fprintf(hf,"%-*sconst %s& operator[](UInt_t i) { return obj.At(i); }\n", offset+3," ",type);
               fprintf(hf,"%-*sInt_t GetEntries() { return obj.GetEntries(); }\n",offset+3," ");
               fprintf(hf,"%-*sTStlObjProxy<%s > obj;\n", offset+3, " ", type);
            }
         } else {
            fprintf(hf,"%-*sconst %s* operator->() { return obj.GetPtr(); }\n", offset+3," ",type);
            fprintf(hf,"%-*sTObjProxy<%s > obj;\n", offset+3, " ", type);
         }

      } else if ( IsClones()) {

         fprintf(hf,"%-*sInjecTBranchProxyInterface();\n", offset+3," ");
         fprintf(hf,"%-*sInt_t GetEntries() { return obj.GetEntries(); }\n",offset+3," ");
         fprintf(hf,"%-*sconst TClonesArray* operator->() { return obj.GetPtr(); }\n", offset+3," ");
         fprintf(hf,"%-*sTClaProxy obj;\n", offset+3," ");

      } else if ( IsSTL()) {

         fprintf(hf,"%-*sInjecTBranchProxyInterface();\n", offset+3," ");
         fprintf(hf,"%-*sInt_t GetEntries() { return obj.GetEntries(); }\n",offset+3," ");
         // fprintf(hf,"%-*sconst TClonesArray* operator->() { return obj.GetPtr(); }\n", offset+3," ");
         fprintf(hf,"%-*sTStlProxy obj;\n", offset+3," ");

      } else {

         fprintf(hf,"%-*sInjecTBranchProxyInterface();\n", offset+3," ");
         fprintf(hf,"%-*sTBranchProxy obj;\n", offset+3," ");

      }

      fprintf(hf,"\n");

      next.Reset();
      while( (desc = ( TBranchProxyDescriptor *)next()) ) {
         desc->OutputDecl(hf,offset+3,fMaxDatamemberType);
      }
      fprintf(hf,"%-*s};\n",offset," ");

      //TBranchProxyDescriptor::OutputDecl(hf,offset,maxVarname);
   }

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