ROOT logo
#include "htree.h"
#include "TROOT.h"
#include "TKey.h"
#include "TBranch.h"
#include "TFile.h"
#include "TMath.h"
#include "TClonesArray.h"

#if ROOT_VERSION_CODE  < ROOT_VERSION(6,0,0)
  #include "Api.h"     //changedROOT6
#endif

//*-- Author : Manuel Sanchez
//*-- Modified : 12/1/2000 by R.Holzmann
//*-- Modified : 17/12/99 by Denis Bertini
//*-- Modified : 12/05/98 by Manuel Sanchez
//*-- Modified : 19/09/00 by Denis Bertini
//*-- Copyright : GENP (Univ. Santiago de Compostela)

//_HADES_CLASS_DESCRIPTION 
//////////////////////////////////////////////
// HTree
//
//  The HTree is a TTree implementing a automatic split algorithm different
// from the Root one; allowing a more complex tree structure (when used with
// HPartialEvent ...)
//
//////////////////////////////////////////////

ClassImp(HTree)

  HTree::HTree(void) : TTree() {
}

HTree::HTree(const Text_t* name, const Text_t* title, Int_t maxvirtualsize) : TTree (name,title,maxvirtualsize) {
}

HTree::~HTree(void) {
}

void HTree::printContainerSizes(void) {
// This function returns a formatted list of data containers with the
// file size of each container.  To be used with Hydra < v6.00 (old
// branching scheme), probably can be adapted for new Root...

   printf("\n");
   printf("      File: %s  \n",this->GetCurrentFile()->GetName());
   printf("            (%i entries) \n",(int) this->GetEntries());
   printf("\n");
   printf("         Container          File Size         Size/evt\n");
   printf("      ---------------  ------------------   ------------\n");

   Int_t nBytes = 0, nBytesBranch2 = 0;
   TObjArray *array2 = 0, *array3 = 0;
   TBranch *branch1 = 0, *branch2 = 0, *branch3 = 0;

   //TObjArray *array4 = 0;
   //TBranch *branch4 = 0;

   for(Int_t i=0;i<fBranches.GetEntries();i++) {

      branch1 = (TBranch*) fBranches.At(i);
      array2 = branch1->GetListOfBranches();

      nBytesBranch2 = 0;
      for(Int_t j=0;j<array2->GetEntries();j++) {

         branch2 = (TBranch*) array2->At(j);
         nBytesBranch2 += (int) branch2->GetZipBytes();
         array3 = branch2->GetListOfBranches();
         Int_t nBranch2 = array3->GetEntries();

         for(Int_t k=0;k<nBranch2;k++) {

            branch3 = (TBranch*) array3->At(k);
            nBytesBranch2 += (int) branch3->GetZipBytes();

//             array4 = branch3->GetListOfBranches();  // needed for old scheme
//             Int_t nBranch3 = array4->GetEntries();
//
//             for(Int_t l=0;l<nBranch3;l++) {
//
//                 branch4 = (TBranch*) array4->At(l);
//                 nBytesBranch2+= (int) branch3->GetZipBytes();
//             }

         }

      }

      if(nBytesBranch2) {
	  printf(" %20s %11i (%4.1f%%)   %6.1f bytes\n",
		 branch1->GetName(),nBytesBranch2,
		 nBytesBranch2*100./this->GetZipBytes(), 1.*nBytesBranch2/branch1->GetEntries() );
      }
      nBytes += nBytesBranch2;
   }
   printf("                       ------------------   ------------\n");
   printf("                      %11i (%4.1f%%)   %6.3f kB/event\n",
         nBytes,nBytes*100./this->GetZipBytes(), nBytes/branch1->GetEntries()/1024. );
   printf("\n");

}

