ROOT logo
void
FillEtas(AliFMDFloatMap& etas)
{
  AliCDBManager*  cdb  = AliCDBManager::Instance();
  cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
  cdb->SetRun(0);
  AliGeomManager::LoadGeometry("geometry.root");
  AliFMDGeometry* geom = AliFMDGeometry::Instance();
  geom->Init();
  geom->InitTransformations();
  
  etas.Clear();
  for (UShort_t d = 1; d <= 3; d++) { 
    UShort_t nRing = (d == 1 ? 1 : 2);
    for (UShort_t q = 0; q < nRing; q++) { 
      Char_t   r    = (q == 0 ? 'I' : 'O');
      UShort_t nStr = (q == 0 ? 512 : 256);
      for (UShort_t t = 0; t < nStr; t++) { 
	Double_t x, y, z;
	geom->Detector2XYZ(d, r, 0, t, x, y, z);
	Double_t phi   =  TMath::ATan2(y, x);
	Double_t rr    =  TMath::Sqrt(y * y + x * x);
	Double_t theta =  TMath::ATan2(rr, z);
	Double_t eta   = -TMath::Log(TMath::Tan(theta / 2));
	etas(d, r, 0, t) =  eta;
      }
    }
  }
}

Double_t
MakeMult()
{
  return TMath::Min(20., gRandom->Landau(1, .1));
}

void
FillESDFMD(AliESDFMD& fmd, AliFMDFloatMap& etas, Double_t ratio)
{
  fmd.Clear();
  
  Int_t nTotal  = 51200;
  Int_t nFilled = 0;

  for (UShort_t d = 1; d <= 3; d++) { 
    UShort_t nRing = (d == 1 ? 1 : 2);
    for (UShort_t q = 0; q < nRing; q++) { 
      Char_t   r    = (q == 0 ? 'I' : 'O');
      UShort_t nSec = (q == 0 ?  20 :  40);
      UShort_t nStr = (q == 0 ? 512 : 256);
      for (UShort_t s = 0; s < nSec; s++) {
	for (UShort_t t = 0; t < nStr; t++) { 
	  if (s == 0) { 
	    Double_t eta = etas(d, r, s, t);
	    fmd.SetEta(d, r, s, t, eta);
	  }
	  Double_t now  = Double_t(nFilled) / nTotal;
	  Bool_t   fill = now < ratio;
	  fmd.SetMultiplicity(d, r, s, t, (!fill ? 0 : MakeMult()));
	  if (fill) nFilled++;
	}
      }
    }
  }
}

Float_t
MakeTree(Int_t ratio, Int_t split, AliFMDFloatMap& etas)
{
  // Split is 
  // 
  //  0 - No split of members
  //  1 - Split on data and sub-objects.
  //  2 - Same as 1
  // 99 - Default - same as 2
  
  AliESDFMD* fmd = new AliESDFMD;
  TString    fname(Form("test_%03d_%02d.root", ratio, split));
  TString    tname(Form("T_%03d_%02d", ratio, split));
  TFile*     file = TFile::Open(fname.Data(),"RECREATE");
  TTree*     tree = new TTree(tname.Data(), 
			      Form("Ratio=%3d%%, Split=%2d", ratio, split));
  TBranch* branch = tree->Branch(split == 0 ? "FMDESD" : "FMDESD.", 
				 &fmd, 32000, split);
  // branch->SetCompressionLevel(9);
  
  std::cout << "  Doing " << tree->GetTitle() << " " << std::flush;
  Int_t nEvents = 10;
  for (Int_t i = 0; i < nEvents; i++) { 
    std::cout << "." << std::flush;
    FillESDFMD(*fmd, etas, Double_t(ratio) / 100);
    tree->Fill();
  }
  
  
  // branch->Print();
  tree->GetCurrentFile()->cd();
  tree->Write();
  tree->GetCurrentFile()->Close();
  
  file = TFile::Open(fname.Data(), "UPDATE");
  tree = static_cast<TTree*>(file->Get(tname.Data()));
  if (split == 0) 
    branch = tree->FindBranch("FMDESD");
  else if (split == 1) { 
    TLeaf* leaf = tree->FindLeaf("FMDESD.fMultiplicity");
    if (leaf) branch = leaf->GetBranch();
    else Warning("FillTree", "Failed to find FMDESD.fMultiplicity");
  }
  else if (split > 1) { 
    TLeaf* leaf = tree->FindLeaf("FMDESD.fMultiplicity.fData");
    if (leaf) branch = leaf->GetBranch();
    else Warning("FillTree", "Failed to find FMDESD.fMultiplicity.fData");
  }
  
  TH1* h = new TH1F("h", tree->GetTitle(), 100, 0, 20);
  tree->Draw("FMDESD.fMultiplicity.fData>>h", 
	     "FMDESD.fMultiplicity.fData<20&&FMDESD.fMultiplicity.fData>0");
  Int_t   nEntries = h->GetEntries();
  Float_t fratio   = Float_t(nEntries) / 51200 / nEvents;
  
  Int_t    comp    = branch->GetCompressionLevel();
  Long64_t totSize = branch->GetTotBytes();
  Long64_t zipSize = branch->GetZipBytes();
  Float_t  compz   = (zipSize ? Float_t(totSize+0.00001)/zipSize : 1);
  std::cout << " done - " 
	    << "Compression: " << compz << " (" << comp << ", " 
	    << Int_t(fratio*1000+.5)/10. << "%)" << std::endl;
  // tree->GetCurrentFile()->Write();
  // tree->GetCurrentFile()->Close();

  // delete tree;
  // delete fmd;
  
  return compz;
}

