ROOT logo
/****************************************************************************
  Macro to get the size of the Tree
  As a improvment to  tree->Print() function, this algorithm
  gives the size of all of the branchces and in addition print them 
  sorted according total tree size (MEMORY USAGE if one event in tree)
  or zip size (THE storage size on disk 

  Printed statistic:
  1. Order
  2. TotSize (in memory) + fraction of total size
  3. ZipSize (in memory) + fraction of zip size
  4. Compression ratio 

  Usage:
  //  1. Enable macro
  .L $ALICE_ROOT/TPC/macros/MakeTreeStat.C+
  // 2. Open the tree (eg.)
  TFile f("AliESDs.root");
  TTree * tree = (TTree*)f.Get("esdTree");
  // 3. Print statistic (sorting according secon argument - either zip Bytes (kTRUE or TotSize (kFALSE)
  MakeStat(tree, kTRUE);

  Origin: M.Ivanov, GSI, m.ivanov@gsi.de

****************************************************************************/






#include "TFile.h"
#include "TTree.h"
#include "TBranch.h"
#include "TMath.h"
#include "TArrayF.h"
#include "TObjArray.h"
#include "TObjString.h"




TTree     *fTree;   // tree of interest
TObjArray aReport;  // array with branch statistic
TArrayF   totSize;  // total size for branch
TArrayF   zipSize;  // zip Size for branch
TArrayF   zipRatio; // zip Ratio for branch

void MakeStat(TTree *tree, Bool_t zipSort);



void PrintSorted(Bool_t zipSort){
  //
  //print statistic
  //
  Int_t entries   = aReport.GetEntries();
  Int_t* indexes  = new Int_t[entries];
  if (zipSort) TMath::Sort(entries,zipSize.GetArray(),indexes,kTRUE);
  else{
    TMath::Sort(entries,totSize.GetArray(),indexes,kTRUE);
  }
  Float_t zipBytes = zipSize[indexes[0]];
  Float_t totBytes =  totSize[indexes[0]];
  Float_t ratioT = 100.*zipBytes/totBytes;
  for (Int_t i=entries-1; i>=0; i--){
    Int_t ib = indexes[i];
    Float_t ratio0= 100.*totSize[ib]/totBytes;
    Float_t ratio1= 100.*zipSize[ib]/zipBytes;
    if (i==0) {
      printf("\n------------------------------------------------------------\n");
      printf("%d  \t\t%5.f(%.2f\%)  \t\t%5.f(%.2f\%)  \t%.2f  \t%s\n",i, 
	     totSize[ib],100., zipSize[ib],100., 100.*zipRatio[ib], aReport.At(ib)->GetName());
    }else{
    printf("%d  \t\t%5.f(%.2f\%)  \t\t%5.f(%.2f\%)  \t%.2f  \t%s\n",i, 
	   totSize[ib],ratio0, zipSize[ib],ratio1, 100.*zipRatio[ib], aReport.At(ib)->GetName());
    }
  }
    

}


void AddToReport(const char *prefix,const char * name, Float_t size[2], Float_t ratio){
  //
  // add branch info to array
  //
  char fullname[10000];
  sprintf(fullname,"%s.%s",prefix,name);
  aReport.AddLast(new TObjString(fullname));
  Int_t entry = aReport.GetEntries();
  if (totSize.GetSize()<entry){
    totSize.Set(entry*2);
    zipSize.Set(entry*2);
    zipRatio.Set(entry*2);
  }
  totSize[entry-1]=Float_t(size[0]);
  zipSize[entry-1]=Float_t(size[1]);
  zipRatio[entry-1]=Float_t(ratio);
}





void MakeStat(const char *prefix, TBranch * branch, Float_t* size, Float_t mratio);



void MakeStat(TTree *tree, Bool_t zipSort){
  //
  // make recursve loop over tree branches
  //
  fTree= tree;
  aReport.Clear();
  TObjArray * array = tree->GetListOfBranches(); 
  Float_t size[2]={0,0};
  char * prefix ="";
  Float_t mratio=tree->GetZipBytes()/float(tree->GetTotBytes());
  for (Int_t i=0; i<array->GetEntries(); i++){
    MakeStat(prefix,(TBranch*)array->At(i),size, mratio);
  }  
  Float_t ratio= (size[0]>0) ? size[1]/Float_t(size[0]): 0;
  //  printf("Sum :\t%f\t%f\t%f\t%s.%s\t\n", float(size[0]), float(size[1]),ratio, prefix,tree->GetName());

  AddToReport(prefix, tree->GetName(),size,ratio);
  PrintSorted(zipSort);
}


