ROOT logo
// Useful on the prompt:
// TH2* h = (TH2*)Cont_cloizide_DhcAna->FindObject("hS482"); h->Draw("surf1"); h->Integral()
// To quickly count events:
// TH2* h = (TH2*)Cont_cloizide_DhcAna->FindObject("fHEvt");
// h->Draw("colz"); h->Integral()
// TH1D* hc = h->ProjectionY("hc"); hc->Draw();                                             
// hc->Integral(1, 90)

bool ispp = 1;

#include "TH1.h"
#include "TH2.h"
#include "TF1.h"
#include "TFile.h"
#include "TGraphErrors.h"
#include "TCanvas.h"
#include "TString.h"
#include "TLatex.h"
#include "TSystem.h"
#include "TTimeStamp.h"
#include "TStopwatch.h"
#include "TStyle.h"
#include "TMath.h"
#include "TKey.h"
#include "TROOT.h"
#include "TCutG.h"
#include "TFormula.h"
#include "TProfile2D.h"

TFile* inFile  = new TFile("$MYDATA/lhc11a_28nov2011_sum.root", "read"); 
TFile* outFile = 0;
TString listName = "Cont_cloizide_DhcAna";

// histograms
const int maxHists  = 99999;
TH2 *sHists[maxHists];
TH2 *mHists[maxHists];
TH2 *cHists[maxHists];
TH2 *hEvt  = 0;
TH2 *hTrk  = 0;
TH1 *hDefi = 0; //fHPtTrg
TH1 *hDefj = 0; //fHPtAss
TH1 *hDefk = 0; //fHCent
TH1 *hDefz = 0; //fHZvtx
TFormula *fIndex = 0;

// The angular regions defining the 1d projections. The arrays
// k{Phi,Eta}{Min,Max}[] define these regions.
const int kNRegions = 5;
const char* regionStr[] = 
  {"NSJET", "RIDGE", "ALL", "ETA_NS", "ETA_AS"};
enum eRegion {NSJET, RIDGE, ALL, ETA_NS, ETA_AS};

// Correlation types:
// 0. Same 
// 1. Mixed 
// 2. CF def "A" (proj 2Ds to dphi then divide)
// 3. CF def "B" (divide 2D's, then project to dhpi). The def. B CFs
// already exist in the input file, just pass them through to the new
// output file, renaming "c" --> "cB".
const int nCorrTypes = 4;
enum eCorrType {kS=0, kM=1, kCA=2, kCB=3};
TString sCorrType[] = {"s","m","c","c"};

// There are two sets of centrality binning: the cbh bins are the
// original ones from the task. The cb1,2 bins are a superset
// including cbh1,2 + any desired combinations. In Loop 2 (the
// cent. combination loop), cb1,2 are indexed as "k", while cbh1,2 are
// indexed as "cb". If no combined bins are needed, Loop 2 just copies
// the existing bins to the output file.

// Binning for gsi03+ generation (TH2 train output)
int nCentBins = 19; // 10 orig + 8 new combined bins
double cb1[] =  {0, 0, 0,2,2, 1,3,0,    0, 1, 2, 3, 4,  5, 10, 20, 30, 40, 60 };
double cb2[] =  {10,20,2,5,10,3,5,5,    1, 2, 3, 4, 5, 10, 20, 30, 40, 50, 90 };

// Just for reference, this should be equivalent to cbh1,2[] in gsi03:
// double cb1[] =  { 0, 1, 2, 3, 4,  5, 10, 20, 30, 40 };
// double cb2[] =  { 1, 2, 3, 4, 5, 10, 20, 30, 40, 50 };

int nZbins = 0;        // zvtx binning from task - read from input file
double z1[99]   = { 0 };
double z2[99]   = { 0 };
int nCentBinsHist = 0; // The exact binning from task - read from input file
double cbh1[99] =  { 0 };
double cbh2[99] =  { 0 };

int colors[] = {kYellow+2, kOrange+2, kBlack, kMagenta, kRed, kOrange, 
		kGreen+2, kCyan, kBlue, kViolet, kGray};

// TGraphs to contain complete bin information. Convention: i,j,k,z
// always means pt_trig, pt_assoc, centrality, and z_vtx bin index,
// respectively.
TGraphErrors *gi, *gj, *gk, *gz;
TObjArray* hists = new TObjArray();
TObjArray* profs = new TObjArray(); // profiles storing <pt> info

// Histos used to compute weight factors for summation.
TH1D* hz[101]; // z-vertex dist. at each cent bin
TH1D* hcent = 0; // No longer used - can remove.

double kPhiMin[kNRegions];
double kPhiMax[kNRegions];
double kEtaMin[kNRegions];
double kEtaMax[kNRegions];

// Reassign as fn. arguments
Double_t dEtaOuter = 1.799;
Double_t dEtaInner = 0.8;

// Functions ---------------------------------------------------------
const char* Region(int r);
char* BinLabel(int ijk, int i);
TGraphErrors* BinGraph(int ijk);
void PrintBins();
TObjArray* GetHistList(TFile& fromfile, TString clname, TString dir);
void MakeWeightHistos();
TH1* ProjectTH2(TH2& h, TString xy, float x1, float y1, float x2, float y2,
	   TString name, TString opt);
void LoadHistos();
TH2 *GetHist(int i, int j, int z, int k, char type);

// Implementation ----------------------------------------------------
void MakeWeightHistos()
{
  // make a z-vertex distribution for each centrality bin
  for (int cb=0; cb<nCentBinsHist; cb++) {
    TAxis* ax = hEvt->GetYaxis();
    int bin1 = ax->FindBin(cbh1[cb]);
    int bin2 = ax->FindBin(cbh2[cb]-0.001);

    hz[cb] = hEvt->ProjectionX(Form("hz%d", cb), bin1, bin2);

    if (0)
      hz[cb]->Draw(cb==0? "" : "same");

    // now filled from file
    // hcent->SetBinContent(cb+1, hz[cb]->Integral());
    // hcent->GetXaxis()->SetBinLabel(cb+1,Form("%.2g-%.2g", cbh1[cb],cbh2[cb]));
  }

  //gk->Draw("aep");
  return;
}