void
ESDDataSize()
{
  gStyle->SetPalette(1);
  
  AliFMDFloatMap etas(3, 2, 1, 512);
  FillEtas(etas);
  
  Int_t  ratios[] = { 1, 10, 25, 50, 100, -1 };
  Int_t  splits[] = { 0, 1, 99, -1 };
  Int_t* pratio   = ratios;

  Double_t arat[] = { 0.5, 1.5, 9.5, 10.5, 24.5, 25.5, 49.5, 50.5, 99.5, 100.5};
  Double_t aspl[] = { -0.5, 0.5, 1.5, 98.5, 99.5 }; 
  TH2* h = new TH2F("size", "ESD size", 9, arat, 4, aspl);
  h->GetXaxis()->SetTitle("Fill ratio");
  h->GetYaxis()->SetTitle("Split level");
  h->SetDirectory(0);
  h->Draw("COLZ");
  std::cout << "Loop over ratios" << std::endl;
  while (*pratio > 0) { 
    Int_t  ratio  = *pratio++;
    Int_t* psplit = splits;

    std::cout << " Loop over splits" << std::endl;
    while (*psplit >= 0) { 
      Int_t split = *psplit++;
      
      Double_t comp = MakeTree(ratio, split, etas);
      h->Fill(ratio, split, comp);
      // h->Draw("COLZ");
    }
  }
  h->Draw("LEGO2");
}

  
 ESDDataSize.C:1
 ESDDataSize.C:2
 ESDDataSize.C:3
 ESDDataSize.C:4
 ESDDataSize.C:5
 ESDDataSize.C:6
 ESDDataSize.C:7
 ESDDataSize.C:8
 ESDDataSize.C:9
 ESDDataSize.C:10
 ESDDataSize.C:11
 ESDDataSize.C:12
 ESDDataSize.C:13
 ESDDataSize.C:14
 ESDDataSize.C:15
 ESDDataSize.C:16
 ESDDataSize.C:17
 ESDDataSize.C:18
 ESDDataSize.C:19
 ESDDataSize.C:20
 ESDDataSize.C:21
 ESDDataSize.C:22
 ESDDataSize.C:23
 ESDDataSize.C:24
 ESDDataSize.C:25
 ESDDataSize.C:26
 ESDDataSize.C:27
 ESDDataSize.C:28
 ESDDataSize.C:29
 ESDDataSize.C:30
 ESDDataSize.C:31
 ESDDataSize.C:32
 ESDDataSize.C:33
 ESDDataSize.C:34
 ESDDataSize.C:35
 ESDDataSize.C:36
 ESDDataSize.C:37
 ESDDataSize.C:38
 ESDDataSize.C:39
 ESDDataSize.C:40
 ESDDataSize.C:41
 ESDDataSize.C:42
 ESDDataSize.C:43
 ESDDataSize.C:44
 ESDDataSize.C:45
 ESDDataSize.C:46
 ESDDataSize.C:47
 ESDDataSize.C:48
 ESDDataSize.C:49
 ESDDataSize.C:50
 ESDDataSize.C:51
 ESDDataSize.C:52
 ESDDataSize.C:53
 ESDDataSize.C:54
 ESDDataSize.C:55
 ESDDataSize.C:56
 ESDDataSize.C:57
 ESDDataSize.C:58
 ESDDataSize.C:59
 ESDDataSize.C:60
 ESDDataSize.C:61
 ESDDataSize.C:62
 ESDDataSize.C:63
 ESDDataSize.C:64
 ESDDataSize.C:65
 ESDDataSize.C:66
 ESDDataSize.C:67
 ESDDataSize.C:68
 ESDDataSize.C:69
 ESDDataSize.C:70
 ESDDataSize.C:71
 ESDDataSize.C:72
 ESDDataSize.C:73
 ESDDataSize.C:74
 ESDDataSize.C:75
 ESDDataSize.C:76
 ESDDataSize.C:77
 ESDDataSize.C:78
 ESDDataSize.C:79
 ESDDataSize.C:80
 ESDDataSize.C:81
 ESDDataSize.C:82
 ESDDataSize.C:83
 ESDDataSize.C:84
 ESDDataSize.C:85
 ESDDataSize.C:86
 ESDDataSize.C:87
 ESDDataSize.C:88
 ESDDataSize.C:89
 ESDDataSize.C:90
 ESDDataSize.C:91
 ESDDataSize.C:92
 ESDDataSize.C:93
 ESDDataSize.C:94
 ESDDataSize.C:95
 ESDDataSize.C:96
 ESDDataSize.C:97
 ESDDataSize.C:98
 ESDDataSize.C:99
 ESDDataSize.C:100
 ESDDataSize.C:101
 ESDDataSize.C:102
 ESDDataSize.C:103
 ESDDataSize.C:104
 ESDDataSize.C:105
 ESDDataSize.C:106
 ESDDataSize.C:107
 ESDDataSize.C:108
 ESDDataSize.C:109
 ESDDataSize.C:110
 ESDDataSize.C:111
 ESDDataSize.C:112
 ESDDataSize.C:113
 ESDDataSize.C:114
 ESDDataSize.C:115
 ESDDataSize.C:116
 ESDDataSize.C:117
 ESDDataSize.C:118
 ESDDataSize.C:119
 ESDDataSize.C:120
 ESDDataSize.C:121
 ESDDataSize.C:122
 ESDDataSize.C:123
 ESDDataSize.C:124
 ESDDataSize.C:125
 ESDDataSize.C:126
 ESDDataSize.C:127
 ESDDataSize.C:128
 ESDDataSize.C:129
 ESDDataSize.C:130
 ESDDataSize.C:131
 ESDDataSize.C:132
 ESDDataSize.C:133
 ESDDataSize.C:134
 ESDDataSize.C:135
 ESDDataSize.C:136
 ESDDataSize.C:137
 ESDDataSize.C:138
 ESDDataSize.C:139
 ESDDataSize.C:140
 ESDDataSize.C:141
 ESDDataSize.C:142
 ESDDataSize.C:143
 ESDDataSize.C:144
 ESDDataSize.C:145
 ESDDataSize.C:146
 ESDDataSize.C:147
 ESDDataSize.C:148
 ESDDataSize.C:149
 ESDDataSize.C:150
 ESDDataSize.C:151
 ESDDataSize.C:152
 ESDDataSize.C:153
 ESDDataSize.C:154
 ESDDataSize.C:155
 ESDDataSize.C:156
 ESDDataSize.C:157
 ESDDataSize.C:158
 ESDDataSize.C:159
 ESDDataSize.C:160
 ESDDataSize.C:161
 ESDDataSize.C:162
 ESDDataSize.C:163
 ESDDataSize.C:164
 ESDDataSize.C:165
 ESDDataSize.C:166
 ESDDataSize.C:167
 ESDDataSize.C:168
 ESDDataSize.C:169
 ESDDataSize.C:170
 ESDDataSize.C:171
 ESDDataSize.C:172
 ESDDataSize.C:173
 ESDDataSize.C:174
 ESDDataSize.C:175