Int_t HTree::MakeCode(const Char_t* filename) {
//----
// MakeCode adapted for Htree with split level 2
// <D.Bertini@gsi.de>

// Connect output file
   Char_t *tfile = new char[1000];
   if (filename) strcpy(tfile,filename);
   else          sprintf(tfile,"%s.C",GetName());
   FILE *fp = fopen(tfile,"w");
  if (!fp) {
      Error("MakeCode","Cannot open output file:%s\n",tfile);
      return -1;
   }
//connect the htree file
   Char_t *treefile = new char[1000];
   if (fDirectory && fDirectory->GetFile())
                strcpy(treefile,fDirectory->GetFile()->GetName());
   else         strcpy(treefile,"Memory Directory");

   TDatime td;
   fprintf(fp,"{\n");
   fprintf(fp,"///////////////////////////////////////////////////////////\n");
   fprintf(fp,"// This file has been automatically generated \n");
   fprintf(fp,"// (%s by ROOT version%s)\n",td.AsString(),gROOT->GetVersion());
   fprintf(fp,"// from HTree %s/%s\n",this->GetName(),this->GetTitle());
   fprintf(fp,"// found on file: %s\n",treefile);
   fprintf(fp,"///////////////////////////////////////////////////////////\n");
   fprintf(fp,"\n");
   fprintf(fp,"\n");

// Reset and file connect
   fprintf(fp,"//Reset ROOT and connect tree file\n");
   fprintf(fp,"   gROOT->Reset();\n");
   fprintf(fp,"   TFile *f = (TFile*)gROOT->GetListOfFiles()->FindObject(\"%s\");\n",treefile);
   fprintf(fp,"   if (!f) {\n");
   fprintf(fp,"      f = new TFile(\"%s\");\n",treefile);
   if (gDirectory != gFile) {
      fprintf(fp,"      f->cd(\"%s\");\n",gDirectory->GetPath());
   }
   fprintf(fp,"   }\n");
   fprintf(fp,"   HTree *%s = (HTree*)gDirectory->Get(\"%s\");\n\n",
                  GetName(),GetName());
   fprintf(fp,"   if(!%s) {cout << \"No tree in file!\" << endl; exit(1);}\n",
                  GetName());

   fprintf(fp,"   HEventHeader* fHead =(HEventHeader*)f->Get(\"EventHeader\");\n");
   fprintf(fp,"   T->SetBranchAddress(\"EventHeader.\",&fHead);\n\n");

//**** Scanning of Htree 
//**** for the moment 
   TFile* f = fDirectory->GetFile(); 
   TList* total = f->GetListOfKeys(); 
   Int_t entries = total->GetSize();

//**** Only work in split mode 2 for the moment
   Char_t sl=*(strchr(GetTitle(),'.')+1);
   switch (sl) {
      case '0' : Error("MakeCode", "split 0 not yet implemented");
                 return -1; 
                 break;
      case '1' : Error("MakeCode", "split 0 not yet implemented");
                 return -1; 
                 break;
   } 


// Scan the File structure linked to the Htree and parse 
// the relevant subdirectories
   for(Int_t i=0;i<entries;i++){
     TKey* akey = (TKey*) total->At(i);
     Text_t ptr[500];
     Text_t ptrObj[500];
     Text_t branch[500];
     const Int_t npartial = 13;
     const Char_t* partial[npartial]={"Mdc","Tof","Tofino","Start","Rich","Shower","Simul","Tracks","Trigger","Particle","Rpc","TrbNet","Emc"};
     for(Int_t k=0; k<npartial; k++){
       if(strstr(akey->GetName(),partial[k]) != 0){
	 f->cd(akey->GetName());
	 fprintf(fp,"   f->cd(\"%s\"); \n",akey->GetName());
	 TList* subkey = gDirectory->GetListOfKeys();
	 Int_t s2 = subkey->GetSize();
	 for(Int_t j=0;j<s2;j++){ 
	   TKey* akey2 = (TKey*) subkey->At(j);
	   if(strstr(akey2->GetClassName(),"LinearCategory") != 0){
	     sprintf(ptrObj,"ptl%s",akey2->GetName());     
	     fprintf(fp,"   %s* %s = new %s();\n",akey2->GetName(),
		     ptrObj,akey2->GetName());  
	     sprintf(ptr,"catl%s",akey2->GetName()); 
	     fprintf(fp,"   HLinearCategory* %s = (HLinearCategory*) gDirectory->Get(\"%s\");\n",ptr,akey2->GetName());
	     sprintf(branch,"brl%s",akey2->GetName());
	     fprintf(fp,"   TBranch* %s = %s->GetBranch(\"%s\");\n",
		     branch,this->GetName(),akey2->GetName()); 
	     fprintf(fp,"   if(%s) %s->SetAddress(&%s);\n\n",branch, branch, ptr);  
	   }

	   if(strstr(akey2->GetClassName(),"MatrixCategory") != 0){
	     sprintf(ptrObj,"ptm%s",akey2->GetName());     
	     fprintf(fp,"   %s* %s = new %s();\n",akey2->GetName(),
		     ptrObj,akey2->GetName());  
	     sprintf(ptr,"catm%s",akey2->GetName()); 
	     fprintf(fp,"   HMatrixCategory* %s = (HMatrixCategory*) gDirectory->Get(\"%s\");\n",ptr,akey2->GetName());
	     sprintf(branch,"brm%s",akey2->GetName());
	     fprintf(fp,"   TBranch* %s = %s->GetBranch(\"%s\");\n",
		     branch,this->GetName(),akey2->GetName()); 
	     fprintf(fp,"   if(%s) %s->SetAddress(&%s);\n\n",branch, branch, ptr);
	   }

	 }
       }
     }
   }

   fprintf(fp,"   f->cd();\n");

//Generate instructions to make the loop on entries
   fprintf(fp,"\n//     This is the loop skeleton\n");
   fprintf(fp,"//       To read only selected branches, Insert statements like:\n");
   fprintf(fp,"// %s->SetBranchStatus(\"*\",0);  // disable all branches\n",GetName());
   fprintf(fp,"// %s->SetBranchStatus(\"branchname\",1);  // activate branchname\n",GetName());
   fprintf(fp,"\n   Int_t nentries = %s->GetEntries();\n",GetName());
   fprintf(fp,"\n   Int_t nbytes = 0;\n");
   fprintf(fp,"//   for (Int_t i=0; i<nentries;i++) {\n");
   fprintf(fp,"//   For Accessing  the Data you can:  \n");
   fprintf(fp,"//    1)Use of a Total Io on theHTree \n");
   fprintf(fp,"//      nbytes += %s->GetEntry(i);\n",GetName());
   fprintf(fp,"//    2)Use of a specific branch Io on the Htree \n");
   fprintf(fp,"//      nbytes += branchname->GetEntry(i);\n");
   fprintf(fp,"\n");
   fprintf(fp,"//   To loop over Data-Objects:\n");
   fprintf(fp,"//      TIter iter = pCat->MakeIterator();\n");
   fprintf(fp,"//      iter->Reset();\n");
   fprintf(fp,"//      while ( (pObj=(HDataObjName*)iter->Next()) != 0 ){ \n");
   fprintf(fp,"//         pObj->getValue();\n");
 
   fprintf(fp,"//      }\n");
   fprintf(fp,"//   pCat->Clear();\n");
   fprintf(fp,"//   }\n");
   fprintf(fp,"}\n");

   fclose(fp);
   printf("Macro %s generated from HTree: %s\n",filename,GetName());

   delete [] treefile; 
   delete [] tfile;
   return 0;
}