void LoadHistos()
{
  if (!inFile) {
    Error("LoadHistos()","TFile ptr zero");
    gSystem->Exit(123);
  }

  TList *list = 0;
  if (ispp) 
    list = (TList*)inFile->Get("Cont_loizides_DhcAna");
  else
    list = (TList*)inFile->Get("Cont_cloizide_DhcAna");
  if (!list) {
    Error("LoadHistos()","TList ptr zero");
    gSystem->Exit(123);
  }

  hEvt = (TH2*)list->FindObject("fHEvt");
  hTrk = (TH2*)list->FindObject("fHTrk");
  if (!hEvt)
    Error("LoadHistos()", "!hEvt");
  if (!hTrk)
    Error("LoadHistos()", "!hTrk");

  hDefi   = (TH1*)list->FindObject("fHPtTrg");
  hDefj   = (TH1*)list->FindObject("fHPtAss");
  hDefk   = (TH1*)list->FindObject("fHCent");
  hDefz   = (TH1*)list->FindObject("fHZvtx");

  gi = new TGraphErrors();
  gj = new TGraphErrors();
  gk = new TGraphErrors();
  gz = new TGraphErrors();
  gi->SetName("TrigPtBins");
  gj->SetName("AsscPtBins");
  gk->SetName("EvCentBins");
  gz->SetName("EvZvtxBins");

  for (int i=0; i<hDefi->GetNbinsX(); i++) {
    gi->SetPoint(i, hDefi->GetBinCenter(i+1), 1.0);
    gi->SetPointError(i, 0.5*hDefi->GetBinWidth(i+1), 0);
  }
  for (int i=0; i<hDefj->GetNbinsX(); i++) {
    gj->SetPoint(i, hDefj->GetBinCenter(i+1), 1.0);
    gj->SetPointError(i, 0.5*hDefj->GetBinWidth(i+1), 0);
  }
  nCentBinsHist = hDefk->GetNbinsX();
  for (int i=0; i<hDefk->GetNbinsX(); i++) {
    cbh1[i] = hDefk->GetBinLowEdge(i+1);
    cbh2[i] = hDefk->GetBinLowEdge(i+2);
  }

  // Get TProfiles with <pt> and <pt^2> info into memory
  for (int n=0; n<list->GetEntries(); n++) {
    TObject* obj = list->At(n);
    TString clName = obj->ClassName();
    if (clName.Contains("TProfile")) {
      profs->Add(obj);
    }
  }

  //  hcent = new TH1D("hcent", "hcent", nCentBinsHist,0,nCentBinsHist);

  for (int i=0; i<nCentBins; i++) {
    gk->SetPoint(i, (cb1[i]+cb2[i])/2., 1.0);
    gk->SetPointError(i, TMath::Abs(cb2[i]-cb1[i])/2, 0);
    //cout << i << " " <<  (cb1[i]+cb2[i])/2. << endl;
  }
         
  nZbins = hDefz->GetNbinsX();
  for (int i=0; i<hDefz->GetNbinsX(); i++) {
    gz->SetPoint(i, hDefz->GetBinCenter(i+1), 1.0);
    gz->SetPointError(i, 0.5*hDefz->GetBinWidth(i+1), 0);
    z1[i] = hDefz->GetBinLowEdge(i+1);
    z2[i] = hDefz->GetBinLowEdge(i+2);
  }

  fIndex = new TFormula("GlobIndex", //this is now relative to 0 (and not to 1 as for histos)
			"(t)*[0]*[1]*[2]+(z)*[0]*[1]+(x)*[0]+(y)+0*[4]");
  fIndex->SetParameters(gi->GetN(),
			gj->GetN(),
			gz->GetN(),
			gk->GetN());
  fIndex->SetParNames("NTrigBins (i)","NAssocBins (j)", "NZvertexBins (z)", "NCentBins (k)"); 

  for (int i=0;i<maxHists;++i) {
    mHists[i]=0;
    sHists[i]=0;
  }

  Int_t ent=list->GetEntries();
  for (Int_t i=0;i<ent;++i) {
    TH2 *obj = dynamic_cast<TH2*>(list->At(i));
    if (!obj)
      continue;
    TString name(obj->GetName());
    if (!name.BeginsWith("hM") && !name.BeginsWith("hS"))
      continue;
    const char *ptr = name.Data()+2;
    Int_t num = atoi(ptr);
    if (num>=maxHists) {
      Error("LoadHistos()", "Found object with too high index: %s %d",name.Data(),maxHists);
      gSystem->Exit(123);
    }
    //obj->SetDirectory(0);
    if (name[1]=='S')
      sHists[num]=obj;
    else if (name[1]=='M')
      mHists[num]=obj;
    else {
      Error("LoadHistos()", "Found object with unknown: %s %d",name.Data(),maxHists);
      gSystem->Exit(123);
    }
  }

  for (int i=0;i<maxHists;++i) {
    if (mHists[i]==0)
      continue;
    if (sHists[i]==0) {
      Error("LoadHistos()", "Both histogram ptr should be set: %d",i);
      continue;
    }

    int nEmptyBinsS = 0;
    int nEmptyBinsM = 0;
    for (int nx=1; nx<36; nx++) {
      for (int ny=1; ny<20; ny++) {
	if(sHists[i]->GetBinContent(nx,ny)==0)
	  nEmptyBinsS++;
	if(mHists[i]->GetBinContent(nx,ny)==0)
	  nEmptyBinsM++;
      }
    }
    double emptyFracS = double(nEmptyBinsS)/720.;
    double emptyFracM = double(nEmptyBinsM)/720.;
    if (emptyFracS > 0.50)
      Warning("LoadHistos","%d %s: %.0f%% of bins are EMPTY", i, sHists[i]->GetTitle(), 100*emptyFracS);
    if (emptyFracM > 0.50)
      Warning("LoadHistos","%d %s: %.0f%% of bins are EMPTY", i, mHists[i]->GetTitle(), 100*emptyFracM);

    cHists[i] = (TH2F*)sHists[i]->Clone(Form("hC%d",i));
    cHists[i]->Divide(sHists[i], mHists[i], 1./sHists[i]->Integral(), 1./mHists[i]->Integral());
  }
}

TH2 *GetHist(int i, int j, int z, int k, char type)
{
  if (!fIndex)
    return 0;

  Int_t ind = fIndex->Eval(i,j,z,k);
  TH2* h = 0;

  if ((ind>=maxHists)||(ind<0)) {
    Error("GetHist", "Input %d %d %d %d gives to large index %d",i,j,z,k,ind);
    return 0;
  }

  if (type == 's') 
    h = sHists[ind];
  else if (type == 'm')
    h = mHists[ind];
  else if (type == 'c')
    h = cHists[ind];
  else {
    Error("GetHist", "Unknown type %c",type);
    return 0;
  }

  if (h)
    if (h->GetSumw2N() == 0)
      h->Sumw2();

  return h;
}

