ROOT logo
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <Riostream.h>

#include "TVector2.h"
#include "TFile.h"
#include "TString.h"
#include "TF1.h"
#include "TH1.h"
#include "TH2.h"
#include "TH3.h"
#include "TProfile.h"
#include "TProfile2D.h"
#include "TMath.h"
#include "TText.h"
#include "TRandom3.h"
#include "TArray.h"
#include "TLegend.h"
#include "TStyle.h"
#include "TMinuit.h"

using namespace std;


void MakeWeightFile()
{
  
  gStyle->SetOptStat(0);
  gStyle->SetOptDate(0);
  

  //TFile *InputFile = new TFile("Results/RawWeightFile_11h.root","READ");
  //TFile *InputFile = new TFile("Results/RawWeightFile_genSignal_Rinv11.root","READ");
  //TFile *InputFile = new TFile("Results/RawWeightFile_genSignal_Rinv11_Smeared.root","READ");
  //TFile *InputFile = new TFile("Results/RawWeightFile_11h_PID1p5.root","READ");
  //TFile *InputFile = new TFile("Results/RawWeightFile_FB5.root","READ");
  //TFile *InputFile = new TFile("Results/RawWeightFile_11h_Chi3p1.root","READ");
  //TFile *InputFile = new TFile("Results/PDC_11h_standard_and_Raw0p04TTC.root","READ");// standard weights
  //TFile *InputFile = new TFile("Results/RawWeightFile_11h_4ktbins_new.root","READ");
  TFile *InputFile = new TFile("Results/RawWeightFile_11h_4ktbins_2sigma_3sigmaTTC.root","READ");// _1(2sigmaTTC), _2(3sigmaTTC)

  //TFile *InputFile = new TFile("MyOutput.root","READ");
  TDirectoryFile *tdir = (TDirectoryFile*)InputFile->Get("PWGCF.outputChaoticityAnalysis.root");
  TList *MyList=(TList*)tdir->Get("ChaoticityOutput_2");
  //TList *MyList=(TList*)InputFile->Get("MyList");
  InputFile->Close();

  const int KtBins=4;
  const int KyBins=1;
  const int EDBins=1;
  const int MBins=10;//10, make sure MB assignment below is correct!!!!!!!!!!!!!!!
  
  TFile *OutFile = new TFile("WeightFile_temp.root","RECREATE");
  TH3F *WeightHistos[KtBins][MBins];
  
  for(int ktB=1; ktB<=KtBins; ktB++){
    for(int MB=1; MB<=MBins; MB++){
      TString *InNameNum = new TString("TwoPart_num_Kt_");
      *InNameNum += ktB-1;
      InNameNum->Append("_Ky_0_M_");
      if(MB<=10) *InNameNum += MB-1;// make sure MB assignment is correct!!!!!!!!!!!!!!!
      else *InNameNum += 1;
      InNameNum->Append("_ED_0");
      //
      TString *InNameDen = new TString("TwoPart_den_Kt_");
      *InNameDen += ktB-1;
      InNameDen->Append("_Ky_0_M_");
      if(MB<=10) *InNameDen += MB-1;// make sure MB assignment is correct!!!!!!!!!!!!!!!
      else *InNameDen += 1;
      InNameDen->Append("_ED_0");
      //
      TH3D *tempNum = (TH3D*)MyList->FindObject(InNameNum->Data());
      TH3D *tempDen = (TH3D*)MyList->FindObject(InNameDen->Data());
      //
      int NormBinStart = tempNum->GetXaxis()->FindBin(0.135);//0.135
      int NormBinEnd = tempNum->GetXaxis()->FindBin(0.2);//0.2
      double Norm = tempNum->Integral(NormBinStart,NormBinEnd, NormBinStart,NormBinEnd, NormBinStart,NormBinEnd);
      Norm /= tempDen->Integral(NormBinStart,NormBinEnd, NormBinStart,NormBinEnd, NormBinStart,NormBinEnd);
      cout<<"Normalization = "<<Norm<<endl;
      cout<<tempNum->Integral(NormBinStart,NormBinEnd, NormBinStart,NormBinEnd, NormBinStart,NormBinEnd)<<"  "<<tempDen->Integral(NormBinStart,NormBinEnd, NormBinStart,NormBinEnd, NormBinStart,NormBinEnd)<<endl;
      //
      TString *OutNameWeight = new TString("Weight_Kt_");
      *OutNameWeight += ktB-1;
      OutNameWeight->Append("_Ky_0_M_");
      *OutNameWeight += MB-1;
      OutNameWeight->Append("_ED_0");
      
      int Nbins=tempNum->GetNbinsX();
      double QLimit = tempNum->GetXaxis()->GetBinUpEdge(Nbins);
      WeightHistos[ktB-1][MB-1] = new TH3F(OutNameWeight->Data(),"r3 Weights", Nbins,0,QLimit, Nbins,0,QLimit, Nbins,0,QLimit);
      WeightHistos[ktB-1][MB-1]->GetXaxis()->SetTitle("out");
      WeightHistos[ktB-1][MB-1]->GetYaxis()->SetTitle("side");
      WeightHistos[ktB-1][MB-1]->GetZaxis()->SetTitle("long");
      WeightHistos[ktB-1][MB-1]->GetXaxis()->SetTitleOffset(1.8);
      WeightHistos[ktB-1][MB-1]->GetYaxis()->SetTitleOffset(1.8);
      WeightHistos[ktB-1][MB-1]->GetZaxis()->SetTitleOffset(1.8);
      for(int outB=1; outB<=Nbins; outB++){
	for(int sideB=1; sideB<=Nbins; sideB++){
	  for(int longB=1; longB<=Nbins; longB++){
	    double weight=1, weight_e=0;
	    if(tempDen->GetBinContent(outB,sideB,longB) > 0 && tempNum->GetBinContent(outB,sideB,longB) > 0) {
	      //if(outB==sideB && outB==longB) cout<<outB<<"  "<<tempNum->GetBinContent(outB,sideB,longB)<<"  "<<tempDen->GetBinContent(outB,sideB,longB)<<endl;
	      weight = double(tempNum->GetBinContent(outB,sideB,longB))/double(tempDen->GetBinContent(outB,sideB,longB)) / Norm;
	      weight_e = pow(sqrt(double(tempNum->GetBinContent(outB,sideB,longB)))/double(tempDen->GetBinContent(outB,sideB,longB)) / Norm,2);
	      weight_e += pow(sqrt(double(tempDen->GetBinContent(outB,sideB,longB)))*double(tempNum->GetBinContent(outB,sideB,longB))/pow(double(tempDen->GetBinContent(outB,sideB,longB)),2) / Norm,2);
	      weight_e = sqrt(weight_e);
	      //if(weight < 0.8 && weight > 0.1) cout<<outB<<"  "<<sideB<<"  "<<longB<<"  "<<tempNum->GetBinContent(outB,sideB,longB)<<"  "<<tempDen->GetBinContent(outB,sideB,longB)<<endl;
	    }
	    if(weight==0){
	      WeightHistos[ktB-1][MB-1]->SetBinContent(outB,sideB,longB, 0);
	      WeightHistos[ktB-1][MB-1]->SetBinError(outB,sideB,longB, 0);
	    }else {
	      WeightHistos[ktB-1][MB-1]->SetBinContent(outB,sideB,longB, weight-1.0);// difference from unity
	      WeightHistos[ktB-1][MB-1]->SetBinError(outB,sideB,longB, weight_e);
	    }

	  }
	}
      }
      
      WeightHistos[ktB-1][MB-1]->Write();

    }// MB
  }// ktB

  int BOI1=2;
  int BOI2=2;
  TH3D *histoOI = WeightHistos[0][0]->Clone();
  histoOI->SetDirectory(0);
  //OutFile->Close();
  
  TH1D *pro = WeightHistos[0][0]->ProjectionY("pro",BOI1,BOI1,BOI2,BOI2);
  pro->Draw();

  /*TFile *projections=new TFile("projections.root","RECREATE");
  histoOI->GetXaxis()->SetRange(BOI1,BOI1);
  TH2D *proYZ = (TH2D*)histoOI->Project3D("yz");
  histoOI->GetXaxis()->SetRange(1,40);
  histoOI->GetYaxis()->SetRange(BOI1,BOI1);
  TH2D *proXZ = (TH2D*)histoOI->Project3D("xz");
  histoOI->GetYaxis()->SetRange(1,40);
  histoOI->GetZaxis()->SetRange(BOI1,BOI1);
  TH2D *proXY = (TH2D*)histoOI->Project3D("xy");
  proYZ->GetXaxis()->SetRangeUser(0,0.1);
  proYZ->GetYaxis()->SetRangeUser(0,0.1);
  proXZ->GetXaxis()->SetRangeUser(0,0.1);
  proXZ->GetYaxis()->SetRangeUser(0,0.1);
  proXY->GetXaxis()->SetRangeUser(0,0.1);
  proXY->GetYaxis()->SetRangeUser(0,0.1);
  proXY->Draw("lego");
  
  proYZ->Write();
  proXZ->Write();
  proXY->Write();
  */

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