ROOT logo

#include "TROOT.h"
#include "TF1.h"
#include "TH1.h"
#include "TH2.h"
#include "TNtuple.h"
#include "TFile.h"
#include "TKey.h"
#include "TRandom.h"
#include "TMath.h"
#include "TGraph.h"
#include "TCanvas.h"
#include "TLatex.h"
#include "TBox.h"
#include "TGraphErrors.h"
#include "TStyle.h"
#include "TPolyLine.h"
#include "TLegend.h"
#include "TLine.h"
#include "TSystem.h"
#include "TObjArray.h"
#include "TGraph2D.h"
#include "TGaxis.h"
#include "TArrow.h"
#include "TASImage.h"
#include "TFitResult.h"
#include "TStopwatch.h"
#include "TProfile2D.h"
#include "TRegexp.h"
#include <iostream>
#include <fstream>
#include <vector>

// Plot utilities class - loaded by rootlogon.C + .rootrc
#include "Utils.h"
PlotUtils utils;
const char* inputFileName = ""; // Assign in macro
const char* cfDef = "cA"; // s, m, cA or cB. Only for phi projections.
double minRidgeDEta = 0.8;
double maxRidgeDEta = 1.799;
const int gNMax = 12; // Global const -- largest n in VnDelta

// Don't do global fit to points outside these pt bin
// indices. Globally scoped for availability in vntvna(). Reassigned
// within individual functions.
double minFitPtBin = 0, maxFitPtBin = 999;

// Switches
//============================================================
bool usePtBinCenter = 1;
bool ispp = 0;

// Functions
//============================================================
void SetProtonProtonFlag(int val) { ispp = val; }
void SetMinRidgeDEta(int val) { minRidgeDEta = val; }
bool IsProtonProton() { return ispp; }
void SetCFDef(char* def) { cfDef = def; }
void SaveGraphs(const char* outputFileName, TString opt = "");
TF1* DoGlobalFit(int n, int k, int includedPtBin1 = 0, int includedPtBin2 = 999,
		 const char* region = "RIDGE", const char* cfDef = "cA", TString opt = "");
void VnDelta(int n, const TH1 &h, double &vnd, double &vnd_err, TString opt="");
void VnDelta(int n, const TF1 &f, double &vnd, double &vnd_err, TString opt="");
void MakeVnDVsQGraphs(int n1, int n2, int k, const char* region, const char* corrtype, TString opt="");
TF1* Harmonic(TH1* h, int n, TString opt);
TF1* HarmonicSum(TH1* h, int n1, int n2, TString opt="");
TH1* Hist(const char* region, const char* type, int i, int j, int k, TString opt="");
TH2* EtaPhiHist(int cent, int ptt, int pta);
TH2* PttPtaHist();
TH2F* Agreement2DHist(int k, int n);
void ijkFromHistName(TH1* h, int& i, int& j, int& k);

TGraphErrors* VnDeltaVsN(int i, int j, int k, int nMax, TString opt);
TGraphErrors* VnDeltaNFVsN(int i, int j, int k, int nMax, TString opt);
TGraphErrors* GlobalvnVsN(int i, int k, int nMax, TString opt);
TGraphErrors* VnDeltaVsPtAssoc(int i, int k, int n, TString opt="");
TGraphErrors* VnDeltaVsPtTrig(int j, int k, int n, TString opt="");
TGraphErrors* AgreementVsPtSum(int k, int n);
TGraphErrors* VnDVsQ(int n, int k, const char* region = "RIDGE", const char* cfDef = "cA", TString opt="");
TGraphErrors* GlobalFitVsPtAssoc(int i, int k, int n, TString opt=""); // v_n(ptt)v_n(pta) vs. assoc pt
TGraphErrors* vnGFvsPt(int n, int k, int ipt1, int ipt2,
		       const char* region = "RIDGE", 
		       const char* corrtype = "cA", TString opt = "");
TF1* GlobalFitVsQ(int n, int k, int ipt1=0, int ipt2=999, const char* region="RIDGE",
		  const char* corrtype="cA", TString opt=""); // The real fit function
//TF1* GlobalFitVsQSubset(int n, int k, int i, TString opt = "");
TGraph* Luzumv1(int cent, const char* pid);
double MomCorrection(int i, int j, int k);

// Global fit function - give to TF1 constructor
double vntvna(double *x, double *par);
double Chi2(TH1* h, TF1* f, TString opt = ""); // "", "ndf" or "prob"
double ReducedChi2(int i, int k, int n);
double SineError(int i, int j, int k); // RMS of <sin n D phi> vs. n about zero
double vnGF(int n, int k, int ptBin, int includedPtBin1 = 0, int includedPtBin2 = 999,
	    const char* region = "RIDGE", const char* cfDef = "cA", TString opt = "");

// Show +/- solutions in chi2 space by varying one fixed parameter (par)
TCanvas* FitStudy(int icent, int n, int par);
TCanvas* DrawQ(int k, int n, TString opt = "");
TCanvas* SingleDraw(int cent, int ptt, int pta, TString opt="");
TCanvas* SingleDrawEta(int cent, int ptt, int pta, TString opt);
TCanvas* SingleDrawPlain(int cent, int ptt, int pta, TString opt);
TCanvas* DrawVnVsPtTrig(int k, int npta, int ptabins[], TString opt = "");
TCanvas* SingleDraw2D(int cent, int ptt, int pta, TString opt="");
TCanvas* MultiDraw(int cent, TString opt);
TCanvas* DrawVnFromGlobalFit(int n, int ipt1=0, int ipt2=999, int ncb = 999, 
			     int centbins[] = 0, TString opt=""); // little v_n
TCanvas* TwoPanelVert(double ydiv, const char* canvName, const char* canvTitle);
TCanvas* DrawChi2vsPtTrig(int npta, int ptabins[], int ncb, int centbins[], TString opt);
TCanvas* DrawAgreement(int icent, TString opt = "");
TCanvas* Drawv1to5(int ncb, int centbins[], int ipt1=0, int ipt2=999, TString opt="");
TCanvas* Drawv2to5(int ncb, int centbins[], int ipt1=0, int ipt2=999, TString opt="");
TCanvas* DrawGlobalvnVsN(int npt, int ptbins[], int ncb, int centbins[], TString opt="");

// functions needed for above routine
void initialize(const char* ifName = inputFileName);
void AddPrelimStampToCurrentPad(float x1, float y1, float x2, float y2, TString opt="");

void SaveCanvases(TObjArray* canvases, const char* fileName);
void SaveCanvasesFromFile(const char* rootFile, const char* targetDir, const char* tag, const char* fileType);
TObjArray* GetObjectsFromFile(TFile& file, TString clname, TString dir="");


// Global variables
//============================================================
TFile *fin=0;
int maxcent;
int centlow[100];  // low and high percentile for each selection
int centhigh[100];
int maxpt;
double ptmean[100];
double ptlow[100];
double pthigh[100];

int colorsPale[] = {kOrange-3, kGreen-6, kAzure-9, kGray+1, kRed-9, kRed-7, kBlue-9, kViolet-9};
int colorsDark[] = {kOrange-8, kGreen+1, kAzure+2, kBlack,  kCyan+1, kRed+0, kBlue+1, kViolet+1};
int centColors[] = {kBlack, kRed, kOrange-3, kGreen+1, kCyan+2, kBlue-1, kViolet, kGreen+1, kOrange-3, kRed+0,  kOrange-8, kRed+1, kBlue+1};
int centColorsPale[] = {kGray, kRed-9, kOrange-4, kGreen-7, kCyan-7, kBlue-9, kViolet-9, kGreen, kOrange, kRed-4,  kOrange-9, kRed-1, kBlue-1};

TLatex ltx;  // NDC
TLatex ltx2; // absolute

// Global container for graphs, TF1s, etc.
TObjArray* gList = new TObjArray();
TObjArray* gFitList = new TObjArray();
TF1* axisFn = 0;

TGraphErrors *gi, *gj, *gk;
char* trigLabel(int i);
char* asscLabel(int j);
char* centLabel(int k);
double MeanPt(int i, int j, int k, TString t_or_a = "t" /* "t" or "a" */, 
	      TString opt="" /* "" or "squared" */);
int CentBin(double cntLo, double cntHi); 
int PtBin(double ptLo, double ptHi);
int CentColor(double cen1, double cen2);
int CentColorPale(double cen1, double cen2);
int PtColor(double p1, double p2);
int PtColorPale(double p1, double p2);
TStopwatch timer;

// The business
//============================================================

void SaveGraphs(const char* outputFileName, TString opt)
{
  const char* mode = "recreate";
  if (opt.Contains("update"))
    mode = "update";

  TFile* outputFile = new TFile(outputFileName, mode);
  gList->Write();
  gFitList->Write();
  outputFile->Close();
  return;
}

void initialize(const char* ifName) {

  // TH1F files with histograms for:
  // NSJET_y_PTTRIG_PTASSOC_CENT (tracks with |delta-eta| < 0.8)
  // RIDGE_y_PTTRIG_PTASSOC_CENT (tracks with |delta-eta| = 0.8 - 1.6)

  if (fin) // don't keep re-initializing
    return;

  fin = new TFile(ifName);
  if (!fin) {
    Error("FourierPlus - initialize()", "%s not found", ifName);
    gSystem->Exit(1);
  }
  
  TList* info = (TList*)fin->Get("FileInfo");
  if (info)
    info->Print();

  gi = (TGraphErrors*) fin->Get("TrigPtBins");
  gj = (TGraphErrors*) fin->Get("AsscPtBins");
  gk = (TGraphErrors*) fin->Get("EvCentBins");

  maxpt = gi->GetN();
  maxcent = gk->GetN();
  gList->Add(gi);   gList->Add(gj);   gList->Add(gk);

  if (gj->GetN() != maxpt)
    Warning("initialize()", 
	    "Trigger and assc. binning are not symmetric: %d vs. %d", 
	    maxpt, gj->GetN() );
  
  for (int k=0; k<maxcent; k++) {
    centlow[k] = gk->GetX()[k] - gk->GetEX()[k];
    centhigh[k] = gk->GetX()[k] + gk->GetEX()[k];
    //    cout << centlow[k] << " " << centhigh[k] << endl;
  }

  for (int i=0; i<maxpt; i++) {
    ptlow[i] = gi->GetX()[i] - gi->GetEX()[i];
    pthigh[i] = gi->GetX()[i] + gi->GetEX()[i];
    //    cout << ptlow[i] << " " << pthigh[i] << endl;
  }

  // OK, leave hard-coded for now....
  ptmean[0] = 0.66; // 0.5-1 GeV
  ptmean[1] = 1.30; // 1-2 GeV
  ptmean[2] = 2.30; // 2-3 GeV
  ptmean[3] = 3.30; // 3-4 GeV
  ptmean[4] = 4.60; // 4-6 GeV
  ptmean[5] = 6.60; // 6-8 GeV
  ptmean[6] = 11.7; // 8-15 GeV

  if (usePtBinCenter)
    for (int i=0; i<maxpt; i++) {
      ptmean[i] = gi->GetX()[i];
    }

  gROOT->SetStyle("Plain");
  gStyle->SetOptTitle(0);
  gStyle->SetOptStat(0);
  ltx.SetNDC();
}

TH1* Hist(const char* region, const char* type, int i, int j, int k, TString opt)
{
  // Options: 
  // "sys": return measured pts. w/systematic errors. 
  // "hi_sys": meas. pts + sys, unmodified stat. errors.
  // "lo_sys": meas. pts - sys, unmodified stat. errors.

  TH1* h_in=0, *h_out=0;
  const char* name = Form("PbPb/%s_%s_%d_%d_%d",region,type,i,j,k);
  h_in = (TH1*)fin->Get(name);
  if (!h_in) {
    Error("Hist()","%s not found, exiting.", name);
    gSystem->Exit(-1);
  }

  h_out = (TH1*)h_in->Clone(Form("%s_%s", name, opt.Data()));
  
  // Stat --> sys error bars. Error estimated as difference in Fourier
  // series (0<n<6) between same-event dist. and CF.
  if (opt.Contains("sys")) {
    const char* s = Form("PbPb/%s_s_%d_%d_%d",region,i,j,k);
    TH1* htmp = (TH1*)fin->Get(s);
    TH1* hs = 0;
    if (htmp)
      hs = (TH1*)htmp->Clone();
    else
      Error("Hist()", "No hist %s", s);

    double c = double(hs->GetNbinsX())/hs->Integral();
    hs->Scale(c);

    TF1* fs = HarmonicSum(hs,  1,5);
    TF1* fc = HarmonicSum(h_in,1,5);

    for (int n=1; n<=hs->GetNbinsX(); n++) {
      double x = hs->GetBinCenter(n);
      double err = TMath::Abs(fs->Eval(x) - fc->Eval(x));
      double bc = h_in->GetBinContent(n);
      
      if (opt.Contains("hi_sys"))
	h_out->SetBinContent(n, bc+err);
      else if (opt.Contains("lo_sys"))
	h_out->SetBinContent(n, bc-err);
      else {
	h_out->SetBinError(n, err);
	h_out->SetFillColor(kGray);
      }
    }
    
    delete htmp;
    delete hs;
    delete fs;
    delete fc;
  }

  return h_out;
}

void ijkFromHistName(TH1* h, int& i, int& j, int& k)
{
  TString tok, name(h->GetName());
  Ssiz_t from = 0;
  int counter = 0;
  while (name.Tokenize(tok, from, "_")) {
    if (counter==2) i = tok.Atoi();
    if (counter==3) j = tok.Atoi();
    if (counter==4) k = tok.Atoi();
    counter++;
  }
  if (0)
    cout << i<<j<<k << endl;

  return;
}

double PtBinCenterSum(int ptt, int pta)
{
  if ((ptt<0 || ptt>=maxpt) || (pta>ptt))
    Error("PtBinCenterSum()","Bad arg(s): ptt %d pta %d", ptt, pta);
 
  double pti = gi->GetX()[ptt];
  double ptj = gj->GetX()[pta];
  return pti+ptj;
}

int GlobalIndex(int ptt, int pta)
{
  // Find the global index from the trig and assc. pt bins.
  // It is useful that TMath::Binomial(n,k) returns 0 when n < k.
  if (pta > ptt) return -1;
  return TMath::Binomial(ptt+1, 2) + pta;
}

void ijFromGlobalIndex(int q, int& ptt, int& pta)
{
  // Assign ptt and pta from the global index q. This function is
  // effectively the inverse of GlobalIndex(i,j).
  for (int i=0; i<maxpt; i++) {
    for (int j=0; j<=i; j++) {
      if (GlobalIndex(i,j)==q) {
	ptt = i; pta = j;
	return;
      }
    }
  }
  return;
}

// Needs to be updated! Has hard-coded numbers like 27.9. -AMA 11/15/2011
TCanvas* FitStudy(int icent, int n, int par)
{
  // First get the VnDelta vs q graph...
  TGraphErrors* gVn = VnDVsQ(n, icent);
  
  // Then setup fit function
  TF1 *fn = new TF1(Form("fn_cent%dto%d_n%d", centlow[icent],centhigh[icent], n), 
		    vntvna, 0.0, 27.9, maxpt);
  fn->SetNpx(1000);
  fn->SetLineColor(kRed);

  TCanvas* c = new TCanvas(Form("chi2_cent%dto%d_n%d", centlow[icent],centhigh[icent], n), 
			   Form("chi2 test for %s, varying v_{%d}(%.1f)",
				centLabel(icent), n, ptmean[par]), 
			   700, 1200);
  c->Divide(1, 3, 0.001, 0.001);
  
  TGraphErrors *g = new TGraphErrors();
  TGraphErrors *chi2 = new TGraphErrors();
  chi2->SetTitle(Form("Total #chi^{2} for n=%d;v_{%d}(p_{T}=%.2f);total #chi^{2}", n,n, ptmean[par]));
  utils.set_tgraph_props(g, kGray, kGray, kFullCircle, 1.3);
  utils.set_tgraph_props(chi2, kBlue, kBlue, kFullCircle, 0.8);
  g->SetLineWidth(3);

  double bestvn     = vnGF(n,icent,par,0,999,"RIDGE","cA","");
  double bestvn_err = vnGF(n,icent,par,0,999,"RIDGE","cA","err");

  int nsteps = 500;

  double parmax = TMath::Abs(2*(bestvn + bestvn_err));
  double parmin = -parmax;

  // First panel: step thru one fixed vn
  c->cd(1);
  TH1F* hf1 = gPad->DrawFrame(0.0, 1.2*parmin, 12.5, 1.2*parmax);
  hf1->SetTitle(Form("title;p_{T};v_{%d}(p_{T})", n));

  for (int step=0; step<=nsteps; step++) {
    double stepsize =  (parmax-parmin)/nsteps;
    double val = parmin + step*stepsize;
    
    for (int ip=0;ip<maxpt;ip++) fn->SetParameter(ip,0.0);
    fn->FixParameter(par, val);

    gVn->Fit(fn, "QR");
    for (int i=0;i<maxpt;i++) {
      g->SetPoint(i, ptmean[i], fn->GetParameter(i));
      g->SetPointError(i, 0.0, fn->GetParError(i));
    }
    if (step%50==0)
      g->DrawClone("elpsame");

    // store chi2 at this val
    chi2->SetPoint(step, val, fn->GetChisquare());
  }
  // Finally, draw once with no fixed parameters...
  utils.set_tgraph_props(g, kBlack, kBlack, kFullCircle, 1.3);
  for (int ip=0;ip<maxpt;ip++) fn->ReleaseParameter(ip);
  gVn->Fit(fn,"QR");
  for (int i=0;i<maxpt;i++) {
    g->SetPoint(i, ptmean[i], fn->GetParameter(i));
    g->SetPointError(i, 0.0, fn->GetParError(i));
  }
  g->DrawClone("elpsame");
  ltx.SetTextSize(0.08);
  ltx.DrawLatex(0.6, 0.8, Form("v_{%d}, %s", n, centLabel(icent)));

  // Plot chi2 over full range
  c->cd(2);
  c->Update();
  chi2->DrawClone("alp");

  // and zoomed to see 1 sigma interval
  c->cd(3);
  c->Update();
  double ymin = 1e9;//chi2->GetHistogram()->GetMinimum();
  for (int j=0; j<chi2->GetN(); j++)
    if (chi2->GetY()[j] < ymin)
      ymin = chi2->GetY()[j];
  double nsigma = n==2? 3 : 3;
  TH1F* hf3 = gPad->DrawFrame(parmin, ymin - 1, parmax, ymin + nsigma);
  hf3->SetTitle(Form("Total #chi^{2} for n=%d;v_{%d}(p_{T}=%.2f);total #chi^{2}", n,n, ptmean[par]));
  chi2->DrawClone("lpsame");
  TLine best, onesig;
  best.SetLineWidth(3);
  onesig.SetLineWidth(3);
  onesig.SetLineColor(kGray);
  best.DrawLine(parmin, ymin, parmax, ymin);
  onesig.DrawLine(parmin, ymin+1, parmax, ymin+1);
  TLatex lbl;
  lbl.DrawLatex(parmin + 0.05*(parmax-parmin), ymin+0.1, Form("Best v_{%d}(%.2f)",n,ptmean[par]));
  lbl.DrawLatex(parmin + 0.05*(parmax-parmin), ymin+1.1, "+ 1#sigma");

  return c;
}

TCanvas* MultiDraw(int cent, TString opt)
{
  // TODO: make this function much more flexible. Pass in an array of
  //  bins or histos and m,n ints to plot in an m x n grid.
  TCanvas* c = new TCanvas(Form("cfmulti_%s_%d",opt.Data(),cent),
			   Form("Corr. Functions - %s", centLabel(cent)),
			   1200, 900);
  c->Divide(maxpt, maxpt-2, 0, 0);

  int ipad=1;

  // Combine first 3 rows (i=0,1,2) to save space
  // Then draw the rest as usual
  for (int i=0; i<maxpt; i++) {
    for (int j=0; j<maxpt; j++) {
      if(j<=i) {
	TCanvas* cs = 0;
	if (opt.Contains("2D")) 
	  cs = SingleDraw2D(cent, i, j, "");
	else if (opt.Contains("deta"))
 	  cs = SingleDrawEta(cent, i, j, "");
	else
	  cs = SingleDraw(cent, i, j, "");
	c->cd(ipad);
	cs->DrawClonePad();
	ipad++;
	if (ipad==maxpt) ipad++;
      }
      else if (i > 2) ipad++;
    }
  }

  // Add some labeling in empty pads
  ltx.SetTextSize(0.15);
  c->cd(1*maxpt);
  ltx.DrawLatex(0.1, 0.8, "p_{T}^{trig}: 0.5-1,");
  ltx.DrawLatex(0.1, 0.6, "1-2, 2-3 GeV/c");  
  c->cd(2*maxpt);
  ltx.DrawLatex(0.1, 0.8, "p_{T}^{trig}:");
  ltx.DrawLatex(0.1, 0.6, "3-4 GeV/c");  
  c->cd(3*maxpt);
  ltx.DrawLatex(0.1, 0.8, "p_{T}^{trig}:");
  ltx.DrawLatex(0.1, 0.6, "4-6 GeV/c");  
  c->cd(4*maxpt);
  ltx.DrawLatex(0.1, 0.8, "p_{T}^{trig}:");
  ltx.DrawLatex(0.1, 0.6, "6-8 GeV/c");  

  c->cd(2*maxpt-2);
  ltx.SetTextSize(0.2);
  ltx.DrawLatex(0.1, 0.7, "Pb+Pb");
  ltx.DrawLatex(0.1, 0.4, "LHC10h");
  ltx.DrawLatex(0.1, 0.1, centLabel(cent));  

  return c;
}

TH2* EtaPhiHist(int cent, int ptt, int pta)
{
 initialize();
  TH2* htmp = (TH2*)fin->Get(Form("PbPb/ETAPHI_c_%1d_%1d_%1d",ptt,pta,cent));
  if (!htmp) {
    Error("EtaPhiHist()",
	  "Problem getting pointer to histogram. cent %d ptt %d pta %d", 
	  cent, ptt, pta);
    return 0;
  }
  TH2* h = (TH2*)htmp->Clone(Form("EtaPhi_c_%1d_%1d_%1d",ptt,pta,cent));
  TAxis *ax = h->GetXaxis(), *ay = h->GetYaxis(), *az = h->GetZaxis();
  ax->SetTitle("#Delta#phi");
  ay->SetTitle("#Delta#eta");
  az->SetTitle("C(#Delta#phi, #Delta#eta)");
  ay->SetRangeUser(-maxRidgeDEta, maxRidgeDEta);
  ax->SetTitleOffset(1.3);
  ay->SetTitleOffset(1.3);
  az->SetTitleOffset(1.4);

  return h;
}

TCanvas* SingleDraw2D(int cent, int ptt, int pta, TString opt)
{
  initialize();
  TCanvas* c = 0; // The canvas to be returned
  double labelScale = 1.3;
  double nDiv = 5;
  
  // See if we have already made this once
  const char* name;
  if (opt=="") 
    name = Form("etaphi_cent%dto%d_%d_%d",
		centlow[cent],centhigh[cent],ptt,pta );
  else
    name = Form("etaphi_cent%dto%d_%d_%d_%s",
		centlow[cent],centhigh[cent],ptt,pta, opt.Data() );

  const char* title = Form("dphideta_cent%dto%d_pTtrig%.2gto%.2g_pTassoc%.2gto%.2g_%s",
			   centlow[cent],centhigh[cent],
			   ptlow[ptt], pthigh[ptt],
			   ptlow[pta], pthigh[pta],
			   opt.Data());

  if (gDirectory->FindObject(name)) {
    c = (TCanvas*) gDirectory->FindObject(name);
    return c;
  }
  else
    c = new TCanvas(name, title, 1);

  TH2* h = EtaPhiHist(cent, ptt,pta);
  if (!h) {
    Error("SingleDraw2D()",
	  "Problem getting pointer to histogram. cent %d ptt %d pta %d", 
	  cent, ptt, pta);
    return 0;
  }
  utils.make_nice_axes(c, h, labelScale, nDiv, nDiv);
  TAxis *ax = h->GetXaxis(), *ay = h->GetYaxis(), *az = h->GetZaxis();
  ax->SetTitle("#Delta#phi [rad]");
  ay->SetTitle("#Delta#eta");
  az->SetTitle("C(#Delta#phi, #Delta#eta)");
  ay->SetRangeUser(-maxRidgeDEta, maxRidgeDEta);
  ax->SetTitleOffset(1.3);
  ay->SetTitleOffset(1.3);
  az->SetTitleOffset(1.4);

  double czlo=0, czhi=5.0;
  if (opt.Contains("zoom")) 
    az->SetRangeUser(czlo, czhi);

  if (opt.Contains("colz"))
    h->Draw("colz");
  else
    h->Draw("surf1");

  ltx.SetTextSize(0.05);
  if (opt.Contains("colz")) {
    if (opt.Contains("zoom")) 
      ltx.DrawLatex(0.6, 0.9, Form("C(#Delta#phi) (C(#Delta#phi) < %.3g)", czhi));
    else
      ltx.DrawLatex(0.6, 0.9, Form("C(#Delta#phi) (full range)"));
  }
  
  // Label pt, centrality, energy
  TString ptStr(Form("#splitline"
		     "{%.3g < p_{T}^{t} < %.3g GeV/c}"
		     "{%.3g < p_{T}^{a} < %.3g GeV/c}",
		     ptlow[ptt], pthigh[ptt],
		     ptlow[pta], pthigh[pta]));
  ltx.SetTextSize(0.07);
  ltx.DrawLatex(0.01, 0.86, ptStr.Data());
  if (ispp)
    ltx.DrawLatex(0.65, 0.9, Form("#splitline{pp 2.76 TeV}{}"));
  else
    ltx.DrawLatex(0.65, 0.9, Form("#splitline{Pb-Pb 2.76 TeV}{%s}", centLabel(cent)));

  return c;
}

TCanvas* SingleDrawEta(int cent, int ptt, int pta, TString opt)
{
  TCanvas* c = 0;
  int lineWidth  = opt.Contains("small") ? 1 : 4;
  double mrkSize = opt.Contains("small") ? 0.5 : 1.5;

  const char* name = Form("deta_cent%dto%d_%d_%d", 
			  centlow[cent],centhigh[cent],ptt,pta);

  // See if we have already made this once
  if (gDirectory->FindObject(name)) {
    c = (TCanvas*) gDirectory->FindObject(name);
    Info("SingleDrawEta()", "%s already created", c->GetName());
    return c;
  }
  else
    c = new TCanvas(name, name, 600, 600);

  TH1 *hNS = 0, *hAS = 0;    // divide-then-project
  TH1 *hNS2 = 0, *hAS2 = 0;  // project-then-divide

  bool includeProjThenDiv = 0;

  if (1) { // Recreate CFs using divide-then-project method

    TH2* hc = (TH2*)fin->Get(Form("PbPb/ETAPHI_c_%1d_%1d_%1d",ptt,pta,cent));
    if (!hc) {
      Error("SingleDrawEta()", "Problem getting hc\n");
      gSystem->Exit(-1);
    }

    int bin1 = hc->GetXaxis()->FindBin(-TMath::PiOver2()+0.001);
    int bin2 = hc->GetXaxis()->FindBin(TMath::PiOver2()-0.001);
    int bin3 = hc->GetXaxis()->FindBin(TMath::PiOver2()+0.001);
    int bin4 = hc->GetXaxis()->FindBin(3*TMath::PiOver2()-0.001);
    
    bool smallEtaRange = false;
    if (smallEtaRange) {
      bin1 = hc->GetXaxis()->FindBin(-TMath::PiOver2()+0.001);
      bin2 = hc->GetXaxis()->FindBin(TMath::PiOver2()-0.001);
      bin3 = hc->GetXaxis()->FindBin(TMath::Pi()-0.5);
      bin4 = hc->GetXaxis()->FindBin(TMath::Pi()+0.5);
    }

    const char* ns_name = Form("ns_deta_cent%dto%d_%d_%d", 
			       centlow[cent],centhigh[cent],ptt,pta);
    const char* as_name = Form("as_deta_cent%dto%d_%d_%d", 
			       centlow[cent],centhigh[cent],ptt,pta);
    
    hNS = hc->ProjectionY(ns_name, bin1, bin2, "e");
    hAS = hc->ProjectionY(as_name, bin3, bin4, "e");

    hNS->Scale(1./(bin2-bin1+1));
    hAS->Scale(1./(bin4-bin3+1));

  }

  if (includeProjThenDiv) { // As created by Project.C (project-then-divide)
    const char* ns = Form("PbPb/ETA_NS_c_%1d_%1d_%1d",ptt,pta,cent);
    const char* as = Form("PbPb/ETA_AS_c_%1d_%1d_%1d",ptt,pta,cent);
    hNS2 = (TH1*)fin->Get(ns);
    hAS2 = (TH1*)fin->Get(as);
    if (!hNS2) {
      Error("SingleDrawEta()", "Problem getting %s\n", ns);
      gSystem->Exit(-1);
    }
    if (!hAS2) {
      Error("SingleDrawEta()", "Problem getting %s\n", as);
      gSystem->Exit(-1);
    }
  }

  utils.set_hist_props(hNS, kBlack, kNone, kBlack, kFullDotLarge, mrkSize);
  utils.set_hist_props(hAS, kRed, kNone, kRed, kFullDotLarge, mrkSize);
  utils.set_ylimits(hNS, hAS);
  hNS->SetLineWidth(lineWidth);
  hAS->SetLineWidth(lineWidth);

  // hNS->Draw("hist");
  // hAS->Draw("histsame");
  hNS->DrawClone("ep");
  hAS->DrawClone("epsame");

  if (includeProjThenDiv) {
    utils.set_hist_props(hNS2, kGray+2, kNone, kGray+2, kFullDotLarge, mrkSize);
    utils.set_hist_props(hAS2, kCyan, kNone, kCyan, kFullDotLarge, mrkSize);
    hNS2->SetLineWidth(lineWidth);
    hAS2->SetLineWidth(lineWidth);

    hNS2->DrawClone("epsame");
    hAS2->DrawClone("epsame");
  }

  return c;
}

TCanvas* SingleDrawPlain(int cent, int ptt, int pta, TString opt)
{
  initialize();
  const char* region = "RIDGE";
  const char* yTitle = Form("%.2g < |#Delta#eta| < %.2g", 
			    minRidgeDEta, maxRidgeDEta);
  if (opt.Contains("ALL")) {
    region = "ALL";
    yTitle = Form("%.2g < |#Delta#eta| < %.2g", 0.0, maxRidgeDEta);
  }
  if (opt.Contains("NSJET")) {
    region = "NSJET";
    yTitle = Form("%.2g < |#Delta#eta| < %.2g", 0.0, minRidgeDEta);
  }
  
  const char* name = Form("%s_cent%dto%d_%d_%d_%s", region,
			  centlow[cent],centhigh[cent],ptt,pta, opt.Data());
  const char* title = Form("dphiPlain_%s_cent%dto%d_pTtrig%.2gto%.2g_pTassoc%.2gto%.2g_%s",
			   region, 
			   centlow[cent],centhigh[cent],
			   ptlow[ptt], pthigh[ptt],
			   ptlow[pta], pthigh[pta],
			   opt.Data());
  TCanvas* c = 0;
  if (gDirectory->FindObject(name)) {

    c = (TCanvas*) gDirectory->FindObject(name);
    Info("SingleDrawPlain()", "%s already created", c->GetName());
    return c;
  }
  else
    c = new TCanvas(name, title, 700, 700);
  c->cd();

  TH1* h_sys = Hist(region, cfDef, ptt,pta,cent, "sys");
  TH1* h     = Hist(region, cfDef, ptt,pta,cent);
  h->SetName("h");

  TAxis* ax = h->GetXaxis();
  TAxis* ay = h->GetYaxis();

  h->SetTitle(Form(";#Delta#phi [rad];C(#Delta#phi),  %s", yTitle));
  h->SetLineWidth(2);
  ax->SetNdivisions(208);
  ay->SetNdivisions(208);
  ax->SetLabelSize(0.04);
  ay->SetLabelSize(0.04);
  ax->SetTitleSize(0.05);
  ay->SetTitleSize(0.05);
  ax->SetTitleOffset(1.5);
  ay->SetTitleOffset(-1.9);
  c->SetFrameLineWidth(2);
  c->SetLeftMargin(0.2);
  c->SetBottomMargin(0.15);
  c->SetTopMargin(0.01);
  c->SetRightMargin(0.01);
  ax->CenterTitle();
  ay->CenterTitle();
  ax->SetTicks("+-");
  ay->SetTicks("+-");

  utils.set_ylimits(h, h, 0.05);
  utils.set_hist_props(h, kBlack, kNone, kBlack, kFullDotLarge, 1.4);
  h->Draw();
  h_sys->Draw("e2psame");
  h->Draw("same");
  if (opt.Contains("harmonics"))
    for (int n=1; n<6; n++)
      Harmonic(h, n, "draw");
  if (opt.Contains("sum"))
    HarmonicSum(h,1,5,"draw");
  
  ltx.SetTextSize(0.045);
  double top = 0.92, gap = 0.08;
  double x1 = (TString(region)=="RIDGE" && (ptlow[ptt] > 4 || ispp))? 0.25 : 0.5;
  ltx.DrawLatex(x1, top-0*gap, Form("p_{T}^{t} %s GeV/c", trigLabel(ptt)));  
  ltx.DrawLatex(x1, top-1*gap, Form("p_{T}^{a} %s GeV/c", asscLabel(pta)));  
  if (ispp)
  ltx.DrawLatex(x1, top-2*gap, Form("pp 2.76 TeV"));  
  else
  ltx.DrawLatex(x1, top-2*gap, Form("Pb-Pb 2.76 TeV, %s", centLabel(cent)));  
  if (0)
    ltx.DrawLatex(0.22, 0.92, Form("|#Delta#eta| > %.1f", minRidgeDEta));  

  // ltx.SetTextColor(kBlack);
  // ltx.SetTextSize(0.03);
  // ltx.DrawLatex(0.7, 0.18, "statistical error only");  
 
  return c;
}

TF1* Harmonic(TH1* h, int n, TString opt)
{
  TF1* f = 0;
  double vndelta=0, vndelta_err=0;
  double phiMin = -0.5*TMath::Pi();
  double phiMax = +1.5*TMath::Pi();
  double b0 = h->Integral() / h->GetNbinsX();
  int color = opt.Contains("gray")? kGray : colorsPale[n-1];

  VnDelta(n, *h, vndelta, vndelta_err);

  f = new TF1(Form("%scos%ddphi", h->GetName(), n), 
	      "[0]*(1. + 2.*[1]*cos([2]*x))",
	      phiMin, phiMax);
    f->SetParameters(b0, vndelta, n);
    f->SetLineColor(color);
    f->SetLineWidth(3);
    if (opt.Contains("draw")) 
      f->Draw("same");

    return f;
}

TF1* HarmonicSum(TH1* h, int n1, int n2, TString opt)
{
  if (n1<1)
    Warning("HarmonicSum()", "n1=%d but should be > 0", n1);

  double phiMin = -0.5*TMath::Pi();
  double phiMax = +1.5*TMath::Pi();

  // Function definition string
  TString fdef("[0]*(1.0 + 2.0*(");
  for (int n=n1; n<=n2; n++) {
    fdef.Append(Form(" [%d]*cos(%d*x) ", n, n));
    fdef.Append( n<n2 ? "+" : "))");
  }

  // Normalization
  TF1 *ff = new TF1("ff", fdef.Data(), phiMin,phiMax);
  ff->SetParameter(0, h->Integral()/h->GetNbinsX());

  // Set parameters 
  for (int n=n1; n<=n2; n++) {

    // Sum of vnt x vna from global fit
    if (opt.Contains("global") ) {
      int i=-1, j=-1, k=-1;
      ijkFromHistName(h,i,j,k);
      double vnt = vnGF(n,k,i,0,999,"RIDGE","cA","");
      double vna = vnGF(n,k,j,0,999,"RIDGE","cA","");
      ff->SetParameter(n, vnt*vna); // TODO: consider including errors
      ff->SetLineColor(kRed+1);
    }
    else { // sum of directly-extracted pair moments
      double Vn=0, VnErr=0;
      VnDelta(n, *h, Vn, VnErr);
      ff->SetParameter(n, Vn);
      ff->SetLineColor(kBlack); // ff->SetLineColor(kAzure);
      //      ff->SetLineWidth(4);
      ff->SetLineStyle(kDashed);
      if (n2==10) {
	ff->SetLineColor(kGreen);
      }
    } 
  }

  if (opt.Contains("draw")) 
    ff->Draw("same");
  
  return ff;
}

TCanvas* SingleDraw(int cent, int ptt, int pta, TString opt)
{
  int lineWidth  = opt.Contains("small") ? 1 : 4;
  double mrkSize = opt.Contains("small") ? 0.5 : 1.5;
  TString dEtaLabel = "";

  const char* region = "RIDGE";
  if (opt.Contains("ALL")) {
    region = "ALL";
    dEtaLabel = Form("%.2g < |#Delta#eta| < %.2g", 0.0, maxRidgeDEta);
  }
  if (opt.Contains("NSJET")) {
    region = "NSJET";
    dEtaLabel = Form("%.2g < |#Delta#eta| < %.2g", 0.0, minRidgeDEta);
  }
  if (TString(region)=="RIDGE")
    dEtaLabel = Form("%.2g < |#Delta#eta| < %.2g", minRidgeDEta, maxRidgeDEta);
  
  initialize();

  TCanvas* c1 = 0; // The canvas to be returned

  // See if we have already made this once
  TString name = Form("dphi_etamin%02d_cent%dto%d_%d_%d", (int)(10*minRidgeDEta), 
			  centlow[cent],centhigh[cent],ptt,pta);
  TString title = Form("dphiFourier_%s_cent%dto%d_pTtrig%.2gto%.2g_pTassoc%.2gto%.2g",
			   region, 
			   centlow[cent],centhigh[cent],
			   ptlow[ptt], pthigh[ptt],
			   ptlow[pta], pthigh[pta]);

  if (!opt.IsNull()) {
    name.Append("_"); name.Append(opt);
    title.Append("_"); title.Append(opt);
  }

  if (gDirectory->FindObject(name.Data())) {

    c1 = (TCanvas*) gDirectory->FindObject(name.Data());
    Info("SingleDraw()", "%s already created", c1->GetName());
    return c1;
  }
  else
    c1 = TwoPanelVert(0.3, name.Data(), title.Data());

  c1->cd(1);
  gPad->SetTopMargin(0.1);
  c1->cd();

  TH1* h = Hist(region, cfDef, ptt,pta,cent);
  TH1* h_sys = Hist(region, cfDef, ptt,pta,cent, "sys");
  utils.set_hist_props(h, kBlack, kNone, kBlack, kFullDotLarge, mrkSize);
  h->SetLineWidth(opt.Contains("small") ? 1 : 2);
  h->GetXaxis()->SetTitle("#Delta#phi [rad]");
  h->GetYaxis()->SetTitle("C(#Delta#phi)");

  TF1* ff5 = HarmonicSum(h, 1, 5, "");
  ff5->SetLineWidth(lineWidth);
  TF1* fflowg = HarmonicSum(h, 1, 5, "global");
  fflowg->SetLineWidth(lineWidth);
  TF1* ff10 = HarmonicSum(h, 1, 10, "");
  ff10->SetLineWidth(lineWidth);
  TF1* ff12 = HarmonicSum(h, 1, 12, "");
  ff12->SetLineWidth(lineWidth);

  c1->cd(1);

  int nXticks = 404, nYticks = 210;
  double pad1Scale = 1.6;
  double pad2Scale = 2.3;
  utils.make_nice_axes(c1, h, pad1Scale, nXticks, nYticks, 0.05, 0.01);
  h->GetXaxis()->SetTitleOffset(1.2);
  h->GetYaxis()->SetTitleOffset(1.5);
  utils.set_ylimits(h,h);

  h->Draw("ep");
  h_sys->Draw("e2psame");
  h->Draw("epsame");

  if (opt.Contains("gray"))
    for (int n=1; n<6; n++)
      Harmonic(h, n, "gray, draw");
  else if (opt.Contains("color"))
    for (int n=1; n<6; n++)
      Harmonic(h, n, "draw");
  
  if (opt.Contains("upto10")) {
    ff10->SetLineWidth(lineWidth+2);
    ff10->SetLineColor(kBlack);
    ff10->DrawClone("same");
    ff10->SetLineWidth(lineWidth);
    ff10->SetLineColor(kGreen);
    ff10->SetLineStyle(kDashed);
    ff10->Draw("same");
  }

  //  ff10->Draw("same");
  ff5->Draw("same");
  h->Draw("p,e,same");
  
  if (opt.Contains("global")) {
    fflowg->Draw("same");
  }

  ltx.SetTextSize(0.06);
  double top = 0.82, gap = 0.08;
  double x1 = (TString(region)=="RIDGE" && ptlow[ptt] > 6)? 0.25 : 0.6;
  if (ispp)
    ltx.DrawLatex(0.2, 0.92, Form("pp 2.76 TeV"));  
  else
    ltx.DrawLatex(0.2, 0.92, Form("Pb-Pb 2.76 TeV, %s central", centLabel(cent)));  
  ltx.DrawLatex(x1, top-0*gap, Form("%.3g < p_{T}^{t} < %.3g GeV/c",
				    ptlow[ptt], pthigh[ptt]));  
  ltx.DrawLatex(x1, top-1*gap, Form("%.3g < p_{T}^{a} < %.3g GeV/c", 
				    ptlow[pta], pthigh[pta]));  
  // ltx.DrawLatex(x1, top-0*gap, Form("p_{T}^{trig} %s GeV/c", trigLabel(ptt)));  
  // ltx.DrawLatex(x1, top-1*gap, Form("p_{T}^{assoc} %s GeV/c", asscLabel(pta)));  
  ltx.DrawLatex(x1, top-2*gap, dEtaLabel.Data());  


  c1->cd(2);

  TH1F *hsub = static_cast <TH1F *> (h->Clone());
  TH1F *hsub10 = static_cast <TH1F *> (h->Clone());
  TH1F *hsubg = (TH1F*) (h->Clone());

  utils.set_hist_props(hsub10,  kBlack, kNone, kBlack, kOpenCircle, mrkSize);
  utils.set_hist_props(hsub,  kAzure, kNone, kAzure,   kFullSquare, mrkSize);
  utils.set_hist_props(hsubg, kRed+1, kNone, kRed+1, kFullSquare, mrkSize);

  for (int i=1;i<=hsub->GetNbinsX();i++) {
    double val, err;
    val = h->GetBinContent(i) * h->GetBinWidth(i);
    err = h->GetBinError(i)   * h->GetBinWidth(i);
    double dphi1 = h->GetXaxis()->GetBinLowEdge(i);
    double dphi2 = h->GetXaxis()->GetBinUpEdge(i);
    double fSum5, fSum10, fSumGlobal;
    fSum5      = ff5->Integral(dphi1, dphi2);
    fSum10     = ff10->Integral(dphi1, dphi2);
    fSumGlobal = fflowg->Integral(dphi1, dphi2);
    hsub->SetBinContent(i,   val/fSum5);
    hsub->SetBinError(i,     err/fSum5);
    hsub10->SetBinContent(i, val/fSum10);
    hsub10->SetBinError(i,   err/fSum10);
    hsubg->SetBinContent(i,  val/fSumGlobal);
    hsubg->SetBinError(i,    err/fSumGlobal);
  }
  utils.make_nice_axes(c1, hsub, pad2Scale, nXticks, 5, 0.05, 0.01);
  if (opt.Contains("global"))
    utils.set_ylimits(hsub, hsubg, 0.2);
  else 
    utils.set_ylimits(hsub, hsub10, 0.2);
  
  hsub->SetTitle(Form(";#Delta#phi [rad];ratio"));
  //  hsub->SetTitle(Form(";#Delta#phi [rad];data/#Sigma_{n=1}^{%s}", opt.Contains("global")?"5":"N"));
  hsub->GetXaxis()->SetTitleOffset(1.25);
  hsub->GetYaxis()->SetTitleOffset(0.7);
  hsub->GetXaxis()->SetTicks("+-");   hsub->GetXaxis()->SetTickLength(0.08);
  hsub10->SetTitle(";#Delta#phi [rad];data/#Sigma_{n=1}^{N}");
  hsub10->GetXaxis()->SetTitleOffset(1.25);
  hsub10->GetYaxis()->SetTitleOffset(0.7);
  hsubg->SetTitle(";#Delta#phi [rad];data/calc");
  hsubg->GetXaxis()->SetTitleOffset(1.25);
  hsubg->GetYaxis()->SetTitleOffset(0.7);

  TLegend* leg = new TLegend(0.2, 0.01, 0.38, 0.38);
  leg->SetFillColor(kNone);
  leg->SetBorderSize(1);
  if (opt.Contains("global")) {
    leg->AddEntry(hsub, "#LTcos(n#Delta#phi)#GT", "epl");
    leg->SetBorderSize(0);
  }
  else
    leg->AddEntry(hsub, "1#leqn#leq5", "epl");

  TLine unity;
  hsub->Draw("ep");

  if (opt.Contains("global")) {
    hsubg->Draw("epsame");
    leg->AddEntry(hsubg, "v(p_{Tt})v(p_{Ta})", "epl");
  }
  else if (opt.Contains("upto10")) {
    TH1* hsub10green = (TH1*)hsub10->Clone();
    utils.set_hist_props(hsub10green,  kBlack, kNone, kGreen, kFullCircle, mrkSize);
    hsub10green->Draw("epsame");
    hsub10->Draw("epsame");
    leg->AddEntry(hsub10green, "1#leqn#leq10", "epl");
  }

  unity.DrawLine(-TMath::PiOver2(), 1.0, 3*TMath::PiOver2(), 1.0);

  c1->cd(2);
  if (opt.Contains("global"))
    leg->Draw();

  if (1) {
    // calculate chi^2
    TF1* flat = new TF1("flat", "1.0", -TMath::PiOver2(), 3*TMath::PiOver2());
    double chi2 = Chi2(hsub, flat);
    double chi2_10 = Chi2(hsub10, flat);
    int ndof = hsub->GetNbinsX();
    delete flat;
    c1->cd(1);
    ltx.DrawLatex(0.65, 0.05, Form("#chi^{2}/ndf = %.3g / %d", chi2, ndof-1));
    if (0)
      cout << "Chi2[5] = " << chi2 << " Chi2[10] = " << chi2_10 
	   << " ndof = " << ndof-1 << " (Prob = " << TMath::Prob(chi2,ndof-6) 
	   << " , " << TMath::Prob(chi2_10,ndof-11) << " )" << endl;
  }
  return c1;
}

double Chi2(TH1* h, TF1* f, TString opt) {
  double chi2 = 0;
  double ndf = 0;
  for (int i=1;i<=h->GetNbinsX();i++) {
    double fy = f->Eval(h->GetBinCenter(i));
    chi2 += pow( (h->GetBinContent(i) - fy)/h->GetBinError(i) , 2.0);
    ndf++;
  }
  ndf -= 1;

  if (opt.Contains("ndf") && ndf > 0)
    chi2 /= ndf;

  if (opt.Contains("prob") )
    return TMath::Prob(chi2, ndf);
 
  return chi2; 
}

double vntvna(double *x, double *par) 
{
  // This function is called many times during a fit. For a 1-d fit,
  // x[0] is the x-position of the nth point,
  // i.e. graph->GetX()[n]. For a single-valued TGraph, it can be used
  // to indicate which point the fitter is currently working on.  The
  // par array contains maxpt free parameters that are continually
  // updated during the fit process.

  // q is the global index
  int q = (int)x[0]; // Assume points are at q + 0.5.
  int i = 999; 
  int j = 999;
  int nPoints = (maxpt*(maxpt+1))/2;
  TF1::fgRejectPoint = kFALSE;

  // Assign i and j from q
  ijFromGlobalIndex(q, i, j);

  if (q < 0 || q >= nPoints) {
    Error("vntvna()", 
	  "Problem finding global index. x[0]=%f, q=%d, i=%d, j=%d",
	  x[0], q, i, j);
    
    return 999;
  }
  
  // Exclude points from fit. Warning: TF1::fgRejectPoint is a global
  // flag checked by all TF1s, beware of side-effects.
  if (j < minFitPtBin || j > maxFitPtBin) {
    TF1::RejectPoint();
    if (0)
      cout << Form("Rejecting x[0],q,i,j = %f %d %d %d", 
		   x[0], q, i, j)
	   << endl;
    return 0;
  }
  
  double v2t = par[i];
  double v2a = par[j];
  int n = par[maxpt];                       // Fourier coeff. index
  int k = par[maxpt+1];                     // cent. bin index
  double fitval = v2t * v2a;

  // Add extra fit term for momentum conservation
  // It is 1/<\sum pt2> * <ptt><pta>
  // From ML & JYO, PRL 106, 102301 (2011) eqs 3-7
  double mptt=0, mpta=0, v1fac=0;
  if (n==1) {
    mptt = MeanPt(i, j, k, "t");
    mpta = MeanPt(i, j, k, "a");
    v1fac = par[maxpt+2];

    fitval += v1fac * mptt * mpta;  
  }
  
  // Odd vnd's < 0 at high pt. // can I replace the below by saying if
  // (vndelta < 0) then make fitval < 0?
  if (j >= PtBin(5., 6.) && (n%2) ) 
    fitval = -fitval;

  return fitval;
}

void VnDelta(int n, const TH1 &h, double &vnd, double &vnd_err, TString opt)
{
  // Extract fourier coefficient n directly from h. If opt is "hi" or
  // "lo", the coefficient is calculated for the points + or - their
  // errors. "hi" and "lo" are meant for an h with systematic (not
  // statistical) errors, so vnd_err is not calculated.
  double VN = 0.0;
  double norm = 0.0;

  // Calculate and set coeff. vnd
  for (int ib=1; ib<=h.GetNbinsX(); ib++) {
    double deltaphi = h.GetBinCenter(ib);
    double weight   = h.GetBinContent(ib);

    if (opt.Contains("hi"))
      weight += h.GetBinError(ib);
    else if (opt.Contains("lo"))
      weight -= h.GetBinError(ib);

    if (opt.Contains("sin") )
      VN += sin(n * deltaphi ) * weight;
    else
      VN += cos(n * deltaphi ) * weight;
    
    norm += weight;
  }
  
  if (norm==0) 
    ::Error("VnDelta()", "Div/0 error");

  VN = VN / norm;

  // // Mom. cons correction?????????????????????????????????
  // if (n==1) VN += 0.002*ptmean[i]*ptmean[j];

  vnd = VN;
  if (opt.Contains("hi") || opt.Contains("lo")) {
    vnd_err = 0;
    return;
  }

  // Statistical uncertainty vnd_err
  double quad_sum_uncertainty = 0.0;
  for (int ib=1; ib<=h.GetNbinsX(); ib++) {
    double deltaphi = h.GetBinCenter(ib);
    double dfdwi = cos(n * deltaphi)/norm - VN/norm;

    if (opt.Contains("sin") )
      dfdwi = sin(n * deltaphi)/norm - VN/norm;

    double sigma = h.GetBinError(ib);
    quad_sum_uncertainty += dfdwi*dfdwi * sigma*sigma;
  }

  vnd_err = TMath::Sqrt(quad_sum_uncertainty);
  return;
}

void VnDelta(int n, const TF1 &f, double &vnd, double &vnd_err, TString opt)
{
  // Extract fourier coefficient n from f.
  double VN = 0.0;
  double norm = 0.0;
  int nSteps = 100;
  double x1=0, x2=0;
  f.GetRange(x1, x2);
  double dx = (x2-x1)/nSteps;

  if (!opt.IsNull() ) cout<<opt.Data()<<endl;

  // Calculate and set coeff. vnd
  for (int ib=0; ib<nSteps; ib++) {

    double deltaphi = x1 + ib*dx; 
    double weight   = f.Eval(deltaphi);

    VN += cos(n * deltaphi ) * weight;
    norm += weight;
  }
  
  if (norm==0) 
    Error("VnDelta()", "Div/0 error");

  VN = VN / norm;
  vnd = VN;
  vnd_err = 0; // for now
  return;
}



// The argument ydiv is the division between pads as a fraction of the
// height.
TCanvas* TwoPanelVert(double ydiv, const char* canvName, const char* canvTitle)
{
  TCanvas* c = new TCanvas(canvName, canvTitle, 800, 800);
  // Extents of pads inside canvas
  double x1=0.01, x2=0.99, y1=0.01, y2=0.99;
  double lm=0.2, rm=0.02;

  // Division between top and bottom pads
  double ysplit = y1 + ydiv*(y2-y1);

  // Divide first, adjust afterward.
  c->Divide(1,2);
  TPad* ptop = (TPad*)(c->GetPad(1));
  TPad* pbot = (TPad*)(c->GetPad(2));

  ptop->SetPad(x1, ysplit, x2, y2);
  ptop->SetMargin(lm, rm, 0.01, 0.01); // left, right, bottom, top.
  ptop->SetFrameLineWidth(2);

  pbot->SetPad(x1, y1, x2, ysplit);
  pbot->SetMargin(lm, rm, 0.4, 0.01); // left, right, bottom, top.
  pbot->SetFrameLineWidth(2);
  pbot->SetTicks();

  c->cd();
  return c;
}

char* trigLabel(int i)
{
  if (i<0 || i>maxpt)
    return Form("Error: no trig pt bin %d", i);
  
  double x1 = gi->GetX()[i] - gi->GetEX()[i];
  double x2 = gi->GetX()[i] + gi->GetEX()[i];

  // int prec1 = 0, prec2 = 0;
  // if (x1 - (int)x1 > 0)
  //   prec1 = 1;
  // if (x2 - (int)x2 > 0)
  //   prec2 = 1;

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

char* asscLabel(int j)
{
  if (j<0 || j>maxpt)
    return Form("Error: no assc pt bin %d", j);
  
  double x1 = gj->GetX()[j] - gj->GetEX()[j];
  double x2 = gj->GetX()[j] + gj->GetEX()[j];

  /* Stupid coding...
  int prec1 = 0, prec2 = 0;

  if (x1 - (int)x1 > 0)
    prec1 = 1;
  if (x2 - (int)x2 > 0)
    prec2 = 1;
  */

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

char* centLabel(int k)
{
  if (k<0 || k>maxcent)
    return Form("Error: no cent bin %d", k);
  
  double c1 = gk->GetX()[k] - gk->GetEX()[k];
  double c2 = gk->GetX()[k] + gk->GetEX()[k];

  return Form("%.0f-%.0f%%", c1, c2);
}


void VnLimits(double &minVn_k, double &maxVn_k, int k, int imin, int imax)
{
  // Find limits for each centrality bin k between imin (inclusive)
  // and imax (also inclusive) to plot a common y axis.
  //  for (int k=0; k < maxcent; k++) {
    for (int n=1; n<=5; n++) {
      for (int i=imin; i<=imax; i++) {
	TGraphErrors* gc = VnDeltaVsPtAssoc(i, k, n);
	if (!gc) {
	  Error("VnLimits()", "No graph i %d k %d n %d", i,k,n );
	  continue;
	}
	for (int j=0; j<gc->GetN(); j++) {
	  double vn = gc->GetY()[j];
	  double evn = gc->GetEY()[j];
	  if (vn+evn > maxVn_k) maxVn_k = vn+evn;
	  if (vn-evn < minVn_k) minVn_k = vn-evn;
	}
      }
    }

  return;
}

TCanvas* DrawQ(int k, int n, TString opt)
{
  TStopwatch ts1, ts2;
  int fitCurveColor = kRed-4;
  int divColor = kBlue;
  const char* region = "RIDGE";
  if (opt.Contains("ALL"))
    region = "ALL";

  TString title = Form("globalfit_%d_cent%dto%d",
			   n, centlow[k],centhigh[k]);
  TString name = Form("V%dvsQ_etamin%02d_cent%dto%d",
		      n, (int)(10*minRidgeDEta), 
		      centlow[k],centhigh[k]);
  
  if (!opt.IsNull()) {
    name.Append("_");
    name.Append(opt.Data());
    title.Append("_");
    title.Append(opt.Data());
  }

  TCanvas* c = TwoPanelVert(0.4, name.Data(), title.Data());
  int cwidth = opt.Contains("highptfit") ? 500 : 1200; 
  c->SetCanvasSize(cwidth, 450);
  c->SetWindowSize(cwidth+50, 500);

  if (opt.Contains("highptfit")) {
    c->GetPad(1)->SetLeftMargin(0.2);
    c->GetPad(2)->SetLeftMargin(0.2);
    c->GetPad(1)->SetRightMargin(0.05);
    c->GetPad(2)->SetRightMargin(0.05);

  }

  TLegend* lq = new TLegend(0.14, 0.56, 0.25, 0.83);
  lq->SetFillColor(kNone);
  lq->SetBorderSize(0);

  // g:  global VnDelta vs global index (stat errors).
  // gs: global VnDelta vs global index (sys errors).
  // fn: global fit TF1.
  // r:  ratio of g/fit.
  TString opt1 = "";
  if (opt.Contains("ALL"))
    opt1.Append("_ALL");
  if (opt.Contains("ptcons"))
    opt1.Append("_ptcons");

  TGraphErrors* g  = VnDVsQ(n, k, region, cfDef, opt1);
  opt1.Append("_sys");
  TGraphErrors* gs = VnDVsQ(n, k, region, cfDef, opt1);

  int ptaLo = 0, ptaHi = 999;
  if (opt.Contains("lowptfit")) {
    ptaHi = PtBin(3., 4.);
  }
  if (opt.Contains("highptfit")) {
    ptaLo = PtBin(5., 6.);
  }
  // If custom pta range was passed in, e.g.
  // Form("ptabin%dto%d", PtBin(1.5, 2.0), PtBin(8, 15))
  if (opt.Contains("ptabin")) {
    TRegexp re("ptabin[0-9]+to[0-9]+");
    TRegexp re1("ptabin[0-9]+");
    TRegexp re2("to[0-9]+");
    TString rx = opt(re), pta1s = rx(re1), pta2s = rx(re2);
    pta1s.ReplaceAll("ptabin","");
    pta2s.ReplaceAll("to","");
    ptaLo = pta1s.Atoi();
    ptaHi = pta2s.Atoi();
  }

  TF1* fn    = GlobalFitVsQ(n, k, ptaLo, ptaHi, region, cfDef, "");
  TF1* fn_hi = GlobalFitVsQ(n, k, ptaLo, ptaHi, region, cfDef, "hi_sys");
  TF1* fn_lo = GlobalFitVsQ(n, k, ptaLo, ptaHi, region, cfDef, "lo_sys");

  // Systematic band on ratio line at unity
  TH1F *r_sys = new TH1F(Form("r_sys_%s", title.Data()), "r_sys", 
			 g->GetN()-0.5, 0, g->GetN()-0.5);
  utils.set_hist_props(r_sys, kBlack, kGray, kBlack, kDot, 1.0);

  TGraphErrors* r = new TGraphErrors();
  TString rname(g->GetName());
  rname.Append("_ratio");
  r->SetName(rname.Data());

  if (!fn) {
    Error("DrawQ()","Problem getting/creating global fit function");
    gSystem->Exit(-1);
  }

  // Set visual properties
  utils.set_tgraph_props(g, kBlack, kBlack, kFullSquare, 1.0);
  utils.set_tgraph_props(gs, kBlack, kBlack, kDot, 0.5);
  gs->SetFillColor(kGray);
  utils.set_tgraph_props(r, kBlack, kBlack, kFullCircle, 1.0);
  g->SetLineWidth(1);
  r->SetLineWidth(1);
  fn->SetLineWidth(1);
  fn->SetLineColor(fitCurveColor);
  fn_hi->SetLineStyle(kDashed);
  fn_lo->SetLineStyle(kDashed);
  fn_hi->SetLineWidth(1);
  fn_lo->SetLineWidth(1);

  // Compute ratio for r graph
  for (int q=0; q<g->GetN(); q++) {
    int ii=0, jj=0;
    ijFromGlobalIndex(q, ii, jj);

    double fy = fn->Eval(q+0.5);
    double y = fy==0? 1e9 : g->GetY()[q]/fy;
    double rerr = fn_hi->Eval(q+0.5) / fy - 1;

    if (opt.Contains("highptfit") && n%2 && g->GetY()[q]!=0)
      y = fy/g->GetY()[q];

    // No error band when no fit point!
    if (jj < ptaLo || jj > ptaHi)
      rerr = 0;

    r->SetPoint(q, g->GetX()[q], y);
    r->SetPointError(q, 0.0, TMath::Abs(g->GetEY()[q]/fy));

    r_sys->SetBinContent(q+1, 1.0);
    r_sys->SetBinError(q+1, rerr);
  }

  // Set up plot ranges for top panel (g and f)
  int nx = g->GetN();
  double x1,y1,x2,y2;
  double sf = 1; // scale factor
  fn->GetRange(x1,x2);
  if (opt.Contains("highptfit")) {
    x1 = 45;
  }
  y1 = sf*fn->GetMinimum(x1,x2);
  y2 = sf*fn->GetMaximum(x1,x2);
  double marg = 0.4*(y2-y1);
  //  if (opt.Contains("lowptfit") || opt.Contains("highptfit") ) marg = 2*(y2-y1);
  x1 -= 0.5;
  x2 += 0.5;
  y1 -= marg;
  y2 += marg;

  // Set up plot ranges for lower panel (r)
  double ry1=0.21, ry2=1.79;
  if (opt.Contains("highptfit")) {
    ry1 = 0.01;
    ry2 = 1.99;
  }

  // Get / make frame histos for top and bottom
  TH2F* hf1 = 0; // (TH2F*)gDirectory->Get("qhf1");
  TH2F* hf2 = 0; // (TH2F*)gDirectory->Get("qhf2");
  TString name1 = Form("qhf1_%s", title.Data());
  TString name2 = Form("qhf2_%s", title.Data());
  // TString sv = n==1 ? "#LTcos(#Delta#phi)#GT" :
  // Form("#LTcos(%d#Delta#phi)#GT", n);
  TString sv = Form("V_{%d#Delta}", n);
  TString sgf = Form("(v_{%d}^{t}v_{%d}^{a})_{fit}", n, n);

  if (!hf1)
    hf1 = new TH2F(name1.Data(), "hf1", nx+1, x1, x2, 1000, y1, y2);
  if (!hf2)
    hf2 = new TH2F(name2.Data(), "hf2", nx+1, x1, x2, 1000, ry1, ry2);

  // Axes
  TAxis* ax1 = hf1->GetXaxis();
  TAxis* ay1 = hf1->GetYaxis();
  TAxis* ax2 = hf2->GetXaxis();
  TAxis* ay2 = hf2->GetYaxis();
  hf1->SetBins(nx+1, x1, x2, 100, y1, y2);
  hf2->SetBins(nx+1, x1, x2, 100, ry1, ry2);
  hf1->SetAxisRange(x1, x2, "X");  
  hf1->SetAxisRange(y1, y2, "Y");  
  hf2->SetAxisRange(x1, x2, "X");  
  hf2->SetAxisRange(ry1, ry2, "Y");  
  ax1->SetLabelOffset(0.02);
  ax1->SetLabelSize(0.04);  ay1->SetLabelSize(0.08);
  ax2->SetLabelSize(0.18);   ay2->SetLabelSize(0.12);
  ax1->SetNdivisions(1);   ax2->SetNdivisions(1);
  ay1->SetNdivisions(208);  ay2->SetNdivisions(opt.Contains("highptfit")?104:210);
  ax1->SetTickLength(0.02);

  //ay1->SetTitle(Form("%s and #color[%d]{%s}",sv.Data(), fitCurveColor, sgf.Data()));
  ay1->SetTitle(Form("%s", sv.Data()));
  ay2->SetTitle(Form("#frac{%s}{fit}", sv.Data()));
  //  ay2->SetTitle(Form("#frac{%s}{%s}", sv.Data(), sgf.Data()));
  // ax2->SetTitle(Form("#splitline{associated p_{T}^{a}}{#color[%d]{   trigger p_{T}^{t}}} [GeV/c]", divColor));
  ax2->SetTitle(Form("#color[%d]{p_{T}^{t}}, p_{T}^{a} [GeV/c]", divColor));
  ay1->SetTitleOffset(opt.Contains("highptfit") ? 1. : 0.45);
  ay1->SetTitleSize(0.09);
  ay1->CenterTitle();
  ay2->SetTitleOffset(opt.Contains("highptfit") ? 0.6 : 0.26);
  ay2->SetTitleSize(0.14);
  ay2->CenterTitle();
  ax2->SetLabelOffset(2.1);
  ax2->SetTitleOffset(1.3);
  ax2->SetTitleSize(0.14);
  ax2->CenterTitle();

  double leftMarg = opt.Contains("highptfit") ? 0.2 : 0.08;
  c->cd(1);
  gPad->SetFrameLineWidth(1);
  gPad->SetLeftMargin(leftMarg);
  hf1->Draw();
  TLine zero;
  zero.DrawLine(x1, 0., x2, 0.);

  
  // NEW========================================
  for (int i=0; i<gi->GetN(); i++) {
    int q1 = GlobalIndex(i, 1), q2 = GlobalIndex(i, i);
    TF1* ifn = 0, *ifn_hi = 0, *ifn_lo = 0;
    //    TF1* _ifn = 0, *_ifn_hi = 0, *_ifn_lo = 0; // temp, unscaled.

    // This works, but has lines between \ptt groups :(
    // TH1F *hfn=0, *hfn_hi=0, *hfn_lo=0;
    // int nq = g->GetN();
    // hfn = new TH1F(Form("%s_%d", fn->GetName(), i), Form("%s_%d", fn->GetName(), i),
    // 		   nq, 0, nq);
    // hfn->SetLineColor(kMagenta);
    // for (int q=0; q<g->GetN(); q++) {
    //   hfn->SetBinContent(q+1, sf*fn->Eval(q+0.5));
    // }

    ifn = (TF1*)       fn->Clone(Form("%s_%d", fn->GetName(), i));
    ifn_hi = (TF1*) fn_hi->Clone(Form("%s_%d", fn_hi->GetName(), i));
    ifn_lo = (TF1*) fn_lo->Clone(Form("%s_%d", fn_lo->GetName(), i));

    ifn->SetName(Form("%s_%d", fn->GetName(), i));
    ifn_hi->SetName(Form("%s_%d", fn_hi->GetName(), i));
    ifn_lo->SetName(Form("%s_%d", fn_lo->GetName(), i));

    double r1 = q1-0.9, r2 = q2+0.92;
    ifn->SetRange(r1, r2);
    ifn_hi->SetRange(r1, r2);
    ifn_lo->SetRange(r1, r2);


    // for (int ip=0; ip<ifn->GetNpar(); ip++) {
    //   double par = ifn->GetParameter(ip);
    //   ifn->SetParameter(ip, 1000*par);
    //   cout<<par<< " " << ifn->GetParameter(ip) << endl;
    // }


    // ifn    = new TF1(Form("%s_%d",    fn->GetName(), i), Form("100*%s",   _ifn->GetName()));
    // ifn_hi = new TF1(Form("%s_%d", fn_hi->GetName(), i), Form("100*%s", _ifn_hi->GetName()));
    // ifn_lo = new TF1(Form("%s_%d", fn_lo->GetName(), i), Form("100*%s", _ifn_lo->GetName()));

    ifn_hi->Draw("same");
    ifn_lo->Draw("same");
    ifn->Draw("same");
    //    hfn->Draw("same");
  }
  // NEW========================================

  for (int i=0; i<gi->GetN(); i++) {
    char* newName = Form("%s_ptt%d", g->GetName(), i);
    TGraphErrors* gcol = (TGraphErrors*)g->Clone(newName);
    int col = PtColor(ptlow[i], pthigh[i]);
    utils.set_tgraph_props(gcol, kBlack, col, kFullSquare, 1.0);
    gcol->SetLineWidth(1);

    newName = Form("%s_ptt%d", gs->GetName(), i);
    TGraphErrors* g_sy = (TGraphErrors*)gs->Clone(newName);
    int col_sy = PtColorPale(ptlow[i], pthigh[i]);
    utils.set_tgraph_props(g_sy, kBlack, col_sy, kDot, 0.5);
    g_sy->SetFillColor(col_sy);
    
    for (int q=0; q<gcol->GetN(); q++) {
      int i2=0, j=0;
      ijFromGlobalIndex(q,i2,j);
      if (i2!=i) {
	gcol->SetPoint(q, gcol->GetX()[q], -99.);
	g_sy->SetPoint(q, gcol->GetX()[q], -99.);
      }

      // Scale points by sf
      gcol->SetPoint(q, gcol->GetX()[q], sf*gcol->GetY()[q]);
      g_sy->SetPoint(q, g_sy->GetX()[q], sf*g_sy->GetY()[q]);
      gcol->SetPointError(q, gcol->GetEX()[q], sf*gcol->GetEY()[q]);
      g_sy->SetPointError(q, g_sy->GetEX()[q], sf*g_sy->GetEY()[q]);

    }
    g_sy->Draw("e2psame");
    gcol->Draw("ezpsame");
  }
  
  c->cd(2);
  gPad->SetFrameLineWidth(1);
  gPad->SetLeftMargin(leftMarg);
  hf2->Draw();
  r_sys->Draw("e2psame");
  
  // Overlay lines, arrows, text, etc.
  TLine div, div_a; // division ticks for trigger and assoc
  TArrow a;
  double tipSize = 0.008; // size of arrowhead
  a.SetLineWidth(1);
  div.SetLineWidth(2);
  div.SetLineColor(fitCurveColor);
  div.DrawLine(x1, 1.0, x2, 1.0);
  r->Draw("ezpsame");
  gList->Add(r);

  for (int i=0; i<gi->GetN(); i++) {
    char* newName = Form("%s_ptt%d", r->GetName(), i);
    TGraphErrors* rcol = (TGraphErrors*)r->Clone(newName);
    int col = PtColor(ptlow[i], pthigh[i]);
    utils.set_tgraph_props(rcol, kBlack, col, kFullCircle, 1.0);
    for (int q=0; q<rcol->GetN(); q++) {
      int i2=0, j=0;
      ijFromGlobalIndex(q,i2,j);
      if (i2!=i) rcol->SetPoint(q, rcol->GetX()[q], -99.);
    }
    rcol->SetLineWidth(1);
    rcol->Draw("ezpsame");
  }
  
  div.SetLineColor(divColor);
  div.SetLineStyle(kSolid);

  // Label centrality and fourier index
  c->cd(1);
  ltx.SetTextSize(0.14);
  ltx.DrawLatex(opt.Contains("highptfit")?0.25:0.14, 0.85, Form("n = %d", n));

  if (!opt.Contains("highptfit")) {
  if (n<=2) {
    ltx.SetTextSize(0.1);
    if (ispp)
    ltx.DrawLatex(0.14, 0.70, Form("pp 2.76 TeV"));
    else {
      ltx.DrawLatex(0.14, 0.70, Form("Pb-Pb 2.76 TeV"));
      ltx.DrawLatex(0.14, 0.61, Form("%d-%d%%", centlow[k],centhigh[k]));
    }
    if (opt.Contains("ptcons")) {
    ltx.DrawLatex(0.14, 0.58, Form("#LT#sum p_{T}^{2}#GT = 4.76 GeV^{2}"));
    }

  }
  if (n==3) {
    lq->AddEntry(g, Form("V_{n#Delta}"), "epl");
    lq->AddEntry(fn, Form("fit"), "l");
    lq->Draw();
  }
  // Always show
    ltx.SetTextSize(0.07);
  double ptaFitLow = ptlow[ptaLo];
  double ptaFitHigh = ptaHi<999? pthigh[ptaHi] : pthigh[maxpt-1];
  //  if (!opt.Contains("highptfit"))
    ltx.DrawLatex(0.14, 0.09, 
		  Form("Global fit range: %3.2g < p_{T}^{a} < min(p_{T}^{t}, %3.2g GeV/c)",
		       ptaFitLow, ptaFitHigh));
  }

  for (int q=0; q<g->GetN(); q++) {
    int i=0, j=0;
    ijFromGlobalIndex(q,i,j);
    double drop = 0.35;
    double ptt = gi->GetX()[i] + gi->GetEX()[i];
    double pta = gj->GetX()[j] + gj->GetEX()[j];
    double tickLength = 0.03*(y2-y1);

    // Draw divisions between trigger pt intervals...
    bool skipTicks = opt.Contains("highptfit") && (pta < 5.);
    if (i==j && !skipTicks) {
      //      if (ptt > 5) {
	c->cd(1);
	div.DrawLine(q+1, y1, q+1, y1+tickLength);
	c->cd(2);
	tickLength = drop-0.1;
	div.DrawLine(q+1, ry2-tickLength, q+1, ry2+tickLength);
	div.DrawLine(q+1, ry1-tickLength, q+1, ry1+tickLength);
	//      }

      // Alignment: align = 10*HorizontalAlign + VerticalAlign
      // For horizontal alignment the following convention applies:
      // 1=left adjusted, 2=centered, 3=right adjusted
      // For vertical alignment the following convention applies:
      // 1=bottom adjusted, 2=centered, 3=top adjusted
      ltx2.SetTextAlign(23);
      ltx2.SetTextSize(0.12);
      ltx2.SetTextColor(divColor);

      if (ptt != 0.75) // too cluttered otherwise 
	ltx2.DrawLatex(q+1, ry1-drop, Form("%.2g", ptt) ); // pt_trig labels
      }
    
    if (pta < ptt && (pta == (int)pta || pta == 0.5) && !skipTicks) {
	div_a.DrawLine(q+1, ry1-drop/8, q+1, ry1+drop/4);
	ltx2.SetTextColor(kBlack);
	ltx2.SetTextFont(52); // italic
	ltx2.DrawLatex(q+1, ry1-drop/4, Form("%.2g", pta) ); // pt_assoc labels
	ltx2.SetTextColor(divColor);
	ltx2.SetTextFont(62); // 62 is default
    }

    // Draw arrows to off-scale points
    c->cd(1);
    double y = g->GetY()[q];
    double ymax = hf1->GetYaxis()->GetXmax();
    double ymin = hf1->GetYaxis()->GetXmin();
    double len = 0.06*(ymax-ymin);
    double gap = 0.01*(ymax-ymin);

    if (y > ymax)
      a.DrawArrow(q+0.5, ymax-len-gap, q+0.5, ymax-gap, tipSize, ">");
    if (y < ymin)
      a.DrawArrow(q+0.5, ymin+len+gap, q+0.5, ymin+gap, tipSize, ">");

    // Do the same for the ratio.
    // If fit has not been applied to some points, don't draw the arrow.
    c->cd(2);
    //    gPad->SetTickx();
    y = r->GetY()[q];
    ymax = hf2->GetYaxis()->GetXmax();
    ymin = hf2->GetYaxis()->GetXmin();
    len = 0.06/0.4*(ymax-ymin); // 0.4 from TwoPanelVert ctor
    gap = 0.02*(ymax-ymin);

    if (0) { // Draw at upper or lower edge of panel
      if (y > ymax)
	a.DrawArrow(q+0.5, ymax-len-gap, q+0.5, ymax-gap, tipSize, ">");
      if (y < ymin)
	a.DrawArrow(q+0.5, ymin+len+gap, q+0.5, ymin+gap, tipSize, ">");
    }
    // Draw with arrow based from ref. line.
    // No arrow when no fit point!
    if (j < ptaLo || j > ptaHi)
      continue;
    if (y > ymax)
      a.DrawArrow(q+0.5, 1.0, q+0.5, 1.0+len, tipSize, ">");
    if (y < ymin)
      a.DrawArrow(q+0.5, 1.0, q+0.5, 1.0-len, tipSize, ">");
  } // end q loop
  
  //  ax2->LabelsOption("h");
  c->cd();
  c->Update();
  return c;
}

TCanvas* DrawVn(int k, int ptt1, int ptt2)
{
  // Draw Fourier coefficients on one canvas for each centrality bin k
  // for trigger pt bins from ptt1 to (and including) ptt2.
  // The x-axis is associated pt.
  const char* name = Form("vndelta_etamin%02d_cent%dto%d_trig%dto%d", 				 
			  (int)(10*minRidgeDEta), centlow[k],centhigh[k], ptt1, ptt2);
  TCanvas* cv = new TCanvas(name, name, 1200, 500);
  TLegend* lv = new TLegend(0.09, 0.72, 0.27, 0.88); // w.r.t. cv
  lv->SetFillColor(kNone);
  lv->SetBorderSize(0);

  double lv2bottom = ptt2<5? 0.65 : 0.8;
  TLegend* lv2 = new TLegend(0.82, lv2bottom, 0.94, 0.95, "p_{T}^{t} (GeV/c)");
  lv2->SetFillColor(kNone);
  lv2->SetBorderSize(0);
  utils.padsetup(cv, 5, 1, "", 0.12, 0.01, 0.03, 0.2);

  // Find limits
  double minVn_k=1000, maxVn_k=-1000;	  
  VnLimits(minVn_k, maxVn_k, k, ptt1, ptt2);

    for (int n=1; n<=5; n++) {
      cv->cd(n);
      double vertMargin = 0.1*(maxVn_k - minVn_k);
      double xmax = gj->GetX()[ptt2] + gj->GetEX()[ptt2];
      double xmin =  -0.43;
      TH1F* hf = gPad->DrawFrame(xmin, minVn_k - vertMargin,
				 xmax, maxVn_k + vertMargin);
      int nXticks = 404;
      int nYticks = 210;
      if (n==1) {
	utils.make_nice_axes(cv, hf, 2., nXticks, nYticks, -0.02, 0.02);
	hf->SetLabelOffset(-0.01, "X");
      }
      else {
	utils.make_nice_axes(cv, hf, 3.4, nXticks, nYticks, -0.075, 0.0);
	hf->SetLabelOffset(-0.057, "X");
	hf->SetTickLength(0.02, "X");
	hf->SetTickLength(0.05, "Y");
      }
      hf->GetXaxis()->SetTicks("+-");
      hf->GetYaxis()->SetTicks("+-");
      
      // Loop backwards to improve visibility of low-pt points
      for (int i=ptt2; i>=ptt1; i--) {
	
	TGraphErrors *gc=0;
	gc = VnDeltaVsPtAssoc(i, k, n);
	if (!gc) {
	  Error("DrawVn()", "Problem finding graph n%d, i%d, k%d" ,n,i,k);
	  continue;
	}
	
	utils.set_tgraph_props(gc, colorsDark[i], colorsDark[i], kFullSquare, 1.6);
	
	TGraphErrors* gfit = GlobalFitVsPtAssoc(i, k, n);
	
	gfit->Draw("plsame");
	gc->Draw("epsame");

	if (n==1)
	  lv2->AddEntry(gc,trigLabel(i), "p");

      }
    }

    cv->cd();
    TPad* overlay = new TPad("overlay", "overlay", 0,0,1,1);
    overlay->SetFillStyle(4000); // transparent
    overlay->Draw();
    overlay->cd();

    ltx.SetTextSize(0.07);
    lv2->Draw();
    ltx.DrawLatex(0.14, 0.76, Form("%s", centLabel(k)));

    for (int n=1; n<=4; n++) {
      cv->cd(n);
      ltx.SetTextSize(n==1? 0.1 : 0.15);
      ltx.DrawLatex((n==1)? 0.45 : 0.1, 0.86, Form("V_{%d#Delta}", n));
    }
    cv->cd(5);
    ltx.DrawLatex(0.72, 0.86, Form("V_{%d#Delta}", 5));
    overlay->cd();
    ltx.SetTextSize(0.075);
    ltx.DrawLatex(0.4, 0.05, "associated p_{T} [GeV/c]");
    ltx.SetTextAngle(90);
    ltx.DrawLatex(0.03, 0.4, "V_{n#Delta}(p_{T}^{assoc.})");
    ltx.SetTextAngle(0);

  return cv;
}

TCanvas* DrawVnVsPtTrig(int k, int npta, int ptabins[], TString opt)
{
  TString title = Form("VnDeltaVsPtTrig_cent%dto%d_pTassoc%.2gto%.2g",
		       centlow[k],centhigh[k],
		       ptlow[ptabins[0]], pthigh[ptabins[npta-1]]);
  if (!opt.IsNull()) {
    title.Append("_");
    title.Append(opt);
  }
  TCanvas* cv = new TCanvas(title.Data(), title.Data(), 1400, 500);
  double lv2bot = 0.9 - 0.07*npta;
  TLegend* lv2 = new TLegend(0.82, lv2bot, 0.98, 0.95, "p_{T}^{a} (GeV/c)");
  lv2->SetFillColor(kNone);
  lv2->SetBorderSize(0);
  utils.padsetup(cv, 5, 1, "", 0.12, 0.01, 0.03, 0.2);

  // Start without knowing y-limits, adjust below.
  double minVn_k=-1., maxVn_k=1.;	  
  TObjArray* graphs = new TObjArray();
  
  for (int n=1; n<=5; n++) {
    cv->cd(n);
    double vertMargin = 0.1*(maxVn_k - minVn_k);
    double xmax = 11.1;
    double xmin = -0.43;

    TH1F* hf = gPad->DrawFrame(xmin, minVn_k - 4*vertMargin,
			       xmax, maxVn_k + vertMargin);
    TLine l;
    l.DrawLine(xmin, 0, xmax, 0);
    
    int nXticks = 404;
    int nYticks = 210;
    if (n==1) {
      utils.make_nice_axes(cv, hf, 2., nXticks, nYticks, -0.02, 0.02);
      hf->SetLabelOffset(-0.01, "X");
    }
    else {
      utils.make_nice_axes(cv, hf, 3.4, nXticks, nYticks, -0.075, 0.0);
      hf->SetLabelOffset(-0.057, "X");
      hf->SetTickLength(0.02, "X");
      hf->SetTickLength(0.05, "Y");
    }
    hf->GetXaxis()->SetTicks("+-");
    hf->GetYaxis()->SetTicks("+-");

    for (int jpta=0; jpta<npta; jpta++) {
      int j = ptabins[jpta];
      TGraphErrors *gc = VnDeltaVsPtTrig(j, k, n);
      if (!gc) {
	Error("DrawVnVsPtTrig()", "Problem finding gc n%d, i%d, k%d" ,n,j,k);
	continue;
      }
      TGraphErrors *gs = VnDeltaVsPtTrig(j, k, n, "sys");
      if (!gs) {
	Error("DrawVnVsPtTrig()", "Problem finding gs n%d, i%d, k%d" ,n,j,k);
	continue;
      }

      int col = PtColor(ptlow[j], pthigh[j]);
      utils.set_tgraph_props(gc, col, col, kFullSquare, 1.2);
      gs->SetFillColor(PtColorPale(ptlow[j], pthigh[j]));
      TGraphErrors* open = (TGraphErrors*)gc->Clone();
      utils.set_tgraph_props(open, kBlack, kBlack, kOpenSquare, 1.2);
	
      gs->Draw("e2psame");
      gc->Draw("epsame");
      open->Draw("epsame");

      if (n==1)
	lv2->AddEntry(gc,asscLabel(j), "elp");

      graphs->Add(gc); // store graph array to find y limits for plot
    }
  }

  // Adjust y limits
  double newYmin = 0, newYmax = 0, newSpace = 0;
  for (int m=0; m<graphs->GetEntries(); m++) {
    TGraphErrors* tg = (TGraphErrors*)graphs->At(m);
    double yhi = TMath::MaxElement(tg->GetN()-1, tg->GetY());
    double ylo = TMath::MinElement(tg->GetN()-1, tg->GetY());
    double ey = TMath::MaxElement(tg->GetN()-1, tg->GetEY());
    ylo -= ey;
    if (yhi > newYmax) newYmax = yhi;
    if (ylo < newYmin) newYmin = ylo;
  }
  newSpace = 0.1*(newYmax - newYmin);
  for (int n=1; n<=5; n++) {
    cv->cd(n);
    TH1F* hf = (TH1F*)gPad->FindObject("hframe");
    hf->GetYaxis()->SetRangeUser(newYmin-3*newSpace, newYmax+newSpace);
    gPad->Modified(); // Signal to redraw
  }
 
  cv->cd();
  TPad* overlay = new TPad("overlay", "overlay", 0,0,1,1);
  overlay->SetFillStyle(4000); // transparent
  overlay->Draw();
  overlay->cd();
  lv2->Draw();
  ltx.SetTextSize(0.05);
  ltx.DrawLatex(0.14, 0.88, Form("%s 2.76 TeV", ispp?"pp":"Pb-Pb"));
  ltx.SetTextSize(0.07);
  if (!ispp)
    ltx.DrawLatex(0.14, 0.8, Form("%s", centLabel(k)));

  for (int n=1; n<=5; n++) {
    cv->cd(n);
    ltx.SetTextSize(n==1? 0.1 : 0.15);
    if (n==1)
      ltx.DrawLatex(0.44, 0.24, Form("n=%d", n));
    else
      ltx.DrawLatex(0.04, 0.24, Form("n=%d", n));

  }
  overlay->cd();
  ltx.SetTextSize(0.075);
  ltx.DrawLatex(0.48, 0.05, "trigger p_{T}^{t} [GeV/c]");
  ltx.SetTextAngle(90);
  ltx.DrawLatex(0.06, 0.48, "V_{n#Delta}  [10^{-2}]");
  ltx.SetTextAngle(0);
  return cv;
}

TGraphErrors* AgreementVsPtSum(int k, int n)
{
  TGraphErrors* gVn = VnDVsQ(n, k);
  TF1* fVn = GlobalFitVsQ(n,k);
  TGraphErrors* g = new TGraphErrors();
  int N = gVn->GetN(); // And f better have the same N.
  int i = 0, j = 0;
  if(N<=0) {
    Error("AgreementVsPtSum()", "Invalid number of points: %d", N);
    gSystem->Exit(1);
  }

  for (int q=0; q<N; q++) {
    ijFromGlobalIndex(q,i,j);
    double gy = gVn->GetY()[q];
    double fy = fVn->Eval(q+0.5);
    double r = TMath::Abs((gy-fy)/gy); 
    g->SetPoint(q, PtBinCenterSum(i, j), r);
  }
  g->SetMarkerStyle(kFullCircle);
  return g;
}

TGraph2D* Agreement2D(int k, int n)
{
  TGraphErrors* gVn = VnDVsQ(n, k);
  TF1* fVn = GlobalFitVsQ(n,k);
  TGraph2D* g = new TGraph2D();
  int N = gVn->GetN(); // And f better have the same N.
  int i = 0, j = 0;
  if(N<=0) {
    Error("AgreementVsPtSum()", "Invalid number of points: %d", N);
    gSystem->Exit(1);
  }

  for (int q=0; q<N; q++) {
    ijFromGlobalIndex(q,i,j);
    double gy = gVn->GetY()[q];
    double fy = fVn->Eval(q+0.5);
    double r = TMath::Abs((gy-fy)/fy); 
    g->SetPoint(q, ptmean[j], ptmean[i], r);
  }
  return g;
}

TH2F* Agreement2DHist(int k, int n)
{
  TGraphErrors* gVn = VnDVsQ(n, k);
  TF1* fVn = GlobalFitVsQ(n,k);

  // Pt binning array
  double ptarr[100];
  for (int i=0; i<maxpt; i++) ptarr[i] = gi->GetX()[i] - gi->GetEX()[i];
  ptarr[maxpt] = gi->GetX()[maxpt-1] + gi->GetEX()[maxpt-1];

  int N = gVn->GetN(); // And f better have the same N.
  int i = 0, j = 0;
  if(N<=0) {
    Error("AgreementVsPtSum()", "Invalid number of points: %d", N);
    gSystem->Exit(1);
  }
  const char* name = Form("agmt_cent%dto%d_n%d", 
			  centlow[k],centhigh[k], n);
  TH2F* h = new TH2F(name, name, maxpt, ptarr, maxpt, ptarr);
  h->SetTitle("title;p_{T}^{a};p_{T}^{t};");

  for (int q=0; q<N; q++) {
    ijFromGlobalIndex(q,i,j);
    double gy = gVn->GetY()[q];
    double fy = fVn->Eval(q+0.5);
    
    // double r = fy==0? 0 : TMath::Abs(gy-fy) / fy; 
    double r = gy==0? 0 : TMath::Abs((gy-fy) / gy); 
    //    double r = fy==0? 0 : TMath::Abs(gy / fy); 
    h->SetBinContent(j+1, i+1, r);
  }
  return h;
}

TH2* PttPtaHist()
{
  // Pt binning array
  double ptarr[100];
  for (int i=0; i<maxpt; i++) ptarr[i] = gi->GetX()[i] - gi->GetEX()[i];
  ptarr[maxpt] = gi->GetX()[maxpt-1] + gi->GetEX()[maxpt-1];

  int i = 0, j = 0;
  const char* name = Form("PttPtaHist");
  TH2F* h = new TH2F(name, name, maxpt, ptarr, maxpt, ptarr);
  h->SetTitle("title;p_{T}^{a} (GeV/c);p_{T}^{t} (GeV/c);");
  h->GetXaxis()->CenterTitle();
  h->GetYaxis()->CenterTitle();
  int N = maxpt * (maxpt + 1) / 2;
  for (int q=0; q<N; q++) {
    ijFromGlobalIndex(q,i,j);
    h->SetBinContent(j+1, i+1, 1.);
  }
  return h;
}

TGraphErrors* Chi2VsTrigPt(int k, int n)
{
  TGraphErrors* g = new TGraphErrors();
  for (int i=0; i<maxpt; i++) {
    g->SetPoint(i, ptmean[i], ReducedChi2(i, k, n));
  }
  g->SetMarkerStyle(kFullCircle);
  return g;
}

TGraphErrors* 
CorrFnChi2VsTrigPt(int j, int k, int n1, int n2, TString opt)
{
  TGraphErrors* g = new TGraphErrors();
  int ip=0;
  for (int i=j; i<maxpt; i++) {
    TH1* h = Hist("RIDGE", "cA", i, j, k);
    double x = MeanPt(i, j, k, "t");
    double y = Chi2(h, HarmonicSum(h, n1, n2, "global"), opt);
    g->SetPoint(ip, x, y);
    ip++;
  }
  g->SetMarkerStyle(kFullCircle);
  return g;
}

double ReducedChi2(int i, int k, int n)
{
  TGraphErrors* g = VnDeltaVsPtAssoc(i, k, n);
  TGraphErrors* f = GlobalFitVsPtAssoc(i, k, n);
  int N = g->GetN(); // And f better have the same N.
  double chi2 = 0;

  // Value (or one-sigma error if opt=="err") of v_n
  //  double vnerr = Bestvn(k,n,i,"err");
  double vnerr = vnGF(n,k,i,0,999,"RIDGE","cA","err");

  if(N<=0 || N!= f->GetN()) {
    Error("ReducedChi2()", "Invalid number of points: %d", N);
    gSystem->Exit(1);
  }

  for (int j=0; j<N; j++) {
    double errj = g->GetEY()[j];

    chi2 += 
      (g->GetY()[j] - f->GetY()[j]) * (g->GetY()[j] - f->GetY()[j]) / 
      pow(errj + vnerr, 2);
  }
  chi2 /= N;
  return chi2;
}

TGraphErrors* VnDeltaVsPtAssoc(int i, int k, int n, TString opt)
{
  // Create a TGraph from VnDelta points
  TGraphErrors* gALL = VnDVsQ(n, k, "RIDGE", "cA", opt);
  TGraphErrors* g = new TGraphErrors();
  TString gname(Form("VnDeltaVsPtAssoc_ptt%d_cent%d_n%d",i,k,n));
  gname.Append(opt);
  g->SetName(gname.Data());

  for (int j=0; j<=i; j++) {
    int q = GlobalIndex(i, j);
    g->SetPoint(j, gj->GetX()[j], gALL->GetY()[q] );
    g->SetPointError(j, 0,  gALL->GetEY()[q] );
    utils.set_tgraph_props(g, colorsDark[i], colorsDark[i], kFullSquare, 1.0); 
    g->SetLineWidth(2);
  }
  
  return g;
}

TGraphErrors* VnDeltaVsPtTrig(int j, int k, int n, TString opt)
{
  // Create a TGraph from VnDelta points
  TGraphErrors* gALL = VnDVsQ(n, k, "RIDGE", "cA", opt);
  TGraphErrors* g = new TGraphErrors();
  TString gname(Form("VnDeltaVsPtTrig_pta%d_cent%dto%d_n%d",
		     j,centlow[k],centhigh[k],n));
  gname.Append(opt);
  g->SetName(gname.Data());

  int ip=0;
  for (int i=j; i<maxpt; i++) {
    int q = GlobalIndex(i, j);
    
    double xerr = 0.;
    if (opt.Contains("sys")) {
      if (gi->GetEX()[i] < 0.126)
	xerr = gi->GetEX()[i];
      else
	xerr = 0.250;
    }
    double mpt = MeanPt(i, j, k, "t"); 
    double sf = 100; // Scale y-value; make sure to label accordingly!!
    g->SetPoint(ip, mpt, sf*gALL->GetY()[q] ); 
    g->SetPointError(ip, xerr,  sf*gALL->GetEY()[q] );

    utils.set_tgraph_props(g, colorsDark[j], colorsDark[j], kFullSquare, 1.0); 
    g->SetLineWidth(2);
    ip++;
  }
  
  return g;
}

TGraphErrors* VnDeltaVsN(int i, int j, int k, int nMax, TString opt)
{
  // Create a TGraph from VnDelta points
  // Stat errors by default. Call with opt "sys" to get sys errors.
  // Call with opt "sine" to get residual <sin n Delta phi> for sys. est.
  int q = GlobalIndex(i, j);
  TString gname(Form("VnDeltaVsN_ptt%.2gto%.2g_pta%.2gto%.2g_cent%dto%d",
		     ptlow[i],pthigh[i],ptlow[j],pthigh[j],
		     centlow[k],centhigh[k]));
  if (!opt.IsNull())  {
    gname.Append("_");
    gname.Append(opt);
  }
  TGraphErrors* g = (TGraphErrors*) gList->FindObject(gname.Data());
  if (g) {
    return g;
  } 
  else {
    g = new TGraphErrors();
    g->SetName(gname.Data());
  }

  int ip=0;
  gStyle->SetEndErrorSize(5);
  for (int n=1; n<=nMax; n++) {

    TGraphErrors* gALL = VnDVsQ(n, k, "RIDGE", "cA", opt);
    double xerr = opt.Contains("sys") ? 0. : 0.0; // 0.2
    g->SetPoint(ip, n, 100*gALL->GetY()[q] );
    g->SetPointError(ip, xerr,  100*gALL->GetEY()[q] );
    if (0)
      cout<<gALL->GetName()<< " " << g->GetY()[ip] << endl;

    ip++;
  }

  utils.set_tgraph_props(g, kBlack, kBlack, kFullCircle, 1.2); 
  g->SetLineWidth(2);
  gList->Add(g);
  return g;
}

TGraphErrors* GlobalvnVsN(int i, int k, int nMax, TString opt)
{
  // Create a TGraph from vn{GF} points
  // Stat errors by default. Call with opt "sys" to get sys errors.

  TString gname(Form("GlobalvnVsN_pt%.2gto%.2g_cent%dto%d",
		     ptlow[i],pthigh[i], centlow[k],centhigh[k]));
  if (!opt.IsNull())  {
    gname.Append("_");
    gname.Append(opt);
  }
  TGraphErrors* g = (TGraphErrors*) gList->FindObject(gname.Data());
  if (g) {
    return g;
  } 
  else {
    g = new TGraphErrors();
    g->SetName(gname.Data());
  }
  g->SetName(gname.Data());

  int ip=0;
  for (int n=1; n<=nMax; n++) {

    // point, stat err, sys err.
    double vnp = vnGF(n, k, i, 0, 999, "RIDGE", "cA", "");
    double vne = vnGF(n, k, i, 0, 999, "RIDGE", "cA", "err");
    double vns = vnGF(n, k, i, 0, 999, "RIDGE", "cA", "sys");
    double xerr = opt.Contains("sys") ? 0. : 0.0; // 0.2
    double yerr = opt.Contains("sys") ? vns : vne;

    g->SetPoint(ip, n, vnp );
    g->SetPointError(ip, xerr, yerr);
    ip++;
  }

  utils.set_tgraph_props(g, kBlack, kBlack, kFullCircle, 1.2); 
  g->SetLineWidth(2);

  return g;
}

TGraphErrors* VnDeltaNFVsN(int i, int j, int k, int nMax, TString opt)
{

  TGraphErrors* VnD = VnDeltaVsN(i,j,k,nMax,opt);
  TGraphErrors* vnt = GlobalvnVsN(i,k,nMax,opt);
  TGraphErrors* vna = GlobalvnVsN(j,k,nMax,opt);
  TString gname(Form("VnDeltaNFVsN_ptt%.2gto%.2g_pta%.2gto%.2g_cent%dto%d",
		     ptlow[i],pthigh[i],ptlow[j],pthigh[j],
		     centlow[k],centhigh[k]));
  if (!opt.IsNull())  {
    gname.Append("_");
    gname.Append(opt);
  }
  TGraphErrors* g = (TGraphErrors*) gList->FindObject(gname.Data());
  if (g) {
    return g;
  } 
  else {
    g = new TGraphErrors();
    g->SetName(gname.Data());
  }
  g->SetName(gname.Data());

  int ip=0;
  for (int n=1; n<=nMax; n++) {

    // Uncertainty vne is stat or sys depending on opt.
    double vnp = VnD->GetY()[ip] - 100*vnt->GetY()[ip]*vna->GetY()[ip];
    double vne = VnD->GetEY()[ip] - 100*vnt->GetEY()[ip]*vna->GetEY()[ip];
    g->SetPoint(ip, n, vnp );
    g->SetPointError(ip, 0.0, vne);
    ip++;
  }

  utils.set_tgraph_props(g, kBlack, kBlack, kOpenSquare, 1.2); 
  g->SetLineWidth(2);
  return g;
}


TF1* GlobalFitVsQ(int n, int k, int ipt1, int ipt2, const char* region, 
		  const char* corrtype, TString opt)
{

  // vn{GF}(trig) x vn{GF}(assc) vs. q, where the points between (and
  // including) ipt1 and ipt2 were used in the global fit.
  // Note: gfname must be identical format to fnName in GlobalFitVsQ().
  TF1* fitfn = 0;
  TString errType("meas");
  if (opt.Contains("hi_sys"))
    errType = "hi";
  if (opt.Contains("lo_sys"))
    errType = "lo";
  TString gfname = 
    Form("globalFitFn_cent%dto%d_n%d_ptbins%dto%d_%s_corrtype_%s_%s", 
	 centlow[k],centhigh[k], n, ipt1, ipt2, 
	 region, corrtype, errType.Data());
  fitfn = (TF1*)gFitList->FindObject(gfname.Data());
  if (fitfn) {
    if (0)
      Info("GlobalFitVsQ()", "Returning cached TF1 %s", gfname.Data());
    return fitfn;
  }

  // If nonexistent, create (& store) a new one
  fitfn = DoGlobalFit(n,k,ipt1,ipt2,region,corrtype,opt);
  //  fitfn = (TF1*)gFitList->FindObject(gfname.Data());
  
  if (!fitfn)
    Warning("GlobalFitVsQ()", 
	    "no fitfn %s,\neven after calling DoGlobalFit()", 
	    gfname.Data());

  return fitfn;
}

TF1* DoGlobalFit(int n, int k, int ipt1, int ipt2, 
		 const char* region, const char* corrtype, TString opt)
{
  // fnName must be identical format to gfname in GlobalFitVsQ().
  TF1 *globalFitFn = 0;
  TGraphErrors* g = 0;
  TString errType("meas");
  if (opt.Contains("hi_sys"))
    errType = "hi";
  if (opt.Contains("lo_sys"))
    errType = "lo";
  TString fnName = 
    Form("globalFitFn_cent%dto%d_n%d_ptbins%dto%d_%s_corrtype_%s_%s", 
	 centlow[k],centhigh[k], n, ipt1, ipt2, 
	 region, corrtype, errType.Data());

  g = VnDVsQ(n, k, region, corrtype, opt);

  if (!g) {
    Error("DoGlobalFit()", "No graph found");
    return 0;
  }

  // Assign global variables that will get checked in the vntvna
  // function during the fit.
  minFitPtBin = ipt1;
  maxFitPtBin = ipt2;

  // Set up the global fit function...  
  double qmax = g->GetN() - 0.4999;
  int nPars = maxpt + 3;
  globalFitFn = new TF1(fnName.Data(), vntvna, 0.0, qmax, nPars);
  
  /* Not needed now, I just flip the v1 points later...AMA 11/15/2011 */
  // Each parameter has an equally good minimum at + or - v_nbest. The
  // starting value is chosen to steer the fit to the positive "root".
  // v_1 is special because it is the only coefficient that crosses
  // zero at low pt, so it gets a negative starting point. Pars are
  // vn(ipt), then last one is n.
  //  double startVal = (n==1)? -0.02 : 0.01;

  double startVal = 0.01;
  for (int ip=0; ip<maxpt; ip++) { 
    globalFitFn->SetParameter(ip, startVal);
    globalFitFn->SetParName(ip, Form("v_%d(%.3g)",n,ptmean[ip]));
  }

  // Pass n into vntvna(). Access as par[maxpt].
  globalFitFn->FixParameter(maxpt, double(n));

  // Pass k into vntvna(). Access as par[maxpt+1].
  globalFitFn->FixParameter(maxpt+1, double(k));

  // Mom. conservation term prefactor. Access as par[maxpt+2].
  if (n==1) {
    globalFitFn->FixParameter(maxpt+2, 0.);
    //    globalFitFn->SetParLimits(maxpt+2, 0., 1e-3);
  }
  else
    globalFitFn->FixParameter(maxpt+2, 0.);
  
  globalFitFn->SetNpx(1000);

  TFitResultPtr result = g->Fit(globalFitFn,"QRNS"); // fast, takes ~15 ms

  if (0) {
    cout<<globalFitFn->GetName();
    result->Print();
  }
  // TMinuit status: 
  // migradResult + 10*minosResult + 100*hesseResult + 1000*improveResult
  // 0:ok, <0:user error, >0: see above.
  int fitStatus = result;
  if (fitStatus)
    Warning("DoGlobalFit()", "TMinuit status %d", fitStatus);

  gFitList->Add(globalFitFn);

  return globalFitFn;
}

double vnGF(int n, int k, int ptBin, int ipt1, int ipt2,
	    const char* region, const char* corrtype, TString opt)
{

  double vn, err;
  TF1* gfn = GlobalFitVsQ(n,k,ipt1,ipt2,region,corrtype,opt);
  if (!gfn) 
    Error("vnGF()", "!gfn");  
  vn = gfn->GetParameter(ptBin); // ptBin is the q index
  err = gfn->GetParError(ptBin);
  
  if (opt.Contains("sys")) {
    TF1* hi = GlobalFitVsQ(n,k,ipt1,ipt2,region,corrtype,"hi_sys");
    TF1* lo = GlobalFitVsQ(n,k,ipt1,ipt2,region,corrtype,"lo_sys");
    double vhi = hi->GetParameter(ptBin);
    double vlo = lo->GetParameter(ptBin);
    return 0.5*TMath::Abs(vhi-vlo);
  }

  // v1 can be negative, otherwise ensure the positive solution is chosen
  // if (n>1 && vn < 0)
  //   vn *= -1;

  // if (ptlow[ipt1] > 4.) // !!!!!!!!!!!!!!!!!!!!!!!!!
  //   vn = TMath::Abs(vn);

  // if (n==1) 
  //   vn += MomCorrection(i, j, k);

  return opt.Contains("err") ? err : vn;
}

TGraphErrors* vnGFvsPt(int n, int k, int ipt1, int ipt2, 
		       const char* region, const char* corrtype, TString opt)
{

  // vn{GF} vs. pt, where the points between (and including) ipt1 and
  // ipt2 were used in the global fit.
  bool isHighPtFit = ipt1 > 0 && ipt2==999;
  bool flipSign = n==1;  // Flip v1?
  if (isHighPtFit) 
    flipSign = 0;
  if (opt.Contains("keepsign"))
    flipSign = 0;
  TString name(Form("v%dGFvsPt_fitpt%dto%d_cent%dto%d",
		  n, ipt1, ipt2, centlow[k], centhigh[k]));
  if (opt.Contains("sys"))
    name.Append("_sys");
  if (opt.Contains("ptcons"))
    name.Append("_ptcons");

  TGraphErrors* g = (TGraphErrors*)gList->FindObject(name.Data());
  if (g)
    return g;
  
  g = new TGraphErrors();
  g->SetName(name);
  
  for (int i=0; i<maxpt; i++) {
    TString opt1 = "";
    if (opt.Contains("ptcons"))
      opt1.Append("_ptcons");
    double vn = vnGF(n,k,i,ipt1,ipt2,region,corrtype,opt1);
    
    if (flipSign)
      vn = -vn;
    
    //    if (isHighPtFit && i<ipt1)
    if (i<ipt1)
      vn = 0.;

    double mpt = MeanPt(i, 0, k, "t"); 
    if (i<ipt1) 
      mpt = -10.;
    g->SetPoint(i, mpt, vn);
    
    if (opt.Contains("sys")) {
      opt1.Append("_sys");
      double ex  = (gi->GetEX()[i] < 0.126) ? gi->GetEX()[i] : 0.250;
      double vns = vnGF(n,k,i,ipt1,ipt2,region,corrtype, opt1);
      g->SetPointError(i, ex, vns);
      //      g->SetPointError(i, gi->GetEX()[i], vns); // too wide 
    }
    else {
      opt1.Append("_err");
      double vne = vnGF(n,k,i,ipt1,ipt2,region,corrtype,opt1);
      g->SetPointError(i, 0.0, vne);
    } 
  }

  int col = CentColor(centlow[k], centhigh[k]);
  int col_pale = CentColorPale(centlow[k], centhigh[k]);
  g->SetLineWidth(2);
  g->SetFillColor(col_pale); // for sys
  utils.set_tgraph_props(g, col, col, kFullCircle, 1.2);

  if (0) cout<<opt.Data()<<endl;
  gList->Add(g);
  return g;
}

TGraph* Luzumv1(int cent, const char* pid) 
{
  // v1 for pions vs pt from viscous hydro calc by Matt Luzum
  // valid cent args 0-4 - 10% bins.
  // pid = "pi", "K", "p".
  const char* dat = Form("v1LHCGlauber%ssv08.dat", pid);
  TString fmt("%lg "); // pt
  for (int ky=0; ky<5; ky++) 
    fmt.Append( ky==cent? "%lg " : "%*lg "); // centrality - skip if *lg
  return new TGraph(dat, fmt.Data());
}

TGraphErrors* GlobalFitVsPtAssoc(int i, int k, int n, TString opt)
{
  // Create a TGraph of vnt{gf} x vna{gf} vs. pt_assoc from gfit
  TF1* gfit = GlobalFitVsQ(n, k, 0, 999, "RIDGE", cfDef, opt);
  TGraphErrors* g = new TGraphErrors();
  TString gname(Form("GlobalFitVsPtAssoc_ptt%d_cent%d_n%d",i,k,n));
  if (!opt.IsNull())
    gname.Append(opt);
  g->SetName(gname);

  for (int j=0; j<=i; j++) {
    int q = GlobalIndex(i, j);
    g->SetPoint(j, gj->GetX()[j], gfit->Eval(q + 0.5) );
    g->SetPointError(j, 0, 0 );
    utils.set_tgraph_props(g, colorsPale[i], colorsPale[i], kFullCircle, 1.0); 
    g->SetLineWidth(4);
  }
  return g;
}

double SineError(int i, int j, int k)
{
  double rms = 0;
  double resid_sin=0, rs_err=0;
  TH1* hst  = Hist("RIDGE", "cA", i, j, k, ""); 	
  double arr[100] = {0};
  //  arr[0] = 0;
  for (int n=1; n<=gNMax; n++) {
    VnDelta(n, *hst,  resid_sin, rs_err, "sin");
    arr[n-1] = resid_sin;
  }

  rms = TMath::RMS(gNMax, arr) / 2;
  if (0)
    cout << " SineError: " << rms << endl;

  return rms;
}

TCanvas* DrawVnDeltaVsN(int nptt, int pttbins[], int npta, 
			int ptabins[], int ncb, int centbins[], TString opt)
{

  double t1=ptlow[pttbins[0]], t2=pthigh[pttbins[nptt-1]];
  double a1=ptlow[ptabins[0]], a2=pthigh[ptabins[npta-1]];
  TString cname = Form("VnDeltaVsN_ptt%.2gto%.2g_pta%.2gto%.2g",t1,t2,a1,a2);
  if (!opt.IsNull()) {
    cname.Append("_");
    cname.Append(opt);
  }
  TCanvas* c = new TCanvas(cname.Data(), cname.Data(), 650,700);
  double legbottom = 0.9 - 0.07*ncb;
  TLegend* leg = new TLegend(0.62, legbottom, 0.98, 0.98, "Centrality");
  leg->SetFillColor(kNone);
  leg->SetBorderSize(0);
  leg->SetName("leg");

  TObjArray* graphs = new TObjArray();
  double xmin = 0.4;
  double xmax = opt.Contains("ext") ? gNMax + 0.5 : 8.5;
  int nXticks =  10, nYticks = 210;
  TLine l;
  TH1F* hf = gPad->DrawFrame(xmin, 0.0001, xmax, 0.26);
  //  bool scale1000 = 0;

  hf->SetTitle(Form(";n;V_{n#Delta} [10^{-2}]"));
  if (opt.Contains("sine"))
    hf->SetTitle(Form(";n;#LTsin(n#Delta#phi)#GT [10^{-2}]"));

  // if (opt.Contains("ext") )  
  //   if (!opt.Contains("sine")) {
  //     scale1000 = 0;
  //     hf->SetTitle(Form(";n;V_{n#Delta}"));
  // }

  l.SetLineStyle(kDashed);

  utils.make_nice_axes(c, hf, 1.3, nXticks, nYticks, 1.4,-1.4);
  hf->SetLabelOffset(0.0, "X");
  hf->SetTitleOffset(-1.96, "Y");

  hf->GetXaxis()->SetTicks("+-");
  hf->GetYaxis()->SetTicks("+-");
  l.DrawLine(hf->GetXaxis()->GetXmin(), 0, hf->GetXaxis()->GetXmax(),0);
  gPad->SetLeftMargin(0.22);
  gPad->SetTopMargin(0.01);
  gPad->SetRightMargin(0.01);

  for (int i=0; i<nptt; i++) {
    for (int j=0; j<npta; j++) {
      for(int k=0; k<ncb; k++) {

	// Stat errors on g, sys errors on gs.
	TString opt1 = opt.Contains("sine") ? "sine" : "";
	TGraphErrors* g = 
	  VnDeltaVsN(pttbins[i], ptabins[j], centbins[k], gNMax, opt1);
	TGraphErrors* gs = 
	  VnDeltaVsN(pttbins[i], ptabins[j], centbins[k], gNMax, "sys");
	TGraphErrors* gc = (TGraphErrors*)g->Clone();
	int dark = CentColor(centlow[centbins[k]], centhigh[centbins[k]]);
	int pale = CentColorPale(centlow[centbins[k]], centhigh[centbins[k]]);
	utils.set_tgraph_props(g, dark, dark, kFullCircle, 1.5); 
	utils.set_tgraph_props(gs, dark, dark, kDot, 2.); 
	utils.set_tgraph_props(gc, kBlack, kBlack, kOpenCircle, 1.5);
	g->SetFillColor(pale);
	gs->SetFillColor(dark);

	TGraphErrors* gnf = 0;
	TGraphErrors* gnf_sys = 0;
	TGraphErrors* gnf_solid = 0;
	if (opt.Contains("vnf")) {  // Non-factorizing part
	  gnf = 
	    VnDeltaNFVsN(pttbins[i], ptabins[j], centbins[k], gNMax, "");
	  gnf_sys = 
	    VnDeltaNFVsN(pttbins[i], ptabins[j], centbins[k], gNMax, "sys");

	  // Just for appearance...
	  gnf_solid = (TGraphErrors*) gnf->Clone(Form("%s_solid", gnf->GetName()));
	  utils.set_tgraph_props(gnf_solid, pale, pale, kFullSquare, gnf->GetMarkerSize());
	}
	// if (scale1000) {
	//   for (int ip=0; ip<g->GetN(); ip++) {
	//     g->SetPoint(ip,   g->GetX()[ip], 1000* g->GetY()[ip]);
	//     gs->SetPoint(ip, gs->GetX()[ip], 1000*gs->GetY()[ip]);
	//     gc->SetPoint(ip, gc->GetX()[ip], 1000*gc->GetY()[ip]);

	//     g->SetPointError(ip,   g->GetEX()[ip], 1000* g->GetEY()[ip]);
	//     gs->SetPointError(ip, gs->GetEX()[ip], 1000*gs->GetEY()[ip]);
	//     gc->SetPointError(ip, gc->GetEX()[ip], 1000*gc->GetEY()[ip]);
	//   }
	// }

	if (opt.Contains("sine")) {
	  g->Fit("pol0", "Q");
	  TF1* gfit = g->GetFunction("pol0");
	  gfit->SetLineColor(dark);
	}

	else if (!opt.Contains("nobars"))
	  g->Draw("Bsame");  // bars

	if (opt.Contains("vnf")) {  // Non-factorizing part
	  utils.draw_errorbox(gnf_sys, pale, 0.3);
	  gnf_solid->Draw("epsame");
	  gnf->Draw("epsame");
	}

	g->Draw("psame");  // colored markers
	gc->Draw("epsame");  // open markers w/black stat error bars

	if (!opt.Contains("sine"))
	  utils.draw_errorbox(gs, dark, 0.3);

	graphs->Add(g);
	leg->AddEntry(g,Form("%d-%d%%",centlow[centbins[k]],centhigh[centbins[k]]),"l,p");

	if (opt.Contains("vnf")) {  // Non-factorizing part
	  leg->AddEntry(gnf_solid,"NF V_{n#Delta}","l,p");
	  //	  leg->AddEntry(gnf_solid,"[v_{n}(p_{T}^{t}) #times v_{n}(p_{T}^{a})]_{GF}","l,p");
	  leg->SetHeader(""); 
	}

      }
    }
  }

  // Adjust y limits
  double newYmin = 0, newYmax = 0, newSpace = 0;
  for (int m=0; m<graphs->GetEntries(); m++) {
    TGraphErrors* tg = (TGraphErrors*)graphs->At(m);
    double yhi = TMath::MaxElement(tg->GetN()-1, tg->GetY());
    double ylo = TMath::MinElement(tg->GetN()-1, tg->GetY());
    if (yhi > newYmax) newYmax = yhi;
    if (ylo < newYmin) newYmin = ylo;
  }

  newSpace = 0.1*(newYmax - newYmin);

  if (opt.Contains("ext"))
    hf->GetYaxis()->SetRangeUser(newYmin-newSpace, newYmax+4*newSpace);
  else
    hf->GetYaxis()->SetRangeUser(newYmin-newSpace, newYmax+newSpace);

  // if (opt.Contains("sine")) {
  //   hf->GetYaxis()->SetRangeUser(0.0001, newYmax+4*newSpace);
  //   gPad->SetLogy();
  // }

  if (!opt.Contains("sine")) 
    leg->Draw();
 
  // Draw text
  ltx.SetTextSize(0.04); // 0.05

  if ( opt.Contains("sine") )  
    legbottom = 0.99;
  else if (opt.Contains("ext") && !opt.Contains("vnf") )  
    legbottom -= 0.4;
  
  double xstart = 0.6;
  ltx.DrawLatex(xstart, legbottom-1*0.07, Form("%.2g < p_{T}^{t} < %.2g GeV/c", t1, t2));
  ltx.DrawLatex(xstart, legbottom-2*0.07, Form("%.2g < p_{T}^{a} < %.2g GeV/c", a1, a2));
  
  gPad->Update();
  gPad->Modified();
  return c; 
}

TCanvas* DrawGlobalvnVsN(int npt, int ptbins[], int ncb, int centbins[], TString opt)
{
  double t1=ptlow[ptbins[0]], t2=pthigh[ptbins[npt-1]];
  TString cname = Form("GlobalvnVsN_pt%.2gto%.2g",t1,t2);
  if (!opt.IsNull()) {
    cname.Append("_");
    cname.Append(opt);
  }
  TCanvas* c = new TCanvas(cname.Data(), cname.Data(), 600,700);
  double legbottom = 0.9 - 0.07*ncb;
  TLegend* leg = new TLegend(0.62, legbottom, 0.98, 0.98, "Centrality");
  leg->SetFillColor(kNone);
  leg->SetBorderSize(0);
  leg->SetName("leg");

  TObjArray* graphs = new TObjArray();
  double xmin = opt.Contains("zoom") ? 2.6 : 0.4;
  double xmax = 8.5;
  int nXticks =  10, nYticks = 210;
  TLine l;
  TH1F* hf = gPad->DrawFrame(xmin, -0.06, xmax, 0.26);
  hf->SetTitle(Form(";n;v_{n}{GF}"));
  l.SetLineStyle(kDashed);

  utils.make_nice_axes(c, hf, 1.3, nXticks, nYticks, 1.4,-1.4);
  hf->SetLabelOffset(0.0, "X");
  if (opt.Contains("zoom"))
    hf->SetTitleOffset(-2.3, "Y");
  else
    hf->SetTitleOffset(-1.9, "Y");

  hf->GetXaxis()->SetTicks("+-");
  hf->GetYaxis()->SetTicks("+-");
  l.DrawLine(hf->GetXaxis()->GetXmin(), 0, hf->GetXaxis()->GetXmax(),0);
  if (opt.Contains("zoom"))
    gPad->SetLeftMargin(0.25);
  else
    gPad->SetLeftMargin(0.2);
  gPad->SetTopMargin(0.01);
  gPad->SetRightMargin(0.01);

  for (int i=0; i<npt; i++) {
    for(int k=0; k<ncb; k++) {

      // Stat errors on g, sys errors on gs.
      TGraphErrors* g  = GlobalvnVsN(ptbins[i], centbins[k], gNMax, "");
      TGraphErrors* gs = GlobalvnVsN(ptbins[i], centbins[k], gNMax, "sys");
      TGraphErrors* gc = (TGraphErrors*)g->Clone();
      int dark = CentColor(centlow[centbins[k]], centhigh[centbins[k]]);
      int pale = CentColorPale(centlow[centbins[k]], centhigh[centbins[k]]);
      utils.set_tgraph_props(g, dark, dark, kFullCircle, 1.5); 
      //      utils.set_tgraph_props(gs, dark, dark, kDot, 2.); 
      utils.set_tgraph_props(gc, kBlack, kBlack, kOpenCircle, 1.5);
      g->SetFillColor(pale);
      //      gs->SetFillColor(dark);
      g->Draw("Bsame");  // colored bars
      utils.draw_errorbox(gs, dark, 0.3);
      g->Draw("psame");  // colored markers
      //      gs->Draw("e[]psame"); // sys error filled rectangles
      gc->Draw("epsame");  // open markers w/black stat error bars
      graphs->Add(g);
      leg->AddEntry(g,Form("%d-%d%%",centlow[centbins[k]],centhigh[centbins[k]]),"l,p");
    }
  }

  // Adjust y limits
  double newYmin = 0, newYmax = 0, newSpace = 0;
  for (int m=0; m<graphs->GetEntries(); m++) {
    TGraphErrors* tg = (TGraphErrors*)graphs->At(m);
    double yhi = TMath::MaxElement(tg->GetN()-1, tg->GetY());
    double ylo = TMath::MinElement(tg->GetN()-1, tg->GetY());
    if (yhi > newYmax) newYmax = yhi;
    if (ylo < newYmin) newYmin = ylo;
  }

  newSpace = 0.1*(newYmax - newYmin);
  hf->GetYaxis()->SetRangeUser(newYmin-newSpace, newYmax+newSpace);
  if (opt.Contains("zoom"))
    hf->GetYaxis()->SetRangeUser(-0.0008, 0.0085);

  leg->Draw();
  c->Update();
 
  // Draw text
  // if (opt.Contains("zoom"))
  //   ltx.SetTextSize(0.03); // 0.04
  // else

  // ltx.SetTextSize(0.04); // 0.05

  double xstart = (opt.Contains("zoom")) ? 0.7 : 0.6;
  ltx.DrawLatex(xstart, legbottom-1*0.07, Form("%.2g < p_{T} < %.2g GeV/c", t1, t2));
  // ltx.DrawLatex(xstart, legbottom-2*0.07, Form("%.2g < p_{T}^{assoc} < %.2g GeV/c", a1, a2));

  return c; 
}


TCanvas* DrawVnFromGlobalFit(int n, int ipt1, int ipt2, int ncb, 
			     int centbins[], TString opt)
{
  // Draw vn for one n on one canvas - many centralities
  initialize();
  double maxPtFit = ipt2==999 ? pthigh[maxpt-1] : pthigh[ipt2];
  const char* cname = Form("v%d_global%s_ptfit%.2gto%.2g",
			   n, opt.Data(), ptlow[ipt1], maxPtFit);
  const char* title = Form("v%d_global%s_ptfit%.2gto%.2g",
			   n, opt.Data(), ptlow[ipt1], maxPtFit);
  double lvleft = opt.Contains("multi")? 0.74 : 0.82;
  double lvbot = opt.Contains("multi")? 0.25 : 0.56;
  int cvHeight = opt.Contains("multi")? 500 : 500;
  TCanvas* cv = new TCanvas(cname, title, 700, cvHeight);
  TLegend* lv = new TLegend(lvleft, lvbot, 0.99, 0.97);
  lv->SetFillColor(kNone); lv->SetName("lv");
  lv->SetMargin(0.3);
  lv->SetBorderSize(1);
  lv->SetHeader("#splitline{Fit range}{(GeV/c):}");
  utils.padsetup(cv, 1, 1, "", 0.12, 0.01, 0.03, 0.2); // ######
  //  gPad->SetRightMargin(0.15);


  TPad* inset = 0;

  TObjArray* graphs = new TObjArray();
  double xmin = 0., xmax = 14.8; // 8.3;
  double ymin = -0.06, ymax = 0.26;
  if (opt.Contains("multi")) {
    ymin = -1.19;
    ymax = 0.52;
  }
  TH1F* hf = gPad->DrawFrame(xmin, ymin, xmax, ymax);
  hf->SetTitle(Form(";p_{T}^{t} (GeV/c);v_{%d}{GF}",n));
  int nXticks =  210;
  int nYticks = 210;
  TLine l;
  l.SetLineStyle(kDashed);
  if (n==1) {
    cv->cd();
    inset = new TPad("inset", "inset", 0.18, 0.18, 0.45, 0.59, kNone, 1, 0);
    inset->Draw();
    inset->cd();
    TH1F* hfi = gPad->DrawFrame(-0.05, -0.04, 4.2, 0.16);
    TAxis* hx = hfi->GetXaxis();     
    TAxis* hy = hfi->GetYaxis();
    hx->SetLabelSize(0.1);
    hy->SetLabelSize(0.1);
    hx->SetNdivisions(104);
    hy->SetNdivisions(104);
    gPad->SetBottomMargin(0.2);
    gPad->SetLeftMargin(0.2);
    gPad->SetRightMargin(0.01);
    gPad->SetTopMargin(0.01);
    //    utils.make_nice_axes(inset, hfi, 3, nXticks, nYticks, 1.4,-1.4);
    l.DrawLine(-0.05, 0, 4.2, 0);
    cv->cd();
  }

  utils.make_nice_axes(cv, hf, 1.3, nXticks, nYticks, 1.4,-1.4);
  hf->SetLabelOffset(0.0, "X");
  hf->SetTitleOffset(1.5, "Y");
  hf->GetXaxis()->SetTicks("+");
  //  hf->GetYaxis()->SetTicks("+-");

  TGraph* v1h[5][3];  
  if (opt.Contains("luzum")) {
    int lSty[] = {7, kSolid, kSolid}; 
    int lCol[] = {kBlack, kCyan, kBlue, kGreen+1, kRed}; 
    TString pidString[] = {"pi", "K", "p"};
    for (int m=0; m<5; m++) {
      for (int pid=0; pid<3; pid++) {
	v1h[m][pid] = Luzumv1(m, pidString[pid].Data()); 	
	TGraph* g1 = v1h[m][pid];
	g1->SetLineStyle(lSty[pid]);
	g1->SetLineColor(lCol[m]);
	g1->SetLineWidth(2);
      }
    }
    hf->GetXaxis()->SetRangeUser(0, 4.8);
    l.DrawLine(0, 0, 4.8, 0);
    v1h[0][0]->Draw("plsame");
    v1h[0][2]->Draw("plsame");
    v1h[4][0]->Draw("plsame");
    v1h[4][2]->Draw("plsame");
  }
  else
    l.DrawLine(hf->GetXaxis()->GetXmin(), 0, hf->GetXaxis()->GetXmax(),0);

  for (int cb=0; cb<ncb; cb++) {
    int k = centbins[cb];

    if (!opt.Contains("multi")) {    
      // last 2 args are included pt bins
      TGraphErrors* gtmp = vnGFvsPt(n, k, ipt1, ipt2);

      // clone to modify without ripples
      TGraphErrors* gc = (TGraphErrors*) gtmp->Clone();
      if (!gc) {
	Error("DrawVnFromGlobalFit()", "Problem making graph" );
	continue;
      }
      TGraphErrors* gtmp_sys = vnGFvsPt(n, k, ipt1, ipt2, "RIDGE", cfDef, "sys");
      TGraphErrors* gs = (TGraphErrors*) gtmp_sys->Clone();

      if (opt.Contains("luzum")) {
	if (centlow[k]==20)
	  utils.set_tgraph_props(gc, kBlue, kBlue, kFullCircle, 1.2);
	if (centlow[k]==40)
	  utils.set_tgraph_props(gc, kRed, kRed, kFullCircle, 1.2);
      }

      utils.draw_errorbox(gs, gs->GetFillColor());
      gc->Draw("epsame");
      graphs->Add(gc);

      TGraphErrors* open = (TGraphErrors*) gc->Clone(Form("%s_open", gc->GetName()));
      utils.set_tgraph_props(open, kBlack, kBlack, kOpenCircle, 1.2);
      open->Draw("epsame");

      lv->AddEntry(gc,Form("%d-%d%%",centlow[k],centhigh[k]),"l,p");
    }
    // NEW
    if (opt.Contains("multi")) {
      int b1,b2,b3,b4;
      b1=PtBin(0.25,0.5);
      b2=PtBin(0.75,1.0);
      b3=PtBin(2.0, 2.5);
      b4=PtBin(3.0, 4.0);
      TGraphErrors* gg1 = vnGFvsPt(n, k, b1, b2, "RIDGE", cfDef, "");
      TGraphErrors* gg2 = vnGFvsPt(n, k, b3, b4, "RIDGE", cfDef, "keepsign");
      TGraphErrors* gs1 = vnGFvsPt(n, k, b1, b2, "RIDGE", cfDef, "sys");
      TGraphErrors* gs2 = vnGFvsPt(n, k, b3, b4, "RIDGE", cfDef, "sys_keepsign");
      utils.set_tgraph_props(gg1, gg1->GetLineColor(), gg1->GetMarkerColor(), kOpenCircle, 1.0);
      utils.set_tgraph_props(gg2, gg2->GetLineColor(), gg2->GetMarkerColor(), kFullSquare, 1.0);
      
      utils.draw_errorbox(gs1, gs1->GetFillColor());
      utils.draw_errorbox(gs2, gs2->GetFillColor());
      gg1->Draw("epsame");
      gg2->Draw("epsame");
      graphs->Add(gs1);
      graphs->Add(gs2);
      const char* s1 = Form("#splitline{%.2g < p_{T}^{a} < %.2g  }{%d-%d%%}",
			    ptlow[b1], pthigh[b2], centlow[k],centhigh[k]);
      const char* s2 = Form("#splitline{%.2g < p_{T}^{a} < %.2g  }{%d-%d%%}",
			    ptlow[b3], pthigh[b4], centlow[k],centhigh[k]);
      lv->AddEntry(gg1, s1, "l,p");
      lv->AddEntry(gg2, s2, "l,p");

      
      if (n==1) {
	inset->cd();
	gg1->Draw("epsame");
	gg2->Draw("epsame");
	cv->cd();
      }
      
    }

  } // centrality bin loop

  if (opt.Contains("luzum")) {
    lv->AddEntry(v1h[0][0], Form("v.h. (#pi)"),"l,p");
    lv->AddEntry(v1h[0][2], Form("v.h. (p)"), "l,p");
  }
  lv->Draw();
  ltx.SetTextSize(0.05);

  if (opt.Contains("multi")) {
    gPad->SetTopMargin(0.02);
    if (ispp)
    ltx.DrawLatex(0.19, 0.92, Form("%s", "#splitline{pp}{2.76 TeV}"));
    else
    ltx.DrawLatex(0.19, 0.92, Form("%s", "#splitline{Pb-Pb}{2.76 TeV}"));
    ltx.DrawLatex(0.49, 0.94, Form("%.2g < |#Delta#eta| < 1.8", minRidgeDEta) ); 

  }
  else {
    ltx.DrawLatex(0.17, 0.88, Form("%.2g < |#Delta#eta| < 1.8", minRidgeDEta) ); 
    ltx.DrawLatex(0.17, 0.94, Form("%.2g < fit p_{T}^{a} < %.2g GeV/c",
				   ptlow[ipt1], maxPtFit));
    ltx.DrawLatex(0.19, 0.78, Form("%s", "#splitline{Pb-Pb}{2.76 TeV}"));
  }
  double newYmin = 0, newYmax = 0, newSpace = 0;
  for (int m=0; m<graphs->GetEntries(); m++) {
    TGraphErrors* tg = (TGraphErrors*)graphs->At(m);
    double yhi = TMath::MaxElement(tg->GetN()-1, tg->GetY());
    double ylo = TMath::MinElement(tg->GetN()-1, tg->GetY());
    if (yhi > newYmax) newYmax = yhi;
    if (ylo < newYmin) newYmin = ylo;
  }

  if (opt.Contains("multi")) {
    if(n==1) 
      newYmin *= 2.2;
    if(n==2) 
      newYmin = 0.02;
  }

  newSpace = 0.2*(newYmax - newYmin);
  //  if (opt.Contains("multi")) newSpace /= 2;
  if (n==5) newSpace *= 2;
  hf->GetYaxis()->SetRangeUser(newYmin-newSpace, newYmax+newSpace);
  cv->Modified();
  cv->Update();
  cv->Draw();
  return cv;
}

TCanvas* Drawv1to5(int ncb, int centbins[], int ipt1, int ipt2, TString opt)
{
  if (!opt.IsNull())
    cout<<opt.Data()<<endl;

  initialize();
  int cent1 = centlow[0];
  int cent2 = centhigh[centbins[ncb-1]];
  double pmax = 15.;
  if (ipt2 < 999.)
    pmax = pthigh[ipt2];
  const char* cname = Form("vn_etamin%02d_cent%dto%d_fitptbin%dto%d", 
			   (int)(10*minRidgeDEta), cent1, cent2, ipt1, ipt2);
  const char* title = Form("v1to5gf_etamin%02d_cent%dto%d_fitpt%.2gto%.2g", 
			   (int)(10*minRidgeDEta), cent1, cent2, ptlow[ipt1], pmax);
  TCanvas* cv = new TCanvas(cname, title, 1400, 500);
  TLegend* lv = new TLegend(0.09, 0.72, 0.27, 0.88);
  lv->SetFillColor(kNone);
  lv->SetBorderSize(0);
  TLine zero;
  double lv2bottom = 0.62;
  TLegend* lv2 = new TLegend(0.82, lv2bottom, 0.93, 0.95, "Centrality");
  lv2->SetFillColor(kNone);
  lv2->SetBorderSize(0);
  utils.padsetup(cv, 5, 1, "", 0.12, 0.01, 0.03, 0.2);

  for (int n=1; n<=5; n++) {
    Printf("Drawv1to5() n = %d / 5", n);
    cv->cd(n);
    double xmin = -0.43, xmax =  8.3;
    double ymin = -0.09, ymax =  0.26;
    if (ptlow[ipt1] > 4.) {
      xmin = 4.9;
      ymin = -0.1;
    }
    if (pthigh[ipt2] > 6.) {
      xmax = 11.8;
      ymax = 1;
    }
    if (opt.Contains("split")) {
      xmin = -0.43;
      xmax = 11.8;
      ymin = -0.2;
      ymax = 1;
    }

    TH1F* hf = gPad->DrawFrame(xmin, ymin, xmax, ymax);
    int nXticks = 206;
    int nYticks = 208;
    if (n==1) {
      utils.make_nice_axes(cv, hf, 2., nXticks, nYticks, -0.02, 0.02);
      hf->SetLabelOffset(-0.01, "X");
    }
    else {
      utils.make_nice_axes(cv, hf, 3.4, nXticks, nYticks, -0.075, 0.0);
      hf->SetLabelOffset(-0.057, "X");
      hf->SetTickLength(0.02, "X");
      hf->SetTickLength(0.05, "Y");
    }
    hf->GetXaxis()->SetTicks("+-");
    hf->GetYaxis()->SetTicks("+-");
    zero.SetLineStyle(kDashed);
    zero.DrawLine(xmin, 0., xmax, 0.);

    // Loop thru every cent bin. Skip non-requested ones.
    // for (int k=0; k<maxcent; k++) {
    //   bool centOK = 1;
    //   if (ncb != 999) {
    // 	centOK = 0;
    // 	for (int cb=0; cb<ncb; cb++) 
    // 	  if(k==centbins[cb])
    // 	    centOK = 1;
    //   }
    //   if (!centOK)
    // 	continue;

    for (int cb=0; cb<ncb; cb++) {
      int k = centbins[cb];
      TGraphErrors* gc = vnGFvsPt(n, k, ipt1, ipt2);
      TGraphErrors* gs = vnGFvsPt(n, k, ipt1, ipt2, "RIDGE", cfDef, "sys");

      if (!gc) {
	Error("Drawv1to5()", "Problem finding graph");
	continue;
      }

      TGraphErrors* gc_hipt=0;
      TGraphErrors* gs_hipt=0;
      if (opt.Contains("highptfit") || opt.Contains("split")) {
	gc_hipt = vnGFvsPt(n, k, ipt2+1, 999, "highptfit");
	gs_hipt = vnGFvsPt(n, k, ipt2+1, 999, "RIDGE", cfDef, "sys");
	gc_hipt->SetMarkerStyle(kOpenCircle);
      }

      int pale = gs->GetFillColor(); // it is CentColor(centlow[k], centhigh[k]).
      utils.draw_errorbox(gs, pale);
      gc->Draw("epsame");

      if (opt.Contains("split")) {
	utils.draw_errorbox(gs_hipt, pale);
	gc_hipt->Draw("epsame");
      }
      
      TGraphErrors* open = (TGraphErrors*) gc->Clone(Form("%s_open", gc->GetName()));
      utils.set_tgraph_props(open, kBlack, kBlack, kOpenCircle, 1.2);
      open->Draw("epsame");

      if (n==1)
	lv2->AddEntry(gc,Form("%d-%d%%",centlow[k],centhigh[k]),"l,p");

    } // cent bin k
  } // Fourier moment n
  
  cv->cd();
  TPad* overlay = new TPad("overlay", "overlay", 0,0,1,1);
  overlay->SetFillStyle(4000); // transparent
  overlay->Draw();
  overlay->cd();
  
  ltx.SetTextSize(0.07);
  lv2->Draw();
  
  for (int n=1; n<=5; n++) {
    cv->cd(n);
    ltx.SetTextSize(n==1? 0.1 : 0.15);
    ltx.DrawLatex((n==1)? 0.85 : 0.7, 0.86, Form("v_{%d}", n));

    if (0 && n==1)
      AddPrelimStampToCurrentPad(0.45,0.7,0.75,0.95, "");
  }
  overlay->cd();
  ltx.SetTextSize(0.075);
  ltx.DrawLatex(0.5, 0.05, "p_{T} [GeV/c]");
  ltx.SetTextAngle(90);
  ltx.DrawLatex(0.05, 0.5, "v_{n }(p_{T})");
  ltx.SetTextAngle(0);
  ltx.SetTextSize(0.05);
  ltx.DrawLatex(0.14, 0.88, Form("%s", "#splitline{Pb-Pb}{2.76 TeV}"));
  ltx.SetTextSize(0.05);
  ltx.DrawLatex(0.13, 0.24, Form("%.2g < |#Delta#eta| < 1.8", minRidgeDEta) ); 
  
  const char* frange = Form("%.2g < fit p_{T}^{a} < %.2g GeV",
  			    ptlow[ipt1], pmax);  
  const char* frange1 = Form("#splitline{solid:}{%.2g < fit p_{T}^{a} < %.2g GeV}",
			    ptlow[ipt1], pthigh[ipt2]);  
  const char* frange2 = Form("#splitline{open:}{%.2g < fit p_{T}^{a} < %.2g GeV}",
			    ptlow[ipt2+1], pthigh[maxpt-1]);  

  if (opt.Contains("split")) {
    ltx.SetTextSize(0.04);
    ltx.DrawLatex(0.31, 0.8, frange1);
    ltx.DrawLatex(0.31, 0.7, frange2);
  }
  else
    ltx.DrawLatex(0.3, 0.27, frange);

  return cv;
}

TCanvas* Drawv2to5(int ncb, int centbins[], int ipt1, int ipt2, TString opt)
{
  if (!opt.IsNull())
    cout<<opt.Data()<<endl;

  initialize();
  int cent1 = centlow[0];
  int cent2 = centhigh[centbins[ncb-1]];
  double pmax = 15.;
  if (ipt2 < 999.)
    pmax = pthigh[ipt2];
  const char* cname = Form("v2to5_etamin%02d_cent%dto%d_fitptbin%dto%d", 
			   (int)(10*minRidgeDEta), cent1, cent2, ipt1, ipt2);
  const char* title = Form("v2to5gf_etamin%02d_cent%dto%d_fitpt%.2gto%.2g", 
			   (int)(10*minRidgeDEta), cent1, cent2, ptlow[ipt1], pmax);
  TCanvas* cv = new TCanvas(cname, title, 1400, 500);
  TLine zero;
  double lv2bottom = 0.58; // 0.5;
  TLegend* lv2 = new TLegend(0.77, lv2bottom, 0.9, 0.95, "Centrality");
  lv2->SetFillColor(kNone);
  lv2->SetBorderSize(0);
  utils.padsetup(cv, 4, 1, "", 0.08, 0.01, 0.03, 0.2);

  for (int n=2; n<=5; n++) {
    Printf("Drawv2to5() n = %d", n);
    cv->cd(n-1);
    double xmin = -0.2;
    double xmax =  7.6;
    TH1F* hf = gPad->DrawFrame(xmin, -0.12, xmax, 0.26); //was y = -0.03, 0.26
    int nXticks = 206;
    int nYticks = 208;
    if (n==2) {
      utils.make_nice_axes(cv, hf, 2., nXticks, nYticks, -0.02, 0.02);
      hf->SetLabelOffset(0.0, "X"); //       hf->SetLabelOffset(-0.01, "X");
    }
    else {
      utils.make_nice_axes(cv, hf, 2.6, nXticks, nYticks, -0.075, 0.0);
      hf->SetLabelOffset(-0.02, "X");
      hf->SetTickLength(0.02, "X");
      hf->SetTickLength(0.05, "Y");
    }
    hf->GetXaxis()->SetTicks("+-");
    hf->GetYaxis()->SetTicks("+-");
    zero.SetLineStyle(kDashed);
    zero.DrawLine(xmin, 0., xmax, 0.);

    for (int cb=0; cb<ncb; cb++) {
      int k = centbins[cb];
      
      TGraphErrors* gc = vnGFvsPt(n, k, ipt1, ipt2);
      TGraphErrors* gs = vnGFvsPt(n, k, ipt1, ipt2, "RIDGE", cfDef, "sys");

      if (!gc) {
	Error("Drawv2to5()", "Problem finding graph");
	continue;
      }

      int pale = gs->GetFillColor(); // it is CentColor(centlow[k], centhigh[k]).
      utils.draw_errorbox(gs, pale);
      //      gs->Draw("e2psame");
      gc->Draw("epsame");
      TGraphErrors* open = (TGraphErrors*) gc->Clone(Form("%s_open", gc->GetName()));
      utils.set_tgraph_props(open, kBlack, kBlack, kOpenCircle, 1.2);
      open->Draw("epsame");

      if (n==2)
	lv2->AddEntry(gc,Form("%d-%d%%",centlow[k],centhigh[k]),"l,p");

    } // cent bin k
  } // Fourier moment n
  
  cv->cd();
  TPad* overlay = new TPad("overlay", "overlay", 0,0,1,1);
  overlay->SetFillStyle(4000); // transparent
  overlay->Draw();
  overlay->cd();
  
  ltx.SetTextSize(0.07);
  lv2->Draw();
  
  for (int n=2; n<=5; n++) {
    cv->cd(n-1);
    ltx.SetTextSize(n==2? 0.1 : 0.15);
    ltx.DrawLatex((n==2)? 0.85 : 0.7, 0.86, Form("v_{%d}", n));
  }
  overlay->cd();
  ltx.SetTextSize(0.075);
  ltx.DrawLatex(0.48, 0.04, "p_{T} [GeV/c]");
  ltx.SetTextAngle(90);
  ltx.DrawLatex(0.02, 0.5, "v_{n }{GF}");
  ltx.SetTextAngle(0);
  ltx.SetTextSize(0.05);
  ltx.DrawLatex(0.33, 0.88, Form("%s", "#splitline{Pb-Pb}{2.76 TeV}"));
  ltx.SetTextSize(0.05);
  ltx.DrawLatex(0.33, 0.75, Form("%.2g < |#Delta#eta| < 1.8", minRidgeDEta) ); 
  
  const char* frange = Form("#splitline{Global fit range}{%.2g < p_{T} < %.2g GeV}", 
			    ptlow[ipt1], pmax);  
  ltx.DrawLatex(0.56, 0.75, frange);
  
  return cv;
}

TCanvas* DrawChi2vsPtTrig(int npta, int ptabins[], int ncb, int centbins[], TString opt)
{
    
  // TODO: options-- global or 1to5, chi2/N or prob
  double a1=ptlow[ptabins[0]], a2=pthigh[ptabins[npta-1]];
  int c1=centlow[centbins[0]], c2=centhigh[centbins[ncb-1]];
  TString cname = Form("chi2_etamin%02d_pta%.2gto%.2g_cent%dto%d",
		       (int)(10*minRidgeDEta), a1, a2, c1, c2 );
  
  if (!opt.IsNull() ) {
    cname.Append("_");
    cname.Append(opt.Data());
  }

  TCanvas* cv = new TCanvas(cname, cname, 1);
  TLegend* lv = new TLegend(0.09, 0.72, 0.27, 0.88); // w.r.t. cv
  lv->SetFillColor(kNone);
  lv->SetBorderSize(0);

  double lv2bottom = 0.62;
  TLegend* lv2 = new TLegend(0.82, lv2bottom, 0.93, 0.95, "Centrality"); // w.r.t. cv
  lv2->SetFillColor(kNone);
  lv2->SetBorderSize(0);
  utils.padsetup(cv, 1, 1, "", 0.12, 0.01, 0.03, 0.2);
  
  double xmin = -0.43;
  double xmax =  12.5;
  TH1F* hf = gPad->DrawFrame(xmin, -0.09, xmax, 26);
  // int nXticks = 210;
  // int nYticks = 210;
  hf->GetXaxis()->SetTicks("+-");
  hf->GetYaxis()->SetTicks("+-");
    
// IN PROGRESS---------------
    for (int j=0; j<npta; j++) {
      for(int k=0; k<ncb; k++) {

	TGraphErrors *gc = CorrFnChi2VsTrigPt(ptabins[j], centbins[k], 1, 5, "ndf");
	if (!gc) {
	  Error("DrawChi2()", "!gc");
	  continue;
	}    
	int col = CentColor(centlow[centbins[k]], centhigh[centbins[k]]);
	utils.set_tgraph_props(gc, col, col, kFullCircle, 1.6);
	gc->Draw("epsame");
	lv2->AddEntry(gc, centLabel(centbins[k]), "l,p");
      }
    }
  
  // cv->cd();
  // TPad* overlay = new TPad("overlay", "overlay", 0,0,1,1);
  // overlay->SetFillStyle(4000); // transparent
  // overlay->Draw();
  // overlay->cd();
  
  // ltx.SetTextSize(0.07);
  // lv2->Draw();
  // overlay->cd();
  // ltx.SetTextSize(0.075);
  // ltx.DrawLatex(0.5, 0.05, "trigger p_{T} [GeV/c]");
  // ltx.SetTextAngle(90);
  // ltx.DrawLatex(0.05, 0.5, "#chi^{2} / NDF");
  // ltx.SetTextAngle(0);

  return cv;
}


TCanvas* DrawAgreement(int icent, TString opt)
{
  // Draw Chi2 on one canvas for each
  // centrality bin k.

  initialize();
  int cent1 = centlow[icent];
  int cent2 = centhigh[icent];

  if (icent==999) {
    cent1 = 0;
    cent2 = 90;
  }
  int k = icent;
  TString cname = Form("agmt_etamin%02d_cent%dto%d_%s", 
		       (int)(10*minRidgeDEta), cent1, cent2, opt.Data());
  if (!opt.IsNull()) {
    cname.Append("_");
    cname.Append(opt.Data());
  }

  TCanvas* cv = new TCanvas(cname.Data(), cname.Data(), 1400, 500);
  TLegend* lv = new TLegend(0.09, 0.72, 0.27, 0.88);
  lv->SetFillColor(kNone);
  lv->SetBorderSize(0);

  double lv2bottom = 0.62;
  TLegend* lv2 = new TLegend(0.82, lv2bottom, 0.93, 0.95, "Centrality");
  lv2->SetFillColor(kNone);
  lv2->SetBorderSize(0);
  cv->Divide(5,1);

  for (int n=1; n<=5; n++) {
    cv->cd(n);

      TH2F *gc = Agreement2DHist(k,n);
      if (!gc) {
	Error("DrawAgreement()", "Problem finding graph" );
	continue;
      }

      //      gc->GetZaxis()->SetRangeUser(1.e-1, 1000);

      gPad->SetLogx(); gPad->SetLogy(); gPad->SetLogz();

      if (opt.Contains("lego")) {
	gc->SetTitleOffset(0.8, "X");
	gc->GetXaxis()->SetLabelSize(0.07);
	gc->GetYaxis()->SetLabelSize(0.07);
	gc->GetZaxis()->SetLabelSize(0.07);
	gc->GetXaxis()->SetTitleSize(0.1);
	gc->GetYaxis()->SetTitleSize(0.1);
	gc->GetZaxis()->SetTitleSize(0.1);
	gc->GetXaxis()->SetNdivisions(8);
	gc->GetYaxis()->SetNdivisions(8);
	
	gPad->SetTopMargin(0.2);
	gPad->SetLeftMargin(0.12);
	gPad->SetRightMargin(0.01);
	gc->Draw("lego2");
      }
      else if (opt.Contains("contour"))
	gc->Draw("colz");

      if (n==1) {
	lv2->AddEntry(gc, Form("%d-%d%%",centlow[k],centhigh[k]),"l,p");
      }
      
  } // Fourier moment n
  
  cv->cd();
  TPad* overlay = new TPad("overlay", "overlay", 0,0,1,1);
  overlay->SetFillStyle(4000); // transparent
  overlay->Draw();
  overlay->cd();
  
  ltx.SetTextSize(0.07);
  const char* str = Form("#left|V_{n#Delta} / (v_{n}^{t} v_{n}^{a})#right|");
  ltx.DrawLatex(0.42, 0.92, str);
  ltx.DrawLatex(0.91, 0.92, Form("%s", centLabel(k)));
  
  for (int n=1; n<=5; n++) {
    cv->cd(n);
    ltx.SetTextSize(0.10);
    ltx.DrawLatex(0.05, 0.76, Form("n = %d", n));
  }
  return cv;
}

void AddPrelimStampToCurrentPad(float x1, float y1, float x2, float y2, TString opt)
{
  TASImage* logo = new TASImage("../commonfigs/alice-prelim.png"); // 287x323
  TPad* logopad = new TPad("logopad", "logo", x1,y1,x2,y2);
  if (opt.Contains("border")) {
    logopad->SetFillColor(kRed);
    logopad->SetBorderSize(2);
  }
  logopad->Draw();  
  logopad->cd(); 
  logo->Draw("");
  return;
}

int CentBin(double cntLo, double cntHi) 
{
  int bin = -123;
  for (int k=0; k<maxcent; k++) {
    if (centlow[k]==cntLo && centhigh[k]==cntHi)
      bin = k;
  }
  if (bin < 0 && 0)
    Warning("CentBin","No bin for %.2g - %.2g", cntLo, cntHi);

  return bin;
}

int PtBin(double ptLo, double ptHi) 
{
  int bin = -123;
  for (int i=0; i<maxpt; i++) {
    if (ptlow[i]==ptLo && pthigh[i]==ptHi)
      bin = i;
  }
  if (bin < 0)
    Warning("PtBin","No bin for %.2g - %.2g", ptLo, ptHi);

  return bin;
}

double MomCorrection(int i, int j, int k)
{
  if(0)cout<<i<<j<<k<<endl;
  // For momentum (non)conservation in v1.
  // Multiplicitave weight: w = w_t*w_a.
  // w_t = ptt - <pt^2>/<pt>
  // w_a = pta - <pt^2>/<pt>

  //  double c = 1./3 * -0.00185;

  //  (ptmean[i]-)* ptmean[j]

  double correction =  1./3 * -0.00185 * ptmean[i]* ptmean[j];
  return correction;
}

void MakeVnDVsQGraphs(int n1, int n2, int k, const char* region, const char* corrtype, TString opt)
{
  // The first two errType constants have points set at the central measured value of
  // VnDelta, with statistical and systematic error bars
  // respectively. The last two have points set at the upper and lower
  // systematic value, with statistical error bars set to be the same
  // as for meas_stat.
  const int nErrTypes = 4;
  enum errType {MEAS_STAT, MEAS_SYS, HI, LO};
  //  const char* errTypeStr[] = {"meas_stat","meas_sys","hi","lo"};
  
  // Fill a huge array with all the coefficients, then use it to set the tgraphs.
  const int nN = gNMax + 1; // 1-10, don't use 0.
  const int nI = maxpt+1;
  const int nJ = maxpt+1;
  const int nT = nErrTypes;
  double vVal[nN][nI][nJ][nT];
  double vErr[nN][nI][nJ][nT];
  double vMix[nN][nI][nJ][nT]; // Just the acceptance correction unc.

  double vSin[nN][nI][nJ][nT]; // <sin n delta phi> for sys. estimation
  double vSinErr[nN][nI][nJ][nT];

  for (int i=0; i<maxpt; i++) {
    for (int j=0; j<=i; j++) {

      double esin  = 0;  // residual sine error
      double ebw   = 0;  // bin width error \propto n / (# dphi bins)
      double ecnt  = 0;  // centrality determination
      double emix  = 0;  // acc. correction error
      double etrk  = 0;  // tracking resolution
      double ev1   = 0;  // v1
      double esys  = 0;  // quadrature sum

      TH1* hst=0, *hsys=0; // stat and sys error, but same points

      hst  = Hist(region, corrtype, i, j, k, "");
      hsys = Hist(region, corrtype, i, j, k, "sys"); 

      if (!hst) Error("MakeVnDVsQGraphs()","!hst");
      if (!hsys) Error("MakeVnDVsQGraphs()","!hsys");

      esin = SineError(i,j,k); // resid_sin / 2;

      for (int n=n1; n<=n2; n++) { // Order of coeff.
	
	// VnDelta on measured points, with statistical errors.
	double val=0, err=0, resid_sin=0, rs_err=0;
	VnDelta(n, *hst,  val, err, "");
	VnDelta(n, *hst,  resid_sin, rs_err, "sin");
	
	// VnDelta on high and low sys values. Stat err. not used.
	double val_hi=0, xxx=0;
	VnDelta(n, *hsys, val_hi, xxx, "hi");
	double val_lo=0, yyy=0;
	VnDelta(n, *hsys, val_lo, yyy, "lo");

	// Momentum conservation correction
	if (n==1 && opt.Contains("ptcons")) { // eqs. 3-7, PRL 106, 102301 (2011)
	  double factor =  ispp ? 0.212 : 0; // 7e-5; <------ trial & error: 7e-5 must be close for 0-20%
	  val    += factor*ptmean[i]*ptmean[j];
	  val_hi += factor*ptmean[i]*ptmean[j];
	  val_lo += factor*ptmean[i]*ptmean[j];
	}

	int nbins = hst->GetNbinsX();
	double mean = (val_hi + val_lo + val) / 3.;
	double ms = 
	  (val_hi-mean)*(val_hi-mean) + 
	  (val_lo-mean)*(val_lo-mean) + 
	  (val   -mean)*(val   -mean);
	double rms = TMath::Sqrt(ms/2); // sqrt(1/(N-1) sum (x_i - <x>)^2 )


	ebw = n/nbins/TMath::Sqrt(12)*val; // This is about 0.008 * n * val
	etrk = 0.01*ptmean[j]*val; // see comments in comparisons/VnDcomparison.C 
	ecnt = 0.01*val;
	emix = rms/2; // take half not to double-count stat err. // 0.25*TMath::Abs(val_hi - val_lo);
	ev1 = (n==1) ? 0.001*ptmean[i]*ptmean[j]*val : 0.;

	esys = TMath::Sqrt(ecnt*ecnt + emix*emix + ebw*ebw + etrk*etrk + ev1*ev1 + esin*esin);
	
	double pointVal = val;
	double pointErr = err;

	vVal[n][i][j][MEAS_STAT] = pointVal;
	vErr[n][i][j][MEAS_STAT] = pointErr;
	vVal[n][i][j][MEAS_SYS] = pointVal;
	vErr[n][i][j][MEAS_SYS] = esys;
	vVal[n][i][j][HI] = pointVal + esys;
	vErr[n][i][j][HI] = pointErr;
	vVal[n][i][j][LO] = pointVal - esys;
	vErr[n][i][j][LO] = pointErr;
	vSin[n][i][j][MEAS_STAT] = resid_sin;
	vSinErr[n][i][j][MEAS_STAT] = rs_err;
	vMix[n][i][j][MEAS_SYS] = emix;

      } // n
    } // j
  } // i

  // Now set the graphs from the arrays.
  for (int n=n1; n<=n2; n++) {
    for (int t=0; t<nErrTypes; t++) {
  
      TString gname = Form("V%dDeltaVsGlobalIndex_cent%dto%d",
			   n,centlow[k],centhigh[k]);
      if (t==HI)
	gname.Append("hi");
      else if (t==LO)
	gname.Append("lo");
      else if (t==MEAS_SYS)
	gname.Append("meas_sys");
      else
	gname.Append("meas_stat");

      if (opt.Contains("sine"))
	gname.Append("_sine");

      if (opt.Contains("ALL"))
	gname.Append("_ALL");
      
      TGraphErrors* g = (TGraphErrors*) gList->FindObject(gname.Data());
      if (!g) {
	g = new TGraphErrors();
	g->SetName(gname.Data());
      }

      TGraphErrors* gmix = 0;
      if (t==MEAS_SYS) {
	gmix = new TGraphErrors();
	gname.Append("_mix");
	gmix->SetName(gname.Data());
      }
      
      double xer = 0.4; // was 0.5
      for (int i=0; i<maxpt; i++) {
	for (int j=0; j<=i; j++) {
	  int q = GlobalIndex(i, j);
	  g->SetPoint(q, q+0.5, vVal[n][i][j][t]);
	  g->SetPointError(q, xer, vErr[n][i][j][t]);

	  if (opt.Contains("sine")) {
	    g->SetPoint(q, q+0.5, vSin[n][i][j][MEAS_STAT]);
	    g->SetPointError(q, xer, vSinErr[n][i][j][MEAS_STAT]);
	  }

	  if (t==MEAS_SYS) {
	    gmix->SetPoint(q, q+0.5, vVal[n][i][j][t]);
	    gmix->SetPointError(q, xer, vMix[n][i][j][t]);
	  }

	}
      }
      
      gList->Add(g);
      if (gmix) gList->Add(gmix);
    }
  }
  
  return;
}

TGraphErrors* VnDVsQ(int n, int k, const char* region, const char* corrtype, TString opt)
{

  // Graph of pair fourier coefficients VnDelta vs. the linear
  // global index q. Arguments:
  // 
  // n, k:   fourier index, centrality bin
  // region: "RIDGE", "NSJET" or "ALL"
  // corrtype:  "s", "m", "cA", "cB"
  //
  // Select opt "hi_sys" or "lo_sys" for hi and low pts
  // with central stat errors and "sys" for the central points
  // with sys. errors. Just like Hist().

  TString gname = Form("V%dDeltaVsGlobalIndex_cent%dto%d",
		       n,centlow[k],centhigh[k]);

  if (opt.Contains("hi"))
    gname.Append("hi");
  else if (opt.Contains("lo"))
    gname.Append("lo");
  else if (opt.Contains("sys"))
    gname.Append("meas_sys");
  else
    gname.Append("meas_stat");

  if (opt.Contains("sine"))
    gname.Append("_sine");

  if (opt.Contains("ALL"))
    gname.Append("_ALL");
  
  TGraphErrors* g = (TGraphErrors*) gList->FindObject(gname.Data()); 
  if (g) {
    if (0)
      Info("VnDVsQ()", "Returning preexisting graph");
    return g;
  }

  TString opt1 = (opt.Contains("sine")) ? "sine" : "";
  if (opt.Contains("ALL"))
    opt1.Append("_ALL");
  if (opt.Contains("ptcons"))
    opt1.Append("_ptcons");

  MakeVnDVsQGraphs(1, gNMax, k, region, corrtype, opt1);
  g = (TGraphErrors*) gList->FindObject(gname.Data()); 
  if (!g) {
    Error("VnDVsQ()", "No graph %s", gname.Data());
    gSystem->Exit(-1);
  }
  return g;
}

double MeanPt(int i, int j, int k, TString t_or_a, TString opt)
{
  // For combined centralities, map k's to the closest available bin
  // 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 };
// OBJ: TProfile2D	hMeanPtTrgCen1	cen=1 (0.5) : 0 at: 0x102af06e0
//  OBJ: TProfile2D	hMeanPtAssCen1	cen=1 (0.5) : 0 at: 0x108308e60
//  OBJ: TProfile2D	hMean2PtTrgCen1	cen=1 (0.5) : 0 at: 0x108309480
//  OBJ: TProfile2D	hMean2PtAssCen1	cen=1 (0.5) : 0 at: 0x108309ad0
//  OBJ: TProfile2D	hMeanPtTrgCen2	cen=2 (1.5) : 0 at: 0x10830a120
//  OBJ: TProfile2D	hMeanPtAssCen2	cen=2 (1.5) : 0 at: 0x10830a770
//  OBJ: TProfile2D	hMean2PtTrgCen2	cen=2 (1.5) : 0 at: 0x10830adc0
//  OBJ: TProfile2D	hMean2PtAssCen2	cen=2 (1.5) : 0 at: 0x10830b410
//  OBJ: TProfile2D	hMeanPtTrgCen3	cen=3 (2.5) : 0 at: 0x10830ba60
//  OBJ: TProfile2D	hMeanPtAssCen3	cen=3 (2.5) : 0 at: 0x10830c0b0
//  OBJ: TProfile2D	hMean2PtTrgCen3	cen=3 (2.5) : 0 at: 0x10830c700
//  OBJ: TProfile2D	hMean2PtAssCen3	cen=3 (2.5) : 0 at: 0x10830cd50
//  OBJ: TProfile2D	hMeanPtTrgCen4	cen=4 (3.5) : 0 at: 0x10830d3a0
//  OBJ: TProfile2D	hMeanPtAssCen4	cen=4 (3.5) : 0 at: 0x10830d9f0
//  OBJ: TProfile2D	hMean2PtTrgCen4	cen=4 (3.5) : 0 at: 0x10830e040
//  OBJ: TProfile2D	hMean2PtAssCen4	cen=4 (3.5) : 0 at: 0x10830e690
//  OBJ: TProfile2D	hMeanPtTrgCen5	cen=5 (4.5) : 0 at: 0x10830ece0
//  OBJ: TProfile2D	hMeanPtAssCen5	cen=5 (4.5) : 0 at: 0x10830f330
//  OBJ: TProfile2D	hMean2PtTrgCen5	cen=5 (4.5) : 0 at: 0x10830f980
//  OBJ: TProfile2D	hMean2PtAssCen5	cen=5 (4.5) : 0 at: 0x10830ffd0
//  OBJ: TProfile2D	hMeanPtTrgCen6	cen=6 (7.5) : 0 at: 0x108310620
//  OBJ: TProfile2D	hMeanPtAssCen6	cen=6 (7.5) : 0 at: 0x108310c70
//  OBJ: TProfile2D	hMean2PtTrgCen6	cen=6 (7.5) : 0 at: 0x1083112c0
//  OBJ: TProfile2D	hMean2PtAssCen6	cen=6 (7.5) : 0 at: 0x108311910
//  OBJ: TProfile2D	hMeanPtTrgCen7	cen=7 (15.0) : 0 at: 0x108311f60
//  OBJ: TProfile2D	hMeanPtAssCen7	cen=7 (15.0) : 0 at: 0x1083125b0
//  OBJ: TProfile2D	hMean2PtTrgCen7	cen=7 (15.0) : 0 at: 0x108312c00
//  OBJ: TProfile2D	hMean2PtAssCen7	cen=7 (15.0) : 0 at: 0x108313250
//  OBJ: TProfile2D	hMeanPtTrgCen8	cen=8 (25.0) : 0 at: 0x1083138a0
//  OBJ: TProfile2D	hMeanPtAssCen8	cen=8 (25.0) : 0 at: 0x108313ef0
//  OBJ: TProfile2D	hMean2PtTrgCen8	cen=8 (25.0) : 0 at: 0x108314540
//  OBJ: TProfile2D	hMean2PtAssCen8	cen=8 (25.0) : 0 at: 0x108314b90
//  OBJ: TProfile2D	hMeanPtTrgCen9	cen=9 (35.0) : 0 at: 0x1083151e0
//  OBJ: TProfile2D	hMeanPtAssCen9	cen=9 (35.0) : 0 at: 0x108315830
//  OBJ: TProfile2D	hMean2PtTrgCen9	cen=9 (35.0) : 0 at: 0x108315e80
//  OBJ: TProfile2D	hMean2PtAssCen9	cen=9 (35.0) : 0 at: 0x1083164d0
//  OBJ: TProfile2D	hMeanPtTrgCen10	cen=10 (45.0) : 0 at: 0x108316b20
//  OBJ: TProfile2D	hMeanPtAssCen10	cen=10 (45.0) : 0 at: 0x108317170
//  OBJ: TProfile2D	hMean2PtTrgCen10	cen=10 (45.0) : 0 at: 0x1083177c0
//  OBJ: TProfile2D	hMean2PtAssCen10	cen=10 (45.0) : 0 at: 0x108317e10
//  OBJ: TProfile2D	hMeanPtTrgCen11	cen=11 (55.0) : 0 at: 0x108318460
//  OBJ: TProfile2D	hMeanPtAssCen11	cen=11 (55.0) : 0 at: 0x108318ab0
//  OBJ: TProfile2D	hMean2PtTrgCen11	cen=11 (55.0) : 0 at: 0x108319100
//  OBJ: TProfile2D	hMean2PtAssCen11	cen=11 (55.0) : 0 at: 0x108319750
//  OBJ: TProfile2D	hMeanPtTrgCen12	cen=12 (75.0) : 0 at: 0x108319da0
//  OBJ: TProfile2D	hMeanPtAssCen12	cen=12 (75.0) : 0 at: 0x10831a3f0
//  OBJ: TProfile2D	hMean2PtTrgCen12	cen=12 (75.0) : 0 at: 0x10831aa40
//  OBJ: TProfile2D	hMean2PtAssCen12	cen=12 (75.0) : 0 at: 0x10831b090

  int k2 = -1;
  if (k == CentBin(0,  1))   k2 = 1;  
  else if (k == CentBin(1,  2))   k2 = 2;  
  else if (k == CentBin(2,  3))   k2 = 3;  
  else if (k == CentBin(3,  4))   k2 = 4;  
  else if (k == CentBin(4,  5))   k2 = 5;  
  else if (k == CentBin(5, 10))   k2 = 6;  
  else if (k == CentBin(10,20))   k2 = 7;  
  else if (k == CentBin(20,30))   k2 = 8;  
  else if (k == CentBin(30,40))   k2 = 9;  
  else if (k == CentBin(40,50))   k2 = 10; 
  else if (k == CentBin(50,60))   k2 = 11; 
  else if (k == CentBin(60,90))   k2 = 12; 
  else if (k == CentBin(0, 10))   k2 = 5;    //CentBin(4, 5);   
  else if (k == CentBin(0, 20))   k2 = 6;    //CentBin(5, 10);  
  else if (k == CentBin(0,  2))   k2 = 1;    //CentBin(0, 1);   
  else if (k == CentBin(2,  5))   k2 = 4;    //CentBin(3, 4);   
  else if (k == CentBin(2, 10))   k2 = 6;    //CentBin(5, 10);  
  else if (k == CentBin(1,  3))   k2 = 2;    //CentBin(1, 2);   
  else if (k == CentBin(3,  5))   k2 = 4;    //CentBin(3, 4);   
  else if (k == CentBin(0,  5))   k2 = 3;    //CentBin(2, 3);   

  else if (k == CentBin(0, 0))   k2 = 1;    //pp
  else {
    Error("MeanPt()", "cent bin %d (%d-%d%%) not assigned", k, centlow[k], centhigh[k]);
  }

  const char* m = opt.Contains("squared") ? "Mean2" : "Mean";

  TString prName_t = Form("h%sPtTrgCen%d", m, k2);
  TString prName_a = Form("h%sPtAssCen%d", m, k2);
  TProfile2D* hmpt_t = (TProfile2D*)fin->Get(prName_t.Data());
  TProfile2D* hmpt_a = (TProfile2D*)fin->Get(prName_a.Data());

  if (!hmpt_t) {
    Error("MeanPt", "Problem finding TProfile %s. Input %d", prName_t.Data(), k);
    gSystem->Exit(-1);
  }
  //  cout << hmpt_t->GetTitle() << " " << centlow[k] << " " << centhigh[k] << endl;

  double mptt = hmpt_t->GetBinContent(i+1, j+1);
  double mpta = hmpt_a->GetBinContent(i+1, j+1);

  if (0) {
    // x axis is trig pt,  y axis assc pt
    TAxis* ax = hmpt_t->GetXaxis();
    TAxis* ay = hmpt_t->GetYaxis();
    Printf("trig %.3g - %.3g, assc: %.3g - %.3g, <pt_t,a> %.3g, %.3g",
	   ax->GetBinLowEdge(i+1), 
	   ax->GetBinUpEdge(i+1), 
	   ay->GetBinLowEdge(j+1), 
	   ay->GetBinUpEdge(j+1),
	   mptt, mpta );
  }

  if (t_or_a.Contains("t"))
    return mptt;
  if (t_or_a.Contains("a"))
    return mpta;
  else
    return -1;
}


int CentColor(double cen1, double cen2) 
{
  if (cen1==0 && cen2==10)
    return kGray+3;
  if (cen1==0 && cen2==20)
    return kMagenta+3;
  if (cen1==0 && cen2==2)
    return kBlack;
  if (cen1==2 && cen2==10)
    return kRed;
  if (cen1==10 && cen2==20)
    return kOrange-3;
  if (cen1==20 && cen2==30)
    return kGreen+1;
  if (cen1==30 && cen2==40)
    return kYellow+2;
  if (cen1==40 && cen2==50)
    return kAzure;
  if (cen1==50 && cen2==60)
    return kBlue-1;
  if (cen1==60 && cen2==90)
    return kViolet;

  return kBlack;
}

int CentColorPale(double cen1, double cen2) 
{
  if (cen1==0 && cen2==10)
    return kGray+1;
  if (cen1==0 && cen2==20)
    return kPink-1; // kPink-6;
  if (cen1==0 && cen2==2)
    return kGray+1;
  if (cen1==2 && cen2==10)
    return kRed-9;
  if (cen1==10 && cen2==20)
    return kOrange-4;
  if (cen1==20 && cen2==30)
    return kGreen-7;
  if (cen1==30 && cen2==40)
    return kYellow-8;
  if (cen1==40 && cen2==50)
    return kAzure-4;
  if (cen1==50 && cen2==60)
    return kBlue-9;
  if (cen1==60 && cen2==90)
    return kViolet-9;

  return kBlack;
}

int PtColor(double p1, double p2)
{
 if (p1==0.25 && p2==0.5)
    return kGray+1;
 if (p1==0.5 && p2==0.75)
    return kYellow+3;
 if (p1==0.75 && p2==1.0)
   return kPink-6;
 if (p1==1.0 && p2==1.5)
   return kBlack;
 if (p1==1.5 && p2==2.0)
   return kRed;
 if (p1==2.0 && p2==2.5)
   return kOrange-3;
 if (p1==2.5 && p2==3)
   return kGreen+2;
 if (p1==3 && p2==4)
   return kBlue;
 if (p1==4 && p2==5)
   return kViolet + 2;
 if (p1==5 && p2==6)
   return kViolet+10;
 if (p1==4 && p2==6)
   return kViolet + 2;
 if (p1==6 && p2==8)
   return kOrange-7;
 if (p1==8 && p2==15)
   return kOrange+9;

 return kBlack; 
}

int PtColorPale(double p1, double p2)
{
 if (p1==0.25 && p2==0.5)
    return kGray;
 if (p1==0.5 && p2==0.75)
    return kYellow+1;
 if (p1==0.75 && p2==1.0)
   return kPink-4;
 if (p1==1.0 && p2==1.5)
   return kGray+1;
 if (p1==1.5 && p2==2.0)
   return kRed-7;
 if (p1==2.0 && p2==2.5)
   return kOrange-4;
 if (p1==2.5 && p2==3)
   return kSpring-4;
 if (p1==3 && p2==4)
   return kAzure+6;
 if (p1==4 && p2==5)
   return kViolet+1;
 if (p1==5 && p2==6)
   return kViolet+8;
 if (p1==4 && p2==6)
   return kViolet+1;
 if (p1==6 && p2==8)
   return kOrange-9;
 if (p1==8 && p2==15)
   return kOrange+6;

 return kGray; 
}

int PtaColor(double p1, double p2)
{
 if (p1==0.25 && p2==0.5)
    return kGray+1;
 if (p1==0.5 && p2==0.75)
   return kBlack;
 if (p1==0.75 && p2==1.0)
   return kRed+1;
 if (p1==1.0 && p2==1.5)
   return kOrange-3;//kBlack;
 if (p1==1.5 && p2==2.0)
   return kGreen+2;//kRed;
 if (p1==2.0 && p2==2.5)
   return kAzure-3;//kOrange-3;
 if (p1==2.5 && p2==3)
   return kViolet + 2;//kBlue;
 if (p1==3 && p2==4)
   return kViolet + 10;//kBlue;
 if (p1==4 && p2==5)
   return kMagenta+3; //kViolet + 2;
 if (p1==5 && p2==6)
   return kViolet;
 if (p1==4 && p2==6)
   return kMagenta-5;
 if (p1==6 && p2==8)
   return kGray+2;
 if (p1==8 && p2==15)
   return kGray+3;

 return kBlack; 
}

int PtaColorPale(double p1, double p2)
{
 if (p1==0.25 && p2==0.5)
    return kGray;
 if (p1==0.5 && p2==0.75)
   return kGray+2;
 if (p1==0.75 && p2==1.0)
   return kPink-2;
 if (p1==1.0 && p2==1.5)
   return kOrange-4;
 if (p1==1.5 && p2==2.0)
   return kGreen-3;
 if (p1==2.0 && p2==2.5)
   return kAzure-4;
 if (p1==2.5 && p2==3)
   return kViolet;
 if (p1==3 && p2==4)
   return kViolet + 2;
 if (p1==4 && p2==5)
   return kMagenta+3;
 if (p1==5 && p2==6)
   return kViolet+10;
 if (p1==4 && p2==6)
   return kMagenta-5;
 if (p1==6 && p2==8)
   return kGray+2;
 if (p1==8 && p2==15)
   return kGray+3;

 return kGray; 
}

void SaveCanvases(TObjArray* canvases, const char* fileName)
{
  TFile* f = new TFile(fileName, "recreate");

  for (int n=0; n<canvases->GetEntries(); n++) {
    TCanvas* c = (TCanvas*)canvases->At(n);
    c->Write(c->GetTitle());
  }
  f->Close();
  return;
}

void SaveCanvasesFromFile(const char* rootFile, const char* targetDir, const char* tag, const char* fileType)
{
  // Get a list of canvases from rootFile into array, then save each
  // to its own file in targetDir/. fileType = "eps", "pdf", "C",
  // "png", etc. Not all formats have been tested.
  gStyle->SetOptTitle(0);
  gStyle->SetOptStat(0);
  TString name = "";
  TString base(targetDir);
  TFile *cFile = new TFile(rootFile, "read");
  cout << cFile->GetName() << endl;
  TObjArray* cList = GetObjectsFromFile(*cFile, "TCanvas");

  for (int n=0; n<cList->GetEntries(); n++) {
    TCanvas* c = (TCanvas*)cList->At(n);
    if (c) {
      name = "";
      name = base;
      name += TString("/");
      name += TString(fileType);
      name += TString("/");
      name += TString(c->GetTitle());
      name += TString(".");
      name += TString(fileType);
      cout<<name.Data()<<endl;

      c->Draw();
      c->Modified();
      c->Update();
      c->SaveAs(name.Data());
    }
    else
      Error("SaveCanvasesFromFile()", "!c");
  }

  if (1) {
    utils.print_pdf(cList, Form("%s/all-figs%s", targetDir, tag), "pdf");
  }
  
  return;
}

//void SaveCanvases(TObjArray* canvases, const char* fileName)
//void SaveCanvasesFromFile(const char* rootFile, const char* targetDir, const char* fileType)
TObjArray* GetObjectsFromFile(TFile& file, TString clname, TString dir)
{
  file.cd(dir.Data());

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

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

  return objList;
}
 FourierPlus.C:1
 FourierPlus.C:2
 FourierPlus.C:3
 FourierPlus.C:4
 FourierPlus.C:5
 FourierPlus.C:6
 FourierPlus.C:7
 FourierPlus.C:8
 FourierPlus.C:9
 FourierPlus.C:10
 FourierPlus.C:11
 FourierPlus.C:12
 FourierPlus.C:13
 FourierPlus.C:14
 FourierPlus.C:15
 FourierPlus.C:16
 FourierPlus.C:17
 FourierPlus.C:18
 FourierPlus.C:19
 FourierPlus.C:20
 FourierPlus.C:21
 FourierPlus.C:22
 FourierPlus.C:23
 FourierPlus.C:24
 FourierPlus.C:25
 FourierPlus.C:26
 FourierPlus.C:27
 FourierPlus.C:28
 FourierPlus.C:29
 FourierPlus.C:30
 FourierPlus.C:31
 FourierPlus.C:32
 FourierPlus.C:33
 FourierPlus.C:34
 FourierPlus.C:35
 FourierPlus.C:36
 FourierPlus.C:37
 FourierPlus.C:38
 FourierPlus.C:39
 FourierPlus.C:40
 FourierPlus.C:41
 FourierPlus.C:42
 FourierPlus.C:43
 FourierPlus.C:44
 FourierPlus.C:45
 FourierPlus.C:46
 FourierPlus.C:47
 FourierPlus.C:48
 FourierPlus.C:49
 FourierPlus.C:50
 FourierPlus.C:51
 FourierPlus.C:52
 FourierPlus.C:53
 FourierPlus.C:54
 FourierPlus.C:55
 FourierPlus.C:56
 FourierPlus.C:57
 FourierPlus.C:58
 FourierPlus.C:59
 FourierPlus.C:60
 FourierPlus.C:61
 FourierPlus.C:62
 FourierPlus.C:63
 FourierPlus.C:64
 FourierPlus.C:65
 FourierPlus.C:66
 FourierPlus.C:67
 FourierPlus.C:68
 FourierPlus.C:69
 FourierPlus.C:70
 FourierPlus.C:71
 FourierPlus.C:72
 FourierPlus.C:73
 FourierPlus.C:74
 FourierPlus.C:75
 FourierPlus.C:76
 FourierPlus.C:77
 FourierPlus.C:78
 FourierPlus.C:79
 FourierPlus.C:80
 FourierPlus.C:81
 FourierPlus.C:82
 FourierPlus.C:83
 FourierPlus.C:84
 FourierPlus.C:85
 FourierPlus.C:86
 FourierPlus.C:87
 FourierPlus.C:88
 FourierPlus.C:89
 FourierPlus.C:90
 FourierPlus.C:91
 FourierPlus.C:92
 FourierPlus.C:93
 FourierPlus.C:94
 FourierPlus.C:95
 FourierPlus.C:96
 FourierPlus.C:97
 FourierPlus.C:98
 FourierPlus.C:99
 FourierPlus.C:100
 FourierPlus.C:101
 FourierPlus.C:102
 FourierPlus.C:103
 FourierPlus.C:104
 FourierPlus.C:105
 FourierPlus.C:106
 FourierPlus.C:107
 FourierPlus.C:108
 FourierPlus.C:109
 FourierPlus.C:110
 FourierPlus.C:111
 FourierPlus.C:112
 FourierPlus.C:113
 FourierPlus.C:114
 FourierPlus.C:115
 FourierPlus.C:116
 FourierPlus.C:117
 FourierPlus.C:118
 FourierPlus.C:119
 FourierPlus.C:120
 FourierPlus.C:121
 FourierPlus.C:122
 FourierPlus.C:123
 FourierPlus.C:124
 FourierPlus.C:125
 FourierPlus.C:126
 FourierPlus.C:127
 FourierPlus.C:128
 FourierPlus.C:129
 FourierPlus.C:130
 FourierPlus.C:131
 FourierPlus.C:132
 FourierPlus.C:133
 FourierPlus.C:134
 FourierPlus.C:135
 FourierPlus.C:136
 FourierPlus.C:137
 FourierPlus.C:138
 FourierPlus.C:139
 FourierPlus.C:140
 FourierPlus.C:141
 FourierPlus.C:142
 FourierPlus.C:143
 FourierPlus.C:144
 FourierPlus.C:145
 FourierPlus.C:146
 FourierPlus.C:147
 FourierPlus.C:148
 FourierPlus.C:149
 FourierPlus.C:150
 FourierPlus.C:151
 FourierPlus.C:152
 FourierPlus.C:153
 FourierPlus.C:154
 FourierPlus.C:155
 FourierPlus.C:156
 FourierPlus.C:157
 FourierPlus.C:158
 FourierPlus.C:159
 FourierPlus.C:160
 FourierPlus.C:161
 FourierPlus.C:162
 FourierPlus.C:163
 FourierPlus.C:164
 FourierPlus.C:165
 FourierPlus.C:166
 FourierPlus.C:167
 FourierPlus.C:168
 FourierPlus.C:169
 FourierPlus.C:170
 FourierPlus.C:171
 FourierPlus.C:172
 FourierPlus.C:173
 FourierPlus.C:174
 FourierPlus.C:175
 FourierPlus.C:176
 FourierPlus.C:177
 FourierPlus.C:178
 FourierPlus.C:179
 FourierPlus.C:180
 FourierPlus.C:181
 FourierPlus.C:182
 FourierPlus.C:183
 FourierPlus.C:184
 FourierPlus.C:185
 FourierPlus.C:186
 FourierPlus.C:187
 FourierPlus.C:188
 FourierPlus.C:189
 FourierPlus.C:190
 FourierPlus.C:191
 FourierPlus.C:192
 FourierPlus.C:193
 FourierPlus.C:194
 FourierPlus.C:195
 FourierPlus.C:196
 FourierPlus.C:197
 FourierPlus.C:198
 FourierPlus.C:199
 FourierPlus.C:200
 FourierPlus.C:201
 FourierPlus.C:202
 FourierPlus.C:203
 FourierPlus.C:204
 FourierPlus.C:205
 FourierPlus.C:206
 FourierPlus.C:207
 FourierPlus.C:208
 FourierPlus.C:209
 FourierPlus.C:210
 FourierPlus.C:211
 FourierPlus.C:212
 FourierPlus.C:213
 FourierPlus.C:214
 FourierPlus.C:215
 FourierPlus.C:216
 FourierPlus.C:217
 FourierPlus.C:218
 FourierPlus.C:219
 FourierPlus.C:220
 FourierPlus.C:221
 FourierPlus.C:222
 FourierPlus.C:223
 FourierPlus.C:224
 FourierPlus.C:225
 FourierPlus.C:226
 FourierPlus.C:227
 FourierPlus.C:228
 FourierPlus.C:229
 FourierPlus.C:230
 FourierPlus.C:231
 FourierPlus.C:232
 FourierPlus.C:233
 FourierPlus.C:234
 FourierPlus.C:235
 FourierPlus.C:236
 FourierPlus.C:237
 FourierPlus.C:238
 FourierPlus.C:239
 FourierPlus.C:240
 FourierPlus.C:241
 FourierPlus.C:242
 FourierPlus.C:243
 FourierPlus.C:244
 FourierPlus.C:245
 FourierPlus.C:246
 FourierPlus.C:247
 FourierPlus.C:248
 FourierPlus.C:249
 FourierPlus.C:250
 FourierPlus.C:251
 FourierPlus.C:252
 FourierPlus.C:253
 FourierPlus.C:254
 FourierPlus.C:255
 FourierPlus.C:256
 FourierPlus.C:257
 FourierPlus.C:258
 FourierPlus.C:259
 FourierPlus.C:260
 FourierPlus.C:261
 FourierPlus.C:262
 FourierPlus.C:263
 FourierPlus.C:264
 FourierPlus.C:265
 FourierPlus.C:266
 FourierPlus.C:267
 FourierPlus.C:268
 FourierPlus.C:269
 FourierPlus.C:270
 FourierPlus.C:271
 FourierPlus.C:272
 FourierPlus.C:273
 FourierPlus.C:274
 FourierPlus.C:275
 FourierPlus.C:276
 FourierPlus.C:277
 FourierPlus.C:278
 FourierPlus.C:279
 FourierPlus.C:280
 FourierPlus.C:281
 FourierPlus.C:282
 FourierPlus.C:283
 FourierPlus.C:284
 FourierPlus.C:285
 FourierPlus.C:286
 FourierPlus.C:287
 FourierPlus.C:288
 FourierPlus.C:289
 FourierPlus.C:290
 FourierPlus.C:291
 FourierPlus.C:292
 FourierPlus.C:293
 FourierPlus.C:294
 FourierPlus.C:295
 FourierPlus.C:296
 FourierPlus.C:297
 FourierPlus.C:298
 FourierPlus.C:299
 FourierPlus.C:300
 FourierPlus.C:301
 FourierPlus.C:302
 FourierPlus.C:303
 FourierPlus.C:304
 FourierPlus.C:305
 FourierPlus.C:306
 FourierPlus.C:307
 FourierPlus.C:308
 FourierPlus.C:309
 FourierPlus.C:310
 FourierPlus.C:311
 FourierPlus.C:312
 FourierPlus.C:313
 FourierPlus.C:314
 FourierPlus.C:315
 FourierPlus.C:316
 FourierPlus.C:317
 FourierPlus.C:318
 FourierPlus.C:319
 FourierPlus.C:320
 FourierPlus.C:321
 FourierPlus.C:322
 FourierPlus.C:323
 FourierPlus.C:324
 FourierPlus.C:325
 FourierPlus.C:326
 FourierPlus.C:327
 FourierPlus.C:328
 FourierPlus.C:329
 FourierPlus.C:330
 FourierPlus.C:331
 FourierPlus.C:332
 FourierPlus.C:333
 FourierPlus.C:334
 FourierPlus.C:335
 FourierPlus.C:336
 FourierPlus.C:337
 FourierPlus.C:338
 FourierPlus.C:339
 FourierPlus.C:340
 FourierPlus.C:341
 FourierPlus.C:342
 FourierPlus.C:343
 FourierPlus.C:344
 FourierPlus.C:345
 FourierPlus.C:346
 FourierPlus.C:347
 FourierPlus.C:348
 FourierPlus.C:349
 FourierPlus.C:350
 FourierPlus.C:351
 FourierPlus.C:352
 FourierPlus.C:353
 FourierPlus.C:354
 FourierPlus.C:355
 FourierPlus.C:356
 FourierPlus.C:357
 FourierPlus.C:358
 FourierPlus.C:359
 FourierPlus.C:360
 FourierPlus.C:361
 FourierPlus.C:362
 FourierPlus.C:363
 FourierPlus.C:364
 FourierPlus.C:365
 FourierPlus.C:366
 FourierPlus.C:367
 FourierPlus.C:368
 FourierPlus.C:369
 FourierPlus.C:370
 FourierPlus.C:371
 FourierPlus.C:372
 FourierPlus.C:373
 FourierPlus.C:374
 FourierPlus.C:375
 FourierPlus.C:376
 FourierPlus.C:377
 FourierPlus.C:378
 FourierPlus.C:379
 FourierPlus.C:380
 FourierPlus.C:381
 FourierPlus.C:382
 FourierPlus.C:383
 FourierPlus.C:384
 FourierPlus.C:385
 FourierPlus.C:386
 FourierPlus.C:387
 FourierPlus.C:388
 FourierPlus.C:389
 FourierPlus.C:390
 FourierPlus.C:391
 FourierPlus.C:392
 FourierPlus.C:393
 FourierPlus.C:394
 FourierPlus.C:395
 FourierPlus.C:396
 FourierPlus.C:397
 FourierPlus.C:398
 FourierPlus.C:399
 FourierPlus.C:400
 FourierPlus.C:401
 FourierPlus.C:402
 FourierPlus.C:403
 FourierPlus.C:404
 FourierPlus.C:405
 FourierPlus.C:406
 FourierPlus.C:407
 FourierPlus.C:408
 FourierPlus.C:409
 FourierPlus.C:410
 FourierPlus.C:411
 FourierPlus.C:412
 FourierPlus.C:413
 FourierPlus.C:414
 FourierPlus.C:415
 FourierPlus.C:416
 FourierPlus.C:417
 FourierPlus.C:418
 FourierPlus.C:419
 FourierPlus.C:420
 FourierPlus.C:421
 FourierPlus.C:422
 FourierPlus.C:423
 FourierPlus.C:424
 FourierPlus.C:425
 FourierPlus.C:426
 FourierPlus.C:427
 FourierPlus.C:428
 FourierPlus.C:429
 FourierPlus.C:430
 FourierPlus.C:431
 FourierPlus.C:432
 FourierPlus.C:433
 FourierPlus.C:434
 FourierPlus.C:435
 FourierPlus.C:436
 FourierPlus.C:437
 FourierPlus.C:438
 FourierPlus.C:439
 FourierPlus.C:440
 FourierPlus.C:441
 FourierPlus.C:442
 FourierPlus.C:443
 FourierPlus.C:444
 FourierPlus.C:445
 FourierPlus.C:446
 FourierPlus.C:447
 FourierPlus.C:448
 FourierPlus.C:449
 FourierPlus.C:450
 FourierPlus.C:451
 FourierPlus.C:452
 FourierPlus.C:453
 FourierPlus.C:454
 FourierPlus.C:455
 FourierPlus.C:456
 FourierPlus.C:457
 FourierPlus.C:458
 FourierPlus.C:459
 FourierPlus.C:460
 FourierPlus.C:461
 FourierPlus.C:462
 FourierPlus.C:463
 FourierPlus.C:464
 FourierPlus.C:465
 FourierPlus.C:466
 FourierPlus.C:467
 FourierPlus.C:468
 FourierPlus.C:469
 FourierPlus.C:470
 FourierPlus.C:471
 FourierPlus.C:472
 FourierPlus.C:473
 FourierPlus.C:474
 FourierPlus.C:475
 FourierPlus.C:476
 FourierPlus.C:477
 FourierPlus.C:478
 FourierPlus.C:479
 FourierPlus.C:480
 FourierPlus.C:481
 FourierPlus.C:482
 FourierPlus.C:483
 FourierPlus.C:484
 FourierPlus.C:485
 FourierPlus.C:486
 FourierPlus.C:487
 FourierPlus.C:488
 FourierPlus.C:489
 FourierPlus.C:490
 FourierPlus.C:491
 FourierPlus.C:492
 FourierPlus.C:493
 FourierPlus.C:494
 FourierPlus.C:495
 FourierPlus.C:496
 FourierPlus.C:497
 FourierPlus.C:498
 FourierPlus.C:499
 FourierPlus.C:500
 FourierPlus.C:501
 FourierPlus.C:502
 FourierPlus.C:503
 FourierPlus.C:504
 FourierPlus.C:505
 FourierPlus.C:506
 FourierPlus.C:507
 FourierPlus.C:508
 FourierPlus.C:509
 FourierPlus.C:510
 FourierPlus.C:511
 FourierPlus.C:512
 FourierPlus.C:513
 FourierPlus.C:514
 FourierPlus.C:515
 FourierPlus.C:516
 FourierPlus.C:517
 FourierPlus.C:518
 FourierPlus.C:519
 FourierPlus.C:520
 FourierPlus.C:521
 FourierPlus.C:522
 FourierPlus.C:523
 FourierPlus.C:524
 FourierPlus.C:525
 FourierPlus.C:526
 FourierPlus.C:527
 FourierPlus.C:528
 FourierPlus.C:529
 FourierPlus.C:530
 FourierPlus.C:531
 FourierPlus.C:532
 FourierPlus.C:533
 FourierPlus.C:534
 FourierPlus.C:535
 FourierPlus.C:536
 FourierPlus.C:537
 FourierPlus.C:538
 FourierPlus.C:539
 FourierPlus.C:540
 FourierPlus.C:541
 FourierPlus.C:542
 FourierPlus.C:543
 FourierPlus.C:544
 FourierPlus.C:545
 FourierPlus.C:546
 FourierPlus.C:547
 FourierPlus.C:548
 FourierPlus.C:549
 FourierPlus.C:550
 FourierPlus.C:551
 FourierPlus.C:552
 FourierPlus.C:553
 FourierPlus.C:554
 FourierPlus.C:555
 FourierPlus.C:556
 FourierPlus.C:557
 FourierPlus.C:558
 FourierPlus.C:559
 FourierPlus.C:560
 FourierPlus.C:561
 FourierPlus.C:562
 FourierPlus.C:563
 FourierPlus.C:564
 FourierPlus.C:565
 FourierPlus.C:566
 FourierPlus.C:567
 FourierPlus.C:568
 FourierPlus.C:569
 FourierPlus.C:570
 FourierPlus.C:571
 FourierPlus.C:572
 FourierPlus.C:573
 FourierPlus.C:574
 FourierPlus.C:575
 FourierPlus.C:576
 FourierPlus.C:577
 FourierPlus.C:578
 FourierPlus.C:579
 FourierPlus.C:580
 FourierPlus.C:581
 FourierPlus.C:582
 FourierPlus.C:583
 FourierPlus.C:584
 FourierPlus.C:585
 FourierPlus.C:586
 FourierPlus.C:587
 FourierPlus.C:588
 FourierPlus.C:589
 FourierPlus.C:590
 FourierPlus.C:591
 FourierPlus.C:592
 FourierPlus.C:593
 FourierPlus.C:594
 FourierPlus.C:595
 FourierPlus.C:596
 FourierPlus.C:597
 FourierPlus.C:598
 FourierPlus.C:599
 FourierPlus.C:600
 FourierPlus.C:601
 FourierPlus.C:602
 FourierPlus.C:603
 FourierPlus.C:604
 FourierPlus.C:605
 FourierPlus.C:606
 FourierPlus.C:607
 FourierPlus.C:608
 FourierPlus.C:609
 FourierPlus.C:610
 FourierPlus.C:611
 FourierPlus.C:612
 FourierPlus.C:613
 FourierPlus.C:614
 FourierPlus.C:615
 FourierPlus.C:616
 FourierPlus.C:617
 FourierPlus.C:618
 FourierPlus.C:619
 FourierPlus.C:620
 FourierPlus.C:621
 FourierPlus.C:622
 FourierPlus.C:623
 FourierPlus.C:624
 FourierPlus.C:625
 FourierPlus.C:626
 FourierPlus.C:627
 FourierPlus.C:628
 FourierPlus.C:629
 FourierPlus.C:630
 FourierPlus.C:631
 FourierPlus.C:632
 FourierPlus.C:633
 FourierPlus.C:634
 FourierPlus.C:635
 FourierPlus.C:636
 FourierPlus.C:637
 FourierPlus.C:638
 FourierPlus.C:639
 FourierPlus.C:640
 FourierPlus.C:641
 FourierPlus.C:642
 FourierPlus.C:643
 FourierPlus.C:644
 FourierPlus.C:645
 FourierPlus.C:646
 FourierPlus.C:647
 FourierPlus.C:648
 FourierPlus.C:649
 FourierPlus.C:650
 FourierPlus.C:651
 FourierPlus.C:652
 FourierPlus.C:653
 FourierPlus.C:654
 FourierPlus.C:655
 FourierPlus.C:656
 FourierPlus.C:657
 FourierPlus.C:658
 FourierPlus.C:659
 FourierPlus.C:660
 FourierPlus.C:661
 FourierPlus.C:662
 FourierPlus.C:663
 FourierPlus.C:664
 FourierPlus.C:665
 FourierPlus.C:666
 FourierPlus.C:667
 FourierPlus.C:668
 FourierPlus.C:669
 FourierPlus.C:670
 FourierPlus.C:671
 FourierPlus.C:672
 FourierPlus.C:673
 FourierPlus.C:674
 FourierPlus.C:675
 FourierPlus.C:676
 FourierPlus.C:677
 FourierPlus.C:678
 FourierPlus.C:679
 FourierPlus.C:680
 FourierPlus.C:681
 FourierPlus.C:682
 FourierPlus.C:683
 FourierPlus.C:684
 FourierPlus.C:685
 FourierPlus.C:686
 FourierPlus.C:687
 FourierPlus.C:688
 FourierPlus.C:689
 FourierPlus.C:690
 FourierPlus.C:691
 FourierPlus.C:692
 FourierPlus.C:693
 FourierPlus.C:694
 FourierPlus.C:695
 FourierPlus.C:696
 FourierPlus.C:697
 FourierPlus.C:698
 FourierPlus.C:699
 FourierPlus.C:700
 FourierPlus.C:701
 FourierPlus.C:702
 FourierPlus.C:703
 FourierPlus.C:704
 FourierPlus.C:705
 FourierPlus.C:706
 FourierPlus.C:707
 FourierPlus.C:708
 FourierPlus.C:709
 FourierPlus.C:710
 FourierPlus.C:711
 FourierPlus.C:712
 FourierPlus.C:713
 FourierPlus.C:714
 FourierPlus.C:715
 FourierPlus.C:716
 FourierPlus.C:717
 FourierPlus.C:718
 FourierPlus.C:719
 FourierPlus.C:720
 FourierPlus.C:721
 FourierPlus.C:722
 FourierPlus.C:723
 FourierPlus.C:724
 FourierPlus.C:725
 FourierPlus.C:726
 FourierPlus.C:727
 FourierPlus.C:728
 FourierPlus.C:729
 FourierPlus.C:730
 FourierPlus.C:731
 FourierPlus.C:732
 FourierPlus.C:733
 FourierPlus.C:734
 FourierPlus.C:735
 FourierPlus.C:736
 FourierPlus.C:737
 FourierPlus.C:738
 FourierPlus.C:739
 FourierPlus.C:740
 FourierPlus.C:741
 FourierPlus.C:742
 FourierPlus.C:743
 FourierPlus.C:744
 FourierPlus.C:745
 FourierPlus.C:746
 FourierPlus.C:747
 FourierPlus.C:748
 FourierPlus.C:749
 FourierPlus.C:750
 FourierPlus.C:751
 FourierPlus.C:752
 FourierPlus.C:753
 FourierPlus.C:754
 FourierPlus.C:755
 FourierPlus.C:756
 FourierPlus.C:757
 FourierPlus.C:758
 FourierPlus.C:759
 FourierPlus.C:760
 FourierPlus.C:761
 FourierPlus.C:762
 FourierPlus.C:763
 FourierPlus.C:764
 FourierPlus.C:765
 FourierPlus.C:766
 FourierPlus.C:767
 FourierPlus.C:768
 FourierPlus.C:769
 FourierPlus.C:770
 FourierPlus.C:771
 FourierPlus.C:772
 FourierPlus.C:773
 FourierPlus.C:774
 FourierPlus.C:775
 FourierPlus.C:776
 FourierPlus.C:777
 FourierPlus.C:778
 FourierPlus.C:779
 FourierPlus.C:780
 FourierPlus.C:781
 FourierPlus.C:782
 FourierPlus.C:783
 FourierPlus.C:784
 FourierPlus.C:785
 FourierPlus.C:786
 FourierPlus.C:787
 FourierPlus.C:788
 FourierPlus.C:789
 FourierPlus.C:790
 FourierPlus.C:791
 FourierPlus.C:792
 FourierPlus.C:793
 FourierPlus.C:794
 FourierPlus.C:795
 FourierPlus.C:796
 FourierPlus.C:797
 FourierPlus.C:798
 FourierPlus.C:799
 FourierPlus.C:800
 FourierPlus.C:801
 FourierPlus.C:802
 FourierPlus.C:803
 FourierPlus.C:804
 FourierPlus.C:805
 FourierPlus.C:806
 FourierPlus.C:807
 FourierPlus.C:808
 FourierPlus.C:809
 FourierPlus.C:810
 FourierPlus.C:811
 FourierPlus.C:812
 FourierPlus.C:813
 FourierPlus.C:814
 FourierPlus.C:815
 FourierPlus.C:816
 FourierPlus.C:817
 FourierPlus.C:818
 FourierPlus.C:819
 FourierPlus.C:820
 FourierPlus.C:821
 FourierPlus.C:822
 FourierPlus.C:823
 FourierPlus.C:824
 FourierPlus.C:825
 FourierPlus.C:826
 FourierPlus.C:827
 FourierPlus.C:828
 FourierPlus.C:829
 FourierPlus.C:830
 FourierPlus.C:831
 FourierPlus.C:832
 FourierPlus.C:833
 FourierPlus.C:834
 FourierPlus.C:835
 FourierPlus.C:836
 FourierPlus.C:837
 FourierPlus.C:838
 FourierPlus.C:839
 FourierPlus.C:840
 FourierPlus.C:841
 FourierPlus.C:842
 FourierPlus.C:843
 FourierPlus.C:844
 FourierPlus.C:845
 FourierPlus.C:846
 FourierPlus.C:847
 FourierPlus.C:848
 FourierPlus.C:849
 FourierPlus.C:850
 FourierPlus.C:851
 FourierPlus.C:852
 FourierPlus.C:853
 FourierPlus.C:854
 FourierPlus.C:855
 FourierPlus.C:856
 FourierPlus.C:857
 FourierPlus.C:858
 FourierPlus.C:859
 FourierPlus.C:860
 FourierPlus.C:861
 FourierPlus.C:862
 FourierPlus.C:863
 FourierPlus.C:864
 FourierPlus.C:865
 FourierPlus.C:866
 FourierPlus.C:867
 FourierPlus.C:868
 FourierPlus.C:869
 FourierPlus.C:870
 FourierPlus.C:871
 FourierPlus.C:872
 FourierPlus.C:873
 FourierPlus.C:874
 FourierPlus.C:875
 FourierPlus.C:876
 FourierPlus.C:877
 FourierPlus.C:878
 FourierPlus.C:879
 FourierPlus.C:880
 FourierPlus.C:881
 FourierPlus.C:882
 FourierPlus.C:883
 FourierPlus.C:884
 FourierPlus.C:885
 FourierPlus.C:886
 FourierPlus.C:887
 FourierPlus.C:888
 FourierPlus.C:889
 FourierPlus.C:890
 FourierPlus.C:891
 FourierPlus.C:892
 FourierPlus.C:893
 FourierPlus.C:894
 FourierPlus.C:895
 FourierPlus.C:896
 FourierPlus.C:897
 FourierPlus.C:898
 FourierPlus.C:899
 FourierPlus.C:900
 FourierPlus.C:901
 FourierPlus.C:902
 FourierPlus.C:903
 FourierPlus.C:904
 FourierPlus.C:905
 FourierPlus.C:906
 FourierPlus.C:907
 FourierPlus.C:908
 FourierPlus.C:909
 FourierPlus.C:910
 FourierPlus.C:911
 FourierPlus.C:912
 FourierPlus.C:913
 FourierPlus.C:914
 FourierPlus.C:915
 FourierPlus.C:916
 FourierPlus.C:917
 FourierPlus.C:918
 FourierPlus.C:919
 FourierPlus.C:920
 FourierPlus.C:921
 FourierPlus.C:922
 FourierPlus.C:923
 FourierPlus.C:924
 FourierPlus.C:925
 FourierPlus.C:926
 FourierPlus.C:927
 FourierPlus.C:928
 FourierPlus.C:929
 FourierPlus.C:930
 FourierPlus.C:931
 FourierPlus.C:932
 FourierPlus.C:933
 FourierPlus.C:934
 FourierPlus.C:935
 FourierPlus.C:936
 FourierPlus.C:937
 FourierPlus.C:938
 FourierPlus.C:939
 FourierPlus.C:940
 FourierPlus.C:941
 FourierPlus.C:942
 FourierPlus.C:943
 FourierPlus.C:944
 FourierPlus.C:945
 FourierPlus.C:946
 FourierPlus.C:947
 FourierPlus.C:948
 FourierPlus.C:949
 FourierPlus.C:950
 FourierPlus.C:951
 FourierPlus.C:952
 FourierPlus.C:953
 FourierPlus.C:954
 FourierPlus.C:955
 FourierPlus.C:956
 FourierPlus.C:957
 FourierPlus.C:958
 FourierPlus.C:959
 FourierPlus.C:960
 FourierPlus.C:961
 FourierPlus.C:962
 FourierPlus.C:963
 FourierPlus.C:964
 FourierPlus.C:965
 FourierPlus.C:966
 FourierPlus.C:967
 FourierPlus.C:968
 FourierPlus.C:969
 FourierPlus.C:970
 FourierPlus.C:971
 FourierPlus.C:972
 FourierPlus.C:973
 FourierPlus.C:974
 FourierPlus.C:975
 FourierPlus.C:976
 FourierPlus.C:977
 FourierPlus.C:978
 FourierPlus.C:979
 FourierPlus.C:980
 FourierPlus.C:981
 FourierPlus.C:982
 FourierPlus.C:983
 FourierPlus.C:984
 FourierPlus.C:985
 FourierPlus.C:986
 FourierPlus.C:987
 FourierPlus.C:988
 FourierPlus.C:989
 FourierPlus.C:990
 FourierPlus.C:991
 FourierPlus.C:992
 FourierPlus.C:993
 FourierPlus.C:994
 FourierPlus.C:995
 FourierPlus.C:996
 FourierPlus.C:997
 FourierPlus.C:998
 FourierPlus.C:999
 FourierPlus.C:1000
 FourierPlus.C:1001
 FourierPlus.C:1002
 FourierPlus.C:1003
 FourierPlus.C:1004
 FourierPlus.C:1005
 FourierPlus.C:1006
 FourierPlus.C:1007
 FourierPlus.C:1008
 FourierPlus.C:1009
 FourierPlus.C:1010
 FourierPlus.C:1011
 FourierPlus.C:1012
 FourierPlus.C:1013
 FourierPlus.C:1014
 FourierPlus.C:1015
 FourierPlus.C:1016
 FourierPlus.C:1017
 FourierPlus.C:1018
 FourierPlus.C:1019
 FourierPlus.C:1020
 FourierPlus.C:1021
 FourierPlus.C:1022
 FourierPlus.C:1023
 FourierPlus.C:1024
 FourierPlus.C:1025
 FourierPlus.C:1026
 FourierPlus.C:1027
 FourierPlus.C:1028
 FourierPlus.C:1029
 FourierPlus.C:1030
 FourierPlus.C:1031
 FourierPlus.C:1032
 FourierPlus.C:1033
 FourierPlus.C:1034
 FourierPlus.C:1035
 FourierPlus.C:1036
 FourierPlus.C:1037
 FourierPlus.C:1038
 FourierPlus.C:1039
 FourierPlus.C:1040
 FourierPlus.C:1041
 FourierPlus.C:1042
 FourierPlus.C:1043
 FourierPlus.C:1044
 FourierPlus.C:1045
 FourierPlus.C:1046
 FourierPlus.C:1047
 FourierPlus.C:1048
 FourierPlus.C:1049
 FourierPlus.C:1050
 FourierPlus.C:1051
 FourierPlus.C:1052
 FourierPlus.C:1053
 FourierPlus.C:1054
 FourierPlus.C:1055
 FourierPlus.C:1056
 FourierPlus.C:1057
 FourierPlus.C:1058
 FourierPlus.C:1059
 FourierPlus.C:1060
 FourierPlus.C:1061
 FourierPlus.C:1062
 FourierPlus.C:1063
 FourierPlus.C:1064
 FourierPlus.C:1065
 FourierPlus.C:1066
 FourierPlus.C:1067
 FourierPlus.C:1068
 FourierPlus.C:1069
 FourierPlus.C:1070
 FourierPlus.C:1071
 FourierPlus.C:1072
 FourierPlus.C:1073
 FourierPlus.C:1074
 FourierPlus.C:1075
 FourierPlus.C:1076
 FourierPlus.C:1077
 FourierPlus.C:1078
 FourierPlus.C:1079
 FourierPlus.C:1080
 FourierPlus.C:1081
 FourierPlus.C:1082
 FourierPlus.C:1083
 FourierPlus.C:1084
 FourierPlus.C:1085
 FourierPlus.C:1086
 FourierPlus.C:1087
 FourierPlus.C:1088
 FourierPlus.C:1089
 FourierPlus.C:1090
 FourierPlus.C:1091
 FourierPlus.C:1092
 FourierPlus.C:1093
 FourierPlus.C:1094
 FourierPlus.C:1095
 FourierPlus.C:1096
 FourierPlus.C:1097
 FourierPlus.C:1098
 FourierPlus.C:1099
 FourierPlus.C:1100
 FourierPlus.C:1101
 FourierPlus.C:1102
 FourierPlus.C:1103
 FourierPlus.C:1104
 FourierPlus.C:1105
 FourierPlus.C:1106
 FourierPlus.C:1107
 FourierPlus.C:1108
 FourierPlus.C:1109
 FourierPlus.C:1110
 FourierPlus.C:1111
 FourierPlus.C:1112
 FourierPlus.C:1113
 FourierPlus.C:1114
 FourierPlus.C:1115
 FourierPlus.C:1116
 FourierPlus.C:1117
 FourierPlus.C:1118
 FourierPlus.C:1119
 FourierPlus.C:1120
 FourierPlus.C:1121
 FourierPlus.C:1122
 FourierPlus.C:1123
 FourierPlus.C:1124
 FourierPlus.C:1125
 FourierPlus.C:1126
 FourierPlus.C:1127
 FourierPlus.C:1128
 FourierPlus.C:1129
 FourierPlus.C:1130
 FourierPlus.C:1131
 FourierPlus.C:1132
 FourierPlus.C:1133
 FourierPlus.C:1134
 FourierPlus.C:1135
 FourierPlus.C:1136
 FourierPlus.C:1137
 FourierPlus.C:1138
 FourierPlus.C:1139
 FourierPlus.C:1140
 FourierPlus.C:1141
 FourierPlus.C:1142
 FourierPlus.C:1143
 FourierPlus.C:1144
 FourierPlus.C:1145
 FourierPlus.C:1146
 FourierPlus.C:1147
 FourierPlus.C:1148
 FourierPlus.C:1149
 FourierPlus.C:1150
 FourierPlus.C:1151
 FourierPlus.C:1152
 FourierPlus.C:1153
 FourierPlus.C:1154
 FourierPlus.C:1155
 FourierPlus.C:1156
 FourierPlus.C:1157
 FourierPlus.C:1158
 FourierPlus.C:1159
 FourierPlus.C:1160
 FourierPlus.C:1161
 FourierPlus.C:1162
 FourierPlus.C:1163
 FourierPlus.C:1164
 FourierPlus.C:1165
 FourierPlus.C:1166
 FourierPlus.C:1167
 FourierPlus.C:1168
 FourierPlus.C:1169
 FourierPlus.C:1170
 FourierPlus.C:1171
 FourierPlus.C:1172
 FourierPlus.C:1173
 FourierPlus.C:1174
 FourierPlus.C:1175
 FourierPlus.C:1176
 FourierPlus.C:1177
 FourierPlus.C:1178
 FourierPlus.C:1179
 FourierPlus.C:1180
 FourierPlus.C:1181
 FourierPlus.C:1182
 FourierPlus.C:1183
 FourierPlus.C:1184
 FourierPlus.C:1185
 FourierPlus.C:1186
 FourierPlus.C:1187
 FourierPlus.C:1188
 FourierPlus.C:1189
 FourierPlus.C:1190
 FourierPlus.C:1191
 FourierPlus.C:1192
 FourierPlus.C:1193
 FourierPlus.C:1194
 FourierPlus.C:1195
 FourierPlus.C:1196
 FourierPlus.C:1197
 FourierPlus.C:1198
 FourierPlus.C:1199
 FourierPlus.C:1200
 FourierPlus.C:1201
 FourierPlus.C:1202
 FourierPlus.C:1203
 FourierPlus.C:1204
 FourierPlus.C:1205
 FourierPlus.C:1206
 FourierPlus.C:1207
 FourierPlus.C:1208
 FourierPlus.C:1209
 FourierPlus.C:1210
 FourierPlus.C:1211
 FourierPlus.C:1212
 FourierPlus.C:1213
 FourierPlus.C:1214
 FourierPlus.C:1215
 FourierPlus.C:1216
 FourierPlus.C:1217
 FourierPlus.C:1218
 FourierPlus.C:1219
 FourierPlus.C:1220
 FourierPlus.C:1221
 FourierPlus.C:1222
 FourierPlus.C:1223
 FourierPlus.C:1224
 FourierPlus.C:1225
 FourierPlus.C:1226
 FourierPlus.C:1227
 FourierPlus.C:1228
 FourierPlus.C:1229
 FourierPlus.C:1230
 FourierPlus.C:1231
 FourierPlus.C:1232
 FourierPlus.C:1233
 FourierPlus.C:1234
 FourierPlus.C:1235
 FourierPlus.C:1236
 FourierPlus.C:1237
 FourierPlus.C:1238
 FourierPlus.C:1239
 FourierPlus.C:1240
 FourierPlus.C:1241
 FourierPlus.C:1242
 FourierPlus.C:1243
 FourierPlus.C:1244
 FourierPlus.C:1245
 FourierPlus.C:1246
 FourierPlus.C:1247
 FourierPlus.C:1248
 FourierPlus.C:1249
 FourierPlus.C:1250
 FourierPlus.C:1251
 FourierPlus.C:1252
 FourierPlus.C:1253
 FourierPlus.C:1254
 FourierPlus.C:1255
 FourierPlus.C:1256
 FourierPlus.C:1257
 FourierPlus.C:1258
 FourierPlus.C:1259
 FourierPlus.C:1260
 FourierPlus.C:1261
 FourierPlus.C:1262
 FourierPlus.C:1263
 FourierPlus.C:1264
 FourierPlus.C:1265
 FourierPlus.C:1266
 FourierPlus.C:1267
 FourierPlus.C:1268
 FourierPlus.C:1269
 FourierPlus.C:1270
 FourierPlus.C:1271
 FourierPlus.C:1272
 FourierPlus.C:1273
 FourierPlus.C:1274
 FourierPlus.C:1275
 FourierPlus.C:1276
 FourierPlus.C:1277
 FourierPlus.C:1278
 FourierPlus.C:1279
 FourierPlus.C:1280
 FourierPlus.C:1281
 FourierPlus.C:1282
 FourierPlus.C:1283
 FourierPlus.C:1284
 FourierPlus.C:1285
 FourierPlus.C:1286
 FourierPlus.C:1287
 FourierPlus.C:1288
 FourierPlus.C:1289
 FourierPlus.C:1290
 FourierPlus.C:1291
 FourierPlus.C:1292
 FourierPlus.C:1293
 FourierPlus.C:1294
 FourierPlus.C:1295
 FourierPlus.C:1296
 FourierPlus.C:1297
 FourierPlus.C:1298
 FourierPlus.C:1299
 FourierPlus.C:1300
 FourierPlus.C:1301
 FourierPlus.C:1302
 FourierPlus.C:1303
 FourierPlus.C:1304
 FourierPlus.C:1305
 FourierPlus.C:1306
 FourierPlus.C:1307
 FourierPlus.C:1308
 FourierPlus.C:1309
 FourierPlus.C:1310
 FourierPlus.C:1311
 FourierPlus.C:1312
 FourierPlus.C:1313
 FourierPlus.C:1314
 FourierPlus.C:1315
 FourierPlus.C:1316
 FourierPlus.C:1317
 FourierPlus.C:1318
 FourierPlus.C:1319
 FourierPlus.C:1320
 FourierPlus.C:1321
 FourierPlus.C:1322
 FourierPlus.C:1323
 FourierPlus.C:1324
 FourierPlus.C:1325
 FourierPlus.C:1326
 FourierPlus.C:1327
 FourierPlus.C:1328
 FourierPlus.C:1329
 FourierPlus.C:1330
 FourierPlus.C:1331
 FourierPlus.C:1332
 FourierPlus.C:1333
 FourierPlus.C:1334
 FourierPlus.C:1335
 FourierPlus.C:1336
 FourierPlus.C:1337
 FourierPlus.C:1338
 FourierPlus.C:1339
 FourierPlus.C:1340
 FourierPlus.C:1341
 FourierPlus.C:1342
 FourierPlus.C:1343
 FourierPlus.C:1344
 FourierPlus.C:1345
 FourierPlus.C:1346
 FourierPlus.C:1347
 FourierPlus.C:1348
 FourierPlus.C:1349
 FourierPlus.C:1350
 FourierPlus.C:1351
 FourierPlus.C:1352
 FourierPlus.C:1353
 FourierPlus.C:1354
 FourierPlus.C:1355
 FourierPlus.C:1356
 FourierPlus.C:1357
 FourierPlus.C:1358
 FourierPlus.C:1359
 FourierPlus.C:1360
 FourierPlus.C:1361
 FourierPlus.C:1362
 FourierPlus.C:1363
 FourierPlus.C:1364
 FourierPlus.C:1365
 FourierPlus.C:1366
 FourierPlus.C:1367
 FourierPlus.C:1368
 FourierPlus.C:1369
 FourierPlus.C:1370
 FourierPlus.C:1371
 FourierPlus.C:1372
 FourierPlus.C:1373
 FourierPlus.C:1374
 FourierPlus.C:1375
 FourierPlus.C:1376
 FourierPlus.C:1377
 FourierPlus.C:1378
 FourierPlus.C:1379
 FourierPlus.C:1380
 FourierPlus.C:1381
 FourierPlus.C:1382
 FourierPlus.C:1383
 FourierPlus.C:1384
 FourierPlus.C:1385
 FourierPlus.C:1386
 FourierPlus.C:1387
 FourierPlus.C:1388
 FourierPlus.C:1389
 FourierPlus.C:1390
 FourierPlus.C:1391
 FourierPlus.C:1392
 FourierPlus.C:1393
 FourierPlus.C:1394
 FourierPlus.C:1395
 FourierPlus.C:1396
 FourierPlus.C:1397
 FourierPlus.C:1398
 FourierPlus.C:1399
 FourierPlus.C:1400
 FourierPlus.C:1401
 FourierPlus.C:1402
 FourierPlus.C:1403
 FourierPlus.C:1404
 FourierPlus.C:1405
 FourierPlus.C:1406
 FourierPlus.C:1407
 FourierPlus.C:1408
 FourierPlus.C:1409
 FourierPlus.C:1410
 FourierPlus.C:1411
 FourierPlus.C:1412
 FourierPlus.C:1413
 FourierPlus.C:1414
 FourierPlus.C:1415
 FourierPlus.C:1416
 FourierPlus.C:1417
 FourierPlus.C:1418
 FourierPlus.C:1419
 FourierPlus.C:1420
 FourierPlus.C:1421
 FourierPlus.C:1422
 FourierPlus.C:1423
 FourierPlus.C:1424
 FourierPlus.C:1425
 FourierPlus.C:1426
 FourierPlus.C:1427
 FourierPlus.C:1428
 FourierPlus.C:1429
 FourierPlus.C:1430
 FourierPlus.C:1431
 FourierPlus.C:1432
 FourierPlus.C:1433
 FourierPlus.C:1434
 FourierPlus.C:1435
 FourierPlus.C:1436
 FourierPlus.C:1437
 FourierPlus.C:1438
 FourierPlus.C:1439
 FourierPlus.C:1440
 FourierPlus.C:1441
 FourierPlus.C:1442
 FourierPlus.C:1443
 FourierPlus.C:1444
 FourierPlus.C:1445
 FourierPlus.C:1446
 FourierPlus.C:1447
 FourierPlus.C:1448
 FourierPlus.C:1449
 FourierPlus.C:1450
 FourierPlus.C:1451
 FourierPlus.C:1452
 FourierPlus.C:1453
 FourierPlus.C:1454
 FourierPlus.C:1455
 FourierPlus.C:1456
 FourierPlus.C:1457
 FourierPlus.C:1458
 FourierPlus.C:1459
 FourierPlus.C:1460
 FourierPlus.C:1461
 FourierPlus.C:1462
 FourierPlus.C:1463
 FourierPlus.C:1464
 FourierPlus.C:1465
 FourierPlus.C:1466
 FourierPlus.C:1467
 FourierPlus.C:1468
 FourierPlus.C:1469
 FourierPlus.C:1470
 FourierPlus.C:1471
 FourierPlus.C:1472
 FourierPlus.C:1473
 FourierPlus.C:1474
 FourierPlus.C:1475
 FourierPlus.C:1476
 FourierPlus.C:1477
 FourierPlus.C:1478
 FourierPlus.C:1479
 FourierPlus.C:1480
 FourierPlus.C:1481
 FourierPlus.C:1482
 FourierPlus.C:1483
 FourierPlus.C:1484
 FourierPlus.C:1485
 FourierPlus.C:1486
 FourierPlus.C:1487
 FourierPlus.C:1488
 FourierPlus.C:1489
 FourierPlus.C:1490
 FourierPlus.C:1491
 FourierPlus.C:1492
 FourierPlus.C:1493
 FourierPlus.C:1494
 FourierPlus.C:1495
 FourierPlus.C:1496
 FourierPlus.C:1497
 FourierPlus.C:1498
 FourierPlus.C:1499
 FourierPlus.C:1500
 FourierPlus.C:1501
 FourierPlus.C:1502
 FourierPlus.C:1503
 FourierPlus.C:1504
 FourierPlus.C:1505
 FourierPlus.C:1506
 FourierPlus.C:1507
 FourierPlus.C:1508
 FourierPlus.C:1509
 FourierPlus.C:1510
 FourierPlus.C:1511
 FourierPlus.C:1512
 FourierPlus.C:1513
 FourierPlus.C:1514
 FourierPlus.C:1515
 FourierPlus.C:1516
 FourierPlus.C:1517
 FourierPlus.C:1518
 FourierPlus.C:1519
 FourierPlus.C:1520
 FourierPlus.C:1521
 FourierPlus.C:1522
 FourierPlus.C:1523
 FourierPlus.C:1524
 FourierPlus.C:1525
 FourierPlus.C:1526
 FourierPlus.C:1527
 FourierPlus.C:1528
 FourierPlus.C:1529
 FourierPlus.C:1530
 FourierPlus.C:1531
 FourierPlus.C:1532
 FourierPlus.C:1533
 FourierPlus.C:1534
 FourierPlus.C:1535
 FourierPlus.C:1536
 FourierPlus.C:1537
 FourierPlus.C:1538
 FourierPlus.C:1539
 FourierPlus.C:1540
 FourierPlus.C:1541
 FourierPlus.C:1542
 FourierPlus.C:1543
 FourierPlus.C:1544
 FourierPlus.C:1545
 FourierPlus.C:1546
 FourierPlus.C:1547
 FourierPlus.C:1548
 FourierPlus.C:1549
 FourierPlus.C:1550
 FourierPlus.C:1551
 FourierPlus.C:1552
 FourierPlus.C:1553
 FourierPlus.C:1554
 FourierPlus.C:1555
 FourierPlus.C:1556
 FourierPlus.C:1557
 FourierPlus.C:1558
 FourierPlus.C:1559
 FourierPlus.C:1560
 FourierPlus.C:1561
 FourierPlus.C:1562
 FourierPlus.C:1563
 FourierPlus.C:1564
 FourierPlus.C:1565
 FourierPlus.C:1566
 FourierPlus.C:1567
 FourierPlus.C:1568
 FourierPlus.C:1569
 FourierPlus.C:1570
 FourierPlus.C:1571
 FourierPlus.C:1572
 FourierPlus.C:1573
 FourierPlus.C:1574
 FourierPlus.C:1575
 FourierPlus.C:1576
 FourierPlus.C:1577
 FourierPlus.C:1578
 FourierPlus.C:1579
 FourierPlus.C:1580
 FourierPlus.C:1581
 FourierPlus.C:1582
 FourierPlus.C:1583
 FourierPlus.C:1584
 FourierPlus.C:1585
 FourierPlus.C:1586
 FourierPlus.C:1587
 FourierPlus.C:1588
 FourierPlus.C:1589
 FourierPlus.C:1590
 FourierPlus.C:1591
 FourierPlus.C:1592
 FourierPlus.C:1593
 FourierPlus.C:1594
 FourierPlus.C:1595
 FourierPlus.C:1596
 FourierPlus.C:1597
 FourierPlus.C:1598
 FourierPlus.C:1599
 FourierPlus.C:1600
 FourierPlus.C:1601
 FourierPlus.C:1602
 FourierPlus.C:1603
 FourierPlus.C:1604
 FourierPlus.C:1605
 FourierPlus.C:1606
 FourierPlus.C:1607
 FourierPlus.C:1608
 FourierPlus.C:1609
 FourierPlus.C:1610
 FourierPlus.C:1611
 FourierPlus.C:1612
 FourierPlus.C:1613
 FourierPlus.C:1614
 FourierPlus.C:1615
 FourierPlus.C:1616
 FourierPlus.C:1617
 FourierPlus.C:1618
 FourierPlus.C:1619
 FourierPlus.C:1620
 FourierPlus.C:1621
 FourierPlus.C:1622
 FourierPlus.C:1623
 FourierPlus.C:1624
 FourierPlus.C:1625
 FourierPlus.C:1626
 FourierPlus.C:1627
 FourierPlus.C:1628
 FourierPlus.C:1629
 FourierPlus.C:1630
 FourierPlus.C:1631
 FourierPlus.C:1632
 FourierPlus.C:1633
 FourierPlus.C:1634
 FourierPlus.C:1635
 FourierPlus.C:1636
 FourierPlus.C:1637
 FourierPlus.C:1638
 FourierPlus.C:1639
 FourierPlus.C:1640
 FourierPlus.C:1641
 FourierPlus.C:1642
 FourierPlus.C:1643
 FourierPlus.C:1644
 FourierPlus.C:1645
 FourierPlus.C:1646
 FourierPlus.C:1647
 FourierPlus.C:1648
 FourierPlus.C:1649
 FourierPlus.C:1650
 FourierPlus.C:1651
 FourierPlus.C:1652
 FourierPlus.C:1653
 FourierPlus.C:1654
 FourierPlus.C:1655
 FourierPlus.C:1656
 FourierPlus.C:1657
 FourierPlus.C:1658
 FourierPlus.C:1659
 FourierPlus.C:1660
 FourierPlus.C:1661
 FourierPlus.C:1662
 FourierPlus.C:1663
 FourierPlus.C:1664
 FourierPlus.C:1665
 FourierPlus.C:1666
 FourierPlus.C:1667
 FourierPlus.C:1668
 FourierPlus.C:1669
 FourierPlus.C:1670
 FourierPlus.C:1671
 FourierPlus.C:1672
 FourierPlus.C:1673
 FourierPlus.C:1674
 FourierPlus.C:1675
 FourierPlus.C:1676
 FourierPlus.C:1677
 FourierPlus.C:1678
 FourierPlus.C:1679
 FourierPlus.C:1680
 FourierPlus.C:1681
 FourierPlus.C:1682
 FourierPlus.C:1683
 FourierPlus.C:1684
 FourierPlus.C:1685
 FourierPlus.C:1686
 FourierPlus.C:1687
 FourierPlus.C:1688
 FourierPlus.C:1689
 FourierPlus.C:1690
 FourierPlus.C:1691
 FourierPlus.C:1692
 FourierPlus.C:1693
 FourierPlus.C:1694
 FourierPlus.C:1695
 FourierPlus.C:1696
 FourierPlus.C:1697
 FourierPlus.C:1698
 FourierPlus.C:1699
 FourierPlus.C:1700
 FourierPlus.C:1701
 FourierPlus.C:1702
 FourierPlus.C:1703
 FourierPlus.C:1704
 FourierPlus.C:1705
 FourierPlus.C:1706
 FourierPlus.C:1707
 FourierPlus.C:1708
 FourierPlus.C:1709
 FourierPlus.C:1710
 FourierPlus.C:1711
 FourierPlus.C:1712
 FourierPlus.C:1713
 FourierPlus.C:1714
 FourierPlus.C:1715
 FourierPlus.C:1716
 FourierPlus.C:1717
 FourierPlus.C:1718
 FourierPlus.C:1719
 FourierPlus.C:1720
 FourierPlus.C:1721
 FourierPlus.C:1722
 FourierPlus.C:1723
 FourierPlus.C:1724
 FourierPlus.C:1725
 FourierPlus.C:1726
 FourierPlus.C:1727
 FourierPlus.C:1728
 FourierPlus.C:1729
 FourierPlus.C:1730
 FourierPlus.C:1731
 FourierPlus.C:1732
 FourierPlus.C:1733
 FourierPlus.C:1734
 FourierPlus.C:1735
 FourierPlus.C:1736
 FourierPlus.C:1737
 FourierPlus.C:1738
 FourierPlus.C:1739
 FourierPlus.C:1740
 FourierPlus.C:1741
 FourierPlus.C:1742
 FourierPlus.C:1743
 FourierPlus.C:1744
 FourierPlus.C:1745
 FourierPlus.C:1746
 FourierPlus.C:1747
 FourierPlus.C:1748
 FourierPlus.C:1749
 FourierPlus.C:1750
 FourierPlus.C:1751
 FourierPlus.C:1752
 FourierPlus.C:1753
 FourierPlus.C:1754
 FourierPlus.C:1755
 FourierPlus.C:1756
 FourierPlus.C:1757
 FourierPlus.C:1758
 FourierPlus.C:1759
 FourierPlus.C:1760
 FourierPlus.C:1761
 FourierPlus.C:1762
 FourierPlus.C:1763
 FourierPlus.C:1764
 FourierPlus.C:1765
 FourierPlus.C:1766
 FourierPlus.C:1767
 FourierPlus.C:1768
 FourierPlus.C:1769
 FourierPlus.C:1770
 FourierPlus.C:1771
 FourierPlus.C:1772
 FourierPlus.C:1773
 FourierPlus.C:1774
 FourierPlus.C:1775
 FourierPlus.C:1776
 FourierPlus.C:1777
 FourierPlus.C:1778
 FourierPlus.C:1779
 FourierPlus.C:1780
 FourierPlus.C:1781
 FourierPlus.C:1782
 FourierPlus.C:1783
 FourierPlus.C:1784
 FourierPlus.C:1785
 FourierPlus.C:1786
 FourierPlus.C:1787
 FourierPlus.C:1788
 FourierPlus.C:1789
 FourierPlus.C:1790
 FourierPlus.C:1791
 FourierPlus.C:1792
 FourierPlus.C:1793
 FourierPlus.C:1794
 FourierPlus.C:1795
 FourierPlus.C:1796
 FourierPlus.C:1797
 FourierPlus.C:1798
 FourierPlus.C:1799
 FourierPlus.C:1800
 FourierPlus.C:1801
 FourierPlus.C:1802
 FourierPlus.C:1803
 FourierPlus.C:1804
 FourierPlus.C:1805
 FourierPlus.C:1806
 FourierPlus.C:1807
 FourierPlus.C:1808
 FourierPlus.C:1809
 FourierPlus.C:1810
 FourierPlus.C:1811
 FourierPlus.C:1812
 FourierPlus.C:1813
 FourierPlus.C:1814
 FourierPlus.C:1815
 FourierPlus.C:1816
 FourierPlus.C:1817
 FourierPlus.C:1818
 FourierPlus.C:1819
 FourierPlus.C:1820
 FourierPlus.C:1821
 FourierPlus.C:1822
 FourierPlus.C:1823
 FourierPlus.C:1824
 FourierPlus.C:1825
 FourierPlus.C:1826
 FourierPlus.C:1827
 FourierPlus.C:1828
 FourierPlus.C:1829
 FourierPlus.C:1830
 FourierPlus.C:1831
 FourierPlus.C:1832
 FourierPlus.C:1833
 FourierPlus.C:1834
 FourierPlus.C:1835
 FourierPlus.C:1836
 FourierPlus.C:1837
 FourierPlus.C:1838
 FourierPlus.C:1839
 FourierPlus.C:1840
 FourierPlus.C:1841
 FourierPlus.C:1842
 FourierPlus.C:1843
 FourierPlus.C:1844
 FourierPlus.C:1845
 FourierPlus.C:1846
 FourierPlus.C:1847
 FourierPlus.C:1848
 FourierPlus.C:1849
 FourierPlus.C:1850
 FourierPlus.C:1851
 FourierPlus.C:1852
 FourierPlus.C:1853
 FourierPlus.C:1854
 FourierPlus.C:1855
 FourierPlus.C:1856
 FourierPlus.C:1857
 FourierPlus.C:1858
 FourierPlus.C:1859
 FourierPlus.C:1860
 FourierPlus.C:1861
 FourierPlus.C:1862
 FourierPlus.C:1863
 FourierPlus.C:1864
 FourierPlus.C:1865
 FourierPlus.C:1866
 FourierPlus.C:1867
 FourierPlus.C:1868
 FourierPlus.C:1869
 FourierPlus.C:1870
 FourierPlus.C:1871
 FourierPlus.C:1872
 FourierPlus.C:1873
 FourierPlus.C:1874
 FourierPlus.C:1875
 FourierPlus.C:1876
 FourierPlus.C:1877
 FourierPlus.C:1878
 FourierPlus.C:1879
 FourierPlus.C:1880
 FourierPlus.C:1881
 FourierPlus.C:1882
 FourierPlus.C:1883
 FourierPlus.C:1884
 FourierPlus.C:1885
 FourierPlus.C:1886
 FourierPlus.C:1887
 FourierPlus.C:1888
 FourierPlus.C:1889
 FourierPlus.C:1890
 FourierPlus.C:1891
 FourierPlus.C:1892
 FourierPlus.C:1893
 FourierPlus.C:1894
 FourierPlus.C:1895
 FourierPlus.C:1896
 FourierPlus.C:1897
 FourierPlus.C:1898
 FourierPlus.C:1899
 FourierPlus.C:1900
 FourierPlus.C:1901
 FourierPlus.C:1902
 FourierPlus.C:1903
 FourierPlus.C:1904
 FourierPlus.C:1905
 FourierPlus.C:1906
 FourierPlus.C:1907
 FourierPlus.C:1908
 FourierPlus.C:1909
 FourierPlus.C:1910
 FourierPlus.C:1911
 FourierPlus.C:1912
 FourierPlus.C:1913
 FourierPlus.C:1914
 FourierPlus.C:1915
 FourierPlus.C:1916
 FourierPlus.C:1917
 FourierPlus.C:1918
 FourierPlus.C:1919
 FourierPlus.C:1920
 FourierPlus.C:1921
 FourierPlus.C:1922
 FourierPlus.C:1923
 FourierPlus.C:1924
 FourierPlus.C:1925
 FourierPlus.C:1926
 FourierPlus.C:1927
 FourierPlus.C:1928
 FourierPlus.C:1929
 FourierPlus.C:1930
 FourierPlus.C:1931
 FourierPlus.C:1932
 FourierPlus.C:1933
 FourierPlus.C:1934
 FourierPlus.C:1935
 FourierPlus.C:1936
 FourierPlus.C:1937
 FourierPlus.C:1938
 FourierPlus.C:1939
 FourierPlus.C:1940
 FourierPlus.C:1941
 FourierPlus.C:1942
 FourierPlus.C:1943
 FourierPlus.C:1944
 FourierPlus.C:1945
 FourierPlus.C:1946
 FourierPlus.C:1947
 FourierPlus.C:1948
 FourierPlus.C:1949
 FourierPlus.C:1950
 FourierPlus.C:1951
 FourierPlus.C:1952
 FourierPlus.C:1953
 FourierPlus.C:1954
 FourierPlus.C:1955
 FourierPlus.C:1956
 FourierPlus.C:1957
 FourierPlus.C:1958
 FourierPlus.C:1959
 FourierPlus.C:1960
 FourierPlus.C:1961
 FourierPlus.C:1962
 FourierPlus.C:1963
 FourierPlus.C:1964
 FourierPlus.C:1965
 FourierPlus.C:1966
 FourierPlus.C:1967
 FourierPlus.C:1968
 FourierPlus.C:1969
 FourierPlus.C:1970
 FourierPlus.C:1971
 FourierPlus.C:1972
 FourierPlus.C:1973
 FourierPlus.C:1974
 FourierPlus.C:1975
 FourierPlus.C:1976
 FourierPlus.C:1977
 FourierPlus.C:1978
 FourierPlus.C:1979
 FourierPlus.C:1980
 FourierPlus.C:1981
 FourierPlus.C:1982
 FourierPlus.C:1983
 FourierPlus.C:1984
 FourierPlus.C:1985
 FourierPlus.C:1986
 FourierPlus.C:1987
 FourierPlus.C:1988
 FourierPlus.C:1989
 FourierPlus.C:1990
 FourierPlus.C:1991
 FourierPlus.C:1992
 FourierPlus.C:1993
 FourierPlus.C:1994
 FourierPlus.C:1995
 FourierPlus.C:1996
 FourierPlus.C:1997
 FourierPlus.C:1998
 FourierPlus.C:1999
 FourierPlus.C:2000
 FourierPlus.C:2001
 FourierPlus.C:2002
 FourierPlus.C:2003
 FourierPlus.C:2004
 FourierPlus.C:2005
 FourierPlus.C:2006
 FourierPlus.C:2007
 FourierPlus.C:2008
 FourierPlus.C:2009
 FourierPlus.C:2010
 FourierPlus.C:2011
 FourierPlus.C:2012
 FourierPlus.C:2013
 FourierPlus.C:2014
 FourierPlus.C:2015
 FourierPlus.C:2016
 FourierPlus.C:2017
 FourierPlus.C:2018
 FourierPlus.C:2019
 FourierPlus.C:2020
 FourierPlus.C:2021
 FourierPlus.C:2022
 FourierPlus.C:2023
 FourierPlus.C:2024
 FourierPlus.C:2025
 FourierPlus.C:2026
 FourierPlus.C:2027
 FourierPlus.C:2028
 FourierPlus.C:2029
 FourierPlus.C:2030
 FourierPlus.C:2031
 FourierPlus.C:2032
 FourierPlus.C:2033
 FourierPlus.C:2034
 FourierPlus.C:2035
 FourierPlus.C:2036
 FourierPlus.C:2037
 FourierPlus.C:2038
 FourierPlus.C:2039
 FourierPlus.C:2040
 FourierPlus.C:2041
 FourierPlus.C:2042
 FourierPlus.C:2043
 FourierPlus.C:2044
 FourierPlus.C:2045
 FourierPlus.C:2046
 FourierPlus.C:2047
 FourierPlus.C:2048
 FourierPlus.C:2049
 FourierPlus.C:2050
 FourierPlus.C:2051
 FourierPlus.C:2052
 FourierPlus.C:2053
 FourierPlus.C:2054
 FourierPlus.C:2055
 FourierPlus.C:2056
 FourierPlus.C:2057
 FourierPlus.C:2058
 FourierPlus.C:2059
 FourierPlus.C:2060
 FourierPlus.C:2061
 FourierPlus.C:2062
 FourierPlus.C:2063
 FourierPlus.C:2064
 FourierPlus.C:2065
 FourierPlus.C:2066
 FourierPlus.C:2067
 FourierPlus.C:2068
 FourierPlus.C:2069
 FourierPlus.C:2070
 FourierPlus.C:2071
 FourierPlus.C:2072
 FourierPlus.C:2073
 FourierPlus.C:2074
 FourierPlus.C:2075
 FourierPlus.C:2076
 FourierPlus.C:2077
 FourierPlus.C:2078
 FourierPlus.C:2079
 FourierPlus.C:2080
 FourierPlus.C:2081
 FourierPlus.C:2082
 FourierPlus.C:2083
 FourierPlus.C:2084
 FourierPlus.C:2085
 FourierPlus.C:2086
 FourierPlus.C:2087
 FourierPlus.C:2088
 FourierPlus.C:2089
 FourierPlus.C:2090
 FourierPlus.C:2091
 FourierPlus.C:2092
 FourierPlus.C:2093
 FourierPlus.C:2094
 FourierPlus.C:2095
 FourierPlus.C:2096
 FourierPlus.C:2097
 FourierPlus.C:2098
 FourierPlus.C:2099
 FourierPlus.C:2100
 FourierPlus.C:2101
 FourierPlus.C:2102
 FourierPlus.C:2103
 FourierPlus.C:2104
 FourierPlus.C:2105
 FourierPlus.C:2106
 FourierPlus.C:2107
 FourierPlus.C:2108
 FourierPlus.C:2109
 FourierPlus.C:2110
 FourierPlus.C:2111
 FourierPlus.C:2112
 FourierPlus.C:2113
 FourierPlus.C:2114
 FourierPlus.C:2115
 FourierPlus.C:2116
 FourierPlus.C:2117
 FourierPlus.C:2118
 FourierPlus.C:2119
 FourierPlus.C:2120
 FourierPlus.C:2121
 FourierPlus.C:2122
 FourierPlus.C:2123
 FourierPlus.C:2124
 FourierPlus.C:2125
 FourierPlus.C:2126
 FourierPlus.C:2127
 FourierPlus.C:2128
 FourierPlus.C:2129
 FourierPlus.C:2130
 FourierPlus.C:2131
 FourierPlus.C:2132
 FourierPlus.C:2133
 FourierPlus.C:2134
 FourierPlus.C:2135
 FourierPlus.C:2136
 FourierPlus.C:2137
 FourierPlus.C:2138
 FourierPlus.C:2139
 FourierPlus.C:2140
 FourierPlus.C:2141
 FourierPlus.C:2142
 FourierPlus.C:2143
 FourierPlus.C:2144
 FourierPlus.C:2145
 FourierPlus.C:2146
 FourierPlus.C:2147
 FourierPlus.C:2148
 FourierPlus.C:2149
 FourierPlus.C:2150
 FourierPlus.C:2151
 FourierPlus.C:2152
 FourierPlus.C:2153
 FourierPlus.C:2154
 FourierPlus.C:2155
 FourierPlus.C:2156
 FourierPlus.C:2157
 FourierPlus.C:2158
 FourierPlus.C:2159
 FourierPlus.C:2160
 FourierPlus.C:2161
 FourierPlus.C:2162
 FourierPlus.C:2163
 FourierPlus.C:2164
 FourierPlus.C:2165
 FourierPlus.C:2166
 FourierPlus.C:2167
 FourierPlus.C:2168
 FourierPlus.C:2169
 FourierPlus.C:2170
 FourierPlus.C:2171
 FourierPlus.C:2172
 FourierPlus.C:2173
 FourierPlus.C:2174
 FourierPlus.C:2175
 FourierPlus.C:2176
 FourierPlus.C:2177
 FourierPlus.C:2178
 FourierPlus.C:2179
 FourierPlus.C:2180
 FourierPlus.C:2181
 FourierPlus.C:2182
 FourierPlus.C:2183
 FourierPlus.C:2184
 FourierPlus.C:2185
 FourierPlus.C:2186
 FourierPlus.C:2187
 FourierPlus.C:2188
 FourierPlus.C:2189
 FourierPlus.C:2190
 FourierPlus.C:2191
 FourierPlus.C:2192
 FourierPlus.C:2193
 FourierPlus.C:2194
 FourierPlus.C:2195
 FourierPlus.C:2196
 FourierPlus.C:2197
 FourierPlus.C:2198
 FourierPlus.C:2199
 FourierPlus.C:2200
 FourierPlus.C:2201
 FourierPlus.C:2202
 FourierPlus.C:2203
 FourierPlus.C:2204
 FourierPlus.C:2205
 FourierPlus.C:2206
 FourierPlus.C:2207
 FourierPlus.C:2208
 FourierPlus.C:2209
 FourierPlus.C:2210
 FourierPlus.C:2211
 FourierPlus.C:2212
 FourierPlus.C:2213
 FourierPlus.C:2214
 FourierPlus.C:2215
 FourierPlus.C:2216
 FourierPlus.C:2217
 FourierPlus.C:2218
 FourierPlus.C:2219
 FourierPlus.C:2220
 FourierPlus.C:2221
 FourierPlus.C:2222
 FourierPlus.C:2223
 FourierPlus.C:2224
 FourierPlus.C:2225
 FourierPlus.C:2226
 FourierPlus.C:2227
 FourierPlus.C:2228
 FourierPlus.C:2229
 FourierPlus.C:2230
 FourierPlus.C:2231
 FourierPlus.C:2232
 FourierPlus.C:2233
 FourierPlus.C:2234
 FourierPlus.C:2235
 FourierPlus.C:2236
 FourierPlus.C:2237
 FourierPlus.C:2238
 FourierPlus.C:2239
 FourierPlus.C:2240
 FourierPlus.C:2241
 FourierPlus.C:2242
 FourierPlus.C:2243
 FourierPlus.C:2244
 FourierPlus.C:2245
 FourierPlus.C:2246
 FourierPlus.C:2247
 FourierPlus.C:2248
 FourierPlus.C:2249
 FourierPlus.C:2250
 FourierPlus.C:2251
 FourierPlus.C:2252
 FourierPlus.C:2253
 FourierPlus.C:2254
 FourierPlus.C:2255
 FourierPlus.C:2256
 FourierPlus.C:2257
 FourierPlus.C:2258
 FourierPlus.C:2259
 FourierPlus.C:2260
 FourierPlus.C:2261
 FourierPlus.C:2262
 FourierPlus.C:2263
 FourierPlus.C:2264
 FourierPlus.C:2265
 FourierPlus.C:2266
 FourierPlus.C:2267
 FourierPlus.C:2268
 FourierPlus.C:2269
 FourierPlus.C:2270
 FourierPlus.C:2271
 FourierPlus.C:2272
 FourierPlus.C:2273
 FourierPlus.C:2274
 FourierPlus.C:2275
 FourierPlus.C:2276
 FourierPlus.C:2277
 FourierPlus.C:2278
 FourierPlus.C:2279
 FourierPlus.C:2280
 FourierPlus.C:2281
 FourierPlus.C:2282
 FourierPlus.C:2283
 FourierPlus.C:2284
 FourierPlus.C:2285
 FourierPlus.C:2286
 FourierPlus.C:2287
 FourierPlus.C:2288
 FourierPlus.C:2289
 FourierPlus.C:2290
 FourierPlus.C:2291
 FourierPlus.C:2292
 FourierPlus.C:2293
 FourierPlus.C:2294
 FourierPlus.C:2295
 FourierPlus.C:2296
 FourierPlus.C:2297
 FourierPlus.C:2298
 FourierPlus.C:2299
 FourierPlus.C:2300
 FourierPlus.C:2301
 FourierPlus.C:2302
 FourierPlus.C:2303
 FourierPlus.C:2304
 FourierPlus.C:2305
 FourierPlus.C:2306
 FourierPlus.C:2307
 FourierPlus.C:2308
 FourierPlus.C:2309
 FourierPlus.C:2310
 FourierPlus.C:2311
 FourierPlus.C:2312
 FourierPlus.C:2313
 FourierPlus.C:2314
 FourierPlus.C:2315
 FourierPlus.C:2316
 FourierPlus.C:2317
 FourierPlus.C:2318
 FourierPlus.C:2319
 FourierPlus.C:2320
 FourierPlus.C:2321
 FourierPlus.C:2322
 FourierPlus.C:2323
 FourierPlus.C:2324
 FourierPlus.C:2325
 FourierPlus.C:2326
 FourierPlus.C:2327
 FourierPlus.C:2328
 FourierPlus.C:2329
 FourierPlus.C:2330
 FourierPlus.C:2331
 FourierPlus.C:2332
 FourierPlus.C:2333
 FourierPlus.C:2334
 FourierPlus.C:2335
 FourierPlus.C:2336
 FourierPlus.C:2337
 FourierPlus.C:2338
 FourierPlus.C:2339
 FourierPlus.C:2340
 FourierPlus.C:2341
 FourierPlus.C:2342
 FourierPlus.C:2343
 FourierPlus.C:2344
 FourierPlus.C:2345
 FourierPlus.C:2346
 FourierPlus.C:2347
 FourierPlus.C:2348
 FourierPlus.C:2349
 FourierPlus.C:2350
 FourierPlus.C:2351
 FourierPlus.C:2352
 FourierPlus.C:2353
 FourierPlus.C:2354
 FourierPlus.C:2355
 FourierPlus.C:2356
 FourierPlus.C:2357
 FourierPlus.C:2358
 FourierPlus.C:2359
 FourierPlus.C:2360
 FourierPlus.C:2361
 FourierPlus.C:2362
 FourierPlus.C:2363
 FourierPlus.C:2364
 FourierPlus.C:2365
 FourierPlus.C:2366
 FourierPlus.C:2367
 FourierPlus.C:2368
 FourierPlus.C:2369
 FourierPlus.C:2370
 FourierPlus.C:2371
 FourierPlus.C:2372
 FourierPlus.C:2373
 FourierPlus.C:2374
 FourierPlus.C:2375
 FourierPlus.C:2376
 FourierPlus.C:2377
 FourierPlus.C:2378
 FourierPlus.C:2379
 FourierPlus.C:2380
 FourierPlus.C:2381
 FourierPlus.C:2382
 FourierPlus.C:2383
 FourierPlus.C:2384
 FourierPlus.C:2385
 FourierPlus.C:2386
 FourierPlus.C:2387
 FourierPlus.C:2388
 FourierPlus.C:2389
 FourierPlus.C:2390
 FourierPlus.C:2391
 FourierPlus.C:2392
 FourierPlus.C:2393
 FourierPlus.C:2394
 FourierPlus.C:2395
 FourierPlus.C:2396
 FourierPlus.C:2397
 FourierPlus.C:2398
 FourierPlus.C:2399
 FourierPlus.C:2400
 FourierPlus.C:2401
 FourierPlus.C:2402
 FourierPlus.C:2403
 FourierPlus.C:2404
 FourierPlus.C:2405
 FourierPlus.C:2406
 FourierPlus.C:2407
 FourierPlus.C:2408
 FourierPlus.C:2409
 FourierPlus.C:2410
 FourierPlus.C:2411
 FourierPlus.C:2412
 FourierPlus.C:2413
 FourierPlus.C:2414
 FourierPlus.C:2415
 FourierPlus.C:2416
 FourierPlus.C:2417
 FourierPlus.C:2418
 FourierPlus.C:2419
 FourierPlus.C:2420
 FourierPlus.C:2421
 FourierPlus.C:2422
 FourierPlus.C:2423
 FourierPlus.C:2424
 FourierPlus.C:2425
 FourierPlus.C:2426
 FourierPlus.C:2427
 FourierPlus.C:2428
 FourierPlus.C:2429
 FourierPlus.C:2430
 FourierPlus.C:2431
 FourierPlus.C:2432
 FourierPlus.C:2433
 FourierPlus.C:2434
 FourierPlus.C:2435
 FourierPlus.C:2436
 FourierPlus.C:2437
 FourierPlus.C:2438
 FourierPlus.C:2439
 FourierPlus.C:2440
 FourierPlus.C:2441
 FourierPlus.C:2442
 FourierPlus.C:2443
 FourierPlus.C:2444
 FourierPlus.C:2445
 FourierPlus.C:2446
 FourierPlus.C:2447
 FourierPlus.C:2448
 FourierPlus.C:2449
 FourierPlus.C:2450
 FourierPlus.C:2451
 FourierPlus.C:2452
 FourierPlus.C:2453
 FourierPlus.C:2454
 FourierPlus.C:2455
 FourierPlus.C:2456
 FourierPlus.C:2457
 FourierPlus.C:2458
 FourierPlus.C:2459
 FourierPlus.C:2460
 FourierPlus.C:2461
 FourierPlus.C:2462
 FourierPlus.C:2463
 FourierPlus.C:2464
 FourierPlus.C:2465
 FourierPlus.C:2466
 FourierPlus.C:2467
 FourierPlus.C:2468
 FourierPlus.C:2469
 FourierPlus.C:2470
 FourierPlus.C:2471
 FourierPlus.C:2472
 FourierPlus.C:2473
 FourierPlus.C:2474
 FourierPlus.C:2475
 FourierPlus.C:2476
 FourierPlus.C:2477
 FourierPlus.C:2478
 FourierPlus.C:2479
 FourierPlus.C:2480
 FourierPlus.C:2481
 FourierPlus.C:2482
 FourierPlus.C:2483
 FourierPlus.C:2484
 FourierPlus.C:2485
 FourierPlus.C:2486
 FourierPlus.C:2487
 FourierPlus.C:2488
 FourierPlus.C:2489
 FourierPlus.C:2490
 FourierPlus.C:2491
 FourierPlus.C:2492
 FourierPlus.C:2493
 FourierPlus.C:2494
 FourierPlus.C:2495
 FourierPlus.C:2496
 FourierPlus.C:2497
 FourierPlus.C:2498
 FourierPlus.C:2499
 FourierPlus.C:2500
 FourierPlus.C:2501
 FourierPlus.C:2502
 FourierPlus.C:2503
 FourierPlus.C:2504
 FourierPlus.C:2505
 FourierPlus.C:2506
 FourierPlus.C:2507
 FourierPlus.C:2508
 FourierPlus.C:2509
 FourierPlus.C:2510
 FourierPlus.C:2511
 FourierPlus.C:2512
 FourierPlus.C:2513
 FourierPlus.C:2514
 FourierPlus.C:2515
 FourierPlus.C:2516
 FourierPlus.C:2517
 FourierPlus.C:2518
 FourierPlus.C:2519
 FourierPlus.C:2520
 FourierPlus.C:2521
 FourierPlus.C:2522
 FourierPlus.C:2523
 FourierPlus.C:2524
 FourierPlus.C:2525
 FourierPlus.C:2526
 FourierPlus.C:2527
 FourierPlus.C:2528
 FourierPlus.C:2529
 FourierPlus.C:2530
 FourierPlus.C:2531
 FourierPlus.C:2532
 FourierPlus.C:2533
 FourierPlus.C:2534
 FourierPlus.C:2535
 FourierPlus.C:2536
 FourierPlus.C:2537
 FourierPlus.C:2538
 FourierPlus.C:2539
 FourierPlus.C:2540
 FourierPlus.C:2541
 FourierPlus.C:2542
 FourierPlus.C:2543
 FourierPlus.C:2544
 FourierPlus.C:2545
 FourierPlus.C:2546
 FourierPlus.C:2547
 FourierPlus.C:2548
 FourierPlus.C:2549
 FourierPlus.C:2550
 FourierPlus.C:2551
 FourierPlus.C:2552
 FourierPlus.C:2553
 FourierPlus.C:2554
 FourierPlus.C:2555
 FourierPlus.C:2556
 FourierPlus.C:2557
 FourierPlus.C:2558
 FourierPlus.C:2559
 FourierPlus.C:2560
 FourierPlus.C:2561
 FourierPlus.C:2562
 FourierPlus.C:2563
 FourierPlus.C:2564
 FourierPlus.C:2565
 FourierPlus.C:2566
 FourierPlus.C:2567
 FourierPlus.C:2568
 FourierPlus.C:2569
 FourierPlus.C:2570
 FourierPlus.C:2571
 FourierPlus.C:2572
 FourierPlus.C:2573
 FourierPlus.C:2574
 FourierPlus.C:2575
 FourierPlus.C:2576
 FourierPlus.C:2577
 FourierPlus.C:2578
 FourierPlus.C:2579
 FourierPlus.C:2580
 FourierPlus.C:2581
 FourierPlus.C:2582
 FourierPlus.C:2583
 FourierPlus.C:2584
 FourierPlus.C:2585
 FourierPlus.C:2586
 FourierPlus.C:2587
 FourierPlus.C:2588
 FourierPlus.C:2589
 FourierPlus.C:2590
 FourierPlus.C:2591
 FourierPlus.C:2592
 FourierPlus.C:2593
 FourierPlus.C:2594
 FourierPlus.C:2595
 FourierPlus.C:2596
 FourierPlus.C:2597
 FourierPlus.C:2598
 FourierPlus.C:2599
 FourierPlus.C:2600
 FourierPlus.C:2601
 FourierPlus.C:2602
 FourierPlus.C:2603
 FourierPlus.C:2604
 FourierPlus.C:2605
 FourierPlus.C:2606
 FourierPlus.C:2607
 FourierPlus.C:2608
 FourierPlus.C:2609
 FourierPlus.C:2610
 FourierPlus.C:2611
 FourierPlus.C:2612
 FourierPlus.C:2613
 FourierPlus.C:2614
 FourierPlus.C:2615
 FourierPlus.C:2616
 FourierPlus.C:2617
 FourierPlus.C:2618
 FourierPlus.C:2619
 FourierPlus.C:2620
 FourierPlus.C:2621
 FourierPlus.C:2622
 FourierPlus.C:2623
 FourierPlus.C:2624
 FourierPlus.C:2625
 FourierPlus.C:2626
 FourierPlus.C:2627
 FourierPlus.C:2628
 FourierPlus.C:2629
 FourierPlus.C:2630
 FourierPlus.C:2631
 FourierPlus.C:2632
 FourierPlus.C:2633
 FourierPlus.C:2634
 FourierPlus.C:2635
 FourierPlus.C:2636
 FourierPlus.C:2637
 FourierPlus.C:2638
 FourierPlus.C:2639
 FourierPlus.C:2640
 FourierPlus.C:2641
 FourierPlus.C:2642
 FourierPlus.C:2643
 FourierPlus.C:2644
 FourierPlus.C:2645
 FourierPlus.C:2646
 FourierPlus.C:2647
 FourierPlus.C:2648
 FourierPlus.C:2649
 FourierPlus.C:2650
 FourierPlus.C:2651
 FourierPlus.C:2652
 FourierPlus.C:2653
 FourierPlus.C:2654
 FourierPlus.C:2655
 FourierPlus.C:2656
 FourierPlus.C:2657
 FourierPlus.C:2658
 FourierPlus.C:2659
 FourierPlus.C:2660
 FourierPlus.C:2661
 FourierPlus.C:2662
 FourierPlus.C:2663
 FourierPlus.C:2664
 FourierPlus.C:2665
 FourierPlus.C:2666
 FourierPlus.C:2667
 FourierPlus.C:2668
 FourierPlus.C:2669
 FourierPlus.C:2670
 FourierPlus.C:2671
 FourierPlus.C:2672
 FourierPlus.C:2673
 FourierPlus.C:2674
 FourierPlus.C:2675
 FourierPlus.C:2676
 FourierPlus.C:2677
 FourierPlus.C:2678
 FourierPlus.C:2679
 FourierPlus.C:2680
 FourierPlus.C:2681
 FourierPlus.C:2682
 FourierPlus.C:2683
 FourierPlus.C:2684
 FourierPlus.C:2685
 FourierPlus.C:2686
 FourierPlus.C:2687
 FourierPlus.C:2688
 FourierPlus.C:2689
 FourierPlus.C:2690
 FourierPlus.C:2691
 FourierPlus.C:2692
 FourierPlus.C:2693
 FourierPlus.C:2694
 FourierPlus.C:2695
 FourierPlus.C:2696
 FourierPlus.C:2697
 FourierPlus.C:2698
 FourierPlus.C:2699
 FourierPlus.C:2700
 FourierPlus.C:2701
 FourierPlus.C:2702
 FourierPlus.C:2703
 FourierPlus.C:2704
 FourierPlus.C:2705
 FourierPlus.C:2706
 FourierPlus.C:2707
 FourierPlus.C:2708
 FourierPlus.C:2709
 FourierPlus.C:2710
 FourierPlus.C:2711
 FourierPlus.C:2712
 FourierPlus.C:2713
 FourierPlus.C:2714
 FourierPlus.C:2715
 FourierPlus.C:2716
 FourierPlus.C:2717
 FourierPlus.C:2718
 FourierPlus.C:2719
 FourierPlus.C:2720
 FourierPlus.C:2721
 FourierPlus.C:2722
 FourierPlus.C:2723
 FourierPlus.C:2724
 FourierPlus.C:2725
 FourierPlus.C:2726
 FourierPlus.C:2727
 FourierPlus.C:2728
 FourierPlus.C:2729
 FourierPlus.C:2730
 FourierPlus.C:2731
 FourierPlus.C:2732
 FourierPlus.C:2733
 FourierPlus.C:2734
 FourierPlus.C:2735
 FourierPlus.C:2736
 FourierPlus.C:2737
 FourierPlus.C:2738
 FourierPlus.C:2739
 FourierPlus.C:2740
 FourierPlus.C:2741
 FourierPlus.C:2742
 FourierPlus.C:2743
 FourierPlus.C:2744
 FourierPlus.C:2745
 FourierPlus.C:2746
 FourierPlus.C:2747
 FourierPlus.C:2748
 FourierPlus.C:2749
 FourierPlus.C:2750
 FourierPlus.C:2751
 FourierPlus.C:2752
 FourierPlus.C:2753
 FourierPlus.C:2754
 FourierPlus.C:2755
 FourierPlus.C:2756
 FourierPlus.C:2757
 FourierPlus.C:2758
 FourierPlus.C:2759
 FourierPlus.C:2760
 FourierPlus.C:2761
 FourierPlus.C:2762
 FourierPlus.C:2763
 FourierPlus.C:2764
 FourierPlus.C:2765
 FourierPlus.C:2766
 FourierPlus.C:2767
 FourierPlus.C:2768
 FourierPlus.C:2769
 FourierPlus.C:2770
 FourierPlus.C:2771
 FourierPlus.C:2772
 FourierPlus.C:2773
 FourierPlus.C:2774
 FourierPlus.C:2775
 FourierPlus.C:2776
 FourierPlus.C:2777
 FourierPlus.C:2778
 FourierPlus.C:2779
 FourierPlus.C:2780
 FourierPlus.C:2781
 FourierPlus.C:2782
 FourierPlus.C:2783
 FourierPlus.C:2784
 FourierPlus.C:2785
 FourierPlus.C:2786
 FourierPlus.C:2787
 FourierPlus.C:2788
 FourierPlus.C:2789
 FourierPlus.C:2790
 FourierPlus.C:2791
 FourierPlus.C:2792
 FourierPlus.C:2793
 FourierPlus.C:2794
 FourierPlus.C:2795
 FourierPlus.C:2796
 FourierPlus.C:2797
 FourierPlus.C:2798
 FourierPlus.C:2799
 FourierPlus.C:2800
 FourierPlus.C:2801
 FourierPlus.C:2802
 FourierPlus.C:2803
 FourierPlus.C:2804
 FourierPlus.C:2805
 FourierPlus.C:2806
 FourierPlus.C:2807
 FourierPlus.C:2808
 FourierPlus.C:2809
 FourierPlus.C:2810
 FourierPlus.C:2811
 FourierPlus.C:2812
 FourierPlus.C:2813
 FourierPlus.C:2814
 FourierPlus.C:2815
 FourierPlus.C:2816
 FourierPlus.C:2817
 FourierPlus.C:2818
 FourierPlus.C:2819
 FourierPlus.C:2820
 FourierPlus.C:2821
 FourierPlus.C:2822
 FourierPlus.C:2823
 FourierPlus.C:2824
 FourierPlus.C:2825
 FourierPlus.C:2826
 FourierPlus.C:2827
 FourierPlus.C:2828
 FourierPlus.C:2829
 FourierPlus.C:2830
 FourierPlus.C:2831
 FourierPlus.C:2832
 FourierPlus.C:2833
 FourierPlus.C:2834
 FourierPlus.C:2835
 FourierPlus.C:2836
 FourierPlus.C:2837
 FourierPlus.C:2838
 FourierPlus.C:2839
 FourierPlus.C:2840
 FourierPlus.C:2841
 FourierPlus.C:2842
 FourierPlus.C:2843
 FourierPlus.C:2844
 FourierPlus.C:2845
 FourierPlus.C:2846
 FourierPlus.C:2847
 FourierPlus.C:2848
 FourierPlus.C:2849
 FourierPlus.C:2850
 FourierPlus.C:2851
 FourierPlus.C:2852
 FourierPlus.C:2853
 FourierPlus.C:2854
 FourierPlus.C:2855
 FourierPlus.C:2856
 FourierPlus.C:2857
 FourierPlus.C:2858
 FourierPlus.C:2859
 FourierPlus.C:2860
 FourierPlus.C:2861
 FourierPlus.C:2862
 FourierPlus.C:2863
 FourierPlus.C:2864
 FourierPlus.C:2865
 FourierPlus.C:2866
 FourierPlus.C:2867
 FourierPlus.C:2868
 FourierPlus.C:2869
 FourierPlus.C:2870
 FourierPlus.C:2871
 FourierPlus.C:2872
 FourierPlus.C:2873
 FourierPlus.C:2874
 FourierPlus.C:2875
 FourierPlus.C:2876
 FourierPlus.C:2877
 FourierPlus.C:2878
 FourierPlus.C:2879
 FourierPlus.C:2880
 FourierPlus.C:2881
 FourierPlus.C:2882
 FourierPlus.C:2883
 FourierPlus.C:2884
 FourierPlus.C:2885
 FourierPlus.C:2886
 FourierPlus.C:2887
 FourierPlus.C:2888
 FourierPlus.C:2889
 FourierPlus.C:2890
 FourierPlus.C:2891
 FourierPlus.C:2892
 FourierPlus.C:2893
 FourierPlus.C:2894
 FourierPlus.C:2895
 FourierPlus.C:2896
 FourierPlus.C:2897
 FourierPlus.C:2898
 FourierPlus.C:2899
 FourierPlus.C:2900
 FourierPlus.C:2901
 FourierPlus.C:2902
 FourierPlus.C:2903
 FourierPlus.C:2904
 FourierPlus.C:2905
 FourierPlus.C:2906
 FourierPlus.C:2907
 FourierPlus.C:2908
 FourierPlus.C:2909
 FourierPlus.C:2910
 FourierPlus.C:2911
 FourierPlus.C:2912
 FourierPlus.C:2913
 FourierPlus.C:2914
 FourierPlus.C:2915
 FourierPlus.C:2916
 FourierPlus.C:2917
 FourierPlus.C:2918
 FourierPlus.C:2919
 FourierPlus.C:2920
 FourierPlus.C:2921
 FourierPlus.C:2922
 FourierPlus.C:2923
 FourierPlus.C:2924
 FourierPlus.C:2925
 FourierPlus.C:2926
 FourierPlus.C:2927
 FourierPlus.C:2928
 FourierPlus.C:2929
 FourierPlus.C:2930
 FourierPlus.C:2931
 FourierPlus.C:2932
 FourierPlus.C:2933
 FourierPlus.C:2934
 FourierPlus.C:2935
 FourierPlus.C:2936
 FourierPlus.C:2937
 FourierPlus.C:2938
 FourierPlus.C:2939
 FourierPlus.C:2940
 FourierPlus.C:2941
 FourierPlus.C:2942
 FourierPlus.C:2943
 FourierPlus.C:2944
 FourierPlus.C:2945
 FourierPlus.C:2946
 FourierPlus.C:2947
 FourierPlus.C:2948
 FourierPlus.C:2949
 FourierPlus.C:2950
 FourierPlus.C:2951
 FourierPlus.C:2952
 FourierPlus.C:2953
 FourierPlus.C:2954
 FourierPlus.C:2955
 FourierPlus.C:2956
 FourierPlus.C:2957
 FourierPlus.C:2958
 FourierPlus.C:2959
 FourierPlus.C:2960
 FourierPlus.C:2961
 FourierPlus.C:2962
 FourierPlus.C:2963
 FourierPlus.C:2964
 FourierPlus.C:2965
 FourierPlus.C:2966
 FourierPlus.C:2967
 FourierPlus.C:2968
 FourierPlus.C:2969
 FourierPlus.C:2970
 FourierPlus.C:2971
 FourierPlus.C:2972
 FourierPlus.C:2973
 FourierPlus.C:2974
 FourierPlus.C:2975
 FourierPlus.C:2976
 FourierPlus.C:2977
 FourierPlus.C:2978
 FourierPlus.C:2979
 FourierPlus.C:2980
 FourierPlus.C:2981
 FourierPlus.C:2982
 FourierPlus.C:2983
 FourierPlus.C:2984
 FourierPlus.C:2985
 FourierPlus.C:2986
 FourierPlus.C:2987
 FourierPlus.C:2988
 FourierPlus.C:2989
 FourierPlus.C:2990
 FourierPlus.C:2991
 FourierPlus.C:2992
 FourierPlus.C:2993
 FourierPlus.C:2994
 FourierPlus.C:2995
 FourierPlus.C:2996
 FourierPlus.C:2997
 FourierPlus.C:2998
 FourierPlus.C:2999
 FourierPlus.C:3000
 FourierPlus.C:3001
 FourierPlus.C:3002
 FourierPlus.C:3003
 FourierPlus.C:3004
 FourierPlus.C:3005
 FourierPlus.C:3006
 FourierPlus.C:3007
 FourierPlus.C:3008
 FourierPlus.C:3009
 FourierPlus.C:3010
 FourierPlus.C:3011
 FourierPlus.C:3012
 FourierPlus.C:3013
 FourierPlus.C:3014
 FourierPlus.C:3015
 FourierPlus.C:3016
 FourierPlus.C:3017
 FourierPlus.C:3018
 FourierPlus.C:3019
 FourierPlus.C:3020
 FourierPlus.C:3021
 FourierPlus.C:3022
 FourierPlus.C:3023
 FourierPlus.C:3024
 FourierPlus.C:3025
 FourierPlus.C:3026
 FourierPlus.C:3027
 FourierPlus.C:3028
 FourierPlus.C:3029
 FourierPlus.C:3030
 FourierPlus.C:3031
 FourierPlus.C:3032
 FourierPlus.C:3033
 FourierPlus.C:3034
 FourierPlus.C:3035
 FourierPlus.C:3036
 FourierPlus.C:3037
 FourierPlus.C:3038
 FourierPlus.C:3039
 FourierPlus.C:3040
 FourierPlus.C:3041
 FourierPlus.C:3042
 FourierPlus.C:3043
 FourierPlus.C:3044
 FourierPlus.C:3045
 FourierPlus.C:3046
 FourierPlus.C:3047
 FourierPlus.C:3048
 FourierPlus.C:3049
 FourierPlus.C:3050
 FourierPlus.C:3051
 FourierPlus.C:3052
 FourierPlus.C:3053
 FourierPlus.C:3054
 FourierPlus.C:3055
 FourierPlus.C:3056
 FourierPlus.C:3057
 FourierPlus.C:3058
 FourierPlus.C:3059
 FourierPlus.C:3060
 FourierPlus.C:3061
 FourierPlus.C:3062
 FourierPlus.C:3063
 FourierPlus.C:3064
 FourierPlus.C:3065
 FourierPlus.C:3066
 FourierPlus.C:3067
 FourierPlus.C:3068
 FourierPlus.C:3069
 FourierPlus.C:3070
 FourierPlus.C:3071
 FourierPlus.C:3072
 FourierPlus.C:3073
 FourierPlus.C:3074
 FourierPlus.C:3075
 FourierPlus.C:3076
 FourierPlus.C:3077
 FourierPlus.C:3078
 FourierPlus.C:3079
 FourierPlus.C:3080
 FourierPlus.C:3081
 FourierPlus.C:3082
 FourierPlus.C:3083
 FourierPlus.C:3084
 FourierPlus.C:3085
 FourierPlus.C:3086
 FourierPlus.C:3087
 FourierPlus.C:3088
 FourierPlus.C:3089
 FourierPlus.C:3090
 FourierPlus.C:3091
 FourierPlus.C:3092
 FourierPlus.C:3093
 FourierPlus.C:3094
 FourierPlus.C:3095
 FourierPlus.C:3096
 FourierPlus.C:3097
 FourierPlus.C:3098
 FourierPlus.C:3099
 FourierPlus.C:3100
 FourierPlus.C:3101
 FourierPlus.C:3102
 FourierPlus.C:3103
 FourierPlus.C:3104
 FourierPlus.C:3105
 FourierPlus.C:3106
 FourierPlus.C:3107
 FourierPlus.C:3108
 FourierPlus.C:3109
 FourierPlus.C:3110
 FourierPlus.C:3111
 FourierPlus.C:3112
 FourierPlus.C:3113
 FourierPlus.C:3114
 FourierPlus.C:3115
 FourierPlus.C:3116
 FourierPlus.C:3117
 FourierPlus.C:3118
 FourierPlus.C:3119
 FourierPlus.C:3120
 FourierPlus.C:3121
 FourierPlus.C:3122
 FourierPlus.C:3123
 FourierPlus.C:3124
 FourierPlus.C:3125
 FourierPlus.C:3126
 FourierPlus.C:3127
 FourierPlus.C:3128
 FourierPlus.C:3129
 FourierPlus.C:3130
 FourierPlus.C:3131
 FourierPlus.C:3132
 FourierPlus.C:3133
 FourierPlus.C:3134
 FourierPlus.C:3135
 FourierPlus.C:3136
 FourierPlus.C:3137
 FourierPlus.C:3138
 FourierPlus.C:3139
 FourierPlus.C:3140
 FourierPlus.C:3141
 FourierPlus.C:3142
 FourierPlus.C:3143
 FourierPlus.C:3144
 FourierPlus.C:3145
 FourierPlus.C:3146
 FourierPlus.C:3147
 FourierPlus.C:3148
 FourierPlus.C:3149
 FourierPlus.C:3150
 FourierPlus.C:3151
 FourierPlus.C:3152
 FourierPlus.C:3153
 FourierPlus.C:3154
 FourierPlus.C:3155
 FourierPlus.C:3156
 FourierPlus.C:3157
 FourierPlus.C:3158
 FourierPlus.C:3159
 FourierPlus.C:3160
 FourierPlus.C:3161
 FourierPlus.C:3162
 FourierPlus.C:3163
 FourierPlus.C:3164
 FourierPlus.C:3165
 FourierPlus.C:3166
 FourierPlus.C:3167
 FourierPlus.C:3168
 FourierPlus.C:3169
 FourierPlus.C:3170
 FourierPlus.C:3171
 FourierPlus.C:3172
 FourierPlus.C:3173
 FourierPlus.C:3174
 FourierPlus.C:3175
 FourierPlus.C:3176
 FourierPlus.C:3177
 FourierPlus.C:3178
 FourierPlus.C:3179
 FourierPlus.C:3180
 FourierPlus.C:3181
 FourierPlus.C:3182
 FourierPlus.C:3183
 FourierPlus.C:3184
 FourierPlus.C:3185
 FourierPlus.C:3186
 FourierPlus.C:3187
 FourierPlus.C:3188
 FourierPlus.C:3189
 FourierPlus.C:3190
 FourierPlus.C:3191
 FourierPlus.C:3192
 FourierPlus.C:3193
 FourierPlus.C:3194
 FourierPlus.C:3195
 FourierPlus.C:3196
 FourierPlus.C:3197
 FourierPlus.C:3198
 FourierPlus.C:3199
 FourierPlus.C:3200
 FourierPlus.C:3201
 FourierPlus.C:3202
 FourierPlus.C:3203
 FourierPlus.C:3204
 FourierPlus.C:3205
 FourierPlus.C:3206
 FourierPlus.C:3207
 FourierPlus.C:3208
 FourierPlus.C:3209
 FourierPlus.C:3210
 FourierPlus.C:3211
 FourierPlus.C:3212
 FourierPlus.C:3213
 FourierPlus.C:3214
 FourierPlus.C:3215
 FourierPlus.C:3216
 FourierPlus.C:3217
 FourierPlus.C:3218
 FourierPlus.C:3219
 FourierPlus.C:3220
 FourierPlus.C:3221
 FourierPlus.C:3222
 FourierPlus.C:3223
 FourierPlus.C:3224
 FourierPlus.C:3225
 FourierPlus.C:3226
 FourierPlus.C:3227
 FourierPlus.C:3228
 FourierPlus.C:3229
 FourierPlus.C:3230
 FourierPlus.C:3231
 FourierPlus.C:3232
 FourierPlus.C:3233
 FourierPlus.C:3234
 FourierPlus.C:3235
 FourierPlus.C:3236
 FourierPlus.C:3237
 FourierPlus.C:3238
 FourierPlus.C:3239
 FourierPlus.C:3240
 FourierPlus.C:3241
 FourierPlus.C:3242
 FourierPlus.C:3243
 FourierPlus.C:3244
 FourierPlus.C:3245
 FourierPlus.C:3246
 FourierPlus.C:3247
 FourierPlus.C:3248
 FourierPlus.C:3249
 FourierPlus.C:3250
 FourierPlus.C:3251
 FourierPlus.C:3252
 FourierPlus.C:3253
 FourierPlus.C:3254
 FourierPlus.C:3255
 FourierPlus.C:3256
 FourierPlus.C:3257
 FourierPlus.C:3258
 FourierPlus.C:3259
 FourierPlus.C:3260
 FourierPlus.C:3261
 FourierPlus.C:3262
 FourierPlus.C:3263
 FourierPlus.C:3264
 FourierPlus.C:3265
 FourierPlus.C:3266
 FourierPlus.C:3267
 FourierPlus.C:3268
 FourierPlus.C:3269
 FourierPlus.C:3270
 FourierPlus.C:3271
 FourierPlus.C:3272
 FourierPlus.C:3273
 FourierPlus.C:3274
 FourierPlus.C:3275
 FourierPlus.C:3276
 FourierPlus.C:3277
 FourierPlus.C:3278
 FourierPlus.C:3279
 FourierPlus.C:3280
 FourierPlus.C:3281
 FourierPlus.C:3282
 FourierPlus.C:3283
 FourierPlus.C:3284
 FourierPlus.C:3285
 FourierPlus.C:3286
 FourierPlus.C:3287
 FourierPlus.C:3288
 FourierPlus.C:3289
 FourierPlus.C:3290
 FourierPlus.C:3291
 FourierPlus.C:3292
 FourierPlus.C:3293
 FourierPlus.C:3294
 FourierPlus.C:3295
 FourierPlus.C:3296
 FourierPlus.C:3297
 FourierPlus.C:3298
 FourierPlus.C:3299
 FourierPlus.C:3300
 FourierPlus.C:3301
 FourierPlus.C:3302
 FourierPlus.C:3303
 FourierPlus.C:3304
 FourierPlus.C:3305
 FourierPlus.C:3306
 FourierPlus.C:3307
 FourierPlus.C:3308
 FourierPlus.C:3309
 FourierPlus.C:3310
 FourierPlus.C:3311
 FourierPlus.C:3312
 FourierPlus.C:3313
 FourierPlus.C:3314
 FourierPlus.C:3315
 FourierPlus.C:3316
 FourierPlus.C:3317
 FourierPlus.C:3318
 FourierPlus.C:3319
 FourierPlus.C:3320
 FourierPlus.C:3321
 FourierPlus.C:3322
 FourierPlus.C:3323
 FourierPlus.C:3324
 FourierPlus.C:3325
 FourierPlus.C:3326
 FourierPlus.C:3327
 FourierPlus.C:3328
 FourierPlus.C:3329
 FourierPlus.C:3330
 FourierPlus.C:3331
 FourierPlus.C:3332
 FourierPlus.C:3333
 FourierPlus.C:3334
 FourierPlus.C:3335
 FourierPlus.C:3336
 FourierPlus.C:3337
 FourierPlus.C:3338
 FourierPlus.C:3339
 FourierPlus.C:3340
 FourierPlus.C:3341
 FourierPlus.C:3342
 FourierPlus.C:3343
 FourierPlus.C:3344
 FourierPlus.C:3345
 FourierPlus.C:3346
 FourierPlus.C:3347
 FourierPlus.C:3348
 FourierPlus.C:3349
 FourierPlus.C:3350
 FourierPlus.C:3351
 FourierPlus.C:3352
 FourierPlus.C:3353
 FourierPlus.C:3354
 FourierPlus.C:3355
 FourierPlus.C:3356
 FourierPlus.C:3357
 FourierPlus.C:3358
 FourierPlus.C:3359
 FourierPlus.C:3360
 FourierPlus.C:3361
 FourierPlus.C:3362
 FourierPlus.C:3363
 FourierPlus.C:3364
 FourierPlus.C:3365
 FourierPlus.C:3366
 FourierPlus.C:3367
 FourierPlus.C:3368
 FourierPlus.C:3369
 FourierPlus.C:3370
 FourierPlus.C:3371
 FourierPlus.C:3372
 FourierPlus.C:3373
 FourierPlus.C:3374
 FourierPlus.C:3375
 FourierPlus.C:3376
 FourierPlus.C:3377
 FourierPlus.C:3378
 FourierPlus.C:3379
 FourierPlus.C:3380
 FourierPlus.C:3381
 FourierPlus.C:3382
 FourierPlus.C:3383
 FourierPlus.C:3384
 FourierPlus.C:3385
 FourierPlus.C:3386
 FourierPlus.C:3387
 FourierPlus.C:3388
 FourierPlus.C:3389
 FourierPlus.C:3390
 FourierPlus.C:3391
 FourierPlus.C:3392
 FourierPlus.C:3393
 FourierPlus.C:3394
 FourierPlus.C:3395
 FourierPlus.C:3396
 FourierPlus.C:3397
 FourierPlus.C:3398
 FourierPlus.C:3399
 FourierPlus.C:3400
 FourierPlus.C:3401
 FourierPlus.C:3402
 FourierPlus.C:3403
 FourierPlus.C:3404
 FourierPlus.C:3405
 FourierPlus.C:3406
 FourierPlus.C:3407
 FourierPlus.C:3408
 FourierPlus.C:3409
 FourierPlus.C:3410
 FourierPlus.C:3411
 FourierPlus.C:3412
 FourierPlus.C:3413
 FourierPlus.C:3414
 FourierPlus.C:3415
 FourierPlus.C:3416
 FourierPlus.C:3417
 FourierPlus.C:3418
 FourierPlus.C:3419
 FourierPlus.C:3420
 FourierPlus.C:3421
 FourierPlus.C:3422
 FourierPlus.C:3423
 FourierPlus.C:3424
 FourierPlus.C:3425
 FourierPlus.C:3426
 FourierPlus.C:3427
 FourierPlus.C:3428
 FourierPlus.C:3429
 FourierPlus.C:3430
 FourierPlus.C:3431
 FourierPlus.C:3432
 FourierPlus.C:3433
 FourierPlus.C:3434
 FourierPlus.C:3435
 FourierPlus.C:3436
 FourierPlus.C:3437
 FourierPlus.C:3438
 FourierPlus.C:3439
 FourierPlus.C:3440
 FourierPlus.C:3441
 FourierPlus.C:3442
 FourierPlus.C:3443
 FourierPlus.C:3444
 FourierPlus.C:3445
 FourierPlus.C:3446
 FourierPlus.C:3447
 FourierPlus.C:3448
 FourierPlus.C:3449
 FourierPlus.C:3450
 FourierPlus.C:3451
 FourierPlus.C:3452
 FourierPlus.C:3453
 FourierPlus.C:3454
 FourierPlus.C:3455
 FourierPlus.C:3456
 FourierPlus.C:3457
 FourierPlus.C:3458
 FourierPlus.C:3459
 FourierPlus.C:3460
 FourierPlus.C:3461
 FourierPlus.C:3462
 FourierPlus.C:3463
 FourierPlus.C:3464
 FourierPlus.C:3465
 FourierPlus.C:3466
 FourierPlus.C:3467
 FourierPlus.C:3468
 FourierPlus.C:3469
 FourierPlus.C:3470
 FourierPlus.C:3471
 FourierPlus.C:3472
 FourierPlus.C:3473
 FourierPlus.C:3474
 FourierPlus.C:3475
 FourierPlus.C:3476
 FourierPlus.C:3477
 FourierPlus.C:3478
 FourierPlus.C:3479
 FourierPlus.C:3480
 FourierPlus.C:3481
 FourierPlus.C:3482
 FourierPlus.C:3483
 FourierPlus.C:3484
 FourierPlus.C:3485
 FourierPlus.C:3486
 FourierPlus.C:3487
 FourierPlus.C:3488
 FourierPlus.C:3489
 FourierPlus.C:3490
 FourierPlus.C:3491
 FourierPlus.C:3492
 FourierPlus.C:3493
 FourierPlus.C:3494
 FourierPlus.C:3495
 FourierPlus.C:3496
 FourierPlus.C:3497
 FourierPlus.C:3498
 FourierPlus.C:3499
 FourierPlus.C:3500
 FourierPlus.C:3501
 FourierPlus.C:3502
 FourierPlus.C:3503
 FourierPlus.C:3504
 FourierPlus.C:3505
 FourierPlus.C:3506
 FourierPlus.C:3507
 FourierPlus.C:3508
 FourierPlus.C:3509
 FourierPlus.C:3510
 FourierPlus.C:3511
 FourierPlus.C:3512
 FourierPlus.C:3513
 FourierPlus.C:3514
 FourierPlus.C:3515
 FourierPlus.C:3516
 FourierPlus.C:3517
 FourierPlus.C:3518
 FourierPlus.C:3519
 FourierPlus.C:3520
 FourierPlus.C:3521
 FourierPlus.C:3522
 FourierPlus.C:3523
 FourierPlus.C:3524
 FourierPlus.C:3525
 FourierPlus.C:3526
 FourierPlus.C:3527
 FourierPlus.C:3528
 FourierPlus.C:3529
 FourierPlus.C:3530
 FourierPlus.C:3531
 FourierPlus.C:3532
 FourierPlus.C:3533
 FourierPlus.C:3534
 FourierPlus.C:3535
 FourierPlus.C:3536
 FourierPlus.C:3537
 FourierPlus.C:3538
 FourierPlus.C:3539
 FourierPlus.C:3540
 FourierPlus.C:3541
 FourierPlus.C:3542
 FourierPlus.C:3543
 FourierPlus.C:3544
 FourierPlus.C:3545
 FourierPlus.C:3546
 FourierPlus.C:3547
 FourierPlus.C:3548
 FourierPlus.C:3549
 FourierPlus.C:3550
 FourierPlus.C:3551
 FourierPlus.C:3552
 FourierPlus.C:3553
 FourierPlus.C:3554
 FourierPlus.C:3555
 FourierPlus.C:3556
 FourierPlus.C:3557
 FourierPlus.C:3558
 FourierPlus.C:3559
 FourierPlus.C:3560
 FourierPlus.C:3561
 FourierPlus.C:3562
 FourierPlus.C:3563
 FourierPlus.C:3564
 FourierPlus.C:3565
 FourierPlus.C:3566
 FourierPlus.C:3567
 FourierPlus.C:3568
 FourierPlus.C:3569
 FourierPlus.C:3570
 FourierPlus.C:3571
 FourierPlus.C:3572
 FourierPlus.C:3573
 FourierPlus.C:3574
 FourierPlus.C:3575
 FourierPlus.C:3576
 FourierPlus.C:3577
 FourierPlus.C:3578
 FourierPlus.C:3579
 FourierPlus.C:3580
 FourierPlus.C:3581
 FourierPlus.C:3582
 FourierPlus.C:3583
 FourierPlus.C:3584
 FourierPlus.C:3585
 FourierPlus.C:3586
 FourierPlus.C:3587
 FourierPlus.C:3588
 FourierPlus.C:3589
 FourierPlus.C:3590
 FourierPlus.C:3591
 FourierPlus.C:3592
 FourierPlus.C:3593
 FourierPlus.C:3594
 FourierPlus.C:3595
 FourierPlus.C:3596
 FourierPlus.C:3597
 FourierPlus.C:3598
 FourierPlus.C:3599
 FourierPlus.C:3600
 FourierPlus.C:3601
 FourierPlus.C:3602
 FourierPlus.C:3603
 FourierPlus.C:3604
 FourierPlus.C:3605
 FourierPlus.C:3606
 FourierPlus.C:3607
 FourierPlus.C:3608
 FourierPlus.C:3609
 FourierPlus.C:3610
 FourierPlus.C:3611
 FourierPlus.C:3612
 FourierPlus.C:3613
 FourierPlus.C:3614
 FourierPlus.C:3615
 FourierPlus.C:3616
 FourierPlus.C:3617
 FourierPlus.C:3618
 FourierPlus.C:3619
 FourierPlus.C:3620
 FourierPlus.C:3621
 FourierPlus.C:3622
 FourierPlus.C:3623
 FourierPlus.C:3624
 FourierPlus.C:3625
 FourierPlus.C:3626
 FourierPlus.C:3627
 FourierPlus.C:3628
 FourierPlus.C:3629
 FourierPlus.C:3630
 FourierPlus.C:3631
 FourierPlus.C:3632
 FourierPlus.C:3633
 FourierPlus.C:3634
 FourierPlus.C:3635
 FourierPlus.C:3636
 FourierPlus.C:3637
 FourierPlus.C:3638
 FourierPlus.C:3639
 FourierPlus.C:3640
 FourierPlus.C:3641
 FourierPlus.C:3642
 FourierPlus.C:3643
 FourierPlus.C:3644
 FourierPlus.C:3645
 FourierPlus.C:3646
 FourierPlus.C:3647
 FourierPlus.C:3648
 FourierPlus.C:3649
 FourierPlus.C:3650
 FourierPlus.C:3651
 FourierPlus.C:3652
 FourierPlus.C:3653
 FourierPlus.C:3654
 FourierPlus.C:3655
 FourierPlus.C:3656
 FourierPlus.C:3657
 FourierPlus.C:3658
 FourierPlus.C:3659
 FourierPlus.C:3660
 FourierPlus.C:3661
 FourierPlus.C:3662
 FourierPlus.C:3663
 FourierPlus.C:3664
 FourierPlus.C:3665
 FourierPlus.C:3666
 FourierPlus.C:3667
 FourierPlus.C:3668
 FourierPlus.C:3669
 FourierPlus.C:3670
 FourierPlus.C:3671
 FourierPlus.C:3672
 FourierPlus.C:3673
 FourierPlus.C:3674
 FourierPlus.C:3675
 FourierPlus.C:3676
 FourierPlus.C:3677
 FourierPlus.C:3678
 FourierPlus.C:3679
 FourierPlus.C:3680
 FourierPlus.C:3681
 FourierPlus.C:3682
 FourierPlus.C:3683
 FourierPlus.C:3684
 FourierPlus.C:3685
 FourierPlus.C:3686
 FourierPlus.C:3687
 FourierPlus.C:3688
 FourierPlus.C:3689
 FourierPlus.C:3690
 FourierPlus.C:3691
 FourierPlus.C:3692
 FourierPlus.C:3693
 FourierPlus.C:3694
 FourierPlus.C:3695
 FourierPlus.C:3696
 FourierPlus.C:3697
 FourierPlus.C:3698
 FourierPlus.C:3699
 FourierPlus.C:3700
 FourierPlus.C:3701
 FourierPlus.C:3702
 FourierPlus.C:3703
 FourierPlus.C:3704
 FourierPlus.C:3705
 FourierPlus.C:3706
 FourierPlus.C:3707
 FourierPlus.C:3708
 FourierPlus.C:3709
 FourierPlus.C:3710
 FourierPlus.C:3711
 FourierPlus.C:3712
 FourierPlus.C:3713
 FourierPlus.C:3714
 FourierPlus.C:3715
 FourierPlus.C:3716
 FourierPlus.C:3717
 FourierPlus.C:3718
 FourierPlus.C:3719
 FourierPlus.C:3720
 FourierPlus.C:3721
 FourierPlus.C:3722
 FourierPlus.C:3723
 FourierPlus.C:3724
 FourierPlus.C:3725
 FourierPlus.C:3726
 FourierPlus.C:3727
 FourierPlus.C:3728
 FourierPlus.C:3729
 FourierPlus.C:3730
 FourierPlus.C:3731
 FourierPlus.C:3732
 FourierPlus.C:3733
 FourierPlus.C:3734
 FourierPlus.C:3735
 FourierPlus.C:3736
 FourierPlus.C:3737
 FourierPlus.C:3738
 FourierPlus.C:3739
 FourierPlus.C:3740
 FourierPlus.C:3741
 FourierPlus.C:3742
 FourierPlus.C:3743
 FourierPlus.C:3744
 FourierPlus.C:3745
 FourierPlus.C:3746
 FourierPlus.C:3747
 FourierPlus.C:3748
 FourierPlus.C:3749
 FourierPlus.C:3750
 FourierPlus.C:3751
 FourierPlus.C:3752
 FourierPlus.C:3753
 FourierPlus.C:3754
 FourierPlus.C:3755
 FourierPlus.C:3756
 FourierPlus.C:3757
 FourierPlus.C:3758
 FourierPlus.C:3759
 FourierPlus.C:3760
 FourierPlus.C:3761
 FourierPlus.C:3762
 FourierPlus.C:3763
 FourierPlus.C:3764
 FourierPlus.C:3765
 FourierPlus.C:3766
 FourierPlus.C:3767
 FourierPlus.C:3768
 FourierPlus.C:3769
 FourierPlus.C:3770
 FourierPlus.C:3771
 FourierPlus.C:3772
 FourierPlus.C:3773
 FourierPlus.C:3774
 FourierPlus.C:3775
 FourierPlus.C:3776
 FourierPlus.C:3777
 FourierPlus.C:3778
 FourierPlus.C:3779
 FourierPlus.C:3780
 FourierPlus.C:3781
 FourierPlus.C:3782
 FourierPlus.C:3783
 FourierPlus.C:3784
 FourierPlus.C:3785
 FourierPlus.C:3786
 FourierPlus.C:3787
 FourierPlus.C:3788
 FourierPlus.C:3789
 FourierPlus.C:3790
 FourierPlus.C:3791
 FourierPlus.C:3792
 FourierPlus.C:3793
 FourierPlus.C:3794
 FourierPlus.C:3795
 FourierPlus.C:3796
 FourierPlus.C:3797
 FourierPlus.C:3798
 FourierPlus.C:3799
 FourierPlus.C:3800
 FourierPlus.C:3801
 FourierPlus.C:3802
 FourierPlus.C:3803
 FourierPlus.C:3804
 FourierPlus.C:3805
 FourierPlus.C:3806
 FourierPlus.C:3807
 FourierPlus.C:3808
 FourierPlus.C:3809
 FourierPlus.C:3810
 FourierPlus.C:3811
 FourierPlus.C:3812
 FourierPlus.C:3813
 FourierPlus.C:3814
 FourierPlus.C:3815
 FourierPlus.C:3816
 FourierPlus.C:3817
 FourierPlus.C:3818
 FourierPlus.C:3819
 FourierPlus.C:3820
 FourierPlus.C:3821
 FourierPlus.C:3822
 FourierPlus.C:3823
 FourierPlus.C:3824
 FourierPlus.C:3825
 FourierPlus.C:3826
 FourierPlus.C:3827
 FourierPlus.C:3828
 FourierPlus.C:3829
 FourierPlus.C:3830
 FourierPlus.C:3831
 FourierPlus.C:3832
 FourierPlus.C:3833
 FourierPlus.C:3834
 FourierPlus.C:3835
 FourierPlus.C:3836
 FourierPlus.C:3837
 FourierPlus.C:3838
 FourierPlus.C:3839
 FourierPlus.C:3840
 FourierPlus.C:3841
 FourierPlus.C:3842
 FourierPlus.C:3843
 FourierPlus.C:3844
 FourierPlus.C:3845
 FourierPlus.C:3846
 FourierPlus.C:3847
 FourierPlus.C:3848
 FourierPlus.C:3849
 FourierPlus.C:3850
 FourierPlus.C:3851
 FourierPlus.C:3852
 FourierPlus.C:3853
 FourierPlus.C:3854
 FourierPlus.C:3855
 FourierPlus.C:3856
 FourierPlus.C:3857
 FourierPlus.C:3858
 FourierPlus.C:3859
 FourierPlus.C:3860
 FourierPlus.C:3861
 FourierPlus.C:3862
 FourierPlus.C:3863
 FourierPlus.C:3864
 FourierPlus.C:3865
 FourierPlus.C:3866
 FourierPlus.C:3867
 FourierPlus.C:3868
 FourierPlus.C:3869
 FourierPlus.C:3870
 FourierPlus.C:3871
 FourierPlus.C:3872
 FourierPlus.C:3873
 FourierPlus.C:3874
 FourierPlus.C:3875
 FourierPlus.C:3876
 FourierPlus.C:3877
 FourierPlus.C:3878
 FourierPlus.C:3879
 FourierPlus.C:3880
 FourierPlus.C:3881
 FourierPlus.C:3882
 FourierPlus.C:3883
 FourierPlus.C:3884
 FourierPlus.C:3885
 FourierPlus.C:3886
 FourierPlus.C:3887
 FourierPlus.C:3888
 FourierPlus.C:3889
 FourierPlus.C:3890
 FourierPlus.C:3891
 FourierPlus.C:3892
 FourierPlus.C:3893
 FourierPlus.C:3894
 FourierPlus.C:3895
 FourierPlus.C:3896
 FourierPlus.C:3897
 FourierPlus.C:3898
 FourierPlus.C:3899
 FourierPlus.C:3900
 FourierPlus.C:3901
 FourierPlus.C:3902
 FourierPlus.C:3903
 FourierPlus.C:3904
 FourierPlus.C:3905
 FourierPlus.C:3906
 FourierPlus.C:3907
 FourierPlus.C:3908
 FourierPlus.C:3909
 FourierPlus.C:3910
 FourierPlus.C:3911
 FourierPlus.C:3912
 FourierPlus.C:3913
 FourierPlus.C:3914
 FourierPlus.C:3915
 FourierPlus.C:3916
 FourierPlus.C:3917
 FourierPlus.C:3918
 FourierPlus.C:3919
 FourierPlus.C:3920
 FourierPlus.C:3921
 FourierPlus.C:3922
 FourierPlus.C:3923
 FourierPlus.C:3924
 FourierPlus.C:3925
 FourierPlus.C:3926
 FourierPlus.C:3927
 FourierPlus.C:3928
 FourierPlus.C:3929
 FourierPlus.C:3930
 FourierPlus.C:3931
 FourierPlus.C:3932
 FourierPlus.C:3933
 FourierPlus.C:3934
 FourierPlus.C:3935
 FourierPlus.C:3936
 FourierPlus.C:3937
 FourierPlus.C:3938
 FourierPlus.C:3939
 FourierPlus.C:3940
 FourierPlus.C:3941
 FourierPlus.C:3942
 FourierPlus.C:3943
 FourierPlus.C:3944
 FourierPlus.C:3945
 FourierPlus.C:3946
 FourierPlus.C:3947
 FourierPlus.C:3948
 FourierPlus.C:3949
 FourierPlus.C:3950
 FourierPlus.C:3951
 FourierPlus.C:3952
 FourierPlus.C:3953
 FourierPlus.C:3954
 FourierPlus.C:3955
 FourierPlus.C:3956
 FourierPlus.C:3957
 FourierPlus.C:3958
 FourierPlus.C:3959
 FourierPlus.C:3960
 FourierPlus.C:3961
 FourierPlus.C:3962
 FourierPlus.C:3963
 FourierPlus.C:3964
 FourierPlus.C:3965
 FourierPlus.C:3966
 FourierPlus.C:3967
 FourierPlus.C:3968
 FourierPlus.C:3969
 FourierPlus.C:3970
 FourierPlus.C:3971
 FourierPlus.C:3972
 FourierPlus.C:3973
 FourierPlus.C:3974
 FourierPlus.C:3975
 FourierPlus.C:3976
 FourierPlus.C:3977
 FourierPlus.C:3978
 FourierPlus.C:3979
 FourierPlus.C:3980
 FourierPlus.C:3981
 FourierPlus.C:3982
 FourierPlus.C:3983
 FourierPlus.C:3984
 FourierPlus.C:3985
 FourierPlus.C:3986
 FourierPlus.C:3987
 FourierPlus.C:3988
 FourierPlus.C:3989
 FourierPlus.C:3990
 FourierPlus.C:3991
 FourierPlus.C:3992
 FourierPlus.C:3993
 FourierPlus.C:3994
 FourierPlus.C:3995
 FourierPlus.C:3996
 FourierPlus.C:3997
 FourierPlus.C:3998
 FourierPlus.C:3999
 FourierPlus.C:4000
 FourierPlus.C:4001
 FourierPlus.C:4002
 FourierPlus.C:4003
 FourierPlus.C:4004
 FourierPlus.C:4005
 FourierPlus.C:4006
 FourierPlus.C:4007
 FourierPlus.C:4008
 FourierPlus.C:4009
 FourierPlus.C:4010
 FourierPlus.C:4011
 FourierPlus.C:4012
 FourierPlus.C:4013
 FourierPlus.C:4014
 FourierPlus.C:4015
 FourierPlus.C:4016
 FourierPlus.C:4017
 FourierPlus.C:4018
 FourierPlus.C:4019
 FourierPlus.C:4020
 FourierPlus.C:4021
 FourierPlus.C:4022
 FourierPlus.C:4023
 FourierPlus.C:4024
 FourierPlus.C:4025
 FourierPlus.C:4026
 FourierPlus.C:4027
 FourierPlus.C:4028
 FourierPlus.C:4029
 FourierPlus.C:4030
 FourierPlus.C:4031
 FourierPlus.C:4032
 FourierPlus.C:4033
 FourierPlus.C:4034
 FourierPlus.C:4035
 FourierPlus.C:4036
 FourierPlus.C:4037
 FourierPlus.C:4038
 FourierPlus.C:4039
 FourierPlus.C:4040
 FourierPlus.C:4041
 FourierPlus.C:4042
 FourierPlus.C:4043
 FourierPlus.C:4044
 FourierPlus.C:4045
 FourierPlus.C:4046
 FourierPlus.C:4047
 FourierPlus.C:4048
 FourierPlus.C:4049
 FourierPlus.C:4050
 FourierPlus.C:4051
 FourierPlus.C:4052
 FourierPlus.C:4053
 FourierPlus.C:4054
 FourierPlus.C:4055
 FourierPlus.C:4056
 FourierPlus.C:4057
 FourierPlus.C:4058
 FourierPlus.C:4059
 FourierPlus.C:4060
 FourierPlus.C:4061
 FourierPlus.C:4062
 FourierPlus.C:4063
 FourierPlus.C:4064
 FourierPlus.C:4065
 FourierPlus.C:4066
 FourierPlus.C:4067
 FourierPlus.C:4068
 FourierPlus.C:4069
 FourierPlus.C:4070
 FourierPlus.C:4071
 FourierPlus.C:4072
 FourierPlus.C:4073
 FourierPlus.C:4074
 FourierPlus.C:4075
 FourierPlus.C:4076
 FourierPlus.C:4077
 FourierPlus.C:4078
 FourierPlus.C:4079
 FourierPlus.C:4080
 FourierPlus.C:4081
 FourierPlus.C:4082
 FourierPlus.C:4083
 FourierPlus.C:4084
 FourierPlus.C:4085
 FourierPlus.C:4086
 FourierPlus.C:4087
 FourierPlus.C:4088
 FourierPlus.C:4089
 FourierPlus.C:4090
 FourierPlus.C:4091
 FourierPlus.C:4092
 FourierPlus.C:4093
 FourierPlus.C:4094
 FourierPlus.C:4095
 FourierPlus.C:4096
 FourierPlus.C:4097
 FourierPlus.C:4098
 FourierPlus.C:4099
 FourierPlus.C:4100
 FourierPlus.C:4101
 FourierPlus.C:4102
 FourierPlus.C:4103
 FourierPlus.C:4104
 FourierPlus.C:4105
 FourierPlus.C:4106
 FourierPlus.C:4107
 FourierPlus.C:4108
 FourierPlus.C:4109
 FourierPlus.C:4110
 FourierPlus.C:4111
 FourierPlus.C:4112
 FourierPlus.C:4113
 FourierPlus.C:4114
 FourierPlus.C:4115
 FourierPlus.C:4116
 FourierPlus.C:4117
 FourierPlus.C:4118
 FourierPlus.C:4119
 FourierPlus.C:4120
 FourierPlus.C:4121
 FourierPlus.C:4122
 FourierPlus.C:4123
 FourierPlus.C:4124
 FourierPlus.C:4125
 FourierPlus.C:4126
 FourierPlus.C:4127
 FourierPlus.C:4128
 FourierPlus.C:4129
 FourierPlus.C:4130
 FourierPlus.C:4131
 FourierPlus.C:4132
 FourierPlus.C:4133
 FourierPlus.C:4134
 FourierPlus.C:4135
 FourierPlus.C:4136
 FourierPlus.C:4137
 FourierPlus.C:4138
 FourierPlus.C:4139
 FourierPlus.C:4140
 FourierPlus.C:4141
 FourierPlus.C:4142
 FourierPlus.C:4143
 FourierPlus.C:4144
 FourierPlus.C:4145
 FourierPlus.C:4146
 FourierPlus.C:4147
 FourierPlus.C:4148
 FourierPlus.C:4149
 FourierPlus.C:4150
 FourierPlus.C:4151
 FourierPlus.C:4152
 FourierPlus.C:4153
 FourierPlus.C:4154
 FourierPlus.C:4155
 FourierPlus.C:4156
 FourierPlus.C:4157
 FourierPlus.C:4158
 FourierPlus.C:4159
 FourierPlus.C:4160
 FourierPlus.C:4161
 FourierPlus.C:4162
 FourierPlus.C:4163
 FourierPlus.C:4164
 FourierPlus.C:4165
 FourierPlus.C:4166
 FourierPlus.C:4167
 FourierPlus.C:4168
 FourierPlus.C:4169