void SumAndProjectTH2s(Double_t dEtaInnerArg = 1.2, Double_t dEtaOuterArg = 1.799)
{
  if (ispp) {
    nCentBins = 1;
    cb1[0] = 0;
    cb2[0] = 0;
  }
  
  dEtaInner = dEtaInnerArg; 
  dEtaOuter = dEtaOuterArg;

  outFile = new TFile(Form("$MYDATA/lhc11a_etamin%02d.root", (int)(10*dEtaInner)), "recreate");

  LoadHistos();
  MakeWeightHistos();
  PrintBins();

  int nk = ispp ? 1 : 10;
  for (int k=0; k<nk; k++) {
    TH2* h = GetHist(0,0,4, k, 's');
    cout << Form("%s %.2g",h->GetTitle(), h->Integral()) << endl;
  }

  // Dude, this is such a hack. TODO: calculate safely the number of y
  // bins included in an x projection, or vice versa.
  double nProjectedBins[] = {8, 12, 18, 18, 18};

  kPhiMin[NSJET] = -TMath::PiOver2();
  kPhiMax[NSJET] = 3*TMath::PiOver2();
  kEtaMin[NSJET] = -dEtaInner;
  kEtaMax[NSJET] = +dEtaInner;
  kPhiMin[RIDGE] = -TMath::PiOver2();
  kPhiMax[RIDGE] = 3*TMath::PiOver2();
  kEtaMin[RIDGE] = -dEtaInner; // selection gets inverted
  kEtaMax[RIDGE] = +dEtaInner;
  kPhiMin[ALL]   = -TMath::PiOver2();
  kPhiMax[ALL]   = 3*TMath::PiOver2();
  kEtaMin[ALL]   = -dEtaOuter;
  kEtaMax[ALL]   = +dEtaOuter;

  kPhiMin[ETA_NS]   = -TMath::PiOver2();
  kPhiMax[ETA_NS]   = +TMath::PiOver2();
  kEtaMin[ETA_NS]   = -dEtaOuter;
  kEtaMax[ETA_NS]   = +dEtaOuter;

  kPhiMin[ETA_AS]   =   TMath::PiOver2();
  kPhiMax[ETA_AS]   = 3*TMath::PiOver2();
  kEtaMin[ETA_AS]   = -dEtaOuter;
  kEtaMax[ETA_AS]   = +dEtaOuter;


  // First loop: sum z-vertex bins - 2D
  for (int cb=0; cb<nCentBinsHist; cb++) {

    double z_int = hz[cb]->Integral();
    double centLo = cbh1[cb];
    double centHi = cbh2[cb];
    if (ispp) {
      centLo = -1;
      centHi = 101;
    }
    cout << Form("Cent bin %d/%d: %.2g to %.2g%%", cb, nCentBinsHist, centLo, centHi)
	 << endl;

    for (int i=0; i<gi->GetN(); i++) {
      for (int j=0; j<=i; j++) {

	for (int ict=0; ict<nCorrTypes-1; ict++) {

	  TH2* hz2 = 0;
	  double wtSum = 0;
	  bool printZWeights = (0 && i==0 && j==0 && ict==kCA);

	  if (printZWeights) 
	    cout << Form("i%d j%d %.0fto%.0f: ", i, j, centLo, centHi);

	  for (int iz=0; iz<nZbins; iz++) {

	    int zbin1 = hz[cb]->FindBin(z1[iz]);
	    int zbin2 = hz[cb]->FindBin(z2[iz]-0.001);

	    double weight = hz[cb]->Integral(zbin1, zbin2) / z_int;

	    if (ict==kS || ict==kM) 
	      weight = 1.0; // Only correlation functions should be weighted
	    
	    wtSum += weight;

	    // There was an off-by-1 bug here!! Getting iz offset from
	    // zero, but loop was from iz=1 up. Fixed.
	    TH2* hc2 = GetHist(i,j,iz,cb,sCorrType[ict][0]);
	    if (!hc2) {
	      if (iz==0 && i==0 && j==0)
		Info("Loop 1", "Histo not found - skipping");
	      continue;
	    }
	    // if (i==7 && j==6 && ict < kCA) {
	    //   cout << Form("%s ===>  %.3g", hc2->GetTitle(), hc2->Integral()) << endl;
	    // }
	    if (printZWeights) {
	      cout << Form("%.2gto%.2g:%.2g ",z1[iz], z2[iz], weight);
	    }
	    
	    int cLo = ispp ? 0 : centLo;
	    int cHi = ispp ? 0 : centHi;
	    const char* newName = Form("%s_%s_%d_%d_%dto%d", 
				       "ETAPHI", sCorrType[ict].Data(),
				       i, j, cLo, cHi);
	    
	    if (iz==0) {
	      hz2 = (TH2*)hc2->Clone(newName);
	      hz2->Reset();
	    }
	    hz2->Add(hc2, weight);
	  } // iz loop
	  
	  if (printZWeights)  
	    cout << endl;
	  
	  hists->Add(hz2);
	  if((ict==kCA || ict==kCB) && TMath::Abs(wtSum - 1.) > 0.01)
	    Warning("MakeWeightHistos()", "weight sum %.2g", wtSum);
	  if (ict == kCA) {
	    double normInt = hz2->Integral()/720;
	    if (TMath::Abs(1-normInt) > 0.05)
	      Warning("Loop 1", "%s (%d) integral not 1: %.3g", 
		      hz2->GetName(), (int)fIndex->Eval(i,j,3,cb), normInt);
	    
	  }
	  
	}
      }
    }
  }
  
  cout<<"\nFinished z-vertex bin sums\n"<<endl;

  /*
  for (int n=0; n<hists->GetEntries(); n++) {
    TH2* h = (TH2*)hists->At(n);
    TString name(h->GetName());
    if (name.Contains("s_0_0"))
      cout<<Form("%s %s %.2g",name.Data(), h->GetTitle(), h->Integral())<<endl;
  }
  */

  outFile->mkdir("PbPb");
  outFile->cd("PbPb");

  // Second loop: sum centrality bins - 2D histos. Purpose: make the
  // desired centrality bin k in the TGraph from smaller centrality
  // bins cb that already exist.
  for (int i=0; i<gi->GetN(); i++) {
    for (int j=0; j<=i; j++) {
      for (int k=0; k<gk->GetN(); k++) { // the target centrality bin
	for (int ict=0; ict<nCorrTypes-1; ict++) {



	  TObjArray* arr = 0;
	  std::vector<double> weights;
	  std::vector<TString> centIntervals;
	  double wtsum = 0;
	  // double centLo = cb1[k];
	  // double centHi = cb2[k]; same as below
	  double centLo = ispp? 0 : gk->GetX()[k] - gk->GetEX()[k];
	  double centHi = ispp? 0 : gk->GetX()[k] + gk->GetEX()[k];
	  const char* name = Form("%s_%s_%d_%d_%.0fto%.0f", 
				  "ETAPHI", sCorrType[ict].Data(), i, j, centLo,centHi);
	  const char* newName = Form("%s_%s_%d_%d_%d", "ETAPHI", sCorrType[ict].Data(), i, j, k);
	  const char* title   = Form("p_{T}^{t} %s, p_{T}^{a} %s, %.0f-%.0f%%", 
				     BinLabel(0, i), 
				     BinLabel(1, j), 
				     centLo, centHi);

	  //	  Printf("%g %g", centLo, centHi);

	  TH2* h2 = 0;
	  h2 = (TH2*) hists->FindObject(name);

	  if (h2) {
	    // Give correct overall normalization for CFs.
	    if (ict == kCA || ict == kCB)
	      h2->Scale(h2->GetNbinsX()*h2->GetNbinsY()/h2->Integral());
	   
	    h2->SetNameTitle(newName, title);
	    h2->Write(newName);

	    if (1) cout<<h2->GetName()<<" "<<endl;
	  }
	  else { // If cent. bin k doesn't exist, it needs to be created as a sum.
	    for (int cb=0; cb<nCentBinsHist; cb++) { // pre-existing cent bins
	      const char* name2 = Form("%s_%s_%d_%d_%.0fto%.0f", 
				       "ETAPHI", sCorrType[ict].Data(), i, j, cbh1[cb], cbh2[cb]);
	      TH2* hcb2 = (TH2*) hists->FindObject(name2);
	      //	      TH2* h = GetHist(0,0,4, k, 's');
	      if (!hcb2) {
		Error("Loop 2","!hcb2");
		continue;
	      }
	      cout << name2 <<" "<< cbh1[cb] << " " << centLo << " " << cbh2[cb] << " " << centHi << endl;

	      // Store relevant histos and their weights
	      if ( cbh1[cb] >= centLo && cbh2[cb] <= centHi ) {
		if (1) cout<<"Adding " << hcb2->GetName()<<" "<<endl;
		if (!arr) arr = new TObjArray();
		arr->Add(hcb2);

		// weight by integral of same-event 2D distribution rather than event count
		// small but visible correction from old way. 
		/* old way:
		weights.push_back(hcent->GetBinContent(cb+1));
		wtsum += hcent->GetBinContent(cb+1);
		*/
		// new way
		const char* ss = Form("ETAPHI_s_%d_%d_%.0fto%.0f", i, j, cbh1[cb], cbh2[cb]);
		TH2* hs = (TH2*) hists->FindObject(ss);
		if (!hs)
		  Error("Loop 2","Problem finding %s", ss);
		double wt = hs->Integral();
		weights.push_back(wt);
		centIntervals.push_back(TString(Form("%.0fto%.0f", cbh1[cb], cbh2[cb])));
		wtsum += wt;

	      }
	    } // cb loop

	    // Add up histos in arr. This part of code only gets used if
	    // centrality combination is requested by including new
	    // bins in cb1,2[] arrays.

	    bool printWeights = (ict == kCA); // print once/bin, not 3x
	    double tot=0;

	    if (printWeights) cout<<name<<" "<<flush;
	    
  	  cout<< arr <<endl;
	  if (!arr)
	    continue;

	    for (int n=0; n<arr->GetEntries(); n++) {

	      tot += weights.at(n)/wtsum;
	      TH2* hn = (TH2*)arr->At(n);

	      if (n==0) {
		h2 = (TH2*)hn->Clone(newName);
		h2->Scale(weights.at(n)/wtsum);
	      }
	      else {
		h2->Add(hn, weights.at(n)/wtsum);
	      }
	      if (printWeights) 
		cout << centIntervals.at(n).Data() << ":" 
		     << weights.at(n)/wtsum << " " << flush;
	    }
	    if (printWeights) cout << " = " << tot << endl;

	    // Give correct overall normalization for CFs.
	    if (ict == kCA || ict == kCB)
	      h2->Scale(h2->GetNbinsX()*h2->GetNbinsY()/h2->Integral());

	    h2->SetNameTitle(newName, title);
	    h2->Write(newName);

	    if (arr) 
	      delete arr; // arr doesn't own its histos, so ok to delete.
	  }
	} // ict
      } // k
    } // j
  } // i

  cout<<"\nFinished centrality bin sums\n"<<endl;

  outFile->cd();
  for (int ijkz=0; ijkz<4; ijkz++)
    BinGraph(ijkz)->Write();
  profs->Write();

  TObjArray* summed = GetHistList(*outFile, "TH2", "PbPb");
  TObjArray* dphis = new TObjArray();

  outFile->cd("PbPb");
  for (int n=0; n<summed->GetEntries(); n++) {
    TH2* h = (TH2*)summed->At(n);
    for (int r=0; r<5; r++) {
      TString name1D(h->GetName());
      name1D.ReplaceAll("ETAPHI", Region(r));
      TString projStr = "x";
      if (r==RIDGE)
	projStr.Prepend("-");
      else if (r==ETA_NS || r==ETA_AS)
	projStr = "y";

      TH1* hp = ProjectTH2(*h, projStr, 
      			   kPhiMin[r], kEtaMin[r], kPhiMax[r], kEtaMax[r], 
      			   name1D, "e");
      hp->SetTitle(h->GetTitle());

      // TODO check this
      if (name1D.Contains("_c_"))
	hp->Scale(1./nProjectedBins[r]);

      if (r==NSJET || r==RIDGE || r==ALL)
	dphis->Add(hp);

      hp->Write();
    }
  }

  // CF defs A and B
  // First find existing "Def. B" CF _c_. Then create "Def. A" CFs as well.
  for (int n=0; n<dphis->GetEntries(); n++) {
    TObject* obj = dphis->At(n);
    TString hname =  obj->GetName();
    TH1* hcB = (TH1*)obj;
    if (hname.Contains("_c_") ) {
      hcB = (TH1*)obj;
    }
    else
      continue;

    TString s(hname);
    TString m(hname);
    TString cA(hname);
    TString cB(hname);
    s.ReplaceAll("_c_", "_s_");
    m.ReplaceAll("_c_", "_m_");
    cA.ReplaceAll("_c_", "_cA_");
    cB.ReplaceAll("_c_", "_cB_");
    
    TH1* hsame  = (TH1*)dphis->FindObject(s.Data());
    TH1* hmixed = (TH1*)dphis->FindObject(m.Data());
    TH1* hcA = (TH1*)hcB->Clone(cA.Data());

    if (0)
      Info("", "%s %s %s", hsame->GetName(), hmixed->GetName(), hcA->GetName());

    hcA->Divide(hsame, hmixed, 1./hsame->Integral(), 1./hmixed->Integral());
    hcB->SetName(cB.Data());

    hcA->Write();
    hcB->Write();

  }
  
  outFile->cd("PbPb");
  int nObjectsInFile = gDirectory->GetListOfKeys()->GetEntries();
  cout <<"\nWrote " << nObjectsInFile 
       << " objects to PbPb/ in " << outFile->GetName() << endl;

  cout << "Closing file..." << endl; 
  outFile->Close();

  return;
}