TBranch *HTree::GetBranch(const Char_t * name) {
  TBranch *r = 0;
  
  r = TTree::GetBranch(name);
  if (!r) {
    TString cad = name;
    cad += ".";
    r = TTree::GetBranch(cad.Data());
    if (r) {
      Warning("GetBranch","Branch %s not found. Using %s instead",
	      name,cad.Data());
    }
  }
  
  return r;
}
TTree *gTree;
 htree.cc:1
 htree.cc:2
 htree.cc:3
 htree.cc:4
 htree.cc:5
 htree.cc:6
 htree.cc:7
 htree.cc:8
 htree.cc:9
 htree.cc:10
 htree.cc:11
 htree.cc:12
 htree.cc:13
 htree.cc:14
 htree.cc:15
 htree.cc:16
 htree.cc:17
 htree.cc:18
 htree.cc:19
 htree.cc:20
 htree.cc:21
 htree.cc:22
 htree.cc:23
 htree.cc:24
 htree.cc:25
 htree.cc:26
 htree.cc:27
 htree.cc:28
 htree.cc:29
 htree.cc:30
 htree.cc:31
 htree.cc:32
 htree.cc:33
 htree.cc:34
 htree.cc:35
 htree.cc:36
 htree.cc:37
 htree.cc:38
 htree.cc:39
 htree.cc:40
 htree.cc:41
 htree.cc:42
 htree.cc:43
 htree.cc:44
 htree.cc:45
 htree.cc:46
 htree.cc:47
 htree.cc:48
 htree.cc:49
 htree.cc:50
 htree.cc:51
 htree.cc:52
 htree.cc:53
 htree.cc:54
 htree.cc:55
 htree.cc:56
 htree.cc:57
 htree.cc:58
 htree.cc:59
 htree.cc:60
 htree.cc:61
 htree.cc:62
 htree.cc:63
 htree.cc:64
 htree.cc:65
 htree.cc:66
 htree.cc:67
 htree.cc:68
 htree.cc:69
 htree.cc:70
 htree.cc:71
 htree.cc:72
 htree.cc:73
 htree.cc:74
 htree.cc:75
 htree.cc:76
 htree.cc:77
 htree.cc:78
 htree.cc:79
 htree.cc:80
 htree.cc:81
 htree.cc:82
 htree.cc:83
 htree.cc:84
 htree.cc:85
 htree.cc:86
 htree.cc:87
 htree.cc:88
 htree.cc:89
 htree.cc:90
 htree.cc:91
 htree.cc:92
 htree.cc:93
 htree.cc:94
 htree.cc:95
 htree.cc:96
 htree.cc:97
 htree.cc:98
 htree.cc:99
 htree.cc:100
 htree.cc:101
 htree.cc:102
 htree.cc:103
 htree.cc:104
 htree.cc:105
 htree.cc:106
 htree.cc:107
 htree.cc:108
 htree.cc:109
 htree.cc:110
 htree.cc:111
 htree.cc:112
 htree.cc:113
 htree.cc:114
 htree.cc:115
 htree.cc:116
 htree.cc:117
 htree.cc:118
 htree.cc:119
 htree.cc:120
 htree.cc:121
 htree.cc:122
 htree.cc:123
 htree.cc:124
 htree.cc:125
 htree.cc:126
 htree.cc:127
 htree.cc:128
 htree.cc:129
 htree.cc:130
 htree.cc:131
 htree.cc:132
 htree.cc:133
 htree.cc:134
 htree.cc:135
 htree.cc:136
 htree.cc:137
 htree.cc:138
 htree.cc:139
 htree.cc:140
 htree.cc:141
 htree.cc:142
 htree.cc:143
 htree.cc:144
 htree.cc:145
 htree.cc:146
 htree.cc:147
 htree.cc:148
 htree.cc:149
 htree.cc:150
 htree.cc:151
 htree.cc:152
 htree.cc:153
 htree.cc:154
 htree.cc:155
 htree.cc:156
 htree.cc:157
 htree.cc:158
 htree.cc:159
 htree.cc:160
 htree.cc:161
 htree.cc:162
 htree.cc:163
 htree.cc:164
 htree.cc:165
 htree.cc:166
 htree.cc:167
 htree.cc:168
 htree.cc:169
 htree.cc:170
 htree.cc:171
 htree.cc:172
 htree.cc:173
 htree.cc:174
 htree.cc:175
 htree.cc:176
 htree.cc:177
 htree.cc:178
 htree.cc:179
 htree.cc:180
 htree.cc:181
 htree.cc:182
 htree.cc:183
 htree.cc:184
 htree.cc:185
 htree.cc:186
 htree.cc:187
 htree.cc:188
 htree.cc:189
 htree.cc:190
 htree.cc:191
 htree.cc:192
 htree.cc:193
 htree.cc:194
 htree.cc:195
 htree.cc:196
 htree.cc:197
 htree.cc:198
 htree.cc:199
 htree.cc:200
 htree.cc:201
 htree.cc:202
 htree.cc:203
 htree.cc:204
 htree.cc:205
 htree.cc:206
 htree.cc:207
 htree.cc:208
 htree.cc:209
 htree.cc:210
 htree.cc:211
 htree.cc:212
 htree.cc:213
 htree.cc:214
 htree.cc:215
 htree.cc:216
 htree.cc:217
 htree.cc:218
 htree.cc:219
 htree.cc:220
 htree.cc:221
 htree.cc:222
 htree.cc:223
 htree.cc:224
 htree.cc:225
 htree.cc:226
 htree.cc:227
 htree.cc:228
 htree.cc:229
 htree.cc:230
 htree.cc:231
 htree.cc:232
 htree.cc:233
 htree.cc:234
 htree.cc:235
 htree.cc:236
 htree.cc:237
 htree.cc:238
 htree.cc:239
 htree.cc:240
 htree.cc:241
 htree.cc:242
 htree.cc:243
 htree.cc:244
 htree.cc:245
 htree.cc:246
 htree.cc:247
 htree.cc:248
 htree.cc:249
 htree.cc:250
 htree.cc:251
 htree.cc:252
 htree.cc:253
 htree.cc:254
 htree.cc:255
 htree.cc:256
 htree.cc:257
 htree.cc:258
 htree.cc:259
 htree.cc:260
 htree.cc:261
 htree.cc:262
 htree.cc:263
 htree.cc:264
 htree.cc:265
 htree.cc:266
 htree.cc:267
 htree.cc:268
 htree.cc:269