void MakeStat(const char *prefix, TBranch * branch, Float_t *size, Float_t mratio){
  //
  // Recursive function to get size of the branches
  // and ratios
  //
  TObjArray * array = branch->GetListOfBranches();
  Float_t bsizeSum[2]={0,0};

  if (!array || array->GetEntries()==0){
    Float_t bsize[2] = {0,0};
    bsize[0]=branch->GetTotalSize();
    bsize[1]=branch->GetZipBytes();
    if (bsize[1]>0){
      Float_t ratio= (bsize[0]>0) ? bsize[1]/Float_t(bsize[0]): 0;
      //      printf("Term:\t%f\t%f\t%f\t%s.%s\t\n",float(bsize[0]), float(bsize[1]),ratio, prefix,branch->GetName());
      AddToReport(prefix, branch->GetName(),bsize,ratio);	
      //branch->Print();
      size[0]+=bsize[0];
      size[1]+=bsize[1];
    }else{
      Float_t ratio= mratio;
      //printf("Ter?:\t%f\t%f\t%f\t%s.%s\t\n",float(bsize[0]), float(-1),ratio, prefix,branch->GetName());
      AddToReport(prefix, branch->GetName(),bsize,ratio);
      //branch->Print();
      size[0]+=bsize[0];
      size[1]+=TMath::Nint(bsize[0]*mratio);
    }

    return;
  }
  for (Int_t i=0; i<array->GetEntries(); i++){
    Float_t bsize[2] = {0,0};
    TString str=prefix;
    str+= branch->GetName();
    MakeStat(str.Data(),(TBranch*)array->At(i), bsize, mratio);
    bsizeSum[0]+=bsize[0];
    bsizeSum[1]+=bsize[1];
    size[0]+=bsize[0];
    size[1]+=bsize[1];
  } 
  Float_t ratio= (size[0]>0) ? size[1]/Float_t(size[0]): 0;
  //printf("Sum :\t%f\t%f\t%f\t%s.%s\t\n", float(bsizeSum[0]), float(bsizeSum[1]),ratio, prefix,branch->GetName()); 
  AddToReport(prefix,branch->GetName(),bsizeSum,ratio);
}
 MakeTreeStat.C:1
 MakeTreeStat.C:2
 MakeTreeStat.C:3
 MakeTreeStat.C:4
 MakeTreeStat.C:5
 MakeTreeStat.C:6
 MakeTreeStat.C:7
 MakeTreeStat.C:8
 MakeTreeStat.C:9
 MakeTreeStat.C:10
 MakeTreeStat.C:11
 MakeTreeStat.C:12
 MakeTreeStat.C:13
 MakeTreeStat.C:14
 MakeTreeStat.C:15
 MakeTreeStat.C:16
 MakeTreeStat.C:17
 MakeTreeStat.C:18
 MakeTreeStat.C:19
 MakeTreeStat.C:20
 MakeTreeStat.C:21
 MakeTreeStat.C:22
 MakeTreeStat.C:23
 MakeTreeStat.C:24
 MakeTreeStat.C:25
 MakeTreeStat.C:26
 MakeTreeStat.C:27
 MakeTreeStat.C:28
 MakeTreeStat.C:29
 MakeTreeStat.C:30
 MakeTreeStat.C:31
 MakeTreeStat.C:32
 MakeTreeStat.C:33
 MakeTreeStat.C:34
 MakeTreeStat.C:35
 MakeTreeStat.C:36
 MakeTreeStat.C:37
 MakeTreeStat.C:38
 MakeTreeStat.C:39
 MakeTreeStat.C:40
 MakeTreeStat.C:41
 MakeTreeStat.C:42
 MakeTreeStat.C:43
 MakeTreeStat.C:44
 MakeTreeStat.C:45
 MakeTreeStat.C:46
 MakeTreeStat.C:47
 MakeTreeStat.C:48
 MakeTreeStat.C:49
 MakeTreeStat.C:50
 MakeTreeStat.C:51
 MakeTreeStat.C:52
 MakeTreeStat.C:53
 MakeTreeStat.C:54
 MakeTreeStat.C:55
 MakeTreeStat.C:56
 MakeTreeStat.C:57
 MakeTreeStat.C:58
 MakeTreeStat.C:59
 MakeTreeStat.C:60
 MakeTreeStat.C:61
 MakeTreeStat.C:62
 MakeTreeStat.C:63
 MakeTreeStat.C:64
 MakeTreeStat.C:65
 MakeTreeStat.C:66
 MakeTreeStat.C:67
 MakeTreeStat.C:68
 MakeTreeStat.C:69
 MakeTreeStat.C:70
 MakeTreeStat.C:71
 MakeTreeStat.C:72
 MakeTreeStat.C:73
 MakeTreeStat.C:74
 MakeTreeStat.C:75
 MakeTreeStat.C:76
 MakeTreeStat.C:77
 MakeTreeStat.C:78
 MakeTreeStat.C:79
 MakeTreeStat.C:80
 MakeTreeStat.C:81
 MakeTreeStat.C:82
 MakeTreeStat.C:83
 MakeTreeStat.C:84
 MakeTreeStat.C:85
 MakeTreeStat.C:86
 MakeTreeStat.C:87
 MakeTreeStat.C:88
 MakeTreeStat.C:89
 MakeTreeStat.C:90
 MakeTreeStat.C:91
 MakeTreeStat.C:92
 MakeTreeStat.C:93
 MakeTreeStat.C:94
 MakeTreeStat.C:95
 MakeTreeStat.C:96
 MakeTreeStat.C:97
 MakeTreeStat.C:98
 MakeTreeStat.C:99
 MakeTreeStat.C:100
 MakeTreeStat.C:101
 MakeTreeStat.C:102
 MakeTreeStat.C:103
 MakeTreeStat.C:104
 MakeTreeStat.C:105
 MakeTreeStat.C:106
 MakeTreeStat.C:107
 MakeTreeStat.C:108
 MakeTreeStat.C:109
 MakeTreeStat.C:110
 MakeTreeStat.C:111
 MakeTreeStat.C:112
 MakeTreeStat.C:113
 MakeTreeStat.C:114
 MakeTreeStat.C:115
 MakeTreeStat.C:116
 MakeTreeStat.C:117
 MakeTreeStat.C:118
 MakeTreeStat.C:119
 MakeTreeStat.C:120
 MakeTreeStat.C:121
 MakeTreeStat.C:122
 MakeTreeStat.C:123
 MakeTreeStat.C:124
 MakeTreeStat.C:125
 MakeTreeStat.C:126
 MakeTreeStat.C:127
 MakeTreeStat.C:128
 MakeTreeStat.C:129
 MakeTreeStat.C:130
 MakeTreeStat.C:131
 MakeTreeStat.C:132
 MakeTreeStat.C:133
 MakeTreeStat.C:134
 MakeTreeStat.C:135
 MakeTreeStat.C:136
 MakeTreeStat.C:137
 MakeTreeStat.C:138
 MakeTreeStat.C:139
 MakeTreeStat.C:140
 MakeTreeStat.C:141
 MakeTreeStat.C:142
 MakeTreeStat.C:143
 MakeTreeStat.C:144
 MakeTreeStat.C:145
 MakeTreeStat.C:146
 MakeTreeStat.C:147
 MakeTreeStat.C:148
 MakeTreeStat.C:149
 MakeTreeStat.C:150
 MakeTreeStat.C:151
 MakeTreeStat.C:152
 MakeTreeStat.C:153
 MakeTreeStat.C:154
 MakeTreeStat.C:155
 MakeTreeStat.C:156
 MakeTreeStat.C:157
 MakeTreeStat.C:158
 MakeTreeStat.C:159
 MakeTreeStat.C:160
 MakeTreeStat.C:161
 MakeTreeStat.C:162
 MakeTreeStat.C:163
 MakeTreeStat.C:164
 MakeTreeStat.C:165
 MakeTreeStat.C:166
 MakeTreeStat.C:167
 MakeTreeStat.C:168
 MakeTreeStat.C:169
 MakeTreeStat.C:170
 MakeTreeStat.C:171
 MakeTreeStat.C:172
 MakeTreeStat.C:173
 MakeTreeStat.C:174
 MakeTreeStat.C:175