const char* Region(int r)
{
  return regionStr[r];
}

char* BinLabel(int ijkz, int i)
{
  // Returns bin extents like "a-b" to <= 4 sig. fig. precision
  TGraphErrors* g = BinGraph(ijkz);
  if (i<0 || i>=g->GetN()) {
    Error("bin_label((TGraphErrors&, Int_t)", "Error: no bin %d", i);
    return 0;
  }

  double x1 = g->GetX()[i] - g->GetEX()[i];
  double x2 = g->GetX()[i] + g->GetEX()[i];

  return Form("%.*g-%.*g", 4, x1, 4, x2);
}

TGraphErrors* BinGraph(int ijkz)
{
  if (ijkz < 0 || ijkz > 3)
    return 0;
  else if (ijkz==0) return gi;
  else if (ijkz==1) return gj;
  else if (ijkz==2) return gk;
  else if (ijkz==3) return gz;
  else 
    return 0;
}

TObjArray* GetHistList(TFile& file, TString clname, TString dir)
{
  file.cd(dir.Data());

  TObjArray* hList = new TObjArray();
  TIter next(gDirectory->GetListOfKeys());
  TKey *key;
  
  while ((key=(TKey*)next())) {
    TString className(key->GetClassName());
    TString keyName(key->GetName());
    if (0) 
      printf("%10s %20s\n", className.Data(), keyName.Data());
    
    if (className.Contains(clname) && clname.Contains("TH2")) {
      hList->Add((TH2*)gDirectory->Get(keyName.Data()));
    }
  }

  cout << hList->GetEntries() << " objects retrieved from "
       << file.GetName()  << "/" << gDirectory->GetName() 
       << endl;

  return hList;
}

TH1* 
ProjectTH2(TH2& h, TString xy, float x1, float y1, float x2, float y2,
	   TString name, TString opt)
{
  TH1* hp = 0;
  double x[] = {x1,x2,x2,x1,x1};
  double y[] = {y1,y1,y2,y2,y1};
  TCutG *cutg = new TCutG("cutg", 5, x, y);
  double area = cutg->Area();
  TString projOpt = "[cutg]";

  // Invert selection: fill bins outside rectangle
  if (xy.Contains("-"))
    projOpt.ReplaceAll("[cutg]", "[-cutg]");
  
  // "e" errors, "d" draw in current pad, "o" original full axis
  projOpt.Append(opt);

  if (xy.Contains("x")) {
    hp = h.ProjectionX(name.Data(), 0, -1, projOpt.Data());
  }
  else if (xy.Contains("y")) {
    hp = h.ProjectionY(name.Data(), 0, -1, projOpt.Data());
  }
  if (!hp)
    Error("ProjectTH2()","!hp");


  if (0) { // For test/debug purposes
    int bx1, bx2, by1, by2;
    double wx, hy;
    TAxis *ax = h.GetXaxis(), *ay = h.GetYaxis();

    bx1 = ax->FindBin(x1);
    bx2 = ax->FindBin(x2);
    by1 = ay->FindBin(y1);
    by2 = ay->FindBin(y2);
    wx = ax->GetBinUpEdge(bx2) - ax->GetBinLowEdge(bx1);
    hy = ay->GetBinUpEdge(by2) - ay->GetBinLowEdge(by1);
    
    if (xy.Contains("-"))
      cout << Form("Selection is inverted.") << endl;
    
    cout << Form("Selection area: %f", area) << endl;
    cout << Form("Actual projected area %f", wx*hy) << endl;
  }

  return hp;
}

void PrintBins()
{
  TGraphErrors* g = 0;

  cout << endl;
  cout <<"-----------------Bin Information-----------------"<< endl;
  for (int n=0; n<4; n++) {
    g = BinGraph(n);
    cout << g->GetName() << ": ";
    for (int i=0; i<g->GetN(); i++) {
      cout << Form("%s ", BinLabel(n, i));
    }
    cout << endl;
  }
  cout <<"-------------------------------------------------"<< endl;
 return;
}
 SumAndProjectTH2s.C:1
 SumAndProjectTH2s.C:2
 SumAndProjectTH2s.C:3
 SumAndProjectTH2s.C:4
 SumAndProjectTH2s.C:5
 SumAndProjectTH2s.C:6
 SumAndProjectTH2s.C:7
 SumAndProjectTH2s.C:8
 SumAndProjectTH2s.C:9
 SumAndProjectTH2s.C:10
 SumAndProjectTH2s.C:11
 SumAndProjectTH2s.C:12
 SumAndProjectTH2s.C:13
 SumAndProjectTH2s.C:14
 SumAndProjectTH2s.C:15
 SumAndProjectTH2s.C:16
 SumAndProjectTH2s.C:17
 SumAndProjectTH2s.C:18
 SumAndProjectTH2s.C:19
 SumAndProjectTH2s.C:20
 SumAndProjectTH2s.C:21
 SumAndProjectTH2s.C:22
 SumAndProjectTH2s.C:23
 SumAndProjectTH2s.C:24
 SumAndProjectTH2s.C:25
 SumAndProjectTH2s.C:26
 SumAndProjectTH2s.C:27
 SumAndProjectTH2s.C:28
 SumAndProjectTH2s.C:29
 SumAndProjectTH2s.C:30
 SumAndProjectTH2s.C:31
 SumAndProjectTH2s.C:32
 SumAndProjectTH2s.C:33
 SumAndProjectTH2s.C:34
 SumAndProjectTH2s.C:35
 SumAndProjectTH2s.C:36
 SumAndProjectTH2s.C:37
 SumAndProjectTH2s.C:38
 SumAndProjectTH2s.C:39
 SumAndProjectTH2s.C:40
 SumAndProjectTH2s.C:41
 SumAndProjectTH2s.C:42
 SumAndProjectTH2s.C:43
 SumAndProjectTH2s.C:44
 SumAndProjectTH2s.C:45
 SumAndProjectTH2s.C:46
 SumAndProjectTH2s.C:47
 SumAndProjectTH2s.C:48
 SumAndProjectTH2s.C:49
 SumAndProjectTH2s.C:50
 SumAndProjectTH2s.C:51
 SumAndProjectTH2s.C:52
 SumAndProjectTH2s.C:53
 SumAndProjectTH2s.C:54
 SumAndProjectTH2s.C:55
 SumAndProjectTH2s.C:56
 SumAndProjectTH2s.C:57
 SumAndProjectTH2s.C:58
 SumAndProjectTH2s.C:59
 SumAndProjectTH2s.C:60
 SumAndProjectTH2s.C:61
 SumAndProjectTH2s.C:62
 SumAndProjectTH2s.C:63
 SumAndProjectTH2s.C:64
 SumAndProjectTH2s.C:65
 SumAndProjectTH2s.C:66
 SumAndProjectTH2s.C:67
 SumAndProjectTH2s.C:68
 SumAndProjectTH2s.C:69
 SumAndProjectTH2s.C:70
 SumAndProjectTH2s.C:71
 SumAndProjectTH2s.C:72
 SumAndProjectTH2s.C:73
 SumAndProjectTH2s.C:74
 SumAndProjectTH2s.C:75
 SumAndProjectTH2s.C:76
 SumAndProjectTH2s.C:77
 SumAndProjectTH2s.C:78
 SumAndProjectTH2s.C:79
 SumAndProjectTH2s.C:80
 SumAndProjectTH2s.C:81
 SumAndProjectTH2s.C:82
 SumAndProjectTH2s.C:83
 SumAndProjectTH2s.C:84
 SumAndProjectTH2s.C:85
 SumAndProjectTH2s.C:86
 SumAndProjectTH2s.C:87
 SumAndProjectTH2s.C:88
 SumAndProjectTH2s.C:89
 SumAndProjectTH2s.C:90
 SumAndProjectTH2s.C:91
 SumAndProjectTH2s.C:92
 SumAndProjectTH2s.C:93
 SumAndProjectTH2s.C:94
 SumAndProjectTH2s.C:95
 SumAndProjectTH2s.C:96
 SumAndProjectTH2s.C:97
 SumAndProjectTH2s.C:98
 SumAndProjectTH2s.C:99
 SumAndProjectTH2s.C:100
 SumAndProjectTH2s.C:101
 SumAndProjectTH2s.C:102
 SumAndProjectTH2s.C:103
 SumAndProjectTH2s.C:104
 SumAndProjectTH2s.C:105
 SumAndProjectTH2s.C:106
 SumAndProjectTH2s.C:107
 SumAndProjectTH2s.C:108
 SumAndProjectTH2s.C:109
 SumAndProjectTH2s.C:110
 SumAndProjectTH2s.C:111
 SumAndProjectTH2s.C:112
 SumAndProjectTH2s.C:113
 SumAndProjectTH2s.C:114
 SumAndProjectTH2s.C:115
 SumAndProjectTH2s.C:116
 SumAndProjectTH2s.C:117
 SumAndProjectTH2s.C:118
 SumAndProjectTH2s.C:119
 SumAndProjectTH2s.C:120
 SumAndProjectTH2s.C:121
 SumAndProjectTH2s.C:122
 SumAndProjectTH2s.C:123
 SumAndProjectTH2s.C:124
 SumAndProjectTH2s.C:125
 SumAndProjectTH2s.C:126
 SumAndProjectTH2s.C:127
 SumAndProjectTH2s.C:128
 SumAndProjectTH2s.C:129
 SumAndProjectTH2s.C:130
 SumAndProjectTH2s.C:131
 SumAndProjectTH2s.C:132
 SumAndProjectTH2s.C:133
 SumAndProjectTH2s.C:134
 SumAndProjectTH2s.C:135
 SumAndProjectTH2s.C:136
 SumAndProjectTH2s.C:137
 SumAndProjectTH2s.C:138
 SumAndProjectTH2s.C:139
 SumAndProjectTH2s.C:140
 SumAndProjectTH2s.C:141
 SumAndProjectTH2s.C:142
 SumAndProjectTH2s.C:143
 SumAndProjectTH2s.C:144
 SumAndProjectTH2s.C:145
 SumAndProjectTH2s.C:146
 SumAndProjectTH2s.C:147
 SumAndProjectTH2s.C:148
 SumAndProjectTH2s.C:149
 SumAndProjectTH2s.C:150
 SumAndProjectTH2s.C:151
 SumAndProjectTH2s.C:152
 SumAndProjectTH2s.C:153
 SumAndProjectTH2s.C:154
 SumAndProjectTH2s.C:155
 SumAndProjectTH2s.C:156
 SumAndProjectTH2s.C:157
 SumAndProjectTH2s.C:158
 SumAndProjectTH2s.C:159
 SumAndProjectTH2s.C:160
 SumAndProjectTH2s.C:161
 SumAndProjectTH2s.C:162
 SumAndProjectTH2s.C:163
 SumAndProjectTH2s.C:164
 SumAndProjectTH2s.C:165
 SumAndProjectTH2s.C:166
 SumAndProjectTH2s.C:167
 SumAndProjectTH2s.C:168
 SumAndProjectTH2s.C:169
 SumAndProjectTH2s.C:170
 SumAndProjectTH2s.C:171
 SumAndProjectTH2s.C:172
 SumAndProjectTH2s.C:173
 SumAndProjectTH2s.C:174
 SumAndProjectTH2s.C:175
 SumAndProjectTH2s.C:176
 SumAndProjectTH2s.C:177
 SumAndProjectTH2s.C:178
 SumAndProjectTH2s.C:179
 SumAndProjectTH2s.C:180
 SumAndProjectTH2s.C:181
 SumAndProjectTH2s.C:182
 SumAndProjectTH2s.C:183
 SumAndProjectTH2s.C:184
 SumAndProjectTH2s.C:185
 SumAndProjectTH2s.C:186
 SumAndProjectTH2s.C:187
 SumAndProjectTH2s.C:188
 SumAndProjectTH2s.C:189
 SumAndProjectTH2s.C:190
 SumAndProjectTH2s.C:191
 SumAndProjectTH2s.C:192
 SumAndProjectTH2s.C:193
 SumAndProjectTH2s.C:194
 SumAndProjectTH2s.C:195
 SumAndProjectTH2s.C:196
 SumAndProjectTH2s.C:197
 SumAndProjectTH2s.C:198
 SumAndProjectTH2s.C:199
 SumAndProjectTH2s.C:200
 SumAndProjectTH2s.C:201
 SumAndProjectTH2s.C:202
 SumAndProjectTH2s.C:203
 SumAndProjectTH2s.C:204
 SumAndProjectTH2s.C:205
 SumAndProjectTH2s.C:206
 SumAndProjectTH2s.C:207
 SumAndProjectTH2s.C:208
 SumAndProjectTH2s.C:209
 SumAndProjectTH2s.C:210
 SumAndProjectTH2s.C:211
 SumAndProjectTH2s.C:212
 SumAndProjectTH2s.C:213
 SumAndProjectTH2s.C:214
 SumAndProjectTH2s.C:215
 SumAndProjectTH2s.C:216
 SumAndProjectTH2s.C:217
 SumAndProjectTH2s.C:218
 SumAndProjectTH2s.C:219
 SumAndProjectTH2s.C:220
 SumAndProjectTH2s.C:221
 SumAndProjectTH2s.C:222
 SumAndProjectTH2s.C:223
 SumAndProjectTH2s.C:224
 SumAndProjectTH2s.C:225
 SumAndProjectTH2s.C:226
 SumAndProjectTH2s.C:227
 SumAndProjectTH2s.C:228
 SumAndProjectTH2s.C:229
 SumAndProjectTH2s.C:230
 SumAndProjectTH2s.C:231
 SumAndProjectTH2s.C:232
 SumAndProjectTH2s.C:233
 SumAndProjectTH2s.C:234
 SumAndProjectTH2s.C:235
 SumAndProjectTH2s.C:236
 SumAndProjectTH2s.C:237
 SumAndProjectTH2s.C:238
 SumAndProjectTH2s.C:239
 SumAndProjectTH2s.C:240
 SumAndProjectTH2s.C:241
 SumAndProjectTH2s.C:242
 SumAndProjectTH2s.C:243
 SumAndProjectTH2s.C:244
 SumAndProjectTH2s.C:245
 SumAndProjectTH2s.C:246
 SumAndProjectTH2s.C:247
 SumAndProjectTH2s.C:248
 SumAndProjectTH2s.C:249
 SumAndProjectTH2s.C:250
 SumAndProjectTH2s.C:251
 SumAndProjectTH2s.C:252
 SumAndProjectTH2s.C:253
 SumAndProjectTH2s.C:254
 SumAndProjectTH2s.C:255
 SumAndProjectTH2s.C:256
 SumAndProjectTH2s.C:257
 SumAndProjectTH2s.C:258
 SumAndProjectTH2s.C:259
 SumAndProjectTH2s.C:260
 SumAndProjectTH2s.C:261
 SumAndProjectTH2s.C:262
 SumAndProjectTH2s.C:263
 SumAndProjectTH2s.C:264
 SumAndProjectTH2s.C:265
 SumAndProjectTH2s.C:266
 SumAndProjectTH2s.C:267
 SumAndProjectTH2s.C:268
 SumAndProjectTH2s.C:269
 SumAndProjectTH2s.C:270
 SumAndProjectTH2s.C:271
 SumAndProjectTH2s.C:272
 SumAndProjectTH2s.C:273
 SumAndProjectTH2s.C:274
 SumAndProjectTH2s.C:275
 SumAndProjectTH2s.C:276
 SumAndProjectTH2s.C:277
 SumAndProjectTH2s.C:278
 SumAndProjectTH2s.C:279
 SumAndProjectTH2s.C:280
 SumAndProjectTH2s.C:281
 SumAndProjectTH2s.C:282
 SumAndProjectTH2s.C:283
 SumAndProjectTH2s.C:284
 SumAndProjectTH2s.C:285
 SumAndProjectTH2s.C:286
 SumAndProjectTH2s.C:287
 SumAndProjectTH2s.C:288
 SumAndProjectTH2s.C:289
 SumAndProjectTH2s.C:290
 SumAndProjectTH2s.C:291
 SumAndProjectTH2s.C:292
 SumAndProjectTH2s.C:293
 SumAndProjectTH2s.C:294
 SumAndProjectTH2s.C:295
 SumAndProjectTH2s.C:296
 SumAndProjectTH2s.C:297
 SumAndProjectTH2s.C:298
 SumAndProjectTH2s.C:299
 SumAndProjectTH2s.C:300
 SumAndProjectTH2s.C:301
 SumAndProjectTH2s.C:302
 SumAndProjectTH2s.C:303
 SumAndProjectTH2s.C:304
 SumAndProjectTH2s.C:305
 SumAndProjectTH2s.C:306
 SumAndProjectTH2s.C:307
 SumAndProjectTH2s.C:308
 SumAndProjectTH2s.C:309
 SumAndProjectTH2s.C:310
 SumAndProjectTH2s.C:311
 SumAndProjectTH2s.C:312
 SumAndProjectTH2s.C:313
 SumAndProjectTH2s.C:314
 SumAndProjectTH2s.C:315
 SumAndProjectTH2s.C:316
 SumAndProjectTH2s.C:317
 SumAndProjectTH2s.C:318
 SumAndProjectTH2s.C:319
 SumAndProjectTH2s.C:320
 SumAndProjectTH2s.C:321
 SumAndProjectTH2s.C:322
 SumAndProjectTH2s.C:323
 SumAndProjectTH2s.C:324
 SumAndProjectTH2s.C:325
 SumAndProjectTH2s.C:326
 SumAndProjectTH2s.C:327
 SumAndProjectTH2s.C:328
 SumAndProjectTH2s.C:329
 SumAndProjectTH2s.C:330
 SumAndProjectTH2s.C:331
 SumAndProjectTH2s.C:332
 SumAndProjectTH2s.C:333
 SumAndProjectTH2s.C:334
 SumAndProjectTH2s.C:335
 SumAndProjectTH2s.C:336
 SumAndProjectTH2s.C:337
 SumAndProjectTH2s.C:338
 SumAndProjectTH2s.C:339
 SumAndProjectTH2s.C:340
 SumAndProjectTH2s.C:341
 SumAndProjectTH2s.C:342
 SumAndProjectTH2s.C:343
 SumAndProjectTH2s.C:344
 SumAndProjectTH2s.C:345
 SumAndProjectTH2s.C:346
 SumAndProjectTH2s.C:347
 SumAndProjectTH2s.C:348
 SumAndProjectTH2s.C:349
 SumAndProjectTH2s.C:350
 SumAndProjectTH2s.C:351
 SumAndProjectTH2s.C:352
 SumAndProjectTH2s.C:353
 SumAndProjectTH2s.C:354
 SumAndProjectTH2s.C:355
 SumAndProjectTH2s.C:356
 SumAndProjectTH2s.C:357
 SumAndProjectTH2s.C:358
 SumAndProjectTH2s.C:359
 SumAndProjectTH2s.C:360
 SumAndProjectTH2s.C:361
 SumAndProjectTH2s.C:362
 SumAndProjectTH2s.C:363
 SumAndProjectTH2s.C:364
 SumAndProjectTH2s.C:365
 SumAndProjectTH2s.C:366
 SumAndProjectTH2s.C:367
 SumAndProjectTH2s.C:368
 SumAndProjectTH2s.C:369
 SumAndProjectTH2s.C:370
 SumAndProjectTH2s.C:371
 SumAndProjectTH2s.C:372
 SumAndProjectTH2s.C:373
 SumAndProjectTH2s.C:374
 SumAndProjectTH2s.C:375
 SumAndProjectTH2s.C:376
 SumAndProjectTH2s.C:377
 SumAndProjectTH2s.C:378
 SumAndProjectTH2s.C:379
 SumAndProjectTH2s.C:380
 SumAndProjectTH2s.C:381
 SumAndProjectTH2s.C:382
 SumAndProjectTH2s.C:383
 SumAndProjectTH2s.C:384
 SumAndProjectTH2s.C:385
 SumAndProjectTH2s.C:386
 SumAndProjectTH2s.C:387
 SumAndProjectTH2s.C:388
 SumAndProjectTH2s.C:389
 SumAndProjectTH2s.C:390
 SumAndProjectTH2s.C:391
 SumAndProjectTH2s.C:392
 SumAndProjectTH2s.C:393
 SumAndProjectTH2s.C:394
 SumAndProjectTH2s.C:395
 SumAndProjectTH2s.C:396
 SumAndProjectTH2s.C:397
 SumAndProjectTH2s.C:398
 SumAndProjectTH2s.C:399
 SumAndProjectTH2s.C:400
 SumAndProjectTH2s.C:401
 SumAndProjectTH2s.C:402
 SumAndProjectTH2s.C:403
 SumAndProjectTH2s.C:404
 SumAndProjectTH2s.C:405
 SumAndProjectTH2s.C:406
 SumAndProjectTH2s.C:407
 SumAndProjectTH2s.C:408
 SumAndProjectTH2s.C:409
 SumAndProjectTH2s.C:410
 SumAndProjectTH2s.C:411
 SumAndProjectTH2s.C:412
 SumAndProjectTH2s.C:413
 SumAndProjectTH2s.C:414
 SumAndProjectTH2s.C:415
 SumAndProjectTH2s.C:416
 SumAndProjectTH2s.C:417
 SumAndProjectTH2s.C:418
 SumAndProjectTH2s.C:419
 SumAndProjectTH2s.C:420
 SumAndProjectTH2s.C:421
 SumAndProjectTH2s.C:422
 SumAndProjectTH2s.C:423
 SumAndProjectTH2s.C:424
 SumAndProjectTH2s.C:425
 SumAndProjectTH2s.C:426
 SumAndProjectTH2s.C:427
 SumAndProjectTH2s.C:428
 SumAndProjectTH2s.C:429
 SumAndProjectTH2s.C:430
 SumAndProjectTH2s.C:431
 SumAndProjectTH2s.C:432
 SumAndProjectTH2s.C:433
 SumAndProjectTH2s.C:434
 SumAndProjectTH2s.C:435
 SumAndProjectTH2s.C:436
 SumAndProjectTH2s.C:437
 SumAndProjectTH2s.C:438
 SumAndProjectTH2s.C:439
 SumAndProjectTH2s.C:440
 SumAndProjectTH2s.C:441
 SumAndProjectTH2s.C:442
 SumAndProjectTH2s.C:443
 SumAndProjectTH2s.C:444
 SumAndProjectTH2s.C:445
 SumAndProjectTH2s.C:446
 SumAndProjectTH2s.C:447
 SumAndProjectTH2s.C:448
 SumAndProjectTH2s.C:449
 SumAndProjectTH2s.C:450
 SumAndProjectTH2s.C:451
 SumAndProjectTH2s.C:452
 SumAndProjectTH2s.C:453
 SumAndProjectTH2s.C:454
 SumAndProjectTH2s.C:455
 SumAndProjectTH2s.C:456
 SumAndProjectTH2s.C:457
 SumAndProjectTH2s.C:458
 SumAndProjectTH2s.C:459
 SumAndProjectTH2s.C:460
 SumAndProjectTH2s.C:461
 SumAndProjectTH2s.C:462
 SumAndProjectTH2s.C:463
 SumAndProjectTH2s.C:464
 SumAndProjectTH2s.C:465
 SumAndProjectTH2s.C:466
 SumAndProjectTH2s.C:467
 SumAndProjectTH2s.C:468
 SumAndProjectTH2s.C:469
 SumAndProjectTH2s.C:470
 SumAndProjectTH2s.C:471
 SumAndProjectTH2s.C:472
 SumAndProjectTH2s.C:473
 SumAndProjectTH2s.C:474
 SumAndProjectTH2s.C:475
 SumAndProjectTH2s.C:476
 SumAndProjectTH2s.C:477
 SumAndProjectTH2s.C:478
 SumAndProjectTH2s.C:479
 SumAndProjectTH2s.C:480
 SumAndProjectTH2s.C:481
 SumAndProjectTH2s.C:482
 SumAndProjectTH2s.C:483
 SumAndProjectTH2s.C:484
 SumAndProjectTH2s.C:485
 SumAndProjectTH2s.C:486
 SumAndProjectTH2s.C:487
 SumAndProjectTH2s.C:488
 SumAndProjectTH2s.C:489
 SumAndProjectTH2s.C:490
 SumAndProjectTH2s.C:491
 SumAndProjectTH2s.C:492
 SumAndProjectTH2s.C:493
 SumAndProjectTH2s.C:494
 SumAndProjectTH2s.C:495
 SumAndProjectTH2s.C:496
 SumAndProjectTH2s.C:497
 SumAndProjectTH2s.C:498
 SumAndProjectTH2s.C:499
 SumAndProjectTH2s.C:500
 SumAndProjectTH2s.C:501
 SumAndProjectTH2s.C:502
 SumAndProjectTH2s.C:503
 SumAndProjectTH2s.C:504
 SumAndProjectTH2s.C:505
 SumAndProjectTH2s.C:506
 SumAndProjectTH2s.C:507
 SumAndProjectTH2s.C:508
 SumAndProjectTH2s.C:509
 SumAndProjectTH2s.C:510
 SumAndProjectTH2s.C:511
 SumAndProjectTH2s.C:512
 SumAndProjectTH2s.C:513
 SumAndProjectTH2s.C:514
 SumAndProjectTH2s.C:515
 SumAndProjectTH2s.C:516
 SumAndProjectTH2s.C:517
 SumAndProjectTH2s.C:518
 SumAndProjectTH2s.C:519
 SumAndProjectTH2s.C:520
 SumAndProjectTH2s.C:521
 SumAndProjectTH2s.C:522
 SumAndProjectTH2s.C:523
 SumAndProjectTH2s.C:524
 SumAndProjectTH2s.C:525
 SumAndProjectTH2s.C:526
 SumAndProjectTH2s.C:527
 SumAndProjectTH2s.C:528
 SumAndProjectTH2s.C:529
 SumAndProjectTH2s.C:530
 SumAndProjectTH2s.C:531
 SumAndProjectTH2s.C:532
 SumAndProjectTH2s.C:533
 SumAndProjectTH2s.C:534
 SumAndProjectTH2s.C:535
 SumAndProjectTH2s.C:536
 SumAndProjectTH2s.C:537
 SumAndProjectTH2s.C:538
 SumAndProjectTH2s.C:539
 SumAndProjectTH2s.C:540
 SumAndProjectTH2s.C:541
 SumAndProjectTH2s.C:542
 SumAndProjectTH2s.C:543
 SumAndProjectTH2s.C:544
 SumAndProjectTH2s.C:545
 SumAndProjectTH2s.C:546
 SumAndProjectTH2s.C:547
 SumAndProjectTH2s.C:548
 SumAndProjectTH2s.C:549
 SumAndProjectTH2s.C:550
 SumAndProjectTH2s.C:551
 SumAndProjectTH2s.C:552
 SumAndProjectTH2s.C:553
 SumAndProjectTH2s.C:554
 SumAndProjectTH2s.C:555
 SumAndProjectTH2s.C:556
 SumAndProjectTH2s.C:557
 SumAndProjectTH2s.C:558
 SumAndProjectTH2s.C:559
 SumAndProjectTH2s.C:560
 SumAndProjectTH2s.C:561
 SumAndProjectTH2s.C:562
 SumAndProjectTH2s.C:563
 SumAndProjectTH2s.C:564
 SumAndProjectTH2s.C:565
 SumAndProjectTH2s.C:566
 SumAndProjectTH2s.C:567
 SumAndProjectTH2s.C:568
 SumAndProjectTH2s.C:569
 SumAndProjectTH2s.C:570
 SumAndProjectTH2s.C:571
 SumAndProjectTH2s.C:572
 SumAndProjectTH2s.C:573
 SumAndProjectTH2s.C:574
 SumAndProjectTH2s.C:575
 SumAndProjectTH2s.C:576
 SumAndProjectTH2s.C:577
 SumAndProjectTH2s.C:578
 SumAndProjectTH2s.C:579
 SumAndProjectTH2s.C:580
 SumAndProjectTH2s.C:581
 SumAndProjectTH2s.C:582
 SumAndProjectTH2s.C:583
 SumAndProjectTH2s.C:584
 SumAndProjectTH2s.C:585
 SumAndProjectTH2s.C:586
 SumAndProjectTH2s.C:587
 SumAndProjectTH2s.C:588
 SumAndProjectTH2s.C:589
 SumAndProjectTH2s.C:590
 SumAndProjectTH2s.C:591
 SumAndProjectTH2s.C:592
 SumAndProjectTH2s.C:593
 SumAndProjectTH2s.C:594
 SumAndProjectTH2s.C:595
 SumAndProjectTH2s.C:596
 SumAndProjectTH2s.C:597
 SumAndProjectTH2s.C:598
 SumAndProjectTH2s.C:599
 SumAndProjectTH2s.C:600
 SumAndProjectTH2s.C:601
 SumAndProjectTH2s.C:602
 SumAndProjectTH2s.C:603
 SumAndProjectTH2s.C:604
 SumAndProjectTH2s.C:605
 SumAndProjectTH2s.C:606
 SumAndProjectTH2s.C:607
 SumAndProjectTH2s.C:608
 SumAndProjectTH2s.C:609
 SumAndProjectTH2s.C:610
 SumAndProjectTH2s.C:611
 SumAndProjectTH2s.C:612
 SumAndProjectTH2s.C:613
 SumAndProjectTH2s.C:614
 SumAndProjectTH2s.C:615
 SumAndProjectTH2s.C:616
 SumAndProjectTH2s.C:617
 SumAndProjectTH2s.C:618
 SumAndProjectTH2s.C:619
 SumAndProjectTH2s.C:620
 SumAndProjectTH2s.C:621
 SumAndProjectTH2s.C:622
 SumAndProjectTH2s.C:623
 SumAndProjectTH2s.C:624
 SumAndProjectTH2s.C:625
 SumAndProjectTH2s.C:626
 SumAndProjectTH2s.C:627
 SumAndProjectTH2s.C:628
 SumAndProjectTH2s.C:629
 SumAndProjectTH2s.C:630
 SumAndProjectTH2s.C:631
 SumAndProjectTH2s.C:632
 SumAndProjectTH2s.C:633
 SumAndProjectTH2s.C:634
 SumAndProjectTH2s.C:635
 SumAndProjectTH2s.C:636
 SumAndProjectTH2s.C:637
 SumAndProjectTH2s.C:638
 SumAndProjectTH2s.C:639
 SumAndProjectTH2s.C:640
 SumAndProjectTH2s.C:641
 SumAndProjectTH2s.C:642
 SumAndProjectTH2s.C:643
 SumAndProjectTH2s.C:644
 SumAndProjectTH2s.C:645
 SumAndProjectTH2s.C:646
 SumAndProjectTH2s.C:647
 SumAndProjectTH2s.C:648
 SumAndProjectTH2s.C:649
 SumAndProjectTH2s.C:650
 SumAndProjectTH2s.C:651
 SumAndProjectTH2s.C:652
 SumAndProjectTH2s.C:653
 SumAndProjectTH2s.C:654
 SumAndProjectTH2s.C:655
 SumAndProjectTH2s.C:656
 SumAndProjectTH2s.C:657
 SumAndProjectTH2s.C:658
 SumAndProjectTH2s.C:659
 SumAndProjectTH2s.C:660
 SumAndProjectTH2s.C:661
 SumAndProjectTH2s.C:662
 SumAndProjectTH2s.C:663
 SumAndProjectTH2s.C:664
 SumAndProjectTH2s.C:665
 SumAndProjectTH2s.C:666
 SumAndProjectTH2s.C:667
 SumAndProjectTH2s.C:668
 SumAndProjectTH2s.C:669
 SumAndProjectTH2s.C:670
 SumAndProjectTH2s.C:671
 SumAndProjectTH2s.C:672
 SumAndProjectTH2s.C:673
 SumAndProjectTH2s.C:674
 SumAndProjectTH2s.C:675
 SumAndProjectTH2s.C:676
 SumAndProjectTH2s.C:677
 SumAndProjectTH2s.C:678
 SumAndProjectTH2s.C:679
 SumAndProjectTH2s.C:680
 SumAndProjectTH2s.C:681
 SumAndProjectTH2s.C:682
 SumAndProjectTH2s.C:683
 SumAndProjectTH2s.C:684
 SumAndProjectTH2s.C:685
 SumAndProjectTH2s.C:686
 SumAndProjectTH2s.C:687
 SumAndProjectTH2s.C:688
 SumAndProjectTH2s.C:689
 SumAndProjectTH2s.C:690
 SumAndProjectTH2s.C:691
 SumAndProjectTH2s.C:692
 SumAndProjectTH2s.C:693
 SumAndProjectTH2s.C:694
 SumAndProjectTH2s.C:695
 SumAndProjectTH2s.C:696
 SumAndProjectTH2s.C:697
 SumAndProjectTH2s.C:698
 SumAndProjectTH2s.C:699
 SumAndProjectTH2s.C:700
 SumAndProjectTH2s.C:701
 SumAndProjectTH2s.C:702
 SumAndProjectTH2s.C:703
 SumAndProjectTH2s.C:704
 SumAndProjectTH2s.C:705
 SumAndProjectTH2s.C:706
 SumAndProjectTH2s.C:707
 SumAndProjectTH2s.C:708
 SumAndProjectTH2s.C:709
 SumAndProjectTH2s.C:710
 SumAndProjectTH2s.C:711
 SumAndProjectTH2s.C:712
 SumAndProjectTH2s.C:713
 SumAndProjectTH2s.C:714
 SumAndProjectTH2s.C:715
 SumAndProjectTH2s.C:716
 SumAndProjectTH2s.C:717
 SumAndProjectTH2s.C:718
 SumAndProjectTH2s.C:719
 SumAndProjectTH2s.C:720
 SumAndProjectTH2s.C:721
 SumAndProjectTH2s.C:722
 SumAndProjectTH2s.C:723
 SumAndProjectTH2s.C:724
 SumAndProjectTH2s.C:725
 SumAndProjectTH2s.C:726
 SumAndProjectTH2s.C:727
 SumAndProjectTH2s.C:728
 SumAndProjectTH2s.C:729
 SumAndProjectTH2s.C:730
 SumAndProjectTH2s.C:731
 SumAndProjectTH2s.C:732
 SumAndProjectTH2s.C:733
 SumAndProjectTH2s.C:734
 SumAndProjectTH2s.C:735
 SumAndProjectTH2s.C:736
 SumAndProjectTH2s.C:737
 SumAndProjectTH2s.C:738
 SumAndProjectTH2s.C:739
 SumAndProjectTH2s.C:740
 SumAndProjectTH2s.C:741
 SumAndProjectTH2s.C:742
 SumAndProjectTH2s.C:743
 SumAndProjectTH2s.C:744
 SumAndProjectTH2s.C:745
 SumAndProjectTH2s.C:746
 SumAndProjectTH2s.C:747
 SumAndProjectTH2s.C:748
 SumAndProjectTH2s.C:749
 SumAndProjectTH2s.C:750
 SumAndProjectTH2s.C:751
 SumAndProjectTH2s.C:752
 SumAndProjectTH2s.C:753
 SumAndProjectTH2s.C:754
 SumAndProjectTH2s.C:755
 SumAndProjectTH2s.C:756
 SumAndProjectTH2s.C:757
 SumAndProjectTH2s.C:758
 SumAndProjectTH2s.C:759
 SumAndProjectTH2s.C:760
 SumAndProjectTH2s.C:761
 SumAndProjectTH2s.C:762
 SumAndProjectTH2s.C:763
 SumAndProjectTH2s.C:764
 SumAndProjectTH2s.C:765
 SumAndProjectTH2s.C:766
 SumAndProjectTH2s.C:767
 SumAndProjectTH2s.C:768
 SumAndProjectTH2s.C:769
 SumAndProjectTH2s.C:770
 SumAndProjectTH2s.C:771
 SumAndProjectTH2s.C:772
 SumAndProjectTH2s.C:773
 SumAndProjectTH2s.C:774
 SumAndProjectTH2s.C:775
 SumAndProjectTH2s.C:776
 SumAndProjectTH2s.C:777
 SumAndProjectTH2s.C:778
 SumAndProjectTH2s.C:779
 SumAndProjectTH2s.C:780
 SumAndProjectTH2s.C:781
 SumAndProjectTH2s.C:782
 SumAndProjectTH2s.C:783
 SumAndProjectTH2s.C:784
 SumAndProjectTH2s.C:785
 SumAndProjectTH2s.C:786
 SumAndProjectTH2s.C:787
 SumAndProjectTH2s.C:788
 SumAndProjectTH2s.C:789
 SumAndProjectTH2s.C:790
 SumAndProjectTH2s.C:791
 SumAndProjectTH2s.C:792
 SumAndProjectTH2s.C:793
 SumAndProjectTH2s.C:794
 SumAndProjectTH2s.C:795
 SumAndProjectTH2s.C:796
 SumAndProjectTH2s.C:797
 SumAndProjectTH2s.C:798
 SumAndProjectTH2s.C:799
 SumAndProjectTH2s.C:800
 SumAndProjectTH2s.C:801
 SumAndProjectTH2s.C:802
 SumAndProjectTH2s.C:803
 SumAndProjectTH2s.C:804
 SumAndProjectTH2s.C:805