]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGCF/EBYE/macros/drawBalanceFunction2DPsi.C
2D drawBalance macro adapted for Toy Model AND weighted mean as for 1D analysis (MW)
[u/mrichter/AliRoot.git] / PWGCF / EBYE / macros / drawBalanceFunction2DPsi.C
index 0226165dc050cc041f649ec4270929e0b6f90c69..f867c0349084aa7d32071f1d00ae9fa48d49f3e4 100644 (file)
@@ -1,14 +1,26 @@
-const Int_t numberOfCentralityBins = 8;
-TString centralityArray[numberOfCentralityBins] = {"0-10","10-20","20-30","30-40","40-50","50-60","60-70","70-80"};
+const Int_t numberOfCentralityBins = 12;
+TString centralityArray[numberOfCentralityBins] = {"0-100","10-20","20-30","30-40","40-50","50-60","60-70","70-80","0-100","0-1","1-2","2-3"};
+
 
 const Int_t gRebin = 1;
 void drawBalanceFunction2DPsi(const char* filename = "AnalysisResultsPsi.root", 
                              Int_t gCentrality = 1,
+                             Int_t gBit = -1,
+                             const char* gCentralityEstimator = 0x0,
+                             Bool_t kShowShuffled = kFALSE, 
+                             Bool_t kShowMixed = kTRUE, 
                              Double_t psiMin = -0.5, Double_t psiMax = 0.5,
+                             Double_t vertexZMin = -10.,
+                             Double_t vertexZMax = 10.,
                              Double_t ptTriggerMin = -1.,
                              Double_t ptTriggerMax = -1.,
                              Double_t ptAssociatedMin = -1.,
-                             Double_t ptAssociatedMax = -1.) {
+                             Double_t ptAssociatedMax = -1.,
+                             Bool_t kUseVzBinning = kTRUE,
+                             Bool_t k2pMethod = kTRUE,
+                             TString eventClass = "EventPlane", //Can be "EventPlane", "Centrality", "Multiplicity"
+                             Bool_t bToy = kFALSE)
+{
   //Macro that draws the BF distributions for each centrality bin
   //for reaction plane dependent analysis
   //Author: Panos.Christakoglou@nikhef.nl
@@ -20,31 +32,39 @@ void drawBalanceFunction2DPsi(const char* filename = "AnalysisResultsPsi.root",
   gSystem->Load("libPWGTools.so");
   gSystem->Load("libPWGCFebye.so");
 
+  //gROOT->LoadMacro("~/SetPlotStyle.C");
+  //SetPlotStyle();
+  gStyle->SetPalette(1,0);
+
   //Prepare the objects and return them
-  TList *listBF = GetListOfObjects(filename,gCentrality,0);
-  TList *listBFShuffled = GetListOfObjects(filename,gCentrality,1);
-  TList *listBFMixed = GetListOfObjects(filename,gCentrality,2);
+  TList *listBF = GetListOfObjects(filename,gCentrality,gBit,gCentralityEstimator,0,bToy);
+  TList *listBFShuffled = NULL;
+  if(kShowShuffled) listBFShuffled = GetListOfObjects(filename,gCentrality,gBit,gCentralityEstimator,1,bToy);
+  TList *listBFMixed = NULL;
+  if(kShowMixed) listBFMixed = GetListOfObjects(filename,gCentrality,gBit,gCentralityEstimator,2,bToy);
   if(!listBF) {
     Printf("The TList object was not created");
     return;
   }
   else 
-    draw(listBF,listBFShuffled,listBFMixed,gCentrality,psiMin,psiMax,
-        ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax);  
+    draw(listBF,listBFShuffled,listBFMixed,gCentrality,gCentralityEstimator,
+        psiMin,psiMax,vertexZMin,vertexZMax,
+        ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax,
+        kUseVzBinning,k2pMethod,eventClass);  
 }
 
 //______________________________________________________//
-TList *GetListOfObjects(const char* filename, 
-                       Int_t gCentrality, Int_t kData = 1) {
+TList *GetListOfObjects(const char* filename,
+                       Int_t gCentrality,
+                       Int_t gBit,
+                       const char *gCentralityEstimator,
+                       Int_t kData = 1,
+                       Bool_t bToy = kFALSE) {
   //Get the TList objects (QA, bf, bf shuffled)
-  //kData == 0: data
-  //kData == 1: shuffling
-  //kData == 2: mixing
-  TList *listQA = 0x0;
   TList *listBF = 0x0;
   
   //Open the file
-  TFile *f = TFile::Open(filename);
+  TFile *f = TFile::Open(filename,"UPDATE");
   if((!f)||(!f->IsOpen())) {
     Printf("The file %s is not found. Aborting...",filename);
     return listBF;
@@ -61,114 +81,150 @@ TList *GetListOfObjects(const char* filename,
   TString listBFName;
   if(kData == 0) {
     //cout<<"no shuffling - no mixing"<<endl;
-    listBFName = "listBFPsi_";
+    listBFName = "listBFPsi";
   }
   else if(kData == 1) {
     //cout<<"shuffling - no mixing"<<endl;
-    listBFName = "listBFPsiShuffled_";
+    listBFName = "listBFPsiShuffled";
   }
   else if(kData == 2) {
     //cout<<"no shuffling - mixing"<<endl;
-    listBFName = "listBFPsiMixed_";
+    listBFName = "listBFPsiMixed";
   }
-  listBFName += centralityArray[gCentrality-1];
-  listBF = dynamic_cast<TList *>(dir->Get(listBFName.Data()));
-  cout<<"======================================================="<<endl;
-  cout<<"List name: "<<listBF->GetName()<<endl;
-  //listBF->ls();
 
-  //Get the histograms
-  TString histoName;
-  if(kData == 0)
-    histoName = "fHistPV0M";
-  else if(kData == 1)
-    histoName = "fHistP_shuffleV0M";
-  else if(kData == 2)
-    histoName = "fHistPV0M";
-  AliTHn *fHistP = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));  
-  if(!fHistP) {
-    Printf("fHistP %s not found!!!",histoName.Data());
-    break;
-  }
-  fHistP->FillParent(); fHistP->DeleteContainers();
-
-  if(kData == 0)
-    histoName = "fHistNV0M";
-  if(kData == 1)
-    histoName = "fHistN_shuffleV0M";
-  if(kData == 2)
-    histoName = "fHistNV0M";
-  AliTHn *fHistN = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
-  if(!fHistN) {
-    Printf("fHistN %s not found!!!",histoName.Data());
-    break;
-  }
-  fHistN->FillParent(); fHistN->DeleteContainers();
+  // different list names in case of toy model
+  if(!bToy){
+    listBFName += "_"
+    listBFName += centralityArray[gCentrality-1];
+    if(gBit > -1) {
+      listBFName += "_Bit"; listBFName += gBit; }
+    if(gCentralityEstimator) {
+      listBFName += "_"; listBFName += gCentralityEstimator;}
+  }
+  else{
+    listBFName.ReplaceAll("Psi","");
+  }
+
+  // histograms were already retrieved (in first iteration)
+  if(dir->Get(Form("%s_histograms",listBFName.Data()))){
+    //cout<<"second iteration"<<endl;
+    listBF = dynamic_cast<TList *>(dir->Get(Form("%s_histograms",listBFName.Data())));
+  }
+
+  // histograms were not yet retrieved (this is the first iteration)
+  else{
+
+    listBF = dynamic_cast<TList *>(dir->Get(listBFName.Data()));
+    cout<<"======================================================="<<endl;
+    cout<<"List name: "<<listBF->GetName()<<endl;
+    //listBF->ls();
+    
+    //Get the histograms
+    TString histoName;
+    if(kData == 0)
+      histoName = "fHistP";
+    else if(kData == 1)
+      histoName = "fHistP_shuffle";
+    else if(kData == 2)
+      histoName = "fHistP";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    AliTHn *fHistP = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));  
+    if(!fHistP) {
+      Printf("fHistP %s not found!!!",histoName.Data());
+      break;
+    }
+    fHistP->FillParent(); fHistP->DeleteContainers();
+    
+    if(kData == 0)
+      histoName = "fHistN";
+    if(kData == 1)
+      histoName = "fHistN_shuffle";
+    if(kData == 2)
+      histoName = "fHistN";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    AliTHn *fHistN = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
+    if(!fHistN) {
+      Printf("fHistN %s not found!!!",histoName.Data());
+      break;
+    }
+    fHistN->FillParent(); fHistN->DeleteContainers();
+    
+    if(kData == 0)
+      histoName = "fHistPN";
+    if(kData == 1)
+      histoName = "fHistPN_shuffle";
+    if(kData == 2)
+      histoName = "fHistPN";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    AliTHn *fHistPN = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
+    if(!fHistPN) {
+      Printf("fHistPN %s not found!!!",histoName.Data());
+      break;
+    }
+    fHistPN->FillParent(); fHistPN->DeleteContainers();
+    
+    if(kData == 0)
+      histoName = "fHistNP";
+    if(kData == 1)
+      histoName = "fHistNP_shuffle";
+    if(kData == 2)
+      histoName = "fHistNP";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    AliTHn *fHistNP = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
+    if(!fHistNP) {
+      Printf("fHistNP %s not found!!!",histoName.Data());
+      break;
+    }
+    fHistNP->FillParent(); fHistNP->DeleteContainers();
+    
+    if(kData == 0)
+      histoName = "fHistPP";
+    if(kData == 1)
+      histoName = "fHistPP_shuffle";
+    if(kData == 2)
+      histoName = "fHistPP";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    AliTHn *fHistPP = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
+    if(!fHistPP) {
+      Printf("fHistPP %s not found!!!",histoName.Data());
+      break;
+    }
+    fHistPP->FillParent(); fHistPP->DeleteContainers();
+    
+    if(kData == 0)
+      histoName = "fHistNN";
+    if(kData == 1)
+      histoName = "fHistNN_shuffle";
+    if(kData == 2)
+      histoName = "fHistNN";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    AliTHn *fHistNN = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
+    if(!fHistNN) {
+      Printf("fHistNN %s not found!!!",histoName.Data());
+      break;
+    }
+    fHistNN->FillParent(); fHistNN->DeleteContainers();
     
-  if(kData == 0)
-    histoName = "fHistPNV0M";
-  if(kData == 1)
-    histoName = "fHistPN_shuffleV0M";
-  if(kData == 2)
-    histoName = "fHistPNV0M";
-  AliTHn *fHistPN = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
-  if(!fHistPN) {
-    Printf("fHistPN %s not found!!!",histoName.Data());
-    break;
-  }
-  fHistPN->FillParent(); fHistPN->DeleteContainers();
+    dir->cd();
+    listBF->Write(Form("%s_histograms",listBFName.Data()), TObject::kSingleKey);
+    
+  }// first iteration
   
-  if(kData == 0)
-    histoName = "fHistNPV0M";
-  if(kData == 1)
-    histoName = "fHistNP_shuffleV0M";
-  if(kData == 2)
-    histoName = "fHistNPV0M";
-  AliTHn *fHistNP = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
-  if(!fHistNP) {
-    Printf("fHistNP %s not found!!!",histoName.Data());
-    break;
-  }
-  fHistNP->FillParent(); fHistNP->DeleteContainers();
-
-  if(kData == 0)
-    histoName = "fHistPPV0M";
-  if(kData == 1)
-    histoName = "fHistPP_shuffleV0M";
-  if(kData == 2)
-    histoName = "fHistPPV0M";
-  AliTHn *fHistPP = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
-  if(!fHistPP) {
-    Printf("fHistPP %s not found!!!",histoName.Data());
-    break;
-  }
-  fHistPP->FillParent(); fHistPP->DeleteContainers();
-
-  if(kData == 0)
-    histoName = "fHistNNV0M";
-  if(kData == 1)
-    histoName = "fHistNN_shuffleV0M";
-  if(kData == 2)
-    histoName = "fHistNNV0M";
-  AliTHn *fHistNN = dynamic_cast<AliTHn *>(listBF->FindObject(histoName.Data()));
-  if(!fHistNN) {
-    Printf("fHistNN %s not found!!!",histoName.Data());
-    break;
-  }
-  fHistNN->FillParent(); fHistNN->DeleteContainers();
+  f->Close();
   
   return listBF;
 }
 
 //______________________________________________________//
 void draw(TList *listBF, TList *listBFShuffled, TList *listBFMixed,
-         Int_t gCentrality, Double_t psiMin, Double_t psiMax,
+         Int_t gCentrality, const char* gCentralityEstimator,
+         Double_t psiMin, Double_t psiMax,
+         Double_t vertexZMin,
+         Double_t vertexZMax,
          Double_t ptTriggerMin, Double_t ptTriggerMax,
-         Double_t ptAssociatedMin, Double_t ptAssociatedMax) {
-  gROOT->LoadMacro("~/SetPlotStyle.C");
-  SetPlotStyle();
-  gStyle->SetPalette(1,0);
-  
+         Double_t ptAssociatedMin, Double_t ptAssociatedMax,
+         Bool_t kUseVzBinning=kFALSE,
+         Bool_t k2pMethod = kFALSE, TString eventClass) {  
   //balance function
   AliTHn *hP = NULL;
   AliTHn *hN = NULL;
@@ -178,20 +234,41 @@ void draw(TList *listBF, TList *listBFShuffled, TList *listBFMixed,
   AliTHn *hNN = NULL;
   //listBF->ls();
   //Printf("=================");
-  hP = (AliTHn*) listBF->FindObject("fHistPV0M");
-  hN = (AliTHn*) listBF->FindObject("fHistNV0M");
-  hPN = (AliTHn*) listBF->FindObject("fHistPNV0M");
-  hNP = (AliTHn*) listBF->FindObject("fHistNPV0M");
-  hPP = (AliTHn*) listBF->FindObject("fHistPPV0M");
-  hNN = (AliTHn*) listBF->FindObject("fHistNNV0M");
+  TString histoName = "fHistP";
+  if(gCentralityEstimator) histoName += gCentralityEstimator;
+  hP = (AliTHn*) listBF->FindObject(histoName.Data());
+  hP->SetName("gHistP");
+  histoName = "fHistN";
+  if(gCentralityEstimator) histoName += gCentralityEstimator;
+  hN = (AliTHn*) listBF->FindObject(histoName.Data());
+  hN->SetName("gHistN");
+  histoName = "fHistPN";
+  if(gCentralityEstimator) histoName += gCentralityEstimator;
+  hPN = (AliTHn*) listBF->FindObject(histoName.Data());
+  hPN->SetName("gHistPN");
+  histoName = "fHistNP";
+  if(gCentralityEstimator) histoName += gCentralityEstimator;
+  hNP = (AliTHn*) listBF->FindObject(histoName.Data());
+  hNP->SetName("gHistNP");
+  histoName = "fHistPP";
+  if(gCentralityEstimator) histoName += gCentralityEstimator;
+  hPP = (AliTHn*) listBF->FindObject(histoName.Data());
+  hPP->SetName("gHistPP");
+  histoName = "fHistNN";
+  if(gCentralityEstimator) histoName += gCentralityEstimator;
+  hNN = (AliTHn*) listBF->FindObject(histoName.Data());
+  hNN->SetName("gHistNN");
 
   AliBalancePsi *b = new AliBalancePsi();
+  b->SetEventClass(eventClass);
   b->SetHistNp(hP);
   b->SetHistNn(hN);
   b->SetHistNpn(hPN);
   b->SetHistNnp(hNP);
   b->SetHistNpp(hPP);
   b->SetHistNnn(hNN);
+  if(kUseVzBinning) b->SetVertexZBinning(kTRUE);
+
 
   //balance function shuffling
   AliTHn *hPShuffled = NULL;
@@ -200,21 +277,44 @@ void draw(TList *listBF, TList *listBFShuffled, TList *listBFMixed,
   AliTHn *hNPShuffled = NULL;
   AliTHn *hPPShuffled = NULL;
   AliTHn *hNNShuffled = NULL;
-  //listBFShuffled->ls();
-  hPShuffled = (AliTHn*) listBFShuffled->FindObject("fHistP_shuffleV0M");
-  hNShuffled = (AliTHn*) listBFShuffled->FindObject("fHistN_shuffleV0M");
-  hPNShuffled = (AliTHn*) listBFShuffled->FindObject("fHistPN_shuffleV0M");
-  hNPShuffled = (AliTHn*) listBFShuffled->FindObject("fHistNP_shuffleV0M");
-  hPPShuffled = (AliTHn*) listBFShuffled->FindObject("fHistPP_shuffleV0M");
-  hNNShuffled = (AliTHn*) listBFShuffled->FindObject("fHistNN_shuffleV0M");
-
-  AliBalancePsi *bShuffled = new AliBalancePsi();
-  bShuffled->SetHistNp(hPShuffled);
-  bShuffled->SetHistNn(hNShuffled);
-  bShuffled->SetHistNpn(hPNShuffled);
-  bShuffled->SetHistNnp(hNPShuffled);
-  bShuffled->SetHistNpp(hPPShuffled);
-  bShuffled->SetHistNnn(hNNShuffled);
+  if(listBFShuffled) {
+    //listBFShuffled->ls();
+    histoName = "fHistP_shuffle";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    hPShuffled = (AliTHn*) listBFShuffled->FindObject(histoName.Data());
+    hPShuffled->SetName("gHistPShuffled");
+    histoName = "fHistN_shuffle";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    hNShuffled = (AliTHn*) listBFShuffled->FindObject(histoName.Data());
+    hNShuffled->SetName("gHistNShuffled");
+    histoName = "fHistPN_shuffle";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    hPNShuffled = (AliTHn*) listBFShuffled->FindObject(histoName.Data());
+    hPNShuffled->SetName("gHistPNShuffled");
+    histoName = "fHistNP_shuffle";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    hNPShuffled = (AliTHn*) listBFShuffled->FindObject(histoName.Data());
+    hNPShuffled->SetName("gHistNPShuffled");
+    histoName = "fHistPP_shuffle";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    hPPShuffled = (AliTHn*) listBFShuffled->FindObject(histoName.Data());
+    hPPShuffled->SetName("gHistPPShuffled");
+    histoName = "fHistNN_shuffle";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    hNNShuffled = (AliTHn*) listBFShuffled->FindObject(histoName.Data());
+    hNNShuffled->SetName("gHistNNShuffled");
+    
+    AliBalancePsi *bShuffled = new AliBalancePsi();
+    bShuffled->SetEventClass(eventClass);
+    bShuffled->SetHistNp(hPShuffled);
+    bShuffled->SetHistNn(hNShuffled);
+    bShuffled->SetHistNpn(hPNShuffled);
+    bShuffled->SetHistNnp(hNPShuffled);
+    bShuffled->SetHistNpp(hPPShuffled);
+    bShuffled->SetHistNnn(hNNShuffled);
+  if(kUseVzBinning) bShuffled->SetVertexZBinning(kTRUE);
+
+  }
 
   //balance function mixing
   AliTHn *hPMixed = NULL;
@@ -223,21 +323,47 @@ void draw(TList *listBF, TList *listBFShuffled, TList *listBFMixed,
   AliTHn *hNPMixed = NULL;
   AliTHn *hPPMixed = NULL;
   AliTHn *hNNMixed = NULL;
-  //listBFMixed->ls();
-  hPMixed = (AliTHn*) listBFMixed->FindObject("fHistPV0M");
-  hNMixed = (AliTHn*) listBFMixed->FindObject("fHistNV0M");
-  hPNMixed = (AliTHn*) listBFMixed->FindObject("fHistPNV0M");
-  hNPMixed = (AliTHn*) listBFMixed->FindObject("fHistNPV0M");
-  hPPMixed = (AliTHn*) listBFMixed->FindObject("fHistPPV0M");
-  hNNMixed = (AliTHn*) listBFMixed->FindObject("fHistNNV0M");
-
-  AliBalancePsi *bMixed = new AliBalancePsi();
-  bMixed->SetHistNp(hPMixed);
-  bMixed->SetHistNn(hNMixed);
-  bMixed->SetHistNpn(hPNMixed);
-  bMixed->SetHistNnp(hNPMixed);
-  bMixed->SetHistNpp(hPPMixed);
-  bMixed->SetHistNnn(hNNMixed);
+
+  if(listBFMixed) {
+    //listBFMixed->ls();
+    histoName = "fHistP";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    hPMixed = (AliTHn*) listBFMixed->FindObject(histoName.Data());
+    hPMixed->SetName("gHistPMixed");
+    histoName = "fHistN";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    hNMixed = (AliTHn*) listBFMixed->FindObject(histoName.Data());
+    hNMixed->SetName("gHistNMixed");
+    histoName = "fHistPN";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    hPNMixed = (AliTHn*) listBFMixed->FindObject(histoName.Data());
+    hPNMixed->SetName("gHistPNMixed");
+    histoName = "fHistNP";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    hNPMixed = (AliTHn*) listBFMixed->FindObject(histoName.Data());
+    histoName = "fHistNP";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    hNPMixed->SetName("gHistNPMixed");
+    histoName = "fHistPP";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    hPPMixed = (AliTHn*) listBFMixed->FindObject(histoName.Data());
+    hPPMixed->SetName("gHistPPMixed");
+    histoName = "fHistNN";
+    if(gCentralityEstimator) histoName += gCentralityEstimator;
+    hNNMixed = (AliTHn*) listBFMixed->FindObject(histoName.Data());
+    hNNMixed->SetName("gHistNNMixed");
+    
+    AliBalancePsi *bMixed = new AliBalancePsi();
+    bMixed->SetEventClass(eventClass);
+    bMixed->SetHistNp(hPMixed);
+    bMixed->SetHistNn(hNMixed);
+    bMixed->SetHistNpn(hPNMixed);
+    bMixed->SetHistNnp(hNPMixed);
+    bMixed->SetHistNpp(hPPMixed);
+    bMixed->SetHistNnn(hNNMixed);
+    if(kUseVzBinning) bMixed->SetVertexZBinning(kTRUE);
+  
+  }
 
   TH2D *gHistBalanceFunction;
   TH2D *gHistBalanceFunctionSubtracted;
@@ -245,38 +371,85 @@ void draw(TList *listBF, TList *listBFShuffled, TList *listBFMixed,
   TH2D *gHistBalanceFunctionMixed;
   TString histoTitle, pngName;
   
-  histoTitle = "Centrality: "; 
-  histoTitle += centralityArray[gCentrality-1]; 
-  histoTitle += "%";
-  if((psiMin == -0.5)&&(psiMax == 0.5))
-    histoTitle += " (-7.5^{o} < #phi - #Psi_{2} < 7.5^{o})"; 
-  else if((psiMin == 0.5)&&(psiMax == 1.5))
-    histoTitle += " (37.5^{o} < #phi - #Psi_{2} < 52.5^{o})"; 
-  else if((psiMin == 1.5)&&(psiMax == 2.5))
-    histoTitle += " (82.5^{o} < #phi - #Psi_{2} < 97.5^{o})"; 
-  else 
-    histoTitle += " (0^{o} < #phi - #Psi_{2} < 180^{o})"; 
-  
-  gHistBalanceFunction = b->GetBalanceFunctionDeltaEtaDeltaPhi(psiMin,psiMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax);
+  if(eventClass == "Centrality"){
+    histoTitle = "Centrality: ";
+    histoTitle += psiMin;
+    histoTitle += " - ";
+    histoTitle += psiMax;
+    histoTitle += " % ";
+    histoTitle += " (0^{o} < #varphi - #Psi_{2} < 180^{o})"; 
+  }
+  else if(eventClass == "Multiplicity"){
+    histoTitle = "Multiplicity: ";
+    histoTitle += psiMin;
+    histoTitle += " - ";
+    histoTitle += psiMax;
+    histoTitle += " tracks";
+    histoTitle += " (0^{o} < #varphi - #Psi_{2} < 180^{o})"; 
+  }
+  else{ // "EventPlane" (default)
+    histoTitle = "Centrality: ";
+    histoTitle += centralityArray[gCentrality-1]; 
+    histoTitle += "%";
+    if((psiMin == -0.5)&&(psiMax == 0.5))
+      histoTitle += " (-7.5^{o} < #varphi - #Psi_{2} < 7.5^{o})"; 
+    else if((psiMin == 0.5)&&(psiMax == 1.5))
+      histoTitle += " (37.5^{o} < #varphi - #Psi_{2} < 52.5^{o})"; 
+    else if((psiMin == 1.5)&&(psiMax == 2.5))
+      histoTitle += " (82.5^{o} < #varphi - #Psi_{2} < 97.5^{o})"; 
+    else 
+      histoTitle += " (0^{o} < #varphi - #Psi_{2} < 180^{o})"; 
+  }
+
+  if(k2pMethod) 
+    if(bMixed)
+      gHistBalanceFunction = b->GetBalanceFunctionDeltaEtaDeltaPhi2pMethod(psiMin,psiMax,vertexZMin,vertexZMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax,bMixed);
+    else{
+      cerr<<"NO MIXED BF BUT REQUESTED CORRECTING WITH IT! --> FAIL"<<endl;
+      return;
+    }
+  else
+    gHistBalanceFunction = b->GetBalanceFunctionDeltaEtaDeltaPhi(psiMin,psiMax,vertexZMin,vertexZMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax);
   gHistBalanceFunction->SetTitle(histoTitle.Data());
   gHistBalanceFunction->GetYaxis()->SetTitleOffset(1.3);
   gHistBalanceFunction->SetName("gHistBalanceFunction");
 
-  gHistBalanceFunctionShuffled = bShuffled->GetBalanceFunctionDeltaEtaDeltaPhi(psiMin,psiMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax);
-  gHistBalanceFunctionShuffled->SetTitle(histoTitle.Data());
-  gHistBalanceFunctionShuffled->GetYaxis()->SetTitleOffset(1.3);
-  gHistBalanceFunctionShuffled->SetName("gHistBalanceFunctionShuffled");
-
-  gHistBalanceFunctionMixed = bMixed->GetBalanceFunctionDeltaEtaDeltaPhi(psiMin,psiMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax);
-  gHistBalanceFunctionMixed->SetTitle(histoTitle.Data());
-  gHistBalanceFunctionMixed->GetYaxis()->SetTitleOffset(1.3);
-  gHistBalanceFunctionMixed->SetName("gHistBalanceFunctionMixed");
+  if(listBFShuffled) {
+    
+    if(k2pMethod) 
+      if(bMixed)
+       gHistBalanceFunctionShuffled = bShuffled->GetBalanceFunctionDeltaEtaDeltaPhi2pMethod(psiMin,psiMax,vertexZMin,vertexZMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax,bMixed);
+      else{
+       cerr<<"NO MIXED BF BUT REQUESTED CORRECTING WITH IT! --> FAIL"<<endl;
+       return;
+      }
+    else
+      gHistBalanceFunctionShuffled = bShuffled->GetBalanceFunctionDeltaEtaDeltaPhi(psiMin,psiMax,vertexZMin,vertexZMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax);
+    gHistBalanceFunctionShuffled->SetTitle(histoTitle.Data());
+    gHistBalanceFunctionShuffled->GetYaxis()->SetTitleOffset(1.3);
+    gHistBalanceFunctionShuffled->SetName("gHistBalanceFunctionShuffled");
+  }
 
-  gHistBalanceFunctionSubtracted = dynamic_cast<TH2D *>(gHistBalanceFunction->Clone());
-  gHistBalanceFunctionSubtracted->Add(gHistBalanceFunctionMixed,-1);
-  gHistBalanceFunctionSubtracted->SetTitle(histoTitle.Data());
-  gHistBalanceFunctionSubtracted->GetYaxis()->SetTitleOffset(1.3);
-  gHistBalanceFunctionSubtracted->SetName("gHistBalanceFunctionSubtracted");
+  if(listBFMixed) {
+    if(k2pMethod) 
+      if(bMixed)
+       gHistBalanceFunctionMixed = bMixed->GetBalanceFunctionDeltaEtaDeltaPhi2pMethod(psiMin,psiMax,vertexZMin,vertexZMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax,bMixed);
+      else{
+       cerr<<"NO MIXED BF BUT REQUESTED CORRECTING WITH IT! --> FAIL"<<endl;
+       return;
+      }
+    else
+      gHistBalanceFunctionMixed = bMixed->GetBalanceFunctionDeltaEtaDeltaPhi(psiMin,psiMax,vertexZMin,vertexZMax,ptTriggerMin,ptTriggerMax,ptAssociatedMin,ptAssociatedMax);
+    gHistBalanceFunctionMixed->SetTitle(histoTitle.Data());
+    gHistBalanceFunctionMixed->GetYaxis()->SetTitleOffset(1.3);
+    gHistBalanceFunctionMixed->SetName("gHistBalanceFunctionMixed");
+  
+    gHistBalanceFunctionSubtracted = dynamic_cast<TH2D *>(gHistBalanceFunction->Clone());
+    gHistBalanceFunctionSubtracted->Add(gHistBalanceFunctionMixed,-1);
+    gHistBalanceFunctionSubtracted->SetTitle(histoTitle.Data());
+    gHistBalanceFunctionSubtracted->GetYaxis()->SetTitleOffset(1.3);
+    gHistBalanceFunctionSubtracted->SetName("gHistBalanceFunctionSubtracted");
+  }
 
   //Draw the results
   TCanvas *c1 = new TCanvas("c1","",0,0,600,500);
@@ -284,93 +457,275 @@ void draw(TList *listBF, TList *listBFShuffled, TList *listBFMixed,
   c1->SetHighLightColor(10);
   c1->SetLeftMargin(0.15);
   gHistBalanceFunction->DrawCopy("lego2");
+  gPad->SetTheta(30); // default is 30
+  gPad->SetPhi(-60); // default is 30
+  gPad->Update();  
   TCanvas *c1a = new TCanvas("c1a","",600,0,600,500);
   c1a->SetFillColor(10); 
   c1a->SetHighLightColor(10);
   c1a->SetLeftMargin(0.15);
   gHistBalanceFunction->DrawCopy("colz");
 
-  TCanvas *c2 = new TCanvas("c2","",100,100,600,500);
-  c2->SetFillColor(10); 
-  c2->SetHighLightColor(10);
-  c2->SetLeftMargin(0.15);
-  gHistBalanceFunctionShuffled->DrawCopy("lego2");
-  TCanvas *c2a = new TCanvas("c2a","",700,100,600,500);
-  c2a->SetFillColor(10); 
-  c2a->SetHighLightColor(10);
-  c2a->SetLeftMargin(0.15);
-  gHistBalanceFunctionShuffled->DrawCopy("colz");
-
-  TCanvas *c3 = new TCanvas("c3","",200,200,600,500);
-  c3->SetFillColor(10); 
-  c3->SetHighLightColor(10);
-  c3->SetLeftMargin(0.15);
-  gHistBalanceFunctionMixed->DrawCopy("lego2");
-  TCanvas *c3a = new TCanvas("c3a","",700,200,600,500);
-  c3a->SetFillColor(10); 
-  c3a->SetHighLightColor(10);
-  c3a->SetLeftMargin(0.15);
-  gHistBalanceFunctionMixed->DrawCopy("colz");
-
-  TCanvas *c4 = new TCanvas("c4","",300,300,600,500);
-  c4->SetFillColor(10); 
-  c4->SetHighLightColor(10);
-  c4->SetLeftMargin(0.15);
-  gHistBalanceFunctionSubtracted->DrawCopy("lego2");
-  TCanvas *c4a = new TCanvas("c4a","",900,300,600,500);
-  c4a->SetFillColor(10); 
-  c4a->SetHighLightColor(10);
-  c4a->SetLeftMargin(0.15);
-  gHistBalanceFunctionSubtracted->DrawCopy("colz");
-
-  TString newFileName = "balanceFunction2D.Centrality"; 
-  newFileName += gCentrality; newFileName += ".Psi";
-  if((psiMin == -0.5)&&(psiMax == 0.5)) newFileName += "InPlane.Ptt";
-  else if((psiMin == 0.5)&&(psiMax == 1.5)) newFileName += "Intermediate.Ptt";
-  else if((psiMin == 1.5)&&(psiMax == 2.5)) newFileName += "OutOfPlane.Ptt";
-  else newFileName += "0.PttFrom";
-  newFileName += ptTriggerMin; newFileName += "To"; 
-  newFileName += ptTriggerMax; newFileName += ".PtaFrom";
-  newFileName += ptAssociatedMin; newFileName += "To"; 
-  newFileName += ptAssociatedMax;  newFileName += ".root";
+  if(listBFShuffled) {
+    TCanvas *c2 = new TCanvas("c2","",100,100,600,500);
+    c2->SetFillColor(10); 
+    c2->SetHighLightColor(10);
+    c2->SetLeftMargin(0.15);
+    gHistBalanceFunctionShuffled->DrawCopy("lego2");
+    gPad->SetTheta(30); // default is 30
+    gPad->SetPhi(-60); // default is 30
+    gPad->Update();  
+    TCanvas *c2a = new TCanvas("c2a","",700,100,600,500);
+    c2a->SetFillColor(10); 
+    c2a->SetHighLightColor(10);
+    c2a->SetLeftMargin(0.15);
+    gHistBalanceFunctionShuffled->DrawCopy("colz");
+  }
+
+  if(listBFMixed) {
+    TCanvas *c3 = new TCanvas("c3","",200,200,600,500);
+    c3->SetFillColor(10); 
+    c3->SetHighLightColor(10);
+    c3->SetLeftMargin(0.15);
+    gHistBalanceFunctionMixed->DrawCopy("lego2");
+    gPad->SetTheta(30); // default is 30
+    gPad->SetPhi(-60); // default is 30
+    gPad->Update();  
+    TCanvas *c3a = new TCanvas("c3a","",800,200,600,500);
+    c3a->SetFillColor(10); 
+    c3a->SetHighLightColor(10);
+    c3a->SetLeftMargin(0.15);
+    gHistBalanceFunctionMixed->DrawCopy("colz");
+
+    TCanvas *c4 = new TCanvas("c4","",300,300,600,500);
+    c4->SetFillColor(10); 
+    c4->SetHighLightColor(10);
+    c4->SetLeftMargin(0.15);
+    gHistBalanceFunctionSubtracted->DrawCopy("lego2");
+    gPad->SetTheta(30); // default is 30
+    gPad->SetPhi(-60); // default is 30
+    gPad->Update();  
+    TCanvas *c4a = new TCanvas("c4a","",900,300,600,500);
+    c4a->SetFillColor(10); 
+    c4a->SetHighLightColor(10);
+    c4a->SetLeftMargin(0.15);
+    gHistBalanceFunctionSubtracted->DrawCopy("colz");
+
+    fitbalanceFunction(gCentrality, psiMin , psiMax,
+                      ptTriggerMin, ptTriggerMax,
+                      ptAssociatedMin, ptAssociatedMax,
+                      gHistBalanceFunctionSubtracted,k2pMethod, eventClass);
+  }
+
+  TString newFileName = "balanceFunction2D."; 
+  if(eventClass == "Centrality"){
+    newFileName += Form("Centrality%.1fTo%.1f",psiMin,psiMax);
+    newFileName += ".PsiAll.PttFrom";
+  }
+  else if(eventClass == "Multiplicity"){
+    newFileName += Form("Multiplicity%.0fTo%.0f",psiMin,psiMax);
+    newFileName += ".PsiAll.PttFrom";
+  }
+  else{ // "EventPlane" (default)
+    newFileName += "Centrality";
+    newFileName += gCentrality; newFileName += ".Psi";
+    if((psiMin == -0.5)&&(psiMax == 0.5)) newFileName += "InPlane.Ptt";
+    else if((psiMin == 0.5)&&(psiMax == 1.5)) newFileName += "Intermediate.Ptt";
+    else if((psiMin == 1.5)&&(psiMax == 2.5)) newFileName += "OutOfPlane.Ptt";
+    else if((psiMin == 2.5)&&(psiMax == 3.5)) newFileName += "Rest.PttFrom";
+    else newFileName += "All.PttFrom";
+  }  
+  newFileName += Form("%.1f",ptTriggerMin); newFileName += "To"; 
+  newFileName += Form("%.1f",ptTriggerMax); newFileName += "PtaFrom";
+  newFileName += Form("%.1f",ptAssociatedMin); newFileName += "To"; 
+  newFileName += Form("%.1f",ptAssociatedMax); 
+  if(k2pMethod) newFileName += "_2pMethod";
+
+  newFileName += "_";
+  newFileName += Form("%.1f",psiMin); 
+  newFileName += "-"; 
+  newFileName += Form("%.1f",psiMax); 
+  newFileName += ".root";
 
   TFile *fOutput = new TFile(newFileName.Data(),"recreate");
   fOutput->cd();
+  /*hP->Write(); hN->Write();
+  hPN->Write(); hNP->Write();
+  hPP->Write(); hNN->Write();
+  hPShuffled->Write(); hNShuffled->Write();
+  hPNShuffled->Write(); hNPShuffled->Write();
+  hPPShuffled->Write(); hNNShuffled->Write();
+  hPMixed->Write(); hNMixed->Write();
+  hPNMixed->Write(); hNPMixed->Write();
+  hPPMixed->Write(); hNNMixed->Write();*/
   gHistBalanceFunction->Write();
-  gHistBalanceFunctionShuffled->Write();
-  gHistBalanceFunctionMixed->Write();
-  gHistBalanceFunctionSubtracted->Write();
+  if(listBFShuffled) gHistBalanceFunctionShuffled->Write();
+  if(listBFMixed) {
+    gHistBalanceFunctionMixed->Write();
+    gHistBalanceFunctionSubtracted->Write();
+  }
   fOutput->Close();
 }
 
 //____________________________________________________________//
-void drawBFPsi2D(Int_t gCentrality = 1,
+void fitbalanceFunction(Int_t gCentrality = 1,
+                       Double_t psiMin = -0.5, Double_t psiMax = 3.5,
+                       Double_t ptTriggerMin = -1.,
+                       Double_t ptTriggerMax = -1.,
+                       Double_t ptAssociatedMin = -1.,
+                       Double_t ptAssociatedMax = -1.,
+                       TH2D *gHist,
+                       Bool_t k2pMethod = kFALSE, 
+                       TString eventClass="EventPlane") {
+  //balancing charges: [1]*TMath::Exp(-0.5*TMath::Power(((x - [3])/[2]),2)-0.5*TMath::Power(((y - [5])/[4]),2)) 
+  //short range correlations: [6]*TMath::Exp(-0.5*TMath::Power(((x - [8])/[7]),2)-0.5*TMath::Power(((y - [10])/[9]),2))
+  cout<<"FITTING FUNCTION"<<endl;
+
+  TF2 *gFitFunction = new TF2("gFitFunction","[0] + [1]*TMath::Exp(-0.5*TMath::Power(((x - [3])/[2]),2)-0.5*TMath::Power(((y - [5])/[4]),2)) + [6]*TMath::Exp(-0.5*TMath::Power(((x - [8])/[7]),2)-0.5*TMath::Power(((y - [10])/[9]),2))",-1.2,1.2,-TMath::Pi()/2.,3.*TMath::Pi()/2.); 
+  gFitFunction->SetName("gFitFunction");
+
+  //Normalization
+  gFitFunction->SetParName(0,"N1"); 
+  gFitFunction->SetParameter(0,1.0);
+
+  //2D balance function
+  gFitFunction->SetParName(1,"N_{BF}");
+  gFitFunction->SetParameter(1,1.0);
+  gFitFunction->SetParLimits(1, 0., 100.);
+  gFitFunction->SetParName(2,"Sigma_{BF}(delta eta)"); 
+  gFitFunction->SetParameter(2,0.6);
+  gFitFunction->SetParLimits(2, 0., 1.);
+  gFitFunction->SetParName(3,"Mean_{BF}(delta eta)"); 
+  gFitFunction->SetParameter(3,0.0);
+  gFitFunction->SetParLimits(3, -0.2, 0.2);
+  gFitFunction->SetParName(4,"Sigma_{BF}(delta phi)"); 
+  gFitFunction->SetParameter(4,0.6);
+  gFitFunction->SetParLimits(4, 0., 1.);
+  gFitFunction->SetParName(5,"Mean_{BF}(delta phi)"); 
+  gFitFunction->SetParameter(5,0.0);
+  gFitFunction->SetParLimits(5, -0.2, 0.2);
+
+  //short range structure
+  gFitFunction->SetParName(6,"N_{SR}");
+  gFitFunction->SetParameter(6,5.0);
+  gFitFunction->SetParLimits(6, 0., 100.);
+  gFitFunction->SetParName(7,"Sigma_{SR}(delta eta)"); 
+  gFitFunction->SetParameter(7,0.01);
+  gFitFunction->SetParLimits(7, 0.0, 0.1);
+  gFitFunction->SetParName(8,"Mean_{SR}(delta eta)"); 
+  gFitFunction->SetParameter(8,0.0);
+  gFitFunction->SetParLimits(8, -0.01, 0.01);
+  gFitFunction->SetParName(9,"Sigma_{SR}(delta phi)"); 
+  gFitFunction->SetParameter(9,0.01);
+  gFitFunction->SetParLimits(9, 0.0, 0.1);
+  gFitFunction->SetParName(10,"Mean_{SR}(delta phi)"); 
+  gFitFunction->SetParameter(10,0.0);
+  gFitFunction->SetParLimits(10, -0.01, 0.01);
+
+
+  //Cloning the histogram
+  TH2D *gHistResidual = dynamic_cast<TH2D *>(gHist->Clone());
+  gHistResidual->SetName("gHistResidual");
+  gHistResidual->Sumw2();
+
+  //Fitting the 2D bf
+  for(Int_t iAttempt = 0; iAttempt < 10; iAttempt++) {
+    gHist->Fit("gFitFunction","nm");
+    for(Int_t iParam = 0; iParam < 11; iParam++) 
+      gFitFunction->SetParameter(iParam,gFitFunction->GetParameter(iParam));
+  }
+  cout<<"======================================================"<<endl;
+  cout<<"Fit chi2/ndf: "<<gFitFunction->GetChisquare()/gFitFunction->GetNDF()<<" - chi2: "<<gFitFunction->GetChisquare()<<" - ndf: "<<gFitFunction->GetNDF()<<endl;
+  cout<<"======================================================"<<endl;
+
+  //Getting the residual
+  gHistResidual->Add(gFitFunction,-1);
+
+  //Write to output file
+  TString newFileName = "balanceFunctionFit2D.";
+  if(eventClass == "Centrality"){
+    newFileName += Form("Centrality%.1fTo%.1f",psiMin,psiMax);
+    newFileName += ".PsiAll.PttFrom";
+  }
+  else if(eventClass == "Multiplicity"){
+    newFileName += Form("Multiplicity%.0fTo%.0f",psiMin,psiMax);
+    newFileName += ".PsiAll.PttFrom";
+  }
+  else{ // "EventPlane" (default)
+    newFileName += "Centrality";
+    newFileName += gCentrality; newFileName += ".Psi";
+    if((psiMin == -0.5)&&(psiMax == 0.5)) newFileName += "InPlane.Ptt";
+    else if((psiMin == 0.5)&&(psiMax == 1.5)) newFileName += "Intermediate.Ptt";
+    else if((psiMin == 1.5)&&(psiMax == 2.5)) newFileName += "OutOfPlane.Ptt";
+    else if((psiMin == 2.5)&&(psiMax == 3.5)) newFileName += "Rest.PttFrom";
+    else newFileName += "All.PttFrom";
+  }  
+  newFileName += Form("%.1f",ptTriggerMin); newFileName += "To"; 
+  newFileName += Form("%.1f",ptTriggerMax); newFileName += "PtaFrom";
+  newFileName += Form("%.1f",ptAssociatedMin); newFileName += "To"; 
+  newFileName += Form("%.1f",ptAssociatedMax); 
+  if(k2pMethod) newFileName += "_2pMethod";
+
+  newFileName += "_";
+  newFileName += Form("%.1f",psiMin); 
+  newFileName += "-"; 
+  newFileName += Form("%.1f",psiMax); 
+  newFileName += ".root";
+
+  TFile *newFile = TFile::Open(newFileName.Data(),"recreate");
+  gHist->Write();
+  gHistResidual->Write();
+  gFitFunction->Write();
+  newFile->Close();
+}
+
+//____________________________________________________________//
+void drawBFPsi2D(const char* lhcPeriod = "LHC11h",
+                const char* gCentralityEstimator = "V0M",
+                Int_t gBit = 128,
+                const char* gEventPlaneEstimator = "VZERO",
+                Int_t gCentrality = 1,
+                Bool_t kShowShuffled = kFALSE, 
+                Bool_t kShowMixed = kFALSE, 
                 Double_t psiMin = -0.5, Double_t psiMax = 0.5,
                 Double_t ptTriggerMin = -1.,
                 Double_t ptTriggerMax = -1.,
                 Double_t ptAssociatedMin = -1.,
-                Double_t ptAssociatedMax = -1.) {
+                Double_t ptAssociatedMax = -1.,
+                Bool_t k2pMethod = kTRUE) {
   //Macro that draws the BF distributions for each centrality bin
   //for reaction plane dependent analysis
   //Author: Panos.Christakoglou@nikhef.nl
-  gROOT->LoadMacro("~/SetPlotStyle.C");
-  SetPlotStyle();
+  TGaxis::SetMaxDigits(3);
 
   //Get the input file
-  TString filename = "LHC11h/PttFrom";
-  filename += ptTriggerMin; filename += "To"; 
-  filename += ptTriggerMax; filename += "PtaFrom";
-  filename += ptAssociatedMin; filename += "To"; 
-  filename += ptAssociatedMax; filename += "/balanceFunction2D.Centrality"; 
+  TString filename = lhcPeriod; 
+  filename += "/Centrality"; filename += gCentralityEstimator;
+  filename += "_Bit"; filename += gBit;
+  filename += "_"; filename += gEventPlaneEstimator;
+  filename +="/PttFrom";
+  filename += Form("%.1f",ptTriggerMin); filename += "To"; 
+  filename += Form("%.1f",ptTriggerMax); filename += "PtaFrom";
+  filename += Form("%.1f",ptAssociatedMin); filename += "To"; 
+  filename += Form("%.1f",ptAssociatedMax); 
+  filename += "/balanceFunction2D.Centrality"; 
   filename += gCentrality; filename += ".Psi";
   if((psiMin == -0.5)&&(psiMax == 0.5)) filename += "InPlane.Ptt";
   else if((psiMin == 0.5)&&(psiMax == 1.5)) filename += "Intermediate.Ptt";
   else if((psiMin == 1.5)&&(psiMax == 2.5)) filename += "OutOfPlane.Ptt";
-  else filename += "0.PttFrom";
-  filename += ptTriggerMin; filename += "To"; 
-  filename += ptTriggerMax; filename += ".PtaFrom";
-  filename += ptAssociatedMin; filename += "To"; 
-  filename += ptAssociatedMax;  filename += ".root";  
+  else if((psiMin == 2.5)&&(psiMax == 3.5)) filename += "Rest.Ptt";
+  else filename += "All.PttFrom";
+  filename += Form("%.1f",ptTriggerMin); filename += "To"; 
+  filename += Form("%.1f",ptTriggerMax); filename += "PtaFrom";
+  filename += Form("%.1f",ptAssociatedMin); filename += "To"; 
+  filename += Form("%.1f",ptAssociatedMax);  
+  if(k2pMethod) filename += "_2pMethod";
+
+  filename += "_";
+  filename += Form("%.1f",psiMin); 
+  filename += "-"; 
+  filename += Form("%.1f",psiMax); 
+  filename += ".root";  
 
   //Open the file
   TFile *f = TFile::Open(filename.Data());
@@ -390,48 +745,54 @@ void drawBFPsi2D(Int_t gCentrality = 1,
   gHistBalanceFunction->GetYaxis()->SetTitleOffset(1.3);
   gHistBalanceFunction->GetZaxis()->SetTitleOffset(1.3);
   gHistBalanceFunction->GetXaxis()->SetTitle("#Delta #eta");
-  gHistBalanceFunction->GetYaxis()->SetTitle("#Delta #varphi (deg.)");
-  gHistBalanceFunction->GetZaxis()->SetTitle("B(#Delta #varphi)");
+  gHistBalanceFunction->GetYaxis()->SetTitle("#Delta #varphi (rad)");
+  gHistBalanceFunction->GetZaxis()->SetTitle("B(#Delta #eta, #Delta #varphi)");
 
   //Shuffled balance function
-  TH1D *gHistBalanceFunctionShuffled = dynamic_cast<TH1D *>(f->Get("gHistBalanceFunctionShuffled"));
-  gHistBalanceFunctionShuffled->SetStats(kFALSE);
-  gHistBalanceFunctionShuffled->GetXaxis()->SetNdivisions(10);
-  gHistBalanceFunctionShuffled->GetYaxis()->SetNdivisions(10);
-  gHistBalanceFunctionShuffled->GetZaxis()->SetNdivisions(10);
-  gHistBalanceFunctionShuffled->GetXaxis()->SetTitleOffset(1.3);
-  gHistBalanceFunctionShuffled->GetYaxis()->SetTitleOffset(1.3);
-  gHistBalanceFunctionShuffled->GetZaxis()->SetTitleOffset(1.3);
-  gHistBalanceFunctionShuffled->GetXaxis()->SetTitle("#Delta #eta");
-  gHistBalanceFunctionShuffled->GetYaxis()->SetTitle("#Delta #varphi (deg.)");
-  gHistBalanceFunctionShuffled->GetZaxis()->SetTitle("B(#Delta #varphi)");
+  if(kShowShuffled) {
+    TH1D *gHistBalanceFunctionShuffled = dynamic_cast<TH1D *>(f->Get("gHistBalanceFunctionShuffled"));
+    gHistBalanceFunctionShuffled->SetStats(kFALSE);
+    gHistBalanceFunctionShuffled->GetXaxis()->SetNdivisions(10);
+    gHistBalanceFunctionShuffled->GetYaxis()->SetNdivisions(10);
+    gHistBalanceFunctionShuffled->GetZaxis()->SetNdivisions(10);
+    gHistBalanceFunctionShuffled->GetXaxis()->SetTitleOffset(1.3);
+    gHistBalanceFunctionShuffled->GetYaxis()->SetTitleOffset(1.3);
+    gHistBalanceFunctionShuffled->GetZaxis()->SetTitleOffset(1.3);
+    gHistBalanceFunctionShuffled->GetXaxis()->SetTitle("#Delta #eta");
+    gHistBalanceFunctionShuffled->GetYaxis()->SetTitle("#Delta #varphi (rad)");
+    gHistBalanceFunctionShuffled->GetZaxis()->SetTitle("B(#Delta #eta, #Delta #varphi)");
+  }
 
   //Mixed balance function
-  TH1D *gHistBalanceFunctionMixed = dynamic_cast<TH1D *>(f->Get("gHistBalanceFunctionMixed"));
-  gHistBalanceFunctionMixed->SetStats(kFALSE);
-  gHistBalanceFunctionMixed->GetXaxis()->SetNdivisions(10);
-  gHistBalanceFunctionMixed->GetYaxis()->SetNdivisions(10);
-  gHistBalanceFunctionMixed->GetZaxis()->SetNdivisions(10);
-  gHistBalanceFunctionMixed->GetXaxis()->SetTitleOffset(1.3);
-  gHistBalanceFunctionMixed->GetYaxis()->SetTitleOffset(1.3);
-  gHistBalanceFunctionMixed->GetZaxis()->SetTitleOffset(1.3);
-  gHistBalanceFunctionMixed->GetXaxis()->SetTitle("#Delta #eta");
-  gHistBalanceFunctionMixed->GetYaxis()->SetTitle("#Delta #varphi (deg.)");
-  gHistBalanceFunctionMixed->GetZaxis()->SetTitle("B(#Delta #varphi)");
+  if(kShowMixed) {
+    TH1D *gHistBalanceFunctionMixed = dynamic_cast<TH1D *>(f->Get("gHistBalanceFunctionMixed"));
+    gHistBalanceFunctionMixed->SetStats(kFALSE);
+    gHistBalanceFunctionMixed->GetXaxis()->SetNdivisions(10);
+    gHistBalanceFunctionMixed->GetYaxis()->SetNdivisions(10);
+    gHistBalanceFunctionMixed->GetZaxis()->SetNdivisions(10);
+    gHistBalanceFunctionMixed->GetXaxis()->SetTitleOffset(1.3);
+    gHistBalanceFunctionMixed->GetYaxis()->SetTitleOffset(1.3);
+    gHistBalanceFunctionMixed->GetZaxis()->SetTitleOffset(1.3);
+    gHistBalanceFunctionMixed->GetXaxis()->SetTitle("#Delta #eta");
+    gHistBalanceFunctionMixed->GetYaxis()->SetTitle("#Delta #varphi (rad)");
+    gHistBalanceFunctionMixed->GetZaxis()->SetTitle("B(#Delta #eta, #Delta #varphi)");
+  }
 
   //Subtracted balance function
-  TH1D *gHistBalanceFunctionSubtracted = dynamic_cast<TH1D *>(f->Get("gHistBalanceFunctionSubtracted"));
-  gHistBalanceFunctionSubtracted->SetStats(kFALSE);
-  gHistBalanceFunctionSubtracted->GetXaxis()->SetNdivisions(10);
-  gHistBalanceFunctionSubtracted->GetYaxis()->SetNdivisions(10);
-  gHistBalanceFunctionSubtracted->GetZaxis()->SetNdivisions(10);
-  gHistBalanceFunctionSubtracted->GetXaxis()->SetTitleOffset(1.3);
-  gHistBalanceFunctionSubtracted->GetYaxis()->SetTitleOffset(1.3);
-  gHistBalanceFunctionSubtracted->GetZaxis()->SetTitleOffset(1.3);
-  gHistBalanceFunctionSubtracted->GetXaxis()->SetTitle("#Delta #eta");
-  gHistBalanceFunctionSubtracted->GetYaxis()->SetTitle("#Delta #varphi (deg.)");
-  gHistBalanceFunctionSubtracted->GetZaxis()->SetTitle("B(#Delta #varphi)");
-  
+  if(kShowMixed) {
+    TH1D *gHistBalanceFunctionSubtracted = dynamic_cast<TH1D *>(f->Get("gHistBalanceFunctionSubtracted"));
+    gHistBalanceFunctionSubtracted->SetStats(kFALSE);
+    gHistBalanceFunctionSubtracted->GetXaxis()->SetNdivisions(10);
+    gHistBalanceFunctionSubtracted->GetYaxis()->SetNdivisions(10);
+    gHistBalanceFunctionSubtracted->GetZaxis()->SetNdivisions(10);
+    gHistBalanceFunctionSubtracted->GetXaxis()->SetTitleOffset(1.3);
+    gHistBalanceFunctionSubtracted->GetYaxis()->SetTitleOffset(1.3);
+    gHistBalanceFunctionSubtracted->GetZaxis()->SetTitleOffset(1.3);
+    gHistBalanceFunctionSubtracted->GetXaxis()->SetTitle("#Delta #eta");
+    gHistBalanceFunctionSubtracted->GetYaxis()->SetTitle("#Delta #varphi (rad)");
+    gHistBalanceFunctionSubtracted->GetZaxis()->SetTitle("B(#Delta #eta, #Delta #varphi)");
+  }
+
   TString pngName;
   
   TString centralityLatex = "Centrality: ";
@@ -458,63 +819,700 @@ void drawBFPsi2D(Int_t gCentrality = 1,
 
   TLatex *latexInfo1 = new TLatex();
   latexInfo1->SetNDC();
-  latexInfo1->SetTextSize(0.04);
+  latexInfo1->SetTextSize(0.045);
   latexInfo1->SetTextColor(1);
 
   //Draw the results
   TCanvas *c1 = new TCanvas("c1","Raw balance function 2D",0,0,600,500);
   c1->SetFillColor(10); c1->SetHighLightColor(10);
   c1->SetLeftMargin(0.17); c1->SetTopMargin(0.05);
-  gHistBalanceFunction->SetTitle("Raw balance function");
+  gHistBalanceFunction->SetTitle("");
   gHistBalanceFunction->GetYaxis()->SetTitleOffset(1.4);
   gHistBalanceFunction->GetYaxis()->SetNdivisions(10);
+  gHistBalanceFunction->GetXaxis()->SetRangeUser(-1.4,1.4); 
   gHistBalanceFunction->GetXaxis()->SetNdivisions(10);
+  gHistBalanceFunction->GetYaxis()->SetTitle("#Delta #varphi (rad)");
   gHistBalanceFunction->DrawCopy("lego2");
+  gPad->SetTheta(30); // default is 30
+  gPad->SetPhi(-60); // default is 30
+  gPad->Update();  
+
+  latexInfo1->DrawLatex(0.64,0.88,centralityLatex.Data());
+  latexInfo1->DrawLatex(0.64,0.82,psiLatex.Data());
+  latexInfo1->DrawLatex(0.64,0.76,pttLatex.Data());
+  latexInfo1->DrawLatex(0.64,0.70,ptaLatex.Data());
+
+  TString pngName = "BalanceFunction2D."; 
+  pngName += "Centrality";
+  pngName += gCentrality; 
+  if((psiMin == -0.5)&&(psiMax == 0.5)) pngName += "InPlane.Ptt";
+  else if((psiMin == 0.5)&&(psiMax == 1.5)) pngName += "Intermediate.Ptt";
+  else if((psiMin == 1.5)&&(psiMax == 2.5)) pngName += "OutOfPlane.Ptt";
+  else if((psiMin == 2.5)&&(psiMax == 3.5)) pngName += "Rest.PttFrom";
+  else pngName += "All.PttFrom";  
+  pngName += Form("%.1f",ptTriggerMin); pngName += "To"; 
+  pngName += Form("%.1f",ptTriggerMax); pngName += "PtaFrom";
+  pngName += Form("%.1f",ptAssociatedMin); pngName += "To"; 
+  pngName += Form("%.1f",ptAssociatedMax); 
+  if(k2pMethod) pngName += "_2pMethod";
+  pngName += ".png";
+
+  c1->SaveAs(pngName.Data());
+
+  if(kShowShuffled) {
+    TCanvas *c2 = new TCanvas("c2","Shuffled balance function 2D",100,100,600,500);
+    c2->SetFillColor(10); c2->SetHighLightColor(10);
+    c2->SetLeftMargin(0.17); c2->SetTopMargin(0.05);
+    gHistBalanceFunctionShuffled->SetTitle("Shuffled events");
+    gHistBalanceFunctionShuffled->GetYaxis()->SetTitleOffset(1.4);
+    gHistBalanceFunctionShuffled->GetYaxis()->SetNdivisions(10);
+    gHistBalanceFunctionShuffled->GetXaxis()->SetNdivisions(10);
+    gHistBalanceFunctionShuffled->DrawCopy("lego2");
+    gPad->SetTheta(30); // default is 30
+    gPad->SetPhi(-60); // default is 30
+    gPad->Update();  
 
-  latexInfo1->DrawLatex(0.68,0.88,centralityLatex.Data());
-  latexInfo1->DrawLatex(0.68,0.82,psiLatex.Data());
-  latexInfo1->DrawLatex(0.68,0.76,pttLatex.Data());
-  latexInfo1->DrawLatex(0.68,0.70,ptaLatex.Data());
-
-  TCanvas *c2 = new TCanvas("c2","Shuffled balance function 2D",100,100,600,500);
-  c2->SetFillColor(10); c2->SetHighLightColor(10);
-  c2->SetLeftMargin(0.17); c2->SetTopMargin(0.05);
-  gHistBalanceFunctionShuffled->SetTitle("Shuffled events");
-  gHistBalanceFunctionShuffled->GetYaxis()->SetTitleOffset(1.4);
-  gHistBalanceFunctionShuffled->GetYaxis()->SetNdivisions(10);
-  gHistBalanceFunctionShuffled->GetXaxis()->SetNdivisions(10);
-  gHistBalanceFunctionShuffled->DrawCopy("lego2");
-
-  latexInfo1->DrawLatex(0.68,0.88,centralityLatex.Data());
-  latexInfo1->DrawLatex(0.68,0.82,psiLatex.Data());
-  latexInfo1->DrawLatex(0.68,0.76,pttLatex.Data());
-  latexInfo1->DrawLatex(0.68,0.70,ptaLatex.Data());
-
-  TCanvas *c3 = new TCanvas("c3","Mixed balance function 2D",200,200,600,500);
-  c3->SetFillColor(10); c3->SetHighLightColor(10);
-  c3->SetLeftMargin(0.17); c3->SetTopMargin(0.05);
-  gHistBalanceFunctionMixed->SetTitle("Mixed events");
-  gHistBalanceFunctionMixed->GetYaxis()->SetTitleOffset(1.4);
-  gHistBalanceFunctionMixed->GetYaxis()->SetNdivisions(10);
-  gHistBalanceFunctionMixed->GetXaxis()->SetNdivisions(10);
-  gHistBalanceFunctionMixed->DrawCopy("lego2");
+    latexInfo1->DrawLatex(0.64,0.88,centralityLatex.Data());
+    latexInfo1->DrawLatex(0.64,0.82,psiLatex.Data());
+    latexInfo1->DrawLatex(0.64,0.76,pttLatex.Data());
+    latexInfo1->DrawLatex(0.64,0.70,ptaLatex.Data());
+  }
+
+  if(kShowMixed) {
+    TCanvas *c3 = new TCanvas("c3","Mixed balance function 2D",200,200,600,500);
+    c3->SetFillColor(10); c3->SetHighLightColor(10);
+    c3->SetLeftMargin(0.17); c3->SetTopMargin(0.05);
+    gHistBalanceFunctionMixed->SetTitle("Mixed events");
+    gHistBalanceFunctionMixed->GetYaxis()->SetTitleOffset(1.4);
+    gHistBalanceFunctionMixed->GetYaxis()->SetNdivisions(10);
+    gHistBalanceFunctionMixed->GetXaxis()->SetNdivisions(10);
+    gHistBalanceFunctionMixed->DrawCopy("lego2");
+    gPad->SetTheta(30); // default is 30
+    gPad->SetPhi(-60); // default is 30
+    gPad->Update();  
+
+    latexInfo1->DrawLatex(0.64,0.88,centralityLatex.Data());
+    latexInfo1->DrawLatex(0.64,0.82,psiLatex.Data());
+    latexInfo1->DrawLatex(0.64,0.76,pttLatex.Data());
+    latexInfo1->DrawLatex(0.64,0.70,ptaLatex.Data());
+  }
+
+  if(kShowMixed) {
+    TCanvas *c4 = new TCanvas("c4","Subtracted balance function 2D",300,300,600,500);
+    c4->SetFillColor(10); c4->SetHighLightColor(10);
+    c4->SetLeftMargin(0.17); c4->SetTopMargin(0.05);
+    gHistBalanceFunctionSubtracted->SetTitle("Subtracted balance function");
+    gHistBalanceFunctionSubtracted->GetYaxis()->SetTitleOffset(1.4);
+    gHistBalanceFunctionSubtracted->GetYaxis()->SetNdivisions(10);
+    gHistBalanceFunctionSubtracted->GetXaxis()->SetNdivisions(10);
+    gHistBalanceFunctionSubtracted->DrawCopy("lego2");
+    gPad->SetTheta(30); // default is 30
+    gPad->SetPhi(-60); // default is 30
+    gPad->Update();  
+
+    latexInfo1->DrawLatex(0.64,0.88,centralityLatex.Data());
+    latexInfo1->DrawLatex(0.64,0.82,psiLatex.Data());
+    latexInfo1->DrawLatex(0.64,0.76,pttLatex.Data());
+    latexInfo1->DrawLatex(0.64,0.70,ptaLatex.Data());
+  }
+}
+
+//____________________________________________________________//
+void drawProjections(TH2D *gHistBalanceFunction2D = 0x0,
+                    Bool_t kProjectInEta = kFALSE,
+                    Int_t binMin = 1,
+                    Int_t binMax = 80,
+                    Int_t gCentrality = 1,
+                    Double_t psiMin = -0.5, 
+                    Double_t psiMax = 3.5,
+                    Double_t ptTriggerMin = -1.,
+                    Double_t ptTriggerMax = -1.,
+                    Double_t ptAssociatedMin = -1.,
+                    Double_t ptAssociatedMax = -1.,
+                    Bool_t k2pMethod = kTRUE,
+                    TString eventClass = "Centrality",
+                    Bool_t bRootMoments = kFALSE) {
+  //Macro that draws the balance functions PROJECTIONS 
+  //for each centrality bin for the different pT of trigger and 
+  //associated particles
+  TGaxis::SetMaxDigits(3);
+
+  //first we need some libraries
+  gSystem->Load("libTree");
+  gSystem->Load("libGeom");
+  gSystem->Load("libVMC");
+  gSystem->Load("libXMLIO");
+  gSystem->Load("libPhysics");
+
+  gSystem->Load("libSTEERBase");
+  gSystem->Load("libESD");
+  gSystem->Load("libAOD");
+
+  gSystem->Load("libANALYSIS.so");
+  gSystem->Load("libANALYSISalice.so");
+  gSystem->Load("libEventMixing.so");
+  gSystem->Load("libCORRFW.so");
+  gSystem->Load("libPWGTools.so");
+  gSystem->Load("libPWGCFebye.so");
+
+  gStyle->SetOptStat(0);
+
+  //Get the input file
+  TString filename = "balanceFunction2D."; 
+  if(eventClass == "Centrality"){
+    filename += Form("Centrality%.1fTo%.1f",psiMin,psiMax);
+    filename += ".PsiAll.PttFrom";
+  }
+  else if(eventClass == "Multiplicity"){
+    filename += Form("Multiplicity%.0fTo%.0f",psiMin,psiMax);
+    filename += ".PsiAll.PttFrom";
+  }
+  else{ // "EventPlane" (default)
+    filename += "Centrality";
+    filename += gCentrality; filename += ".Psi";
+    if((psiMin == -0.5)&&(psiMax == 0.5)) filename += "InPlane.Ptt";
+    else if((psiMin == 0.5)&&(psiMax == 1.5)) filename += "Intermediate.Ptt";
+    else if((psiMin == 1.5)&&(psiMax == 2.5)) filename += "OutOfPlane.Ptt";
+    else if((psiMin == 2.5)&&(psiMax == 3.5)) filename += "Rest.PttFrom";
+    else filename += "All.PttFrom";
+  }  
+  filename += Form("%.1f",ptTriggerMin); filename += "To"; 
+  filename += Form("%.1f",ptTriggerMax); filename += "PtaFrom";
+  filename += Form("%.1f",ptAssociatedMin); filename += "To"; 
+  filename += Form("%.1f",ptAssociatedMax); 
+  if(k2pMethod) filename += "_2pMethod";
+
+  filename += "_";
+  filename += Form("%.1f",psiMin); 
+  filename += "-"; 
+  filename += Form("%.1f",psiMax);
+  filename += ".root";
+
+  //Open the file
+  TFile *f = 0x0;
+  if(!gHistBalanceFunction2D) {
+    TFile::Open(filename.Data());
+    if((!f)||(!f->IsOpen())) {
+      Printf("The file %s is not found. Aborting...",filename);
+      return listBF;
+    }
+    //f->ls();
+  }
+
+  //Latex
+  TString centralityLatex = "Centrality: ";
+  centralityLatex += centralityArray[gCentrality-1]; 
+  centralityLatex += "%";
+
+  TString psiLatex;
+  if((psiMin == -0.5)&&(psiMax == 0.5))
+    psiLatex = " -7.5^{o} < #varphi^{t} - #Psi_{2} < 7.5^{o}"; 
+  else if((psiMin == 0.5)&&(psiMax == 1.5))
+    psiLatex = " 37.5^{o} < #varphi^{t} - #Psi_{2} < 52.5^{o}"; 
+  else if((psiMin == 1.5)&&(psiMax == 2.5))
+    psiLatex = " 82.5^{o} < #varphi^{t} - #Psi_{2} < 97.5^{o}"; 
+  else 
+    psiLatex = " 0^{o} < #varphi^{t} - #Psi_{2} < 180^{o}"; 
+  TString pttLatex = Form("%.1f",ptTriggerMin);
+  pttLatex += " < p_{T,trig} < "; pttLatex += Form("%.1f",ptTriggerMax);
+  pttLatex += " GeV/c";
+
+  TString ptaLatex = Form("%.1f",ptAssociatedMin);
+  ptaLatex += " < p_{T,assoc} < "; ptaLatex += Form("%.1f",ptAssociatedMax);
+  ptaLatex += " GeV/c";
+
+  TLatex *latexInfo1 = new TLatex();
+  latexInfo1->SetNDC();
+  latexInfo1->SetTextSize(0.045);
+  latexInfo1->SetTextColor(1);
+
+
+  //============================================================//
+  //Get subtracted and mixed balance function
+  TH2D *gHistBalanceFunctionSubtracted2D = 0x0;
+  TH2D *gHistBalanceFunctionMixed2D      = 0x0;
+  if(!gHistBalanceFunction2D) {
+    gHistBalanceFunctionSubtracted2D = (TH2D*)f->Get("gHistBalanceFunctionSubtracted");
+    gHistBalanceFunctionMixed2D      = (TH2D*)f->Get("gHistBalanceFunctionMixed");
+  }
+  else {
+    gHistBalanceFunctionSubtracted2D = dynamic_cast<TH2D*>(gHistBalanceFunction2D->Clone());
+    gHistBalanceFunctionMixed2D = dynamic_cast<TH2D*>(gHistBalanceFunction2D->Clone());
+  }
+
+  TH1D *gHistBalanceFunctionSubtracted = NULL;
+  TH1D *gHistBalanceFunctionMixed      = NULL;
+
+  TH1D *gHistBalanceFunctionSubtracted_scale = NULL;
+  TH1D *gHistBalanceFunctionMixed_scale      = NULL;
+
+  if(kProjectInEta){
+    gHistBalanceFunctionSubtracted = dynamic_cast<TH1D *>(gHistBalanceFunctionSubtracted2D->ProjectionX("gHistBalanceFunctionSubtractedEta",binMin,binMax));
+    gHistBalanceFunctionSubtracted->Scale(gHistBalanceFunctionSubtracted2D->GetYaxis()->GetBinWidth(1));   // to remove normalization to phi bin width
+    gHistBalanceFunctionMixed      = dynamic_cast<TH1D *>(gHistBalanceFunctionMixed2D->ProjectionX("gHistBalanceFunctionMixedEta",binMin,binMax));
+    gHistBalanceFunctionMixed->Scale(gHistBalanceFunctionMixed2D->GetYaxis()->GetBinWidth(1));   // to remove normalization to phi bin width
+    gHistBalanceFunctionSubtracted->SetTitle("B(#Delta#eta)");
+    gHistBalanceFunctionMixed->SetTitle("B_{mix}(#Delta#eta)");  
+  }
+  else{
+    gHistBalanceFunctionSubtracted = dynamic_cast<TH1D *>(gHistBalanceFunctionSubtracted2D->ProjectionY("gHistBalanceFunctionSubtractedPhi",binMin,binMax));
+    gHistBalanceFunctionSubtracted->Scale(gHistBalanceFunctionSubtracted2D->GetXaxis()->GetBinWidth(1));   // to remove normalization to eta bin width
+    gHistBalanceFunctionMixed      = dynamic_cast<TH1D *>(gHistBalanceFunctionMixed2D->ProjectionY("gHistBalanceFunctionMixedPhi",binMin,binMax));
+    gHistBalanceFunctionMixed->Scale(gHistBalanceFunctionMixed2D->GetXaxis()->GetBinWidth(1));   // to remove normalization to eta bin width
+    gHistBalanceFunctionSubtracted->SetTitle("B(#Delta#varphi)");
+    gHistBalanceFunctionMixed->SetTitle("B_{mix}(#Delta#varphi)");  
+  }
+
+  gHistBalanceFunctionSubtracted->SetMarkerStyle(20);
+  gHistBalanceFunctionSubtracted->GetYaxis()->SetTitleOffset(1.3);
+
+  gHistBalanceFunctionMixed->SetMarkerStyle(25);
+
+  TCanvas *c1 = new TCanvas("c1","",0,0,600,500);
+  c1->SetFillColor(10); 
+  c1->SetHighLightColor(10);
+  c1->SetLeftMargin(0.15);
+  gHistBalanceFunctionSubtracted->DrawCopy("E");
+  gHistBalanceFunctionMixed->DrawCopy("ESAME");
   
-  latexInfo1->DrawLatex(0.68,0.88,centralityLatex.Data());
-  latexInfo1->DrawLatex(0.68,0.82,psiLatex.Data());
-  latexInfo1->DrawLatex(0.68,0.76,pttLatex.Data());
-  latexInfo1->DrawLatex(0.68,0.70,ptaLatex.Data());
+  legend = new TLegend(0.18,0.62,0.45,0.82,"","brNDC");
+  legend->SetTextSize(0.045); 
+  legend->SetTextFont(42); 
+  legend->SetBorderSize(0);
+  legend->SetFillStyle(0); 
+  legend->SetFillColor(10);
+  legend->SetMargin(0.25); 
+  legend->SetShadowColor(10);
+  legend->AddEntry(gHistBalanceFunctionSubtracted,"Data","lp");
+  legend->AddEntry(gHistBalanceFunctionMixed,"Mixed data","lp");
+  legend->Draw();
+  
+
+  TString meanLatex, rmsLatex, skewnessLatex, kurtosisLatex;
+
+  if(bRootMoments){
+    meanLatex = "#mu = "; 
+    meanLatex += Form("%.3f",gHistBalanceFunctionSubtracted->GetMean());
+    meanLatex += " #pm "; 
+    meanLatex += Form("%.3f",gHistBalanceFunctionSubtracted->GetMeanError());
     
-  TCanvas *c4 = new TCanvas("c4","Subtracted balance function 2D",300,300,600,500);
-  c4->SetFillColor(10); c4->SetHighLightColor(10);
-  c4->SetLeftMargin(0.17); c4->SetTopMargin(0.05);
-  gHistBalanceFunctionSubtracted->SetTitle("Subtracted balance function");
-  gHistBalanceFunctionSubtracted->GetYaxis()->SetTitleOffset(1.4);
-  gHistBalanceFunctionSubtracted->GetYaxis()->SetNdivisions(10);
-  gHistBalanceFunctionSubtracted->GetXaxis()->SetNdivisions(10);
-  gHistBalanceFunctionSubtracted->DrawCopy("lego2");
-
-  latexInfo1->DrawLatex(0.68,0.88,centralityLatex.Data());
-  latexInfo1->DrawLatex(0.68,0.82,psiLatex.Data());
-  latexInfo1->DrawLatex(0.68,0.76,pttLatex.Data());
-  latexInfo1->DrawLatex(0.68,0.70,ptaLatex.Data());
+    rmsLatex = "#sigma = "; 
+    rmsLatex += Form("%.3f",gHistBalanceFunctionSubtracted->GetRMS());
+    rmsLatex += " #pm "; 
+    rmsLatex += Form("%.3f",gHistBalanceFunctionSubtracted->GetRMSError());
+    
+    skewnessLatex = "S = "; 
+    skewnessLatex += Form("%.3f",gHistBalanceFunctionSubtracted->GetSkewness(1));
+    skewnessLatex += " #pm "; 
+    skewnessLatex += Form("%.3f",gHistBalanceFunctionSubtracted->GetSkewness(11));
+    
+    kurtosisLatex = "K = "; 
+    kurtosisLatex += Form("%.3f",gHistBalanceFunctionSubtracted->GetKurtosis(1));
+    kurtosisLatex += " #pm "; 
+    kurtosisLatex += Form("%.3f",gHistBalanceFunctionSubtracted->GetKurtosis(11));
+    
+    Printf("Mean: %lf - Error: %lf",gHistBalanceFunctionSubtracted->GetMean(),gHistBalanceFunctionSubtracted->GetMeanError());
+    Printf("RMS: %lf - Error: %lf",gHistBalanceFunctionSubtracted->GetRMS(),gHistBalanceFunctionSubtracted->GetRMSError());
+    Printf("Skeweness: %lf - Error: %lf",gHistBalanceFunctionSubtracted->GetSkewness(1),gHistBalanceFunctionSubtracted->GetSkewness(11));
+    Printf("Kurtosis: %lf - Error: %lf",gHistBalanceFunctionSubtracted->GetKurtosis(1),gHistBalanceFunctionSubtracted->GetKurtosis(11));
+
+
+    // store in txt files
+    TString meanFileName = filename;
+    if(kProjectInEta) 
+      meanFileName= "deltaEtaProjection_Mean.txt";
+    //meanFileName.ReplaceAll(".root","_DeltaEtaProjection_Mean.txt");
+    else              
+      meanFileName = "deltaPhiProjection_Mean.txt";
+      //meanFileName.ReplaceAll(".root","_DeltaPhiProjection_Mean.txt");
+    ofstream fileMean(meanFileName.Data(),ios::app);
+    fileMean << " " << gHistBalanceFunctionSubtracted->GetMean() << " " <<gHistBalanceFunctionSubtracted->GetMeanError()<<endl;
+    fileMean.close();
+
+    TString rmsFileName = filename;
+    if(kProjectInEta) 
+      rmsFileName = "deltaEtaProjection_Rms.txt";
+      //rmsFileName.ReplaceAll(".root","_DeltaEtaProjection_Rms.txt");
+    else              
+      rmsFileName = "deltaPhiProjection_Rms.txt");
+      //rmsFileName.ReplaceAll(".root","_DeltaPhiProjection_Rms.txt");
+    ofstream fileRms(rmsFileName.Data(),ios::app);
+    fileRms << " " << gHistBalanceFunctionSubtracted->GetRMS() << " " <<gHistBalanceFunctionSubtracted->GetRMSError()<<endl;
+    fileRms.close();
+
+    TString skewnessFileName = filename;
+    if(kProjectInEta) 
+      skewnessFileName = "deltaEtaProjection_Skewness.txt";
+      //skewnessFileName.ReplaceAll(".root","_DeltaEtaProjection_Skewness.txt");
+    else              
+      skewnessFileName = "deltaPhiProjection_Skewness.txt";
+    //skewnessFileName.ReplaceAll(".root","_DeltaPhiProjection_Skewness.txt");
+    ofstream fileSkewness(skewnessFileName.Data(),ios::app);
+    fileSkewness << " " << gHistBalanceFunctionSubtracted->GetSkewness(1) << " " <<gHistBalanceFunctionSubtracted->GetSkewness(11)<<endl;
+    fileSkewness.close();
+
+    TString kurtosisFileName = filename;
+    if(kProjectInEta) 
+      kurtosisFileName = "deltaEtaProjection_Kurtosis.txt";
+      //kurtosisFileName.ReplaceAll(".root","_DeltaEtaProjection_Kurtosis.txt");
+    else
+      kurtosisFileName = "deltaPhiProjection_Kurtosis.txt";              
+      //kurtosisFileName.ReplaceAll(".root","_DeltaPhiProjection_Kurtosis.txt");
+    ofstream fileKurtosis(kurtosisFileName.Data(),ios::app);
+    fileKurtosis << " " << gHistBalanceFunctionSubtracted->GetKurtosis(1) << " " <<gHistBalanceFunctionSubtracted->GetKurtosis(11)<<endl;
+    fileKurtosis.close();
+  }
+  // calculate the moments by hand
+  else{
+
+    Double_t meanAnalytical, meanAnalyticalError;
+    Double_t sigmaAnalytical, sigmaAnalyticalError;
+    Double_t skewnessAnalytical, skewnessAnalyticalError;
+    Double_t kurtosisAnalytical, kurtosisAnalyticalError;
+
+    Int_t gDeltaEtaPhi = 2;
+    if(kProjectInEta) gDeltaEtaPhi = 1;
+
+    AliBalancePsi *bHelper = new AliBalancePsi;
+    bHelper->GetMomentsAnalytical(gDeltaEtaPhi,gHistBalanceFunctionSubtracted,meanAnalytical,meanAnalyticalError,sigmaAnalytical,sigmaAnalyticalError,skewnessAnalytical,skewnessAnalyticalError,kurtosisAnalytical,kurtosisAnalyticalError);
+
+    meanLatex = "#mu = "; 
+    meanLatex += Form("%.3f",meanAnalytical);
+    meanLatex += " #pm "; 
+    meanLatex += Form("%.3f",meanAnalyticalError);
+    
+    rmsLatex = "#sigma = "; 
+    rmsLatex += Form("%.3f",sigmaAnalytical);
+    rmsLatex += " #pm "; 
+    rmsLatex += Form("%.3f",sigmaAnalyticalError);
+    
+    skewnessLatex = "S = "; 
+    skewnessLatex += Form("%.3f",skewnessAnalytical);
+    skewnessLatex += " #pm "; 
+    skewnessLatex += Form("%.3f",skewnessAnalyticalError);
+    
+    kurtosisLatex = "K = "; 
+    kurtosisLatex += Form("%.3f",kurtosisAnalytical);
+    kurtosisLatex += " #pm "; 
+    kurtosisLatex += Form("%.3f",kurtosisAnalyticalError);
+    Printf("Mean: %lf - Error: %lf",meanAnalytical, meanAnalyticalError);
+    Printf("Sigma: %lf - Error: %lf",sigmaAnalytical, sigmaAnalyticalError);
+    Printf("Skeweness: %lf - Error: %lf",skewnessAnalytical, skewnessAnalyticalError);
+    Printf("Kurtosis: %lf - Error: %lf",kurtosisAnalytical, kurtosisAnalyticalError);
+
+    // store in txt files
+    TString meanFileName = filename;
+    if(kProjectInEta) 
+      meanFileName = "deltaEtaProjection_Mean.txt";
+      //meanFileName.ReplaceAll(".root","_DeltaEtaProjection_Mean.txt");
+    else              
+      meanFileName = "deltaPhiProjection_Mean.txt";
+      //meanFileName.ReplaceAll(".root","_DeltaPhiProjection_Mean.txt");
+    ofstream fileMean(meanFileName.Data(),ios::app);
+    fileMean << " " << meanAnalytical << " " <<meanAnalyticalError<<endl;
+    fileMean.close();
+
+    TString rmsFileName = filename;
+    if(kProjectInEta) 
+      rmsFileName = "deltaEtaProjection_Rms.txt";
+      //rmsFileName.ReplaceAll(".root","_DeltaEtaProjection_Rms.txt");
+    else              
+      rmsFileName = "deltaPhiProjection_Rms.txt";
+//rmsFileName.ReplaceAll(".root","_DeltaPhiProjection_Rms.txt");
+    ofstream fileRms(rmsFileName.Data(),ios::app);
+    fileRms << " " << sigmaAnalytical << " " <<sigmaAnalyticalError<<endl;
+    fileRms.close();
+
+    TString skewnessFileName = filename;
+    if(kProjectInEta) 
+      skewnessFileName = "deltaEtaProjection_Skewness.txt";
+      //skewnessFileName.ReplaceAll(".root","_DeltaEtaProjection_Skewness.txt");
+    else              
+      skewnessFileName = "deltaPhiProjection_Skewness.txt";
+      //skewnessFileName.ReplaceAll(".root","_DeltaPhiProjection_Skewness.txt");
+    ofstream fileSkewness(skewnessFileName.Data(),ios::app);
+    fileSkewness << " " << skewnessAnalytical << " " <<skewnessAnalyticalError<<endl;
+    fileSkewness.close();
+
+    TString kurtosisFileName = filename;
+    if(kProjectInEta) 
+      kurtosisFileName = "deltaEtaProjection_Kurtosis.txt";
+      //kurtosisFileName.ReplaceAll(".root","_DeltaEtaProjection_Kurtosis.txt");
+    else              
+      kurtosisFileName = "deltaPhiProjection_Kurtosis.txt";
+      //kurtosisFileName.ReplaceAll(".root","_DeltaPhiProjection_Kurtosis.txt");
+    ofstream fileKurtosis(kurtosisFileName.Data(),ios::app);
+    fileKurtosis << " " << kurtosisAnalytical << " " <<kurtosisAnalyticalError<<endl;
+    fileKurtosis.close();
+  }
+
+  // Weighted mean as calculated for 1D analysis
+  Double_t weightedMean, weightedMeanError;
+  GetWeightedMean1D(gHistBalanceFunctionSubtracted,kProjectInEta,1,-1,weightedMean,weightedMeanError);
+  Printf("Weighted Mean: %lf - Error: %lf",weightedMean, weightedMeanError);
+  // store in txt files
+  TString weightedMeanFileName = filename;
+  if(kProjectInEta) 
+    weightedMeanFileName = "deltaEtaProjection_WeightedMean.txt";
+    //weightedMeanFileName.ReplaceAll(".root","_DeltaEtaProjection_WeightedMean.txt");
+  else              
+    weightedMeanFileName = "deltaPhiProjection_WeightedMean.txt";
+    //weightedMeanFileName.ReplaceAll(".root","_DeltaPhiProjection_WeightedMean.txt");
+  ofstream fileWeightedMean(weightedMeanFileName.Data(),ios::app);
+  fileWeightedMean << " " << weightedMean << " " <<weightedMeanError<<endl;
+  fileWeightedMean.close();
+
+
+  TCanvas *c2 = new TCanvas("c2","",600,0,600,500);
+  c2->SetFillColor(10); 
+  c2->SetHighLightColor(10);
+  c2->SetLeftMargin(0.15);
+  gHistBalanceFunctionSubtracted->DrawCopy("E");
+  TLatex *latex = new TLatex();
+  latex->SetNDC();
+  latex->SetTextSize(0.035);
+  latex->SetTextColor(1);
+  latex->DrawLatex(0.64,0.85,meanLatex.Data());
+  latex->DrawLatex(0.64,0.81,rmsLatex.Data());
+  latex->DrawLatex(0.64,0.77,skewnessLatex.Data());
+  latex->DrawLatex(0.64,0.73,kurtosisLatex.Data());
+
+  TString pngName = filename;
+  if(kProjectInEta) pngName.ReplaceAll(".root","_DeltaEtaProjection.png");
+  else              pngName.ReplaceAll(".root","_DeltaPhiProjection.png");
+
+  c2->SaveAs(pngName.Data());
+
+  TString outFileName = filename;
+  if(kProjectInEta) outFileName.ReplaceAll(".root","_DeltaEtaProjection.root");
+  else              outFileName.ReplaceAll(".root","_DeltaPhiProjection.root");
+  TFile *fProjection = TFile::Open(outFileName.Data(),"recreate");  
+  gHistBalanceFunctionSubtracted->Write();
+  gHistBalanceFunctionMixed->Write();
+  fProjection->Close();
+}
+
+//____________________________________________________________//
+void drawBFPsi2DFromCorrelationFunctions(const char* lhcPeriod = "LHC10h",
+                                        Int_t gTrainNumber = 64,
+                                        const char* gCentralityEstimator = "V0M",
+                                        Int_t gBit = 128,
+                                        const char* gEventPlaneEstimator = "VZERO",
+                                        Int_t gCentrality = 1,
+                                        Double_t psiMin = -0.5, Double_t psiMax = 3.5,
+                                        Double_t vertexZMin = -10.,
+                                        Double_t vertexZMax = 10.,
+                                        Double_t ptTriggerMin = -1.,
+                                        Double_t ptTriggerMax = -1.,
+                                        Double_t ptAssociatedMin = -1.,
+                                        Double_t ptAssociatedMax = -1.,
+                                        TString eventClass = "Multiplicity"
+) {
+  //Macro that draws the BF distributions for each centrality bin
+  //for reaction plane dependent analysis
+  //Author: Panos.Christakoglou@nikhef.nl
+  TGaxis::SetMaxDigits(3);
+  gStyle->SetPalette(55,0);
+
+  //Get the input file
+  TString filename = lhcPeriod; 
+  if(lhcPeriod != ""){
+    //filename += "/Train"; filename += gTrainNumber;
+    filename +="/PttFrom";
+    filename += Form("%.1f",ptTriggerMin); filename += "To"; 
+    filename += Form("%.1f",ptTriggerMax); filename += "PtaFrom";
+    filename += Form("%.1f",ptAssociatedMin); filename += "To"; 
+    filename += Form("%.1f",ptAssociatedMax); 
+    filename += "/correlationFunction.";
+  }
+  else{
+    filename += "correlationFunction.";
+  }
+  if(eventClass == "Centrality"){
+    filename += Form("Centrality%.1fTo%.1f",psiMin,psiMax);
+    filename += ".PsiAll.PttFrom";
+  }
+  else if(eventClass == "Multiplicity"){
+    filename += Form("Multiplicity%.0fTo%.0f",psiMin,psiMax);
+    filename += ".PsiAll.PttFrom";
+  }
+  else{ // "EventPlane" (default)
+    filename += "Centrality";
+    filename += gCentrality; filename += ".Psi";
+    if((psiMin == -0.5)&&(psiMax == 0.5)) filename += "InPlane.Ptt";
+    else if((psiMin == 0.5)&&(psiMax == 1.5)) filename += "Intermediate.Ptt";
+    else if((psiMin == 1.5)&&(psiMax == 2.5)) filename += "OutOfPlane.Ptt";
+    else if((psiMin == 2.5)&&(psiMax == 3.5)) filename += "Rest.PttFrom";
+    else filename += "All.PttFrom";
+  }  
+  filename += Form("%.1f",ptTriggerMin); filename += "To"; 
+  filename += Form("%.1f",ptTriggerMax); filename += "PtaFrom";
+  filename += Form("%.1f",ptAssociatedMin); filename += "To"; 
+  filename += Form("%.1f",ptAssociatedMax); 
+  filename += "_";
+  filename += Form("%.1f",psiMin);
+  filename += "-";
+  filename += Form("%.1f",psiMax);
+  filename += ".root";  
+
+  //Open the file
+  TFile *f = TFile::Open(filename.Data());
+  if((!f)||(!f->IsOpen())) {
+    Printf("The file %s is not found. Aborting...",filename);
+    return listBF;
+  }
+  //f->ls();
+
+  TH2D *gHistPN = dynamic_cast<TH2D *>(f->Get("gHistPNCorrelationFunctions"));
+  if(!gHistPN) return;
+  TH2D *gHistNP = dynamic_cast<TH2D *>(f->Get("gHistNPCorrelationFunctions"));
+  if(!gHistNP) return;
+  TH2D *gHistPP = dynamic_cast<TH2D *>(f->Get("gHistPPCorrelationFunctions"));
+  if(!gHistPP) return;
+  TH2D *gHistNN = dynamic_cast<TH2D *>(f->Get("gHistNNCorrelationFunctions"));
+  if(!gHistNN) return;
+
+  gHistPN->Sumw2();
+  gHistPP->Sumw2();
+  gHistPN->Add(gHistPP,-1);
+  gHistNP->Sumw2();
+  gHistNN->Sumw2();
+  gHistNP->Add(gHistNN,-1);
+  gHistPN->Add(gHistNP);
+  gHistPN->Scale(0.5);
+  TH2D *gHistBalanceFunction2D = dynamic_cast<TH2D *>(gHistPN->Clone());
+  gHistBalanceFunction2D->SetStats(kFALSE);
+  gHistBalanceFunction2D->GetXaxis()->SetTitle("#Delta#eta");
+  gHistBalanceFunction2D->GetYaxis()->SetTitle("#Delta#varphi (rad)");
+  gHistBalanceFunction2D->GetZaxis()->SetTitle("B(#Delta#eta,#Delta#varphi)");
+
+  //Draw the results
+  TCanvas *c0 = new TCanvas("c0","Balance function 2D",0,0,600,500);
+  c0->SetFillColor(10); c0->SetHighLightColor(10);
+  c0->SetLeftMargin(0.17); c0->SetTopMargin(0.05);
+  gHistBalanceFunction2D->SetTitle("");
+  gHistBalanceFunction2D->GetZaxis()->SetTitleOffset(1.4);
+  gHistBalanceFunction2D->GetZaxis()->SetNdivisions(10);
+  gHistBalanceFunction2D->GetYaxis()->SetTitleOffset(1.4);
+  gHistBalanceFunction2D->GetYaxis()->SetNdivisions(10);
+  gHistBalanceFunction2D->GetXaxis()->SetRangeUser(-1.4,1.4); 
+  gHistBalanceFunction2D->GetXaxis()->SetNdivisions(10);
+  gHistBalanceFunction2D->DrawCopy("lego2");
+  gPad->SetTheta(30); // default is 30
+  gPad->SetPhi(-60); // default is 30
+  gPad->Update();  
+  TString multLatex = Form("Multiplicity: %.1f - %.1f",psiMin,psiMax);
+
+  TString pttLatex = Form("%.1f",ptTriggerMin);
+  pttLatex += " < p_{T}^{t} < "; pttLatex += Form("%.1f",ptTriggerMax);
+  pttLatex += " GeV/c";
+
+  TString ptaLatex = Form("%.1f",ptAssociatedMin);
+  ptaLatex += " < p_{T}^{a} < "; ptaLatex += Form("%.1f",ptAssociatedMax);
+  ptaLatex += " GeV/c";
+
+  TLatex *latexInfo1 = new TLatex();
+  latexInfo1->SetNDC();
+  latexInfo1->SetTextSize(0.045);
+  latexInfo1->SetTextColor(1);
+  latexInfo1->DrawLatex(0.54,0.88,multLatex.Data());
+  latexInfo1->DrawLatex(0.54,0.82,pttLatex.Data());
+  latexInfo1->DrawLatex(0.54,0.76,ptaLatex.Data());
+
+  TString pngName = "BalanceFunction2D."; 
+  pngName += Form("%s: %.1f - %.1f",eventClass.Data(),psiMin,psiMax);
+  pngName += ".PttFrom";  
+  pngName += Form("%.1f",ptTriggerMin); pngName += "To"; 
+  pngName += Form("%.1f",ptTriggerMax); pngName += "PtaFrom";
+  pngName += Form("%.1f",ptAssociatedMin); pngName += "To"; 
+  pngName += Form("%.1f",ptAssociatedMax); 
+  pngName += ".png";
+
+  c0->SaveAs(pngName.Data());
+
+  drawProjections(gHistBalanceFunction2D,
+                 kTRUE,
+                 1,36,
+                 gCentrality,
+                 psiMin,psiMax,
+                 ptTriggerMin,ptTriggerMax,
+                 ptAssociatedMin,ptAssociatedMax,
+                 kTRUE,
+                 eventClass,
+                 kFALSE);
+
+  drawProjections(gHistBalanceFunction2D,
+                 kFALSE,
+                 1,80,
+                 gCentrality,
+                 psiMin,psiMax,
+                 ptTriggerMin,ptTriggerMax,
+                 ptAssociatedMin,ptAssociatedMax,
+                 kTRUE,
+                 eventClass.Data(),
+                 kFALSE);
+
+  TString outFileName = filename;
+  outFileName.ReplaceAll("correlationFunction","balanceFunction2D");
+  gHistBalanceFunction2D->SetName("gHistBalanceFunctionSubtracted");
+  TFile *fOut = TFile::Open(outFileName.Data(),"recreate");  
+  gHistBalanceFunction2D->Write();
+  fOut->Close();
+  
 }
+
+//____________________________________________________________________//
+void GetWeightedMean1D(TH1D *gHistBalance, Bool_t kProjectInEta = kTRUE, Int_t fStartBin = 1, Int_t fStopBin = -1, Double_t &WM, Double_t &WME) {
+
+  //Prints the calculated width of the BF and its error
+  Double_t gSumXi = 0.0, gSumBi = 0.0, gSumBiXi = 0.0;
+  Double_t gSumBiXi2 = 0.0, gSumBi2Xi2 = 0.0;
+  Double_t gSumDeltaBi2 = 0.0, gSumXi2DeltaBi2 = 0.0;
+  Double_t deltaBalP2 = 0.0, integral = 0.0;
+  Double_t deltaErrorNew = 0.0;
+
+  //Retrieve this variables from Histogram
+  Int_t fNumberOfBins = gHistBalance->GetNbinsX();
+  if(fStopBin > -1)   fNumberOfBins = fStopBin;
+  Double_t fP2Step    = gHistBalance->GetBinWidth(1); // assume equal binning!
+  Double_t currentBinCenter = 0.;
+
+  for(Int_t i = fStartBin; i <= fNumberOfBins; i++) {
+
+    // in order to recover the |abs| in the 1D analysis
+    currentBinCenter = gHistBalance->GetBinCenter(i);
+    if(kProjectInEta){
+      if(currentBinCenter < 0) currentBinCenter = -currentBinCenter;
+    }
+    else{
+      if(currentBinCenter < 0) currentBinCenter = -currentBinCenter;
+      if(currentBinCenter > TMath::Pi()) currentBinCenter = 2 * TMath::Pi() - currentBinCenter;
+    }
+
+    gSumXi += currentBinCenter;
+    gSumBi += gHistBalance->GetBinContent(i);
+    gSumBiXi += gHistBalance->GetBinContent(i)*currentBinCenter;
+    gSumBiXi2 += gHistBalance->GetBinContent(i)*TMath::Power(currentBinCenter,2);
+    gSumBi2Xi2 += TMath::Power(gHistBalance->GetBinContent(i),2)*TMath::Power(currentBinCenter,2);
+    gSumDeltaBi2 +=  TMath::Power(gHistBalance->GetBinError(i),2);
+    gSumXi2DeltaBi2 += TMath::Power(currentBinCenter,2) * TMath::Power(gHistBalance->GetBinError(i),2);
+    
+    deltaBalP2 += fP2Step*TMath::Power(gHistBalance->GetBinError(i),2);
+    integral += fP2Step*gHistBalance->GetBinContent(i);
+  }
+  for(Int_t i = fStartBin; i < fNumberOfBins; i++)
+    deltaErrorNew += gHistBalance->GetBinError(i)*(currentBinCenter*gSumBi - gSumBiXi)/TMath::Power(gSumBi,2);
+  
+  Double_t integralError = TMath::Sqrt(deltaBalP2);
+  
+  Double_t delta = gSumBiXi / gSumBi;
+  Double_t deltaError = (gSumBiXi / gSumBi) * TMath::Sqrt(TMath::Power((TMath::Sqrt(gSumXi2DeltaBi2)/gSumBiXi),2) + TMath::Power((gSumDeltaBi2/gSumBi),2) );
+  
+  WM  = delta;
+  WME = deltaError;
+}
+