ROOT logo
#ifndef __TREND_C_
#define __TREND_C_
#include "SummaryDrawer.C"
#include <TH1.h>
#include <THStack.h>
#include <TMultiGraph.h>
#include <TGraphAsymmErrors.h>
#include <TTree.h>
#include <TList.h>
#include <TLegend.h>

/**
 * Structure to make trendind plots from cut scans 
 * 
 */
struct Trend : public SummaryDrawer
{
  //__________________________________________________________________
  /** 
   * Constructor
   */
  Trend() 
  {
    fSLCuts.SetName("sl");
    fSHCuts.SetName("sh");
    fDCCuts.SetName("dc");
    fOrder[0] = &fSLCuts;
    fOrder[1] = &fSHCuts;
    fOrder[2] = &fDCCuts;
  }
  //=== Customization member function ================================
  /** 
   * Add a sharing filter low cut 
   * 
   * @param name    Name of the cut type (fix,mpv,sig,xi,prob)
   * @param values  Space-separated cut parameters 
   */
  void AddSLCut(const TString& name, const TString& values) 
  {
    fSLCuts.Add(new TNamed(name, values));
  }
  //__________________________________________________________________
  /** 
   * Add a sharing filter high cut 
   * 
   * @param name    Name of the cut type (fix,mpv,sig,xi,prob)
   * @param values  Space-separated cut parameters 
   */
  void AddSHCut(const TString& name, const TString& values) 
  {
    fSHCuts.Add(new TNamed(name, values));
  }
  //__________________________________________________________________
  /** 
   * Add a density calculator threshold 
   * 
   * @param name    Name of the cut type (fix,mpv,sig,xi,prob)
   * @param values  Space-separated cut parameters 
   */
  void AddDCCut(const TString& name, const TString& values) 
  {
    fDCCuts.Add(new TNamed(name, values));
  }
  //__________________________________________________________________
  /** 
   * Add a run to analyse 
   * 
   * @param name Run number
   */
  void AddRun(const TString& name)
  {
    fRuns.Add(new TNamed(name, name));
  }
  //__________________________________________________________________
  /** 
   * Add a centrality bin to analyse 
   * 
   * @param l  Lower bound
   * @param h  Upper bound
   */
  void AddCentrality(UShort_t l, UShort_t h)
  {
    TObjString* n = 0;
    if (l <= 0 && h >= 100) n = new TObjString("all");
    else                    n = new TObjString(Form("cent%03d_%03d", l, h));
    n->SetUniqueID((h & 0xFFFF) << 16 | (l & 0xFFFF));
    fCents.Add(n);
  }
  //__________________________________________________________________
  /** 
   * Set the order in which to do the comparison.  Most important
   * should be last.
   * 
   * @param order Permutation of sl, sh, and dc, space separated
   */
  void SetOrder(const TString& order) 
  {
    TObjArray* a = order.Tokenize(" ");
    if (a->GetEntries() < 3) {
      Error("SetOrder", "Order must contain a pertubation of "
	    "\"sl\", \"sh\", and \"dc\", separated by spaces");
      fOrder[0] = fOrder[1] = fOrder[2] = 0;
      return;
    }
    for (Int_t i = 0; i < 3; i++) { 
      const TString& n = static_cast<TObjString*>(a->At(i))->String();
      TList* l = 0;
      if      (n.EqualTo("sl", TString::kIgnoreCase)) l = &fSLCuts;
      else if (n.EqualTo("sh", TString::kIgnoreCase)) l = &fSHCuts;
      else if (n.EqualTo("dc", TString::kIgnoreCase)) l = &fDCCuts;
      if (!l) { 
	Error("SetOrder", "Unknown cut \"%s\"", n.Data());
	fOrder[0] = fOrder[1] = fOrder[2] = 0;
	return;
      }
      fOrder[i] = l;
    }
    a->Delete();
  }
  //=== Processing member functions ==================================
  /** 
   * Run it
   * 
   * @param sys 
   * @param sNN 
   * @param trg 
   */
  void Run(const char* output="trending.root", 
	   UShort_t sys=2, 
	   UShort_t sNN=2760, 
	   UShort_t trg=1)
  {
    TString outName(output);
    outName.ReplaceAll(".pdf", ".root");
    if (!outName.EndsWith(".root")) outName.Append(".root");
    TString pdfName(outName);
    pdfName.ReplaceAll(".root", ".pdf");
    
    CreateCanvas(pdfName, true);
    
    TFile*      out    = TFile::Open(outName, "RECREATE");
    TDirectory* refDir = out->mkdir("reference");

    TIter iCent(&fCents);
    TObject* pCent = 0;
    while ((pCent = iCent())) {
      UShort_t low   = (pCent->GetUniqueID() & 0xFFFF);
      UShort_t high  = (pCent->GetUniqueID() >> 16) & 0xFFFF;
      TGraph*  graph = GetOther(sys, sNN, trg, low, high);
      if (!graph) break;
      
      TString name(graph->GetName());
      name.Append(Form("_%s", pCent->GetName()));
      graph->SetName(name);

      fOthers.Add(graph);
      refDir->Add(graph);
    }

    TIter    iRun(&fRuns);
    TObject* pRun = 0;
    while ((pRun = iRun())) {
      TString     sRun = pRun->GetName();
      TDirectory* dRun = out->mkdir(sRun);
      
      MakeChapter(sRun);
      
      for (Int_t i = 0; i < 1/*2*/; i++) { 
	TString     three(Form("%dstrip", i+2));
	TDirectory* dStrip = dRun->mkdir(three);

	MakeChapter(Form("_%s", three.Data()));

	three.Append("_slX_shX_dcX");
	
	LoopCuts(sRun, three, fOrder[0], fOrder[1], fOrder[2], dStrip);
      }
    }
    out->Write();
    out->Close();
    CloseCanvas();
  }
  //__________________________________________________________________
  /** 
   * Loop over cuts.  Recursively calls self. 
   * 
   * @param run      Run number
   * @param cur      Current path
   * @param cuts1    Cuts
   * @param cuts2    Cuts (or null)
   * @param cuts3    Cuts (or null)
   * @param out      Output diretory
   * @param upBin    Parents bin number 
   * @param upMean   Parents mean
   * @param upRatios Parents ratios
   */    
  void LoopCuts(const TString& run, 
		const TString& cur, 
		const TList*   cuts1,
		const TList*   cuts2,
		const TList*   cuts3,
		TDirectory*    out,
		Int_t          upBin=0,
		THStack*       upMean=0, 
		THStack*       upRatios=0)
  {
    TString pre(Form("%s%s",(cuts3 ? "" : "_"), (cuts2 ? "" : "_")));
    Printf("%s%s", pre.Data(), cur.Data());

    TDirectory* dCut = out->mkdir(cuts1->GetName()); 
    TIter       iCut(cuts1);
    TObject*    pCut = 0;
    dCut->cd();
    while ((pCut = iCut())) { 
      TString     sMethod = pCut->GetName();
      TDirectory* dMethod = dCut->mkdir(sMethod);
      TString     sValues = pCut->GetTitle();
      TObjArray*  aValues = sValues.Tokenize(" ");
      TIter       iValue(aValues);
      TObjString* pValue = 0;
      TString     templ(Form("%s%s", cuts1->GetName(), sMethod.Data()));
      TString     base(cur);
      base.ReplaceAll(Form("%sX", cuts1->GetName()), templ);
      aValues->SetName(cuts1->GetName());

      THStack*     mean   = 0;
      THStack*     ratios = 0;
      dMethod->cd();
      MakeStacks(base, aValues, mean, ratios);
      dMethod->Add(mean);
      dMethod->Add(ratios);

      Int_t xbin = 1;
      while ((pValue = static_cast<TObjString*>(iValue()))) {
	TString     sValue(Form("%05.2f", pValue->String().Atof()));
	sValue.ReplaceAll(".", "d");
	TDirectory* dValue = dMethod->mkdir(sValue);
	TString now(base);
	TString sub(Form("%s%s", templ.Data(), sValue.Data()));
	now.ReplaceAll(templ.Data(), sub.Data());
	// now.Append(sValue);
	dValue->cd();

	if (cuts2) {
	  // Loop over sub-cut.
	  LoopCuts(run, now, cuts2, cuts3, 0, 
		   dValue, xbin, mean, ratios);
	}
	else {
	  // Process for a given cut with the current value of that cut. 
	  if (!NextFile(run, now, dValue, xbin, 
			mean, ratios)) {
	    // xbin++;
	    dMethod->cd();
	    continue;
	  }
	  // After this, we have points for the current cut value
	  // stored in the stacks mean and wSpread, and added ratios
	  // for the current cut to the stack ratios.  Since we're not
	  // done with the cut values just yet, we should wait to
	  // update the parent stacks.
	}

	if (upMean /*&& upWSpread*/) {
	  // For each centrality extract 
	  // - mean of mean of ... 
	  // - var of var of ... 
	  // - spread of spread of ... 
	  TIter    iCent(&fCents);
	  TObject* pCent = 0;
	  Int_t    jCent = 0;
	  while ((pCent = iCent())) {
	    TH1* h = static_cast<TH1*>(mean->GetHists()->At(jCent));
	    // Info("", "Updating parent %s with %s @ %d", 
	    //      upMean->GetTitle(), h->GetTitle(),upBin);
	    UpdateStacks(h, jCent, upBin, upMean);
	    jCent++;
	  }
	} // if ups
	
	xbin++;
	dMethod->cd();
      } // for values 
      
      if (upRatios) {
	TIter nextHist(ratios->GetHists());
	TH1*  hist = 0;
	while ((hist = static_cast<TH1*>(nextHist()))) 
	  upRatios->Add(hist);
      }      
      dCut->cd();

      FixMinMax(ratios);
      FixMinMax(mean);

      if (mean && mean->GetHists()->GetEntries() > 0 && 
	  ratios && ratios->GetHists() && 
	  ratios->GetHists()->GetEntries() > 0) {
	fBody->Divide(2,1);
	DrawStacks(fBody->GetPad(1), mean, kNorth|kWest);
	DrawStacks(fBody->GetPad(2), ratios, kNorth|kCenter, kSouth|kCenter);
	PrintCanvas(Form("%s_%s", pre.Data(), base.Data()), 0.5);
      }
    } // for methods 
    out->cd();
  }
  //__________________________________________________________________
  /** 
   * Process the next file 
   * 
   * @param dir        Directory
   * @param filename   File name
   * @param out        Output directory 
   * @param binx       Bin number 
   * @param mean       Graphs of mean +/- variance 
   * @param wspread    Graphs of mean +/- max/min
   * @param ratios     Ratios stack
   * 
   * @return true on success 
   */
  Bool_t NextFile(const TString& run, const TString& now,
		  TDirectory* out, Int_t binx, 
		  THStack* mean, THStack* ratios)
  {
    TString dir(Form("%s_dndeta_%s", run.Data(), now.Data()));
    TString path(Form("%s/forward_dndeta.root", dir.Data()));
    if (gSystem->AccessPathName(path.Data())) {
      Warning("NextFile", "%s not found", path.Data());
      return false;
    }
    TFile* file = TFile::Open(path, "READ");
    if (!file) { 
      Warning("NextFile", "Failed to open %s", path.Data());
      return false;
    }
    // Info("NextFile", "Opened %s", path.Data());
    
    TCollection* results = GetCollection(file, "ForwarddNdetaResults");
    if (!results) return false;

    TCollection* mcResults = GetCollection(file, "MCTruthdNdetaResults");

    THStack* all = new THStack("all",    "All");
    THStack* rat = new THStack("ratios", "Ratios");
    
    TIter    iCent(&fCents);
    TObject* pCent = 0;
    Int_t    jCent = 0;
    while ((pCent = iCent())) {
      TString folderName(pCent->GetName());
      TCollection* centFolder = GetCollection(results, folderName);
      if (!centFolder) {
	Warning("", "Didn't get the centrality %s folder from %s",
		folderName.Data(), results->GetName());
	// results->ls();
	break;
      }

      TCollection* mcCentFolder = 0;
      if (mcResults) mcCentFolder = GetCollection(mcResults, folderName);
      
      TH1* dNdeta = GetH1(centFolder, Form("dndetaForward%s", 
					   fRebinned ? "_rebin05" : ""));
      if (!dNdeta) {
	Warning("", "Didn't get histogram for jCent=%d in %s", 
		jCent, path.Data());
	// results->ls();
	break;
      }
      dNdeta->SetDirectory(out);
      dNdeta->SetName(folderName);
      dNdeta->SetMarkerColor(jCent+1);
      dNdeta->SetLineColor(jCent+1);

      TH1* other = 0; 
      if (mcCentFolder) 
	other = GetH1(mcCentFolder, Form("dndetaMCTruth%s", 
					 fRebinned ? "_rebin05" : ""));
      if (!other) {
	TGraph*  graph = static_cast<TGraph*>(fOthers.At(jCent));
	if (!graph) break;

	other = G2H(graph, *(dNdeta->GetXaxis()));
      }

      if (!other) {
	Warning("", "No other data found for %s", path.Data());
	break;
      }

      other->SetMarkerColor(dNdeta->GetMarkerColor());
      other->SetMarkerSize(dNdeta->GetMarkerSize());
      other->SetLineColor(dNdeta->GetLineColor());
      other->SetDirectory(out);
      folderName.ReplaceAll("cent", "other");
      folderName.ReplaceAll("all",  "other");
      other->SetName(folderName);

      all->Add(other);
      all->Add(dNdeta);
      
      folderName.ReplaceAll("other", "ratio");
      TH1* ratio = static_cast<TH1*>(dNdeta->Clone(folderName));
      ratio->SetTitle(Form("%s %s", dir.Data(), pCent->GetName()));
      ratio->SetDirectory(out);
      ratio->Divide(other);
      ratio->SetMarkerStyle(20+binx-1);
      ratio->SetMarkerColor(jCent+1);
      ratio->SetLineColor(kGray);
      ratio->SetLineWidth(0);
      ratios->Add(ratio);

      rat->Add(ratio);
      
      UpdateStacks(ratio, jCent, binx, mean);
      jCent++;
    }
    out->Add(all);
    out->Add(rat);

    FixMinMax(all);
    FixMinMax(rat);
    
    fBody->Divide(1,2,0,0);
    DrawStacks(fBody->GetPad(1), all/*, 21*/);
    DrawStacks(fBody->GetPad(2), rat, kNorth|kCenter);
    PrintCanvas(Form("____%s", now.Data()), .4);

    file->Close();
    if (jCent <= 0) return false;

    return true;
  }
  //=== Stack functions ==============================================
  /** 
   * Make stacks 
   * 
   * @param run      Run number
   * @param values   Cut parameters
   * @param mean     Stack of means
   * @param ratios   Stack of ratios 
   */
  void MakeStacks(const TString&   run,
		  const TObjArray* values, 
		  THStack*&        mean, 
		  THStack*&        ratios)
  {
    mean    = new THStack("mean", run);
    ratios  = new THStack("ratios", run);

    // --- Create histograms and graphs ------------------------
    Int_t    nValues = values->GetEntriesFast();
    TIter    nextCent(&fCents);
    TObject* pcent = 0;
    Int_t    col   = 1;
    while ((pcent = nextCent())) {
      UShort_t low   = (pcent->GetUniqueID() & 0xFFFF);
      UShort_t high  = (pcent->GetUniqueID() >> 16) & 0xFFFF;
      
      TH1* hMean = new TH1D(pcent->GetName(), 
			    Form("%s %d%%-%d%% central", run.Data(), 
				 low, high),
			    nValues, .5, nValues+.5);
      hMean->SetMarkerColor(col);
      hMean->SetMarkerStyle(20);
      hMean->SetLineColor(col);
      hMean->SetXTitle(Form("Cut parameter X_{%s}", values->GetName()));
      hMean->SetYTitle("Average, spread, and min/max of ratio");
      hMean->SetDirectory(0);
      TIter nextV(values);
      TObjString* pvalue = 0;
      Int_t xbin = 1;
      while ((pvalue = static_cast<TObjString*>(nextV()))) {
	TString& value = pvalue->String();
	hMean->GetXaxis()->SetBinLabel(xbin, value);
	xbin++;
      }

      TGraphAsymmErrors* gWSpread = new TGraphAsymmErrors(nValues);
      gWSpread->SetName("minmax");
      gWSpread->SetTitle(hMean->GetTitle());
      gWSpread->SetMarkerColor(col);
      gWSpread->SetLineColor(col);
      gWSpread->SetFillColor(0);
      gWSpread->SetFillStyle(0);

      hMean->GetListOfFunctions()->Add(gWSpread, "[]pl same");
      mean->Add(hMean, "x0 e1");
      col++;
    }
  }
  //__________________________________________________________________
  /** 
   * Update stacks 
   * 
   * @param h       Histogram
   * @param i       Index 
   * @param binx    Bin number 
   * @param stack   Stack to update
   */
  void UpdateStacks(TH1*         h, 
		    Int_t        i, 
		    Int_t        binx,
		    THStack*     stack)
  {
    Double_t avg = 0;
    Double_t var = 0;
    Double_t min = +100000;
    Double_t max = -100000;
    HistStatistics(h, avg, var, min, max);
    h->SetMinimum(0.95*min);
    h->SetMaximum(1.1*max);
    
    TH1* hMean = static_cast<TH1*>(stack->GetHists()->At(i));
    hMean->SetBinContent(binx, avg);
    hMean->SetBinError(binx,var);

    TObject* pG = hMean->GetListOfFunctions()->FindObject("minmax");
    if (!pG) {
      hMean->GetListOfFunctions()->ls();
      return;
    }
    TGraphAsymmErrors* gWSpread = static_cast<TGraphAsymmErrors*>(pG);
    gWSpread->SetPoint(binx-1, binx, avg);
    gWSpread->SetPointError(binx-1,0, 0, /*0.5,0.5,*/
			    TMath::Abs(avg-min), TMath::Abs(max-avg));
  }
  //=== Graphics member functions ====================================
  //__________________________________________________________________
  /** 
   * Build a centrality legend
   * 
   * @param p     Pad
   * @param where See above 
   * @param stack Stack to make legend for 
   */
  void BuildCentLegend(TVirtualPad* p, UInt_t where, THStack* stack=0)
  {
    TLegend* l     = MakeLegend(p, where, false);
    TIter    iCent(&fCents);
    TObject* pCent = 0;
    Int_t    col   = 1;
    while ((pCent = iCent())) {
      UShort_t low   = (pCent->GetUniqueID() & 0xFFFF);
      UShort_t high  = (pCent->GetUniqueID() >> 16) & 0xFFFF;

      TLegendEntry* e = l->AddEntry("dummy", 
				    Form("%2d%% - %2d%% central", low, high),
				    "pl");
      e->SetFillColor(col);
      e->SetMarkerColor(col);
      e->SetLineColor(col);
      e->SetMarkerStyle(20);
      col++;
    }
    if (stack && stack->GetHistogram()) { 
      stack->GetHistogram()->GetListOfFunctions()->Add(l);
    }
    else 
      l->Draw();
    
  }
  //__________________________________________________________________
  /** 
   * Make a cut legend. 
   * 
   * @param p      Pad
   * @param where  See above 
   * @param stack  Stack to make legend for
   */
  void BuildCutLegend(TVirtualPad* p, UInt_t where, THStack* stack)
  {
    TLegend* l     = MakeLegend(p, where, false);
    l->SetX1(p->GetLeftMargin());
    l->SetX2(1-p->GetRightMargin());
    // l->SetBorderSize(1);
    l->SetNColumns(1);

    TList    seen;
    TIter    iHist(stack->GetHists());
    TH1*     pHist = 0;
    while ((pHist = static_cast<TH1*>(iHist()))) {
      TString title(pHist->GetTitle());

      Int_t   idx = title.Index(" cent");
      if (idx != kNPOS) title.Remove(idx, 5+3+3+1);

      idx = title.Index("_dndeta");
      if (idx != kNPOS) title.Remove(0, idx+6+1+1);
      
      TObject* before = seen.FindObject(title);
      if (before) continue;

      seen.Add(new TObjString(title));
      
      TLegendEntry* e = l->AddEntry("dummy", title, "p");
      e->SetMarkerColor(kBlack);
      e->SetMarkerStyle(pHist->GetMarkerStyle());
    }
    seen.IsOwner();
    if (stack->GetHistogram()) { 
      stack->GetHistogram()->GetListOfFunctions()->Add(l);
    }
    else 
      l->Draw();
    
  }
  //__________________________________________________________________
  /** 
   * Draw stacks
   *  
   * @param p      Pad
   * @param stack  Stacks
   * @param cent   Centrality legend location
   * @param cuts   Cut legend location
   */
  void DrawStacks(TVirtualPad* p, 
		  THStack* stack, 
		  UInt_t cent=0, 
		  UInt_t cuts=0)
  {
    if (!stack) {
      Warning("DrawStacks", "Stack is missing!");
      return;
    }
    if (!stack->GetHists() || stack->GetHists()->GetEntries() <= 0) { 
      Warning("DrawStacks", "Stack is empty");
      return;
    }
    TH1*    first = static_cast<TH1*>(stack->GetHists()->At(0));
    TString xT    = first->GetXaxis()->GetTitle();
    
    p->cd();
    stack->Draw("nostack");
    // DrawInPad(p, 0, stack, "nostack", flags);
    stack->GetXaxis()->SetTitle(xT);
    FixMinMax(stack);

    if (cent > 0) BuildCentLegend(p, cent, stack);
    if (cuts > 0) BuildCutLegend(p, cuts, stack);

    p->Modified();
    p->Update();
    p->cd();
  }
  //=== Utility static member functions ==============================
  /** 
   * Update statistics
   * 
   * @param y    Current observation
   * @param cnt  On entry, last count, on return current count
   * @param mean On entry, last mean, on return current mean
   * @param var  On entry, last variance, on return current variance 
   */
  static void Statistics(Double_t  y,
			 Int_t&    cnt,
			 Double_t& mean, 
			 Double_t& var) 
  {
    cnt        += 1;
    mean       += (y - mean) / cnt;
    var        += (cnt > 1 ? (TMath::Power(y-mean,2)/(cnt-1)-var/cnt) : 0);
  }
  //__________________________________________________________________
  /** 
   * Calculate histogram statistics
   *  
   * @param h     Histogram
   * @param mean  On return, the Y-mean
   * @param var   On return, the Y variance 
   * @param min   On return, the least Y 
   * @param max   On return, the largest Y 
   */
  static void HistStatistics(const TH1* h, 
			     Double_t& mean, 
			     Double_t& var, 
			     Double_t& min, 
			     Double_t& max)
  {
    mean      = 0;
    var       = 0;
    min       = +100000;
    max       = -100000;
    Int_t cnt = 0;
    for (Int_t i = 1; i <= h->GetNbinsX(); i++) { 
      Double_t y = h->GetBinContent(i);
      if (TMath::Abs(y) <= 1e-9) continue;
      min        =  TMath::Min(min, y);
      max        =  TMath::Max(max, y);
      Statistics(y, cnt, mean, var);
    }
    // Info("", "Stats for %s:  mean=%f +/- %f [%f,%f]",
    //      h->GetTitle(), mean, var, min, max);
  }
  //__________________________________________________________________
  /** 
   * Fix the min/max of a stack
   * 
   * @param stack 
   */
  static void FixMinMax(THStack* stack)
  {
    TIter iHist(stack->GetHists());
    TH1*  pHist = 0;
    Double_t m1 = 10000000;
    Double_t m2 = -10000000;
    while((pHist = static_cast<TH1*>(iHist()))) { 
      m1 = TMath::Min(m1, pHist->GetMinimum(1e-6));
      m2 = TMath::Max(m2, pHist->GetMaximum());
    }
    // Double_t m1 = stack->GetMinimum("nostack e");
    // Double_t m2 = stack->GetMaximum("nostack e");
    // Printf("Stack %s minimum: %f", stack->GetTitle(), m1);
    stack->SetMinimum((m1 < 0 ? 1.05 : 0.95)  * m1);
    stack->SetMaximum((m2 > 0 ? 1.05 : 0.95)  * m2);
  }
  //__________________________________________________________________
  /** 
   * Turn a graph into a histogram
   * 
   * @param g    Graph
   * @param axis Axis to use 
   * 
   * @return Newly allocated histogram 
   */
  static TH1* G2H(const TGraph* g, const TAxis& axis)
  {
    TH1* h = 0;
    if (axis.GetXbins()->GetArray()) 
      h = new TH1D(g->GetName(), g->GetTitle(), 
		   axis.GetNbins(), axis.GetXbins()->GetArray());
    else 
      h = new TH1D(g->GetName(), g->GetTitle(), 
		   axis.GetNbins(), axis.GetXmin(), axis.GetXmax());
    h->SetMarkerColor(g->GetMarkerColor());
    h->SetMarkerStyle(g->GetMarkerStyle());
    h->SetMarkerSize(g->GetMarkerSize());
    h->SetLineColor(g->GetLineColor());
    h->SetLineStyle(g->GetLineStyle());
    h->SetLineWidth(g->GetLineWidth());
    h->SetFillColor(g->GetFillColor());
    h->SetFillStyle(g->GetFillStyle());
    h->SetDirectory(0);
    
    for (Int_t i = 1; i <= h->GetNbinsX(); i++) { 
      Double_t x = h->GetXaxis()->GetBinCenter(i);
      Double_t y = g->Eval(x); // , 0, "S");
      h->SetBinContent(i, y);
    }
    return h;
  }
  //__________________________________________________________________
  /** 
   * Get other data
   * 
   * @param sys    Collision system
   * @param sNN    Collision energy 
   * @param trg    Trigger 
   * @param lowC   Low centrality 
   * @param highC  High centrality 
   * 
   * @return Newly allocated histogram
   */
  static TGraph* GetOther(UShort_t      sys, 
			  UShort_t      sNN, 
			  UShort_t      trg,
			  UShort_t      lowC, 
			  UShort_t      highC)
  {
    // --- Set the macro pathand load other data script --------------
    // Always recompile 
    if (!gROOT->GetClass("RefData")) {
      TString savPath(gROOT->GetMacroPath());
      gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWGLF/FORWARD/analysis2",
			       gROOT->GetMacroPath()));
      gROOT->LoadMacro("OtherData.C++");
      gROOT->SetMacroPath(savPath);
    }
    Long_t ret = gROOT->ProcessLine(Form("RefData::GetData(%d,%d,%d,%d,%d,0x4)",
					 sys, sNN, trg, lowC, highC));
    if (!ret) { 
      Warning("GetOther", "No other data for %d %d %d %d%%-%d%% central", 
	      sys, sNN, trg, lowC, highC);
      return 0;
    }
    TMultiGraph* others = reinterpret_cast<TMultiGraph*>(ret);    
    TGraph*      other  =static_cast<TGraph*>(others->GetListOfGraphs()->At(0));
    if (!other) {
      Warning("GetOther", "No ALICE data for %d %d %d %d%%-%d%% central", 
	      sys, sNN, trg, lowC, highC);
      return 0;
    }
    
    // Info("", "Got graph %s/%s", other->GetName(), other->GetTitle());

    return other;
  }

  //__________________________________________________________________
  TList     fSLCuts;
  TList     fSHCuts;
  TList     fDCCuts;
  TList     fRuns;
  TList     fCents;
  TList     fOthers;
  TList*    fOrder[3];	
  Bool_t    fRebinned;
};

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