ROOT logo
/*
  several function used for PbPb combined spectra
  Blast Wave is also implemented here
  further documentation will come
  
  author: Roberto Preghenella
  email : preghenella@bo.infn.it
*/


/*****************************************************************/
/* BOLTZMANN
/*****************************************************************/

Double_t
Boltzmann_Func(const Double_t *x, const Double_t *p)
{
  /* dN/dpt */
  
  Double_t pt = x[0];
  Double_t mass = p[0];
  Double_t mt = TMath::Sqrt(pt * pt + mass * mass);
  Double_t T = p[1];
  Double_t norm = p[2];

  return pt * norm * mt * TMath::Exp(-mt / T);
}

TF1 *
Boltzmann(const Char_t *name, Double_t mass, Double_t T = 0.1, Double_t norm = 1.)
{
  
  TF1 *fBoltzmann = new TF1(name, Boltzmann_Func, 0., 10., 3);
  fBoltzmann->SetParameters(mass, T, norm);
  fBoltzmann->SetParNames("mass", "T", "norm");
  fBoltzmann->FixParameter(0, mass);
  return fBoltzmann;
}

/*****************************************************************/
/* LEVY-TSALLIS */
/*****************************************************************/

Double_t
LevyTsallis_Func(const Double_t *x, const Double_t *p)
{
  /* dN/dpt */
  
  Double_t pt = x[0];
  Double_t mass = p[0];
  Double_t mt = TMath::Sqrt(pt * pt + mass * mass);
  Double_t n = p[1];
  Double_t C = p[2];
  Double_t norm = p[3];

  Double_t part1 = (n - 1.) * (n - 2.);
  Double_t part2 = n * C * (n * C + mass * (n - 2.));
  Double_t part3 = part1 / part2;
  Double_t part4 = 1. + (mt - mass) / n / C;
  Double_t part5 = TMath::Power(part4, -n);
  return pt * norm * part3 * part5;
}

TF1 *
LevyTsallis(const Char_t *name, Double_t mass, Double_t n = 5., Double_t C = 0.1, Double_t norm = 1.)
{
  
  TF1 *fLevyTsallis = new TF1(name, LevyTsallis_Func, 0., 10., 4);
  fLevyTsallis->SetParameters(mass, n, C, norm);
  fLevyTsallis->SetParNames("mass", "n", "C", "norm");
  fLevyTsallis->FixParameter(0, mass);
  fLevyTsallis->SetParLimits(1, 1.e-3, 1.e3);
  fLevyTsallis->SetParLimits(2, 1.e-3, 1.e3);
  fLevyTsallis->SetParLimits(3, 1.e-6, 1.e6);
  return fLevyTsallis;
}

/*****************************************************************/
/* BOLTZMANN-GIBBS BLAST-WAVE */
/*****************************************************************/

static TF1 *fBGBlastWave_Integrand = NULL;
static TF1 *fBGBlastWave_Integrand_num = NULL;
static TF1 *fBGBlastWave_Integrand_den = NULL;
Double_t
BGBlastWave_Integrand(const Double_t *x, const Double_t *p)
{
  
  /* 
     x[0] -> r (radius)
     p[0] -> mT (transverse mass)
     p[1] -> pT (transverse momentum)
     p[2] -> beta_max (surface velocity)
     p[3] -> T (freezout temperature)
     p[4] -> n (velocity profile)
  */
  
  Double_t r = x[0];
  Double_t mt = p[0];
  Double_t pt = p[1];
  Double_t beta_max = p[2];
  Double_t temp_1 = 1. / p[3];
  Double_t n = p[4];

  Double_t beta = beta_max * TMath::Power(r, n);
  if (beta > 0.9999999999999999) beta = 0.9999999999999999;
  Double_t rho = TMath::ATanH(beta);
  Double_t argI0 = pt * TMath::SinH(rho) * temp_1;
  if (argI0 > 700.) argI0 = 700.;
  Double_t argK1 = mt * TMath::CosH(rho) * temp_1;
  //  if (argI0 > 100 || argI0 < -100)
  //    printf("r=%f, pt=%f, beta_max=%f, temp=%f, n=%f, mt=%f, beta=%f, rho=%f, argI0=%f, argK1=%f\n", r, pt, beta_max, 1. / temp_1, n, mt, beta, rho, argI0, argK1);
  return r * mt * TMath::BesselI0(argI0) * TMath::BesselK1(argK1);
  
}

Double_t
BGBlastWave_Func(const Double_t *x, const Double_t *p)
{
  /* dN/dpt */
  
  Double_t pt = x[0];
  Double_t mass = p[0];
  Double_t mt = TMath::Sqrt(pt * pt + mass * mass);
  Double_t beta_max = p[1];
  Double_t temp = p[2];
  Double_t n = p[3];
  Double_t norm = p[4];
  
  if (!fBGBlastWave_Integrand)
    fBGBlastWave_Integrand = new TF1("fBGBlastWave_Integrand", BGBlastWave_Integrand, 0., 1., 5);
  fBGBlastWave_Integrand->SetParameters(mt, pt, beta_max, temp, n);
  Double_t integral = fBGBlastWave_Integrand->Integral(0., 1., (Double_t *)0, 1.e-6);
  return norm * pt * integral;
}

Double_t
BGBlastWaveRatio_Func(const Double_t *x, const Double_t *p)
{
  /* dN/dpt */
  
  Double_t pt = x[0];
  Double_t mass = p[0];
  Double_t mt = TMath::Sqrt(pt * pt + mass * mass);
  Double_t beta_max_num = p[1];
  Double_t temp_num = p[2];
  Double_t n_num = p[3];
  Double_t norm_num = p[4];
  Double_t beta_max_den = p[5];
  Double_t temp_den = p[6];
  Double_t n_den = p[7];
  Double_t norm_den = p[8];
  
  if (!fBGBlastWave_Integrand_num)
    fBGBlastWave_Integrand_num = new TF1("fBGBlastWave_Integrand_num", BGBlastWave_Integrand, 0., 1., 5);
  fBGBlastWave_Integrand_num->SetParameters(mt, pt, beta_max_num, temp_num, n_num);
  Double_t integral_num = fBGBlastWave_Integrand_num->Integral(0., 1.);

  if (!fBGBlastWave_Integrand_den)
    fBGBlastWave_Integrand_den = new TF1("fBGBlastWave_Integrand_den", BGBlastWave_Integrand, 0., 1., 5);
  fBGBlastWave_Integrand_den->SetParameters(mt, pt, beta_max_den, temp_den, n_den);
  Double_t integral_den = fBGBlastWave_Integrand_den->Integral(0., 1.);

  return (norm_num / norm_den) * (integral_num / integral_den);
}

Double_t
BGBlastWaveParticleRatio_Func(const Double_t *x, const Double_t *p)
{
  /* dN/dpt */
  
  Double_t pt = x[0];
  Double_t mass_num = p[0];
  Double_t mass_den = p[1];
  Double_t mt_num = TMath::Sqrt(pt * pt + mass_num * mass_num);
  Double_t mt_den = TMath::Sqrt(pt * pt + mass_den * mass_den);
  Double_t beta_max = p[2];
  Double_t temp = p[3];
  Double_t n = p[4];
  Double_t norm_num = p[5];
  Double_t norm_den = p[6];
  
  if (!fBGBlastWave_Integrand_num)
    fBGBlastWave_Integrand_num = new TF1("fBGBlastWave_Integrand_num", BGBlastWave_Integrand, 0., 1., 5);
  fBGBlastWave_Integrand_num->SetParameters(mt_num, pt, beta_max, temp, n);
  Double_t integral_num = fBGBlastWave_Integrand_num->Integral(0., 1.);
  
  if (!fBGBlastWave_Integrand_den)
    fBGBlastWave_Integrand_den = new TF1("fBGBlastWave_Integrand_den", BGBlastWave_Integrand, 0., 1., 5);
  fBGBlastWave_Integrand_den->SetParameters(mt_den, pt, beta_max, temp, n);
  Double_t integral_den = fBGBlastWave_Integrand_den->Integral(0., 1.);

  return (norm_num / norm_den) * (integral_num / integral_den);
}

Double_t
BGBlastWave_Func_OneOverPt(const Double_t *x, const Double_t *p)
{
  /* 1/pt dN/dpt */
  
  Double_t pt = x[0];
  Double_t mass = p[0];
  Double_t mt = TMath::Sqrt(pt * pt + mass * mass);
  Double_t beta_max = p[1];
  Double_t temp = p[2];
  Double_t n = p[3];
  Double_t norm = p[4];
  
  if (!fBGBlastWave_Integrand)
    fBGBlastWave_Integrand = new TF1("fBGBlastWave_Integrand", BGBlastWave_Integrand, 0., 1., 5);
  fBGBlastWave_Integrand->SetParameters(mt, pt, beta_max, temp, n);
  Double_t integral = fBGBlastWave_Integrand->Integral(0., 1., (Double_t *)0, 1.e-3);

  return norm * integral;
}

TF1 *
BGBlastWave(const Char_t *name, Double_t mass, Double_t beta_max = 0.9, Double_t temp = 0.1, Double_t n = 1., Double_t norm = 1.e6)
{
  
  TF1 *fBGBlastWave = new TF1(name, BGBlastWave_Func, 0., 10., 5);
  fBGBlastWave->SetParameters(mass, beta_max, temp, n, norm);
  fBGBlastWave->SetParNames("mass", "beta_max", "T", "n", "norm");
  fBGBlastWave->FixParameter(0, mass);
  fBGBlastWave->SetParLimits(1, 0.01, 0.99);
  fBGBlastWave->SetParLimits(2, 0.01, 1.);
  fBGBlastWave->SetParLimits(3, 0.01, 50.);
  return fBGBlastWave;
}

TF1 *
BGBlastWaveRatio(const Char_t *name, Double_t mass, Double_t beta_max = 0.9, Double_t temp = 0.1, Double_t n = 1., Double_t norm = 1.e6)
{
  
  TF1 *fBGBlastWave = new TF1(name, BGBlastWaveRatio_Func, 0., 10., 9);
  fBGBlastWave->SetParameters(mass, beta_max, temp, n, norm, beta_max, temp, n, norm);
  fBGBlastWave->SetParNames("mass", "beta_max_num", "T_num", "n_num", "norm_num", "beta_max_den", "T_den", "n_den", "norm_den");
  fBGBlastWave->FixParameter(0, mass);
  fBGBlastWave->SetParLimits(1, 0.01, 0.99);
  fBGBlastWave->SetParLimits(2, 0.01, 1.);
  fBGBlastWave->SetParLimits(3, 0.01, 10.);
  fBGBlastWave->SetParLimits(5, 0.01, 0.99);
  fBGBlastWave->SetParLimits(6, 0.01, 1.);
  fBGBlastWave->SetParLimits(7, 0.01, 10.);
  return fBGBlastWave;
}

TF1 *
BGBlastWaveParticleRatio(const Char_t *name, Double_t mass_num, Double_t mass_den, Double_t beta_max = 0.9, Double_t temp = 0.1, Double_t n = 1., Double_t norm_num = 1.e6, Double_t norm_den = 1.e6)
{
  
  TF1 *fBGBlastWave = new TF1(name, BGBlastWaveParticleRatio_Func, 0., 10., 7);
  fBGBlastWave->SetParameters(mass_num, mass_den, beta_max, temp, n, norm_num, norm_den);
  fBGBlastWave->SetParNames("mass_num", "mass_den", "beta_max", "T", "n", "norm_num", "norm_den");
  fBGBlastWave->FixParameter(0, mass_num);
  fBGBlastWave->FixParameter(1, mass_den);
  fBGBlastWave->SetParLimits(2, 0.01, 0.99);
  fBGBlastWave->SetParLimits(3, 0.01, 1.);
  fBGBlastWave->SetParLimits(4, 0.01, 10.);
  return fBGBlastWave;
}

TF1 *BGBlastWave_OneOverPT(const Char_t *name, Double_t mass, Double_t beta_max = 0.9, Double_t temp = 0.1, Double_t n = 1., Double_t norm = 1.e6)
{
  
  TF1 *fBGBlastWave = new TF1(name, BGBlastWave_Func_OneOverPt, 0., 10., 5);
  fBGBlastWave->SetParameters(mass, beta_max, temp, n, norm);
  fBGBlastWave->SetParNames("mass", "beta_max", "T", "n", "norm");
  fBGBlastWave->FixParameter(0, mass);
  fBGBlastWave->SetParLimits(1, 0.01, 0.99);
  fBGBlastWave->SetParLimits(2, 0.01, 1.);
  fBGBlastWave->SetParLimits(3, 0.01, 50.);
  return fBGBlastWave;
}

/*****************************************************************/
/* TSALLIS BLAST-WAVE */
/*****************************************************************/

static TF1 *fTsallisBlastWave_Integrand_r = NULL;
Double_t
TsallisBlastWave_Integrand_r(const Double_t *x, const Double_t *p)
{
  /* 
     x[0] -> r (radius)
     p[0] -> mT (transverse mass)
     p[1] -> pT (transverse momentum)
     p[2] -> beta_max (surface velocity)
     p[3] -> T (freezout temperature)
     p[4] -> n (velocity profile)
     p[5] -> q
     p[6] -> y (rapidity)
     p[7] -> phi (azimuthal angle)
  */
  
  Double_t r = x[0];
  Double_t mt = p[0];
  Double_t pt = p[1];
  Double_t beta_max = p[2];
  Double_t temp_1 = 1. / p[3];
  Double_t n = p[4];
  Double_t q = p[5];
  Double_t y = p[6];
  Double_t phi = p[7];

  if (q <= 1.) return r;

  Double_t beta = beta_max * TMath::Power(r, n);
  Double_t rho = TMath::ATanH(beta);
  
  Double_t part1 = mt * TMath::CosH(y) * TMath::CosH(rho);
  Double_t part2 = pt * TMath::SinH(rho) * TMath::Cos(phi);
  Double_t part3 = part1 - part2;
  Double_t part4 = 1 + (q - 1.) * temp_1 * part3;
  Double_t expo = -1. / (q - 1.);
  //  printf("part1=%f, part2=%f, part3=%f, part4=%f, expo=%f\n", part1, part2, part3, part4, expo);
  Double_t part5 = TMath::Power(part4, expo);

  return r * part5;
}

static TF1 *fTsallisBlastWave_Integrand_phi = NULL;
Double_t
TsallisBlastWave_Integrand_phi(const Double_t *x, const Double_t *p)
{
  /* 
     x[0] -> phi (azimuthal angle)
  */
  
  Double_t phi = x[0];
  fTsallisBlastWave_Integrand_r->SetParameter(7, phi);
  Double_t integral = fTsallisBlastWave_Integrand_r->Integral(0., 1.);
  return integral;
}

static TF1 *fTsallisBlastWave_Integrand_y = NULL;
Double_t
TsallisBlastWave_Integrand_y(const Double_t *x, const Double_t *p)
{
  /* 
     x[0] -> y (rapidity)
  */

  Double_t y = x[0];
  fTsallisBlastWave_Integrand_r->SetParameter(6, y);
  Double_t integral = fTsallisBlastWave_Integrand_phi->Integral(-TMath::Pi(), TMath::Pi());
  return TMath::CosH(y) * integral;
}

Double_t
TsallisBlastWave_Func(const Double_t *x, const Double_t *p)
{
  /* dN/dpt */
  
  Double_t pt = x[0];
  Double_t mass = p[0];
  Double_t mt = TMath::Sqrt(pt * pt + mass * mass);
  Double_t beta_max = p[1];
  Double_t temp = p[2];
  Double_t n = p[3];
  Double_t q = p[4];
  Double_t norm = p[5];

  if (!fTsallisBlastWave_Integrand_r)
    fTsallisBlastWave_Integrand_r = new TF1("fTsallisBlastWave_Integrand_r", TsallisBlastWave_Integrand_r, 0., 1., 8);
  if (!fTsallisBlastWave_Integrand_phi)
    fTsallisBlastWave_Integrand_phi = new TF1("fTsallisBlastWave_Integrand_phi", TsallisBlastWave_Integrand_phi, -TMath::Pi(), TMath::Pi(), 0);
  if (!fTsallisBlastWave_Integrand_y)
    fTsallisBlastWave_Integrand_y = new TF1("fTsallisBlastWave_Integrand_y", TsallisBlastWave_Integrand_y, -0.5, 0.5, 0);

  fTsallisBlastWave_Integrand_r->SetParameters(mt, pt, beta_max, temp, n, q, 0., 0.);
  Double_t integral = fTsallisBlastWave_Integrand_y->Integral(-0.5, 0.5);
  return norm * pt * integral;
}

TF1 *
TsallisBlastWave(const Char_t *name, Double_t mass, Double_t beta_max = 0.9, Double_t temp = 0.1, Double_t n = 1., Double_t q = 2., Double_t norm = 1.e6)
{
  
  TF1 *fTsallisBlastWave = new TF1(name, TsallisBlastWave_Func, 0., 10., 6);
  fTsallisBlastWave->SetParameters(mass, beta_max, temp, n, q, norm);
  fTsallisBlastWave->SetParNames("mass", "beta_max", "T", "n", "q", "norm");
  fTsallisBlastWave->FixParameter(0, mass);
  fTsallisBlastWave->SetParLimits(1, 0.01, 0.99);
  fTsallisBlastWave->SetParLimits(2, 0.01, 1.);
  fTsallisBlastWave->SetParLimits(3, 0.1, 10.);
  fTsallisBlastWave->SetParLimits(4, 1., 10.);
  return fTsallisBlastWave;
}

/*****************************************************************/
/*****************************************************************/
/*****************************************************************/


TF1 *
BGBlastWave_SingleFit(TH1 *h, Double_t mass, Option_t *opt = "")
{

  TF1 *f = BGBlastWave(Form("fBGBW_%s", h->GetName()), mass);
  h->Fit(f);
  h->Fit(f);
  h->Fit(f, opt);
  return f;
  
}

Int_t nBW;
TF1 *fBGBW[1000];
TF1 *fBGBWratio[1000];
TGraphErrors *gBW[1000];

TObjArray *
BGBlastWave_GlobalFit(TObjArray *data, Double_t *mass, Double_t profile = 0.5, Bool_t computeCont = kFALSE, Bool_t fixProfile = kFALSE)
{

  /* get data */
  Int_t ndf = 0;
  nBW = data->GetEntries();
  for (Int_t idata = 0; idata < nBW; idata++) {
    gBW[idata] = (TGraphErrors *)data->At(idata);
    gBW[idata]->SetName(Form("gBW%d", idata));
    ndf += gBW[idata]->GetN();
  }

  /* init BG blast-wave functions */
  for (Int_t idata = 0; idata < nBW; idata++) {
    printf("init BG-BlastWave function #%d: mass = %f\n", idata, mass[idata]);
    fBGBW[idata] = BGBlastWave(Form("fBGBW%d", idata), mass[idata]);
  }

  if (computeCont)
    printf("-> compute contours requested\n");

  /* display data */
  TCanvas *cBW = new TCanvas("cBW");
  cBW->Divide(nBW, 1);
  for (Int_t idata = 0; idata < nBW; idata++) {
    cBW->cd(idata + 1);
    gBW[idata]->Draw("ap*");
  }
  cBW->Update();

  /* init minuit: nBW normalizations + 3 (beta, T, n) BG-BlastWave params */
  const Int_t nbwpars = 3;
  const Int_t nfitpars = nBW + nbwpars;
  TMinuit *minuit = new TMinuit(nfitpars);
  minuit->SetFCN(BGBlastWave_FCN);
  Double_t arglist[10];
  Int_t ierflg = 0;
  arglist[0] = 1;
  minuit->mnexcm("SET ERR", arglist, 1, ierflg);
  for (Int_t idata = 0; idata < nBW; idata++) {
    minuit->mnparm(idata, Form("norm%d", idata), 1.e6, 1., 0., 0., ierflg);
    ndf--;
  }
  //  minuit->mnparm(nBW + 0, "<beta>", 0.55, 0.01, 0., 1., ierflg);
  //  minuit->mnparm(nBW + 1, "T", 0.14, 0.01, 0., 1., ierflg);
  //  minuit->mnparm(nBW + 2, "n", profile, 0.1, 0., 10., ierflg);
  
  minuit->mnparm(nBW + 0, "<beta>", 0.7, 0.01, 0.2, 0.7, ierflg);
  minuit->mnparm(nBW + 1, "T", 0.07, 0.001, 0.07, 0.2, ierflg);
  minuit->mnparm(nBW + 2, "n", profile, 0.1, 0.6, 5., ierflg);

  ndf -= 3;
  if (fixProfile) {
    minuit->FixParameter(nBW + 2);
    ndf++;
  }

  /* set strategy */
  arglist[0] = 1;
  minuit->mnexcm("SET STRATEGY", arglist, 1, ierflg);

  /* start MIGRAD minimization */
  arglist[0] = 500000;
  arglist[1] = 1.;
  minuit->mnexcm("MIGRAD", arglist, 2, ierflg);

  /* set strategy */
  arglist[0] = 2;
  minuit->mnexcm("SET STRATEGY", arglist, 1, ierflg);

  /* start MIGRAD minimization */
  arglist[0] = 500000;
  arglist[1] = 1.;
  minuit->mnexcm("MIGRAD", arglist, 2, ierflg);

  /* start IMPROVE minimization */
  arglist[0] = 500000;
  minuit->mnexcm("IMPROVE", arglist, 1, ierflg);

  /* start MINOS */
  arglist[0] = 500000;
  arglist[1] = nBW + 1;
  arglist[2] = nBW + 2;
  arglist[3] = nBW + 3;
  minuit->mnexcm("MINOS", arglist, 4, ierflg);

  /* print results */
  Double_t amin,edm,errdef;
  Int_t nvpar,nparx,icstat;
  minuit->mnstat(amin, edm, errdef, nvpar, nparx, icstat);
  minuit->mnprin(4, amin);

  /* get parameters */
  Double_t beta, betae, betaeplus, betaeminus, betagcc, temp, tempe, tempeplus, tempeminus, tempgcc, prof, profe, profeplus, profeminus, profgcc;
  minuit->GetParameter(nBW + 0, beta, betae);
  minuit->mnerrs(nBW + 0, betaeplus, betaeminus, betae, betagcc);
  minuit->GetParameter(nBW + 1, temp, tempe);
  minuit->mnerrs(nBW + 1, tempeplus, tempeminus, tempe, tempgcc);
  minuit->GetParameter(nBW + 2, prof, profe);
  minuit->mnerrs(nBW + 2, profeplus, profeminus, profe, profgcc);
  Double_t beta_max = 0.5 * (2. + prof) * beta;
  Double_t norm[1000], norme[1000];
  for (Int_t idata = 0; idata < nBW; idata++)
    minuit->GetParameter(idata, norm[idata], norme[idata]);

  /* printout */
  printf("[x] *********************************\n");
  printf("[x] beta_max = %f\n", beta_max);
  printf("[x] <beta>   = %f +- %f (e+ = %f, e- = %f)\n", beta, betae, betaeplus, betaeminus);
  printf("[x] T        = %f +- %f (e+ = %f, e- = %f)\n", temp, tempe, tempeplus, tempeminus);
  printf("[x] n        = %f +- %f (e+ = %f, e- = %f)\n", prof, profe, profeplus, profeminus);
  printf("[x] chi2     = %f\n", amin);
  printf("[x] ndf      = %f\n", ndf);

  /* 1-sigma contour */
  minuit->SetErrorDef(1);
  TGraph *gCont1 = NULL;
  if (computeCont) gCont1 = (TGraph *) minuit->Contour(50, nBW + 0, nBW + 1);
  if (gCont1) gCont1->SetName("gCont1");

  /* 2-sigma contour */
  minuit->SetErrorDef(4);
  TGraph *gCont2 = NULL;
  //  if (computeCont) gCont2 = (TGraph *) minuit->Contour(50, nBW + 0, nBW + 1);
  if (gCont2) gCont2->SetName("gCont2");

  /* display fits */
  for (Int_t idata = 0; idata < nBW; idata++) {
    cBW->cd(idata + 1);
    fBGBW[idata]->SetParameter(4, norm[idata]);
    fBGBW[idata]->SetParameter(1, beta_max);
    fBGBW[idata]->SetParameter(2, temp);
    fBGBW[idata]->SetParameter(3, prof);
    fBGBW[idata]->Draw("same");
  }
  cBW->Update();

  /* histo params */
  TH1D *hBW = new TH1D("hBW", "", 4, 0., 4.);
  hBW->SetBinContent(1, beta);
  hBW->SetBinError(1, betae);
  hBW->SetBinContent(2, temp);
  hBW->SetBinError(2, tempe);
  hBW->SetBinContent(3, prof);
  hBW->SetBinError(3, profe);
  hBW->SetBinContent(4, amin/ndf);

  /* BW graph */
  TGraphAsymmErrors *gBetaT = new TGraphAsymmErrors();
  gBetaT->SetName("gBetaT");
  gBetaT->SetPoint(0, beta, temp);
  gBetaT->SetPointEXlow(0, TMath::Abs(betaeminus));
  gBetaT->SetPointEXhigh(0, TMath::Abs(betaeplus));
  gBetaT->SetPointEYlow(0, TMath::Abs(tempeminus));
  gBetaT->SetPointEYhigh(0, TMath::Abs(tempeplus));

  /* prepare output array */
  TObjArray *outoa = new TObjArray();
  for (Int_t idata = 0; idata < nBW; idata++) {
    outoa->Add(gBW[idata]);
    outoa->Add(fBGBW[idata]);
  }
  outoa->Add(cBW);
  outoa->Add(hBW);
  outoa->Add(gBetaT);
  if (gCont1) outoa->Add(gCont1);
  if (gCont2) outoa->Add(gCont2);

  return outoa;

}

void 
BGBlastWave_FCN(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag)
{

  /* beta -> beta_max */
  Double_t beta = par[nBW+0];
  Double_t T = par[nBW+1];
  Double_t n = par[nBW+2];
  Double_t beta_max = 0.5 * (2. + n) * beta;
#if 1
  /* check beta_max */
  if (beta_max >= 1. || beta_max <= 0.) {
    f = kMaxInt;
    return;
  }
  /* check T */
  if (T <= 0.) {
    f = kMaxInt;
    return;
  }
#endif

  Double_t pt, pte, val, vale, func, pull, chi = 0;
  /* loop over all the data */
  for (Int_t iBW = 0; iBW < nBW; iBW++) {
    /* set BGBW parameters */
    fBGBW[iBW]->SetParameter(4, par[iBW]);
    fBGBW[iBW]->SetParameter(1, beta_max);
    fBGBW[iBW]->SetParameter(2, T);
    fBGBW[iBW]->SetParameter(3, n);
    /* loop over all the points */
    for (Int_t ipt = 0; ipt < gBW[iBW]->GetN(); ipt++) {
      pt = gBW[iBW]->GetX()[ipt];
      pte = gBW[iBW]->GetEX()[ipt];
      val = gBW[iBW]->GetY()[ipt];
      vale = gBW[iBW]->GetEY()[ipt];
      func = fBGBW[iBW]->Eval(pt);
      //      func = fBGBW[iBW]->Integral(pt - pte, pt + pte);
      pull = (val - func) / vale;
      chi += pull * pull;
    }
  }

  f = chi;
}

/*****************************************************************/

TObjArray *
BGBlastWave_GlobalFitRatio(TObjArray *data, Double_t *mass, Double_t profile = .7, Bool_t fixProfile = kFALSE)
{

  /* get data */
  Int_t ndf = 0;
  nBW = data->GetEntries();
  for (Int_t idata = 0; idata < nBW; idata++) {
    gBW[idata] = (TGraphErrors *)data->At(idata);
    gBW[idata]->SetName(Form("gBW%d", idata));
    ndf += gBW[idata]->GetN();
  }

  /* init BG blast-wave functions */
  for (Int_t idata = 0; idata < nBW; idata++) {
    printf("init BG-BlastWaveRatio function #%d: mass = %f\n", idata, mass[idata]);
    fBGBWratio[idata] = BGBlastWaveRatio(Form("fBGBWratio%d", idata), mass[idata]);
  }

  /* display data */
  TCanvas *cBW = new TCanvas("cBW");
  cBW->Divide(nBW, 1);
  for (Int_t idata = 0; idata < nBW; idata++) {
    cBW->cd(idata + 1);
    gBW[idata]->Draw("ap*");
  }
  cBW->Update();

  /* init minuit: nBW normalizations + 3 (beta, T, n) BG-BlastWave params */
  const Int_t nbwpars = 3;
  const Int_t nfitpars = 2 * (nBW + nbwpars);
  TMinuit *minuit = new TMinuit(nfitpars);
  minuit->SetFCN(BGBlastWave_FCNRatio);
  Double_t arglist[10];
  Int_t ierflg = 0;
  arglist[0] = 1;
  minuit->mnexcm("SET ERR", arglist, 1, ierflg);
  for (Int_t idata = 0; idata < nBW; idata++) {
    minuit->mnparm(idata, Form("norm%d_num", idata), 1.e6, 1., 0., 0., ierflg);
    ndf--;
  }
  for (Int_t idata = nBW; idata < 2 * nBW; idata++) {
    minuit->mnparm(idata, Form("norm%d_den", idata), 1.e6, 1., 0., 0., ierflg);
    minuit->FixParameter(idata);
    ndf--;
  }
  minuit->mnparm(2 * nBW + 0, "<beta>_num", 0.65, 0.01, 0., 1., ierflg);
  minuit->mnparm(2 * nBW + 1, "T_num", 0.1, 0.01, 0., 1., ierflg);
  minuit->mnparm(2 * nBW + 2, "n_num", profile, 0.1, 0., 10., ierflg);
  minuit->mnparm(2 * nBW + 3, "<beta>_den", 0.65, 0.01, 0., 1., ierflg);
  minuit->mnparm(2 * nBW + 4, "T_den", 0.1, 0.01, 0., 1., ierflg);
  minuit->mnparm(2 * nBW + 5, "n_den", profile, 0.1, 0., 10., ierflg);
  ndf -= 3;

  if (fixProfile) {
    minuit->FixParameter(nBW + 2);
    minuit->FixParameter(nBW + 5);
    ndf++;
  }

  /* set strategy */
  arglist[0] = 1;
  minuit->mnexcm("SET STRATEGY", arglist, 1, ierflg);

  printf("-->> STARTING MIGRAD with %d parameters\n", nfitpars);

  /* start MIGRAD minimization */
  arglist[0] = 500000;
  arglist[1] = 1.;
  minuit->mnexcm("MIGRAD", arglist, 2, ierflg);

  /* set strategy */
  arglist[0] = 2;
  minuit->mnexcm("SET STRATEGY", arglist, 1, ierflg);

  /* start MIGRAD minimization */
  arglist[0] = 500000;
  arglist[1] = 1.;
  minuit->mnexcm("MIGRAD", arglist, 2, ierflg);

  /* start IMPROVE minimization */
  arglist[0] = 500000;
  minuit->mnexcm("IMPROVE", arglist, 1, ierflg);

  /* start MINOS */
  arglist[0] = 500000;
  arglist[1] = 2 * nBW + 1;
  arglist[2] = 2 * nBW + 2;
  arglist[3] = 2 * nBW + 3;
  arglist[4] = 2 * nBW + 4;
  arglist[5] = 2 * nBW + 5;
  arglist[6] = 2 * nBW + 6;
  minuit->mnexcm("MINOS", arglist, 7, ierflg);

  /* print results */
  Double_t amin,edm,errdef;
  Int_t nvpar,nparx,icstat;
  minuit->mnstat(amin, edm, errdef, nvpar, nparx, icstat);
  minuit->mnprin(4, amin);

  /* get parameters */
  Double_t beta_num, betae_num, betaeplus_num, betaeminus_num, betagcc_num, temp_num, tempe_num, tempeplus_num, tempeminus_num, tempgcc_num, prof_num, profe_num, profeplus_num, profeminus_num, profgcc_num;
  Double_t beta_den, betae_den, betaeplus_den, betaeminus_den, betagcc_den, temp_den, tempe_den, tempeplus_den, tempeminus_den, tempgcc_den, prof_den, profe_den, profeplus_den, profeminus_den, profgcc_den;
  minuit->GetParameter(2*nBW + 0, beta_num, betae_num);
  minuit->mnerrs(nBW + 0, betaeplus_num, betaeminus_num, betae_num, betagcc_num);
  minuit->GetParameter(2*nBW + 1, temp_num, tempe_num);
  minuit->mnerrs(nBW + 1, tempeplus_num, tempeminus_num, tempe_num, tempgcc_num);
  minuit->GetParameter(2*nBW + 2, prof_num, profe_num);
  minuit->mnerrs(nBW + 2, profeplus_num, profeminus_num, profe_num, profgcc_num);
  minuit->GetParameter(2*nBW + 3, beta_den, betae_den);
  minuit->mnerrs(nBW + 3, betaeplus_den, betaeminus_den, betae_den, betagcc_den);
  minuit->GetParameter(2*nBW + 4, temp_den, tempe_den);
  minuit->mnerrs(nBW + 4, tempeplus_den, tempeminus_den, tempe_den, tempgcc_den);
  minuit->GetParameter(2*nBW + 5, prof_den, profe_den);
  minuit->mnerrs(nBW + 5, profeplus_den, profeminus_den, profe_den, profgcc_den);
  Double_t beta_max_num, beta_max_den;
  beta_max_num = 0.5 * (2. + prof_num) * beta_num;
  beta_max_den = 0.5 * (2. + prof_den) * beta_den;
  Double_t norm_num[1000], norme_num[1000];
  Double_t norm_den[1000], norme_den[1000];
  for (Int_t idata = 0; idata < nBW; idata++)
    minuit->GetParameter(idata, norm_num[idata], norme_num[idata]);
  for (Int_t idata = 0; idata < nBW; idata++) {
    minuit->GetParameter(nBW + idata, norm_den[idata], norme_den[idata]);
  }

  /* printout */
  printf("[x] *********************************\n");
  printf("[x] beta_max = %f\n", beta_max_num);
  printf("[x] <beta>   = %f +- %f (e+ = %f, e- = %f)\n", beta_num, betae_num, betaeplus_num, betaeminus_num);
  printf("[x] T        = %f +- %f (e+ = %f, e- = %f)\n", temp_num, tempe_num, tempeplus_num, tempeminus_num);
  printf("[x] n        = %f +- %f (e+ = %f, e- = %f)\n", prof_num, profe_num, profeplus_num, profeminus_num);
  printf("[x] *********************************\n");
  printf("[x] beta_max = %f\n", beta_max_den);
  printf("[x] <beta>   = %f +- %f (e+ = %f, e- = %f)\n", beta_den, betae_den, betaeplus_den, betaeminus_den);
  printf("[x] T        = %f +- %f (e+ = %f, e- = %f)\n", temp_den, tempe_den, tempeplus_den, tempeminus_den);
  printf("[x] n        = %f +- %f (e+ = %f, e- = %f)\n", prof_den, profe_den, profeplus_den, profeminus_den);
  printf("[x] *********************************\n");
  printf("[x] chi2     = %f\n", amin);
  printf("[x] ndf      = %f\n", ndf);

  /* 1-sigma contour */
  minuit->SetErrorDef(1);
  TGraph *gCont1 = NULL;
  //  gCont1 = (TGraph *) minuit->Contour(50, nBW + 0, nBW + 1);
  if (gCont1) gCont1->SetName("gCont1");

  /* 2-sigma contour */
  minuit->SetErrorDef(4);
  TGraph *gCont2 = NULL;
  //  gCont2 = (TGraph *) minuit->Contour(50, nBW + 0, nBW + 1);
  if (gCont2) gCont2->SetName("gCont2");

  /* display fits */
  for (Int_t idata = 0; idata < nBW; idata++) {
    cBW->cd(idata + 1);
    fBGBWratio[idata]->SetParameter(4, norm_num[idata]);
    fBGBWratio[idata]->SetParameter(1, beta_max_num);
    fBGBWratio[idata]->SetParameter(2, temp_num);
    fBGBWratio[idata]->SetParameter(3, prof_num);
    fBGBWratio[idata]->SetParameter(8, norm_den[idata]);
    fBGBWratio[idata]->SetParameter(5, beta_max_den);
    fBGBWratio[idata]->SetParameter(6, temp_den);
    fBGBWratio[idata]->SetParameter(7, prof_den);
    fBGBWratio[idata]->Draw("same");
  }
  cBW->Update();

  return;

  /* histo params */
  TH1D *hBW = new TH1D("hBW", "", 3, 0., 3.);
  hBW->SetBinContent(1, beta);
  hBW->SetBinError(1, betae);
  hBW->SetBinContent(2, temp);
  hBW->SetBinError(2, tempe);
  hBW->SetBinContent(3, prof);
  hBW->SetBinError(3, profe);

  /* BW graph */
  TGraphAsymmErrors *gBetaT = new TGraphAsymmErrors();
  gBetaT->SetName("gBetaT");
  gBetaT->SetPoint(0, beta, temp);
  gBetaT->SetPointEXlow(0, TMath::Abs(betaeminus));
  gBetaT->SetPointEXhigh(0, TMath::Abs(betaeplus));
  gBetaT->SetPointEYlow(0, TMath::Abs(tempeminus));
  gBetaT->SetPointEYhigh(0, TMath::Abs(tempeplus));

  /* prepare output array */
  TObjArray *outoa = new TObjArray();
  for (Int_t idata = 0; idata < nBW; idata++) {
    outoa->Add(gBW[idata]);
    outoa->Add(fBGBWratio[idata]);
  }
  outoa->Add(cBW);
  outoa->Add(hBW);
  outoa->Add(gBetaT);
  if (gCont1) outoa->Add(gCont1);
  if (gCont2) outoa->Add(gCont2);

  return outoa;

}

void 
BGBlastWave_FCNRatio(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag)
{

  /* beta -> beta_max */
  Double_t beta_num = par[2*nBW+0];
  Double_t T_num = par[2*nBW+1];
  Double_t n_num = par[2*nBW+2];
  Double_t beta_max_num = 0.5 * (2. + n_num) * beta_num;
  Double_t beta_den = par[2*nBW+3];
  Double_t T_den = par[2*nBW+4];
  Double_t n_den = par[2*nBW+5];
  Double_t beta_max_den = 0.5 * (2. + n_den) * beta_den;
#if 0
  /* check beta_max */
  if (beta_max >= 1. || beta_max <= 0.) {
    f = kMaxInt;
    return;
  }
  /* check T */
  if (T <= 0.) {
    f = kMaxInt;
    return;
  }
#endif

  Double_t pt, pte, val, vale, func, pull, chi = 0;
  /* loop over all the data */
  for (Int_t iBW = 0; iBW < nBW; iBW++) {
    /* set BGBW parameters */
    fBGBWratio[iBW]->SetParameter(4, par[iBW]);
    fBGBWratio[iBW]->SetParameter(1, beta_max_num);
    fBGBWratio[iBW]->SetParameter(2, T_num);
    fBGBWratio[iBW]->SetParameter(3, n_num);
    fBGBWratio[iBW]->SetParameter(8, par[nBW+iBW]);
    fBGBWratio[iBW]->SetParameter(5, beta_max_den);
    fBGBWratio[iBW]->SetParameter(6, T_den);
    fBGBWratio[iBW]->SetParameter(7, n_den);
    /* loop over all the points */
    for (Int_t ipt = 0; ipt < gBW[iBW]->GetN(); ipt++) {
      pt = gBW[iBW]->GetX()[ipt];
      pte = gBW[iBW]->GetEX()[ipt];
      val = gBW[iBW]->GetY()[ipt];
      vale = gBW[iBW]->GetEY()[ipt];
      func = fBGBWratio[iBW]->Eval(pt);
      //      func = fBGBW[iBW]->Integral(pt - pte, pt + pte);
      pull = (val - func) / vale;
      chi += pull * pull;
    }
  }

  f = chi;
}

/*****************************************************************/

Int_t ratioPartNum[9] = {2, 3, 4, 3, 3, 3, 4, 4, 4};
Int_t ratioChargeNum[9] = {1, 1, 1, 0, 1, 2, 0, 1, 2};
Int_t ratioPartDen[9] = {2, 3, 4, 2, 2, 2, 2, 2, 2};
Int_t ratioChargeDen[9] = {0, 0, 0, 0, 1, 2, 0, 1, 2};

Char_t *ratioPartNumName[9] = {"pion", "kaon", "proton", "kaon", "kaon", "kaon", "proton", "proton", "proton"};
Char_t *ratioChargeNumName[9] = {"minus", "minus", "minus", "plus", "minus", "both", "plus", "minus", "both"};
Char_t *ratioPartDenName[9] = {"pion", "kaon", "proton", "pion", "pion", "pion", "pion", "pion", "pion"};
Char_t *ratioChargeDenName[9] = {"plus", "plus", "plus", "plus", "minus", "both", "plus", "minus", "both"};

IntegratedRatioError(const Char_t *spectrafilename, const Char_t *ratiosfilename)
{

  TFile *fspectra = TFile::Open(spectrafilename);
  TFile *fratios = TFile::Open(ratiosfilename);
  
  Int_t icent = 0;
  for (Int_t irat = 3; irat < 9; irat++) {

    Int_t ipnum = ratioPartNum[irat];
    Int_t icnum = ratioChargeNum[irat];

    Int_t ipden = ratioPartDen[irat];
    Int_t icden = ratioChargeDen[irat];

    if (icnum == 2 || icden == 2) continue;

    printf("%s\n", Form("sys_cent%d_%s_%s_%s_%s", icent, ratioPartNumName[irat], ratioChargeNumName[irat], ratioPartDenName[irat], ratioChargeDenName[irat]));
    TH1 *hrat_sys = (TH1 *)fratios->Get(Form("sys_cent%d_%s_%s_%s_%s", icent, ratioPartNumName[irat], ratioChargeNumName[irat], ratioPartDenName[irat], ratioChargeDenName[irat]));

    printf("%d %d %d %d\n", ipnum, icnum, ipden, icden);
    TH1 *hnum = (TH1 *)fspectra->Get(Form("cent%d_%s_%s", icent, ratioPartNumName[irat], ratioChargeNumName[irat]));
    TH1 *hnum_stat = (TH1 *)fspectra->Get(Form("stat_cent%d_%s_%s", icent, ratioPartNumName[irat], ratioChargeNumName[irat]));
    printf("%s = %p\n", Form("cent%d_%s_%s", icent, ratioPartNumName[irat], ratioChargeNumName[irat]), hnum);
  
    TH1 *hden = (TH1 *)fspectra->Get(Form("cent%d_%s_%s", icent, ratioPartDenName[irat], ratioChargeDenName[irat]));
    TH1 *hden_stat = (TH1 *)fspectra->Get(Form("stat_cent%d_%s_%s", icent, ratioPartDenName[irat], ratioChargeDenName[irat]));
    printf("%s = %p\n", Form("cent%d_%s_%s", icent, ratioPartDenName[irat], ratioChargeDenName[irat]), hden);
    
    TH1 *hnum_plus = (TH1 *)hnum->Clone("hnum_plus");
    TH1 *hnum_minus = (TH1 *)hnum->Clone("hnum_minus");
    TH1 *hden_plus = (TH1 *)hden->Clone("hden_plus");
    TH1 *hden_minus = (TH1 *)hden->Clone("hden_minus");
    TH1 *hnum_stat_plus = (TH1 *)hnum_stat->Clone("hnum_stat_plus");
    TH1 *hnum_stat_minus = (TH1 *)hnum_stat->Clone("hnum_stat_minus");
    TH1 *hden_stat_plus = (TH1 *)hden_stat->Clone("hden_stat_plus");
    TH1 *hden_stat_minus = (TH1 *)hden_stat->Clone("hden_stat_minus");
    for (Int_t ibin = 0; ibin < hnum_plus->GetNbinsX(); ibin++) {
      Double_t val = hrat_sys->GetBinContent(ibin + 1);
      Double_t vale = hrat_sys->GetBinError(ibin + 1);
      if (vale <= 0.) continue;
      Double_t syse = vale / val;

      val = hnum_plus->GetBinContent(ibin + 1);
      vale = hnum_plus->GetBinError(ibin + 1);
      val *= (1. + syse);
      vale *= (1. + syse);
      hnum_plus->SetBinContent(ibin + 1, val);
      hnum_plus->SetBinError(ibin + 1, vale);

      val = hnum_minus->GetBinContent(ibin + 1);
      vale = hnum_minus->GetBinError(ibin + 1);
      val *= (1. - syse);
      vale *= (1. - syse);
      hnum_minus->SetBinContent(ibin + 1, val);
      hnum_minus->SetBinError(ibin + 1, vale);

      val = hden_plus->GetBinContent(ibin + 1);
      vale = hden_plus->GetBinError(ibin + 1);
      val *= (1. + syse);
      vale *= (1. + syse);
      hden_plus->SetBinContent(ibin + 1, val);
      hden_plus->SetBinError(ibin + 1, vale);

      val = hden_minus->GetBinContent(ibin + 1);
      vale = hden_minus->GetBinError(ibin + 1);
      val *= (1. - syse);
      vale *= (1. - syse);
      hden_minus->SetBinContent(ibin + 1, val);
      hden_minus->SetBinError(ibin + 1, vale);



      val = hnum_stat_plus->GetBinContent(ibin + 1);
      vale = hnum_stat_plus->GetBinError(ibin + 1);
      val *= (1. + syse);
      vale *= (1. + syse);
      hnum_stat_plus->SetBinContent(ibin + 1, val);
      hnum_stat_plus->SetBinError(ibin + 1, vale);

      val = hnum_stat_minus->GetBinContent(ibin + 1);
      vale = hnum_stat_minus->GetBinError(ibin + 1);
      val *= (1. - syse);
      vale *= (1. - syse);
      hnum_stat_minus->SetBinContent(ibin + 1, val);
      hnum_stat_minus->SetBinError(ibin + 1, vale);

      val = hden_stat_plus->GetBinContent(ibin + 1);
      vale = hden_stat_plus->GetBinError(ibin + 1);
      val *= (1. + syse);
      vale *= (1. + syse);
      hden_stat_plus->SetBinContent(ibin + 1, val);
      hden_stat_plus->SetBinError(ibin + 1, vale);

      val = hden_stat_minus->GetBinContent(ibin + 1);
      vale = hden_stat_minus->GetBinError(ibin + 1);
      val *= (1. - syse);
      vale *= (1. - syse);
      hden_stat_minus->SetBinContent(ibin + 1, val);
      hden_stat_minus->SetBinError(ibin + 1, vale);
    }

    TCanvas *c = new TCanvas;
    hnum_stat->SetLineColor(8);
    hnum_stat->SetMarkerColor(8);
    hnum_stat->SetMarkerSize(1);
    hnum_stat->SetMarkerStyle(20);
    hnum_stat->Draw();
    
    hnum_stat_plus->SetLineColor(2);
    hnum_stat_plus->SetMarkerColor(2);
    hnum_stat_plus->SetMarkerSize(1);
    hnum_stat_plus->SetMarkerStyle(20);
    hnum_stat_plus->Draw("same");
    
    hnum_stat_minus->SetLineColor(4);
    hnum_stat_minus->SetMarkerColor(4);
    hnum_stat_minus->SetMarkerSize(1);
    hnum_stat_minus->SetMarkerStyle(20);
    hnum_stat_minus->Draw("same");
    
    c->Update();

    c = new TCanvas();
    TH1 *hrat = (TH1 *)hnum_stat->Clone("hrat");
    TH1 *hrat_plus = (TH1 *)hnum_stat_plus->Clone("hrat_plus");
    TH1 *hrat_minus = (TH1 *)hnum_stat_minus->Clone("hrat_minus");

    hrat->Divide(hden_stat);
    hrat_plus->Divide(hden_stat);
    hrat_minus->Divide(hden_stat);

    hrat->Draw();
    hrat_plus->Draw("same");
    hrat_minus->Draw("same");


    c->Update();
    
    getchar();
    
    
    /* integrate as they are */
    printf("***** NUM:\n");
    IntegratedProduction(hnum, AliPID::ParticleMass(ratioPartNum[irat]), 0, "0q");
    printf("***** NUM PLUS:\n");
    IntegratedProduction(hnum_plus, AliPID::ParticleMass(ratioPartNum[irat]), 0, "0q");
    printf("***** NUM MINUS:\n");
    IntegratedProduction(hnum_minus, AliPID::ParticleMass(ratioPartNum[irat]), 0, "0q");
    
    printf("***** DEN:\n");
    IntegratedProduction(hden, AliPID::ParticleMass(ratioPartDen[irat]), 0, "0q");
    printf("***** DEN PLUS:\n");
    IntegratedProduction(hden_plus, AliPID::ParticleMass(ratioPartDen[irat]), 0, "0q");
    printf("***** DEN MINUS:\n");
    IntegratedProduction(hden_minus, AliPID::ParticleMass(ratioPartDen[irat]), 0, "0q");

  }
  
}

enum EIntegratedData_t {
  kInt_YieldData, kInt_YieldDataErr, kInt_YieldDataLin,
  kInt_MeanData, kInt_MeanDataErr, kInt_MeanDataLin,
  kInt_YieldLow, kInt_YieldLowErr,
  kInt_MeanLow, kInt_MeanLowErr,
  kInt_YieldHigh, kInt_YieldHighErr,
  kInt_MeanHigh, kInt_MeanHighErr,
  kInt_NData
};

IntegratedProduction_measurement(const Char_t *filename, Option_t *opt = "q0R")
{

  for (Int_t ipart = 2; ipart < 5; ipart++)
    for (Int_t icharge = 0; icharge < 2; icharge++) {
      IntegratedProduction(filename, ipart, icharge, 0, 0., 10., opt);
      IntegratedProduction(filename, ipart, icharge, 1, 0., 10., opt);
    }

}

IntegratedProduction_systematics(const Char_t *filename, Option_t *opt = "q0R")
{

  Double_t min[5] = {0., 0., 0., 0., 0.};
  Double_t max[5] = {0., 0., 0.5, 1.0, 2.0};
  for (Int_t ipart = 2; ipart < 5; ipart++)
    for (Int_t icharge = 0; icharge < 2; icharge++)
      for (Int_t ifunc = 1; ifunc < 6; ifunc++)
	IntegratedProduction(filename, ipart, icharge, ifunc, min[ipart], max[ipart], opt);

}

IntegratedProduction_check(const Char_t *filename, Option_t *opt = "q0R")
{

  for (Int_t ipart = 2; ipart < 5; ipart++)
    for (Int_t icharge = 0; icharge < 2; icharge++)
      for (Int_t ifunc = 1; ifunc < 6; ifunc++)
	IntegratedProduction(filename, ipart, icharge, ifunc, 0., 10., opt);

}

IntegratedProduction(const Char_t *filename, Int_t ipart, Int_t icharge, Int_t ifunc = 0, Float_t min = 0., Float_t max = 10., Option_t *opt = "q0R")
{

  Char_t *centName[10] = {
    "0-5%", "5-10%", "10-20%", "20-40%", "40-60%", "60-80%", "80-100%", "minimum bias"
  };
  
  
  Char_t *chargeName[3] = {"plus", "minus", "sum"};
  
  Char_t *partChargeName[5][2] = {
    "", "",
    "", "",
    "#pi^{+}", "#pi^{-}",
    "K^{+}", "K^{-}",
    "p", "#bar{p}"
  };
  
  gStyle->SetOptStat(0);
  gStyle->SetOptFit(1);
  
  /* PWGTools */
  gSystem->Load("libANALYSIS.so");
  gSystem->Load("libANALYSISalice.so");
  gSystem->Load("libCORRFW.so");
  gSystem->Load("libPWGTools.so");
  AliPWGFunc pwgfunc;
  pwgfunc.SetVarType(AliPWGFunc::kdNdpt);

  Double_t mass = AliPID::ParticleMass(ipart);

  TF1 *f = NULL;
  switch (ifunc) {
  case 0:
    f = BGBlastWave("BlastWave", mass);
    f->SetLineColor(2);
    break;
  case 1:
    f = LevyTsallis("Levy-Tsallis", mass, 5., mass);
    f->SetLineColor(8);
    break;
  case 2:
    f = Boltzmann("Boltzmann", mass);
    f->SetLineColor(kPink+1);
    break;
  case 3:
    f = pwgfunc.GetMTExp(mass, 0.1, 1., "m_{T}-exponential");
    f->SetLineColor(kViolet+1);
    break;
  case 4:
    f = pwgfunc.GetPTExp(0.1, 1., "p_{T}-exponential");
    f->SetLineColor(kAzure+1);
    break;
  case 5:
    f = pwgfunc.GetBoseEinstein(mass, 0.1, 1., "Bose-Einstein");
    f->SetLineColor(kYellow+1);
    break;
  default:
  };
  f->SetTitle(f->GetName());
  f->SetLineWidth(2);
  f->SetFillColor(0);
  f->SetMarkerColor(f->GetLineColor());

  /* define low-pt fit range according to the number of free parameters */
  Int_t nfreeparams = f->GetNumberFreeParameters();

  TCanvas *cc = new TCanvas("cCanvasFit", "", 1200, 800);
  cc->Divide(4, 2);

  //  if (max < 0)
  //  TFile *fout = TFile::Open(Form("%s.IntegratedProduction.LowPtFit_%s_%s_%s.root", filename, f->GetName(), AliPID::ParticleName(ipart), chargeName[icharge]), "RECREATE");
  //  else if (min < 0)
  //  TFile *fout = TFile::Open(Form("%s.IntegratedProduction.HighPtFit_%s_%s_%s.root", filename, f->GetName(), AliPID::ParticleName(ipart), chargeName[icharge]), "RECREATE");
  //  else
    TFile *fout = TFile::Open(Form("%s.IntegratedProduction_%s_%s_%s.root", filename, f->GetName(), AliPID::ParticleName(ipart), chargeName[icharge]), "RECREATE");
  
  Double_t integrated_data[kInt_NData];

  TFile *filein = TFile::Open(filename);
  TH1F *hyield_data_stat = new TH1F(Form("hPartYield_data_stat_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hyield_data_sys = new TH1F(Form("hPartYield_data_sys_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hyield_data = new TH1F(Form("hPartYield_data_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hyield_low_stat = new TH1F(Form("hPartYield_low_stat_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hyield_low_sys = new TH1F(Form("hPartYield_low_sys_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hyield_low = new TH1F(Form("hPartYield_low_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hyield_high_stat = new TH1F(Form("hPartYield_high_stat_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hyield_high_sys = new TH1F(Form("hPartYield_high_sys_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hyield_high = new TH1F(Form("hPartYield_high_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hmean_data_stat = new TH1F(Form("hPartMean_data_stat_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hmean_data_sys = new TH1F(Form("hPartMean_data_sys_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hmean_data = new TH1F(Form("hPartMean_data_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hmean_low_stat = new TH1F(Form("hPartMean_low_stat_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hmean_low_sys = new TH1F(Form("hPartMean_low_sys_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hmean_low = new TH1F(Form("hPartMean_low_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hmean_high_stat = new TH1F(Form("hPartMean_high_stat_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hmean_high_sys = new TH1F(Form("hPartMean_high_sys_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hmean_high = new TH1F(Form("hPartMean_high_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hyield_stat = new TH1F(Form("hYield_stat_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hyield_sys = new TH1F(Form("hYield_sys_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hyield = new TH1F(Form("hYield_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hmean_stat = new TH1F(Form("hMean_stat_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hmean_sys = new TH1F(Form("hMean_sys_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  TH1F *hmean = new TH1F(Form("hMean_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", 7, 0, 7);
  for (Int_t icent = 0; icent < 7; icent++) {
    cc->cd(icent + 1)->SetLogy();
    printf("*************************\n");
    printf("cent=%d part=%d charge=%d\n", icent, ipart, icharge);
    TH1 *h = (TH1 *)filein->Get(Form("cent%d_%s_%s", icent, AliPID::ParticleName(ipart), chargeName[icharge]));
    //    h = Convert_dNdy_dNdeta(h, AliPID::ParticleMass(ipart), 0.5);
    h->SetTitle(Form("%s (%s);p_{T} (GeV/c);dN/dp_{T}", partChargeName[ipart][icharge], centName[icent]));
    h->SetMarkerStyle(20);
    h->SetMarkerSize(1);
    h->SetLineWidth(1);
    h->SetFillColor(0);
    h->SetFillStyle(0);
    h->SetLineColor(1);
    h->SetMarkerColor(4);
    TH1 *hstat = (TH1 *)filein->Get(Form("stat_cent%d_%s_%s", icent, AliPID::ParticleName(ipart), chargeName[icharge]));
    //    hstat = Convert_dNdy_dNdeta(hstat, AliPID::ParticleMass(ipart), 0.5);
    hstat->SetMarkerStyle(20);
    hstat->SetMarkerSize(1);
    hstat->SetLineWidth(1);
    hstat->SetLineColor(1);
    hstat->SetMarkerColor(4);
    TH1 *hsys = (TH1 *)filein->Get(Form("sys_cent%d_%s_%s", icent, AliPID::ParticleName(ipart), chargeName[icharge]));
    //    hsys = Convert_dNdy_dNdeta(hsys, AliPID::ParticleMass(ipart), 0.5);
    hsys->SetMarkerStyle(20);
    hsys->SetMarkerSize(1);
    hsys->SetLineWidth(1);
    hsys->SetLineColor(1);
    hsys->SetMarkerColor(4);

    if (max < 0.) {
      /* define fit range according to number of free parameter */
      Int_t gotpoints = 0;
      for (Int_t ipt = 0; ipt < h->GetNbinsX(); ipt++) {
	if (h->GetBinError(ipt + 1) <= 0.) continue;
	gotpoints++;
	if (gotpoints < nfreeparams*2) continue;
	max = h->GetXaxis()->GetBinUpEdge(ipt + 1);
	break;
      }
      printf("fitting up to %f\n", max);
    }    
    if (min < 0.) {
      /* define fit range according to number of free parameter */
      Int_t gotpoints = 0;
      for (Int_t ipt = h->GetNbinsX(); ipt > 0; ipt--) {
	if (h->GetBinError(ipt) <= 0.) continue;
	gotpoints++;
	if (gotpoints < nfreeparams+3) continue;
	min = h->GetXaxis()->GetBinLowEdge(ipt);
	break;
      }
      printf("fitting from %f\n", min);
    }    

    printf("-> processing stat-only data\n");

    IntegratedProduction(hstat, f, opt, min, max, integrated_data);
    fout->cd();
    hstat->Write(Form("IntegratedProduction_stat_cent%d_%s_%s.root", icent, AliPID::ParticleName(ipart), chargeName[icharge]));

    hyield_data_stat->SetBinContent(icent + 1, integrated_data[kInt_YieldData]);
    hyield_data_stat->SetBinError(icent + 1, integrated_data[kInt_YieldDataErr]);
    hyield_low_stat->SetBinContent(icent + 1, integrated_data[kInt_YieldLow]);
    hyield_low_stat->SetBinError(icent + 1, integrated_data[kInt_YieldLowErr]);

    hyield_high_stat->SetBinContent(icent + 1, integrated_data[kInt_YieldHigh]);
    hyield_high_stat->SetBinError(icent + 1, integrated_data[kInt_YieldHighErr]);

    hmean_data_stat->SetBinContent(icent + 1, integrated_data[kInt_MeanData]);
    hmean_data_stat->SetBinError(icent + 1, integrated_data[kInt_MeanDataErr]);

    hmean_low_stat->SetBinContent(icent + 1, integrated_data[kInt_MeanLow]);
    hmean_low_stat->SetBinError(icent + 1, integrated_data[kInt_MeanLowErr]);
    
    printf("-> processing sys-only data\n");

    IntegratedProduction(hsys, f, opt, min, max, integrated_data);
    fout->cd();
    hsys->Write(Form("IntegratedProduction_sys_cent%d_%s_%s.root", icent, AliPID::ParticleName(ipart), chargeName[icharge]));

    hyield_data_sys->SetBinContent(icent + 1, integrated_data[kInt_YieldData]);
    hyield_data_sys->SetBinError(icent + 1, integrated_data[kInt_YieldDataLin]);

    hyield_low_sys->SetBinContent(icent + 1, integrated_data[kInt_YieldLow]);
    hyield_low_sys->SetBinError(icent + 1, integrated_data[kInt_YieldLowErr]);

    hyield_high_sys->SetBinContent(icent + 1, integrated_data[kInt_YieldHigh]);
    hyield_high_sys->SetBinError(icent + 1, integrated_data[kInt_YieldHighErr]);

    hmean_data_sys->SetBinContent(icent + 1, integrated_data[kInt_MeanData]);
    hmean_data_sys->SetBinError(icent + 1, integrated_data[kInt_MeanDataLin]);

    hmean_low_sys->SetBinContent(icent + 1, integrated_data[kInt_MeanLow]);
    hmean_low_sys->SetBinError(icent + 1, integrated_data[kInt_MeanLowErr]);
    
    printf("-> processing stat+sys data\n");

    IntegratedProduction(h, f, opt, min, max, integrated_data);
    fout->cd();
    h->Write(Form("IntegratedProduction_cent%d_%s_%s.root", icent, AliPID::ParticleName(ipart), chargeName[icharge]));
    f->SetRange(min, max);
    f->Write(Form("%s_cent%d_%s_%s.root", f->GetName(), icent, AliPID::ParticleName(ipart), chargeName[icharge]));
    h->DrawCopy();
    f->DrawCopy("same");
    TLegend *l = gPad->BuildLegend(0.15, 0.12, 0.5, 0.3);
    l->SetBorderSize(0);
    l->SetFillColor(0);
    l->SetFillStyle(0);

    hyield_data->SetBinContent(icent + 1, integrated_data[kInt_YieldData]);
    hyield_data->SetBinError(icent + 1, integrated_data[kInt_YieldDataLin]);

    hyield_low->SetBinContent(icent + 1, integrated_data[kInt_YieldLow]);
    hyield_low->SetBinError(icent + 1, integrated_data[kInt_YieldLowErr]);

    hyield_high->SetBinContent(icent + 1, integrated_data[kInt_YieldHigh]);
    hyield_high->SetBinError(icent + 1, integrated_data[kInt_YieldHighErr]);

    hmean_data->SetBinContent(icent + 1, integrated_data[kInt_MeanData]);
    hmean_data->SetBinError(icent + 1, integrated_data[kInt_MeanDataLin]);

    hmean_low->SetBinContent(icent + 1, integrated_data[kInt_MeanLow]);
    hmean_low->SetBinError(icent + 1, integrated_data[kInt_MeanLowErr]);
    
    hmean_high->SetBinContent(icent + 1, integrated_data[kInt_MeanHigh]);
    hmean_high->SetBinError(icent + 1, integrated_data[kInt_MeanHighErr]);
    
    
  }

  hyield_stat->Add(hyield_data_stat);
  hyield_stat->Add(hyield_low_stat);
  hyield_stat->Add(hyield_high_stat);

  hyield_sys->Add(hyield_data_sys);
  hyield_sys->Add(hyield_low_sys);
  hyield_sys->Add(hyield_high_sys);

  hyield->Add(hyield_data);
  hyield->Add(hyield_low);
  hyield->Add(hyield_high);
  
  
  hmean_stat->Add(hmean_data_stat);
  hmean_stat->Add(hmean_low_stat);
  hmean_stat->Add(hmean_high_stat);
  //      hmean_stat->Divide(hyield_stat);
  hmean_sys->Add(hmean_data_sys);
  hmean_sys->Add(hmean_low_sys);
  hmean_sys->Add(hmean_high_sys);
  //      hmean_sys->Divide(hyield_sys);
  hmean->Add(hmean_data);
  hmean->Add(hmean_low);
  hmean->Add(hmean_high);
  
  fout->cd();

  hyield->Write();
  hmean->Write();

  hyield_stat->Write();
  hmean_stat->Write();

  hyield_sys->Write();
  hmean_sys->Write();

  hyield_data->Write();
  hmean_data->Write();

  hyield_data_stat->Write();
  hmean_data_stat->Write();

  hyield_data_sys->Write();
  hmean_data_sys->Write();

  hyield_low->Write();
  hmean_low->Write();

  hyield_high->Write();
  hmean_high->Write();

  hyield_low_stat->Write();
  hmean_low_stat->Write();

  hyield_high_stat->Write();
  hmean_high_stat->Write();

  hmean_low_sys->Write();
  hyield_low_sys->Write();
  
  hmean_high_sys->Write();
  hyield_high_sys->Write();

  cc->Write();
  
  fout->Close();
}

IntegratedProduction_pp(const Char_t *filename, Char_t *what = "", Int_t ifunc = 1, Option_t *opt = "0qI")
{
  TFile *filein = TFile::Open(filename);
  for (Int_t ipart = 0; ipart < 6; ipart++) {
    printf("*************************\n");
    printf("part=%d\n", ipart);
    TH1 *h = (TH1 *)filein->Get(Form("hComb_ITSsa%d_TPC%d_TOF%d_HMPID%d", ipart, ipart, ipart, ipart));
    IntegratedProduction(h, AliPID::ParticleMass(ipart % 3 + 2), ifunc, opt);
    if (gPad) gPad->SaveAs(Form("IntegratedProduction_pp_%d.root", ipart));
  }
}

IntegratedProduction(TH1 *h, TF1 *f = NULL, Option_t *opt = "0q", Float_t min = 0., Float_t max = 10., Double_t *integrated_data = NULL, Bool_t verbose = kFALSE)
{

  Double_t yield, yielderr, yielderrcorr, mean, meanerr, meanerrcorr, partyield[3], partyielderr[3], partyielderrcorr[3], partmean[3], partmeanerr[3], partmeanerrcorr[3];

  TVirtualFitter::SetMaxIterations(1000000);

  if (f) {
    Int_t fres = 1;
    Int_t fatt = 0;
    while (fres != 0 && fatt < 10) {
      fres = h->Fit(f, opt, "", min, max);
      fres = h->Fit(f, opt, "", min, max);
      printf("fit res = %d\n", fres);
      fatt++;
    }
  }

  // return;

  GetYieldAndMean(h, f, yield, yielderr, yielderrcorr, mean, meanerr, meanerrcorr, 0., 10., partyield, partyielderr, partyielderrcorr, partmean, partmeanerr, partmeanerrcorr);

  //  Double_t fint = f ? f->Integral(0.,10.) : 0.;
  //  Double_t finte = f ? f->IntegralError(0.,10.) : 0.;
  //  Double_t fmean = f ? f->Mean(0., 10.) : 0.;

  if (verbose) {
  printf("----\n");
  printf("dN/dy        = %f +- %f (%f)\n", yield, yielderr, yielderrcorr);
  printf("<pt>         = %f +- %f (%f)\n", mean, meanerr, meanerrcorr);
  printf("----\n");
  printf("dN/dy (data) = %f +- %f (%f)\n", partyield[0], partyielderr[0], partyielderrcorr[0]);
  printf("dN/dy (low)  = %f +- %f (%f)\n", partyield[1], partyielderr[1], partyielderrcorr[1]);
  printf("dN/dy (high) = %f +- %f (%f)\n", partyield[2], partyielderr[2], partyielderrcorr[2]);
  printf("<pt> (data)  = %f +- %f (%f)\n", partmean[0], partmeanerr[0], partmeanerrcorr[0]);
  printf("<pt> (low)   = %f +- %f (%f)\n", partmean[1], partmeanerr[1], partmeanerrcorr[1]);
  printf("<pt> (high)  = %f +- %f (%f)\n", partmean[2], partmeanerr[2], partmeanerrcorr[2]);
  printf("----\n");
  //  printf("dN/dy (func) = %f +- %f\n", fint, finte);
  //  printf("<pT> (func)  = %f +- %f\n", fmean, 0.);
  }

  if (!integrated_data) return;

  integrated_data[kInt_YieldData] = partyield[0];
  integrated_data[kInt_YieldDataErr] = partyielderr[0];
  integrated_data[kInt_YieldDataLin] = partyielderrcorr[0];
  integrated_data[kInt_MeanData] = partmean[0];
  integrated_data[kInt_MeanDataErr] = partmeanerr[0];
  integrated_data[kInt_MeanDataLin] = partmeanerrcorr[0];
  integrated_data[kInt_YieldLow] = partyield[1];
  integrated_data[kInt_YieldLowErr] = partyielderr[1];
  integrated_data[kInt_MeanLow] = partmean[1];
  integrated_data[kInt_MeanLowErr] = partmeanerr[1];
  integrated_data[kInt_YieldHigh] = partyield[2];
  integrated_data[kInt_YieldHighErr] = partyielderr[2];
  integrated_data[kInt_MeanHigh] = partmean[2];
  integrated_data[kInt_MeanHighErr] = partmeanerr[2];

  //  TH1 *hr = (TH1 *)h->Clone("hr");
  //  hr->Divide(f);
  //  new TCanvas;
  //  hr->Draw();

  //  TProfile *p = new TProfile("p", "", 100, 0., 10.);
  //  gROOT->LoadMacro("HistoUtils.C");
  //  HistoUtils_Function2Profile(f, p);
  //  p->Draw();
}

GetYieldAndMean(TH1 *h, TF1 *f, Double_t &yield, Double_t &yielderr, Double_t &yielderrcorr, Double_t &mean, Double_t &meanerr, Double_t &meanerrcorr, Double_t min, Double_t max, Double_t *partyield, Double_t *partyielderr, Double_t *partyielderrcorr, Double_t *partmean, Double_t *partmeanerr, Double_t *partmeanerrcorr)
{

  /* find lowest edge in histo */
  Int_t binlo;
  Double_t lo;
  for (Int_t ibin = 1; ibin < h->GetNbinsX() + 1; ibin++) {
    if (h->GetBinContent(ibin) != 0.) {
      binlo = ibin;
      lo = h->GetBinLowEdge(ibin);
      break;
    }
  }
  
  /* find highest edge in histo */
  Int_t binhi;
  Double_t hi;
  for (Int_t ibin = h->GetNbinsX(); ibin > 0; ibin--) {
    if (h->GetBinContent(ibin) != 0.) {
      binhi = ibin + 1;
      hi = h->GetBinLowEdge(ibin + 1);
      break;
    }
  }
  
  /* integrate the data */
  Double_t cont, err, width, cent, integral_data = 0., integralerr_data = 0., integralerrcorr_data = 0., meanintegral_data = 0., meanintegralerr_data = 0., meanintegralerrcorr_data = 0.;
  for (Int_t ibin = binlo; ibin < binhi; ibin++) {
    cent = h->GetBinCenter(ibin);
    width = h->GetBinWidth(ibin);
    cont = h->GetBinContent(ibin);
    err = h->GetBinError(ibin);
    /* check we didn't get an empty bin in between */
    if (cont != 0. && err != 0.) {
      /* all right, use data */
      integral_data += cont * width;
      integralerr_data += err * err * width * width;
      integralerrcorr_data += err * width;
      meanintegral_data += cont * width * cent;
      meanintegralerr_data += err * err * width * width * cent * cent;
      meanintegralerrcorr_data += err * width * cent;
    }
    else {
      /* missing data-point, complain and use function */
      printf("WARNING: missing data-point at %f\n", cent);
      printf("         using function as a patch\n");
      integral_data += f->Integral(h->GetBinLowEdge(ibin), h->GetBinLowEdge(ibin+1));
      integralerr_data += f->IntegralError(h->GetBinLowEdge(ibin), h->GetBinLowEdge(ibin+1), 0, 0, 1.e-6);
      meanintegral_data += f->Mean(h->GetBinLowEdge(ibin), h->GetBinLowEdge(ibin+1)) * f->Integral(h->GetBinLowEdge(ibin), h->GetBinLowEdge(ibin+1));
      meanintegralerr_data += f->Mean(h->GetBinLowEdge(ibin), h->GetBinLowEdge(ibin+1)) * f->IntegralError(h->GetBinLowEdge(ibin), h->GetBinLowEdge(ibin+1), 0, 0, 1.e-6);
    }
  }
  integralerr_data = TMath::Sqrt(integralerr_data);
  meanintegralerr_data = TMath::Sqrt(meanintegralerr_data);
  
  /* integrate below the data */
  if (!f) {
    min = lo;
    max = hi;
    printf("WARNING: no function provided! Use only data with no extrapolation\n");
  }
  Double_t integral_lo = min < lo ? f->Integral(min, lo, (Double_t *)0, 1.e-6) : 0.;
  Double_t integralerr_lo = min < lo ? f->IntegralError(min, lo, 0, 0, 1.e-6) : 0.;
  Double_t meanintegral_lo = min < lo ? f->Mean(min, lo, (Double_t *)0, 1.e-6) * integral_lo : 0.;
  Double_t meanintegralerr_lo = min < lo ? f->Mean(min, lo, (Double_t *)0, 1.e-6) * integralerr_lo : 0.;
  
  /* integrate above the data */
  Double_t integral_hi = max > hi ? f->Integral(hi, max, (Double_t *)0, 1.e-6) : 0.;
  Double_t integralerr_hi = max > hi ? f->IntegralError(hi, max, 0, 0, 1.e-6) : 0.;
  Double_t meanintegral_hi = max > hi ? f->Mean(hi, max, (Double_t *)0, 1.e-6) * integral_hi : 0.;
  Double_t meanintegralerr_hi = max > hi ? f->Mean(hi, max, (Double_t *)0, 1.e-6) * integralerr_hi : 0.;

  /* compute integrated yield */
  yield = integral_data + integral_lo + integral_hi;
  yielderr = TMath::Sqrt(integralerr_data * integralerr_data + 
			 integralerr_lo * integralerr_lo + 
			 integralerr_hi * integralerr_hi);
  yielderrcorr = TMath::Sqrt(integralerrcorr_data * integralerrcorr_data + 
			     integralerr_lo * integralerr_lo + 
			     integralerr_hi * integralerr_hi);
  
  /* compute integrated mean */
  mean = (meanintegral_data + meanintegral_lo + meanintegral_hi) / yield;
  meanerr = TMath::Sqrt(meanintegralerr_data * meanintegralerr_data + 
			meanintegralerr_lo * meanintegralerr_lo + 
			meanintegralerr_hi * meanintegralerr_hi) / yield;
  meanerrcorr = TMath::Sqrt(meanintegralerrcorr_data * meanintegralerrcorr_data + 
			    meanintegralerr_lo * meanintegralerr_lo + 
			    meanintegralerr_hi * meanintegralerr_hi) / yield;

  /* set partial yields */
  partyield[0] = integral_data;
  partyielderr[0] = integralerr_data;
  partyielderrcorr[0] = integralerrcorr_data;
  partyield[1] = integral_lo;
  partyielderr[1] = integralerr_lo;
  partyielderrcorr[1] = integralerr_lo;
  partyield[2] = integral_hi;
  partyielderr[2] = integralerr_hi;
  partyielderrcorr[2] = integralerr_hi;

  /* set partial means */
  partmean[0] = meanintegral_data;
  partmeanerr[0] = meanintegralerr_data;
  partmeanerrcorr[0] = meanintegralerrcorr_data;
  partmean[1] = meanintegral_lo;
  partmeanerr[1] = meanintegralerr_lo;
  partmeanerrcorr[1] = meanintegralerr_lo;
  partmean[2] = meanintegral_hi;
  partmeanerr[2] = meanintegralerr_hi;
  partmeanerrcorr[2] = meanintegralerr_hi;
  
}

/*****************************************************************/

Double_t 
y2eta(Double_t pt, Double_t mass, Double_t y){
  Double_t mt = TMath::Sqrt(mass * mass + pt * pt);
  return TMath::ASinH(mt / pt * TMath::SinH(y));
}
Double_t 
eta2y(Double_t pt, Double_t mass, Double_t eta){
  Double_t mt = TMath::Sqrt(mass * mass + pt * pt);
  return TMath::ASinH(pt / mt * TMath::SinH(eta));
}

TH1 *
Convert_dNdy_1over2pipt_dNdeta(TH1 *hin, Double_t mass, Double_t eta = 0.8)
{

  TH1 *hout = hin->Clone("hout");
  hout->Reset();
  Double_t pt, mt, conv, val, vale;
  for (Int_t ibin = 0; ibin < hin->GetNbinsX(); ibin++) {
    pt = hin->GetBinCenter(ibin + 1);
    conv = eta2y(pt, mass, eta) / eta;
    val = hin->GetBinContent(ibin + 1);
    vale = hin->GetBinError(ibin + 1);
    val /= (2. * TMath::Pi() * pt);
    vale /= (2. * TMath::Pi() * pt);
    val *= conv;
    vale *= conv;
    hout->SetBinContent(ibin + 1, val);
    hout->SetBinError(ibin + 1, vale);
  }
  return hout;
}

TH1 *
Convert_dNdy_1over2pipt_dNdy(TH1 *hin)
{

  TH1 *hout = hin->Clone("hout");
  hout->Reset();
  Double_t pt, mt, conv, val, vale;
  for (Int_t ibin = 0; ibin < hin->GetNbinsX(); ibin++) {
    pt = hin->GetBinCenter(ibin + 1);
    val = hin->GetBinContent(ibin + 1);
    vale = hin->GetBinError(ibin + 1);
    val /= (2. * TMath::Pi() * pt);
    vale /= (2. * TMath::Pi() * pt);
    hout->SetBinContent(ibin + 1, val);
    hout->SetBinError(ibin + 1, vale);
  }
  return hout;
}

TH1 *
Convert_dNdy_1overpt_dNdy(TH1 *hin)
{

  TH1 *hout = hin->Clone("hout");
  hout->Reset();
  Double_t pt, mt, conv, val, vale;
  for (Int_t ibin = 0; ibin < hin->GetNbinsX(); ibin++) {
    pt = hin->GetBinCenter(ibin + 1);
    val = hin->GetBinContent(ibin + 1);
    vale = hin->GetBinError(ibin + 1);
    val /= pt;
    vale /= pt;
    hout->SetBinContent(ibin + 1, val);
    hout->SetBinError(ibin + 1, vale);
  }
  return hout;
}

TH1 *
Convert_dNdy_dNdeta(TH1 *hin, Double_t mass, Double_t eta = 0.8)
{

  TH1 *hout = hin->Clone("hout");
  hout->Reset();
  Double_t pt, mt, conv, val, vale;
  for (Int_t ibin = 0; ibin < hin->GetNbinsX(); ibin++) {
    pt = hin->GetBinCenter(ibin + 1);
    conv = eta2y(pt, mass, eta) / eta;
    val = hin->GetBinContent(ibin + 1);
    vale = hin->GetBinError(ibin + 1);
    val *= conv;
    vale *= conv;
    hout->SetBinContent(ibin + 1, val);
    hout->SetBinError(ibin + 1, vale);
  }
  return hout;
}

TGraph *
Convert_dNdy_dNdeta(TGraph *hin, Double_t mass, Double_t eta = 0.8)
{

  TGraph *hout = hin->Clone("hout");
  //  hout->Reset();
  Double_t pt, mt, conv, val, valelo, valehi;
  for (Int_t ibin = 0; ibin < hin->GetN(); ibin++) {
    pt = hin->GetX()[ibin];
    conv = eta2y(pt, mass, eta) / eta;
    val = hin->GetY()[ibin];
    valelo = hin->GetEYlow()[ibin];
    valehi = hin->GetEYhigh()[ibin];
    val *= conv;
    valelo *= conv;
    valehi *= conv;
    hout->GetX()[ibin] = pt;
    hout->GetY()[ibin] = val;
    hout->GetEYlow()[ibin] = valelo;
    hout->GetEYhigh()[ibin] = valehi;
  }
  return hout;
}

TH1 *
SummedId_1over2pipt_dNdeta(const Char_t *filename, Int_t icent, Float_t etarange, Float_t scalePi = 1.)
{

  const Char_t *chargeName[2] = {
    "plus", "minus"
  };

  TFile *filein = TFile::Open(filename);
  TH1 *hy[AliPID::kSPECIES][2];
  TH1 *heta[AliPID::kSPECIES][2];
  for (Int_t ipart = 2; ipart < AliPID::kSPECIES; ipart++)
    for (Int_t icharge = 0; icharge < 2; icharge++) {
      hy[ipart][icharge] = (TH1 *)filein->Get(Form("cent%d_%s_%s", icent, AliPID::ParticleName(ipart), chargeName[icharge]));
      if (!hy[ipart][icharge]) {
	printf("cannot find cent%d_%s_%s\n", icent, AliPID::ParticleName(ipart), chargeName[icharge]);
	return NULL;
      }
      heta[ipart][icharge] = Convert_dNdy_1over2pipt_dNdeta(hy[ipart][icharge], AliPID::ParticleMass(ipart), etarange);
      if (ipart == 2) heta[ipart][icharge]->Scale(scalePi);
    }

  /* sum */
  TH1D *hsum = heta[2][0]->Clone("hsum");
  hsum->Reset();
  for (Int_t ipart = 2; ipart < AliPID::kSPECIES; ipart++)
    for (Int_t icharge = 0; icharge < 2; icharge++) {
      hsum->Add(heta[ipart][icharge]);
    }
  for (Int_t ipt = 0; ipt < hsum->GetNbinsX(); ipt++) {
    Double_t err = 0.;
    for (Int_t ipart = 2; ipart < AliPID::kSPECIES; ipart++)
      for (Int_t icharge = 0; icharge < 2; icharge++) {
	err += heta[ipart][icharge]->GetBinError(ipt + 1);
      }
    hsum->SetBinError(ipt + 1, err);
  }
  return hsum;
}

TH1 *
SummedId_dNdeta(const Char_t *filename, Int_t icent)
{

  const Char_t *chargeName[2] = {
    "plus", "minus"
  };

  TFile *filein = TFile::Open(filename);
  TH1 *hy[AliPID::kSPECIES][2];
  TH1 *heta[AliPID::kSPECIES][2];
  for (Int_t ipart = 2; ipart < AliPID::kSPECIES; ipart++)
    for (Int_t icharge = 0; icharge < 2; icharge++) {
      hy[ipart][icharge] = (TH1 *)filein->Get(Form("cent%d_%s_%s", icent, AliPID::ParticleName(ipart), chargeName[icharge]));
      if (!hy[ipart][icharge]) {
	printf("cannot find cent%d_%s_%s\n", icent, AliPID::ParticleName(ipart), chargeName[icharge]);
	return NULL;
      }
      heta[ipart][icharge] = Convert_dNdy_dNdeta(hy[ipart][icharge], AliPID::ParticleMass(ipart));
    }

  /* sum */
  TH1D *hsum = heta[2][0]->Clone("hsum");
  hsum->Reset();
  for (Int_t ipart = 2; ipart < AliPID::kSPECIES; ipart++)
    for (Int_t icharge = 0; icharge < 2; icharge++)
      hsum->Add(heta[ipart][icharge]);

  return hsum;
}

/*****************************************************************/

TH1 *
ReturnExtremeHighHisto(TH1 *hin, TH1 *herr = NULL)
{
  TH1 *hout = (TH1 *)hin->Clone(Form("%s_extremehigh", hin->GetName()));
  for (Int_t ibin = 0; ibin < hin->GetNbinsX(); ibin++) {
    if (hin->GetBinError(ibin + 1) <= 0.) continue;
    Double_t val = hin->GetBinContent(ibin + 1);
    Double_t err = hin->GetBinError(ibin + 1);
    if (herr) err = herr->GetBinError(ibin + 1);
    hout->SetBinContent(ibin + 1, val + err);
  }
  return hout;
}

TH1 *
ReturnExtremeLowHisto(TH1 *hin, TH1 *herr = NULL)
{
  TH1 *hout = (TH1 *)hin->Clone(Form("%s_extremelow", hin->GetName()));
  for (Int_t ibin = 0; ibin < hin->GetNbinsX(); ibin++) {
    if (hin->GetBinError(ibin + 1) <= 0.) continue;
    Double_t val = hin->GetBinContent(ibin + 1);
    Double_t err = hin->GetBinError(ibin + 1);
    if (herr) err = herr->GetBinError(ibin + 1);
    hout->SetBinContent(ibin + 1, val - err);
  }
  return hout;
}

TH1 *
ReturnExtremeSoftHisto(TH1 *hin, TH1 *herr = NULL)
{
  return ReturnExtremeHisto(hin, herr, -1.);
}

TH1 *
ReturnExtremeHardHisto(TH1 *hin, TH1 *herr = NULL)
{
  return ReturnExtremeHisto(hin, herr, 1.);
}

TH1 *
ReturnExtremeHisto(TH1 *hin, TH1 *herr = NULL, Float_t sign = 1.)
{
  Double_t ptlow, pthigh;
  for (Int_t ibin = 0; ibin < hin->GetNbinsX(); ibin++) {
    if (hin->GetBinError(ibin + 1) <= 0.) continue;
    ptlow = hin->GetBinLowEdge(ibin + 1);
    break;
  }
  for (Int_t ibin = hin->GetNbinsX(); ibin >= 0; ibin--) {
    if (hin->GetBinError(ibin + 1) <= 0.) continue;
    pthigh = hin->GetBinLowEdge(ibin + 2);
    break;
  }

  Double_t mean = hin->GetMean();
  Double_t maxdiff = 0.;
  TH1 *hmax = NULL;
  for (Int_t inode = 0; inode < hin->GetNbinsX(); inode++) {

    Double_t ptnode = hin->GetBinCenter(inode + 1);
    TH1 *hout = (TH1 *)hin->Clone(Form("%s_extremehard", hin->GetName()));
    
    for (Int_t ibin = 0; ibin < hin->GetNbinsX(); ibin++) {
      if (hin->GetBinError(ibin + 1) <= 0.) continue;
      Double_t val = hin->GetBinContent(ibin + 1);
      Double_t err = hin->GetBinError(ibin + 1);
      if (herr) err = herr->GetBinError(ibin + 1);
      Double_t cen = hin->GetBinCenter(ibin + 1);
      //    err *= -1. - (cen - ptlow) * (-1. - 1.) / (pthigh - ptlow);
      if (cen < ptnode)
        err *= -1. + (cen - ptlow) / (ptnode - ptlow);
      else
        err *= (cen - ptnode) / (pthigh - ptnode);

      hout->SetBinContent(ibin + 1, val + sign * err);
    }

    Double_t diff = TMath::Abs(mean - hout->GetMean());
    if (diff > maxdiff) {
      //      printf("found max at %f\n", ptnode);
      if (hmax) delete hmax;
      hmax = (TH1 *)hout->Clone("hmax");
      maxdiff = diff;
    }
    delete hout;
  }
  return hmax;
}

TGraphErrors *
ReturnExtremeSoftGraph(TGraphErrors *hin, TGraphErrors *herr = NULL)
{
  TGraphErrors *hout = (TGraphErrors *)hin->Clone(Form("%s_extremesoft", hin->GetName()));
  Double_t ptlow, pthigh;
  Double_t ptlow = hin->GetX()[0];
  Double_t pthigh = hin->GetX()[hin->GetN() - 1];

  for (Int_t ibin = 0; ibin < hin->GetN(); ibin++) {
    Double_t val = hin->GetY()[ibin];
    Double_t err = hin->GetEY()[ibin];
    if (herr) err = herr->GetEY()[ibin];
    Double_t cen = hin->GetX()[ibin];
    err *= 1. + (cen - ptlow) * (-1. - 1.) / (pthigh - ptlow);
    hout->SetPoint(ibin, cen, val + err);
  }
  return hout;
}


TGraphErrors *
ReturnExtremeHardGraph(TGraphErrors *hin, TGraphErrors *herr = NULL)
{
  TGraphErrors *hout = (TGraphErrors *)hin->Clone(Form("%s_extremehard", hin->GetName()));
  Double_t ptlow, pthigh;
  Double_t ptlow = hin->GetX()[0];
  Double_t pthigh = hin->GetX()[hin->GetN() - 1];

  for (Int_t ibin = 0; ibin < hin->GetN(); ibin++) {
    Double_t val = hin->GetY()[ibin];
    Double_t err = hin->GetEY()[ibin];
    if (herr) err = herr->GetEY()[ibin];
    Double_t cen = hin->GetX()[ibin];
    err *= -1. - (cen - ptlow) * (-1. - 1.) / (pthigh - ptlow);
    hout->SetPoint(ibin, cen, val + err);
  }
  return hout;
}

 SpectraUtils.C:1
 SpectraUtils.C:2
 SpectraUtils.C:3
 SpectraUtils.C:4
 SpectraUtils.C:5
 SpectraUtils.C:6
 SpectraUtils.C:7
 SpectraUtils.C:8
 SpectraUtils.C:9
 SpectraUtils.C:10
 SpectraUtils.C:11
 SpectraUtils.C:12
 SpectraUtils.C:13
 SpectraUtils.C:14
 SpectraUtils.C:15
 SpectraUtils.C:16
 SpectraUtils.C:17
 SpectraUtils.C:18
 SpectraUtils.C:19
 SpectraUtils.C:20
 SpectraUtils.C:21
 SpectraUtils.C:22
 SpectraUtils.C:23
 SpectraUtils.C:24
 SpectraUtils.C:25
 SpectraUtils.C:26
 SpectraUtils.C:27
 SpectraUtils.C:28
 SpectraUtils.C:29
 SpectraUtils.C:30
 SpectraUtils.C:31
 SpectraUtils.C:32
 SpectraUtils.C:33
 SpectraUtils.C:34
 SpectraUtils.C:35
 SpectraUtils.C:36
 SpectraUtils.C:37
 SpectraUtils.C:38
 SpectraUtils.C:39
 SpectraUtils.C:40
 SpectraUtils.C:41
 SpectraUtils.C:42
 SpectraUtils.C:43
 SpectraUtils.C:44
 SpectraUtils.C:45
 SpectraUtils.C:46
 SpectraUtils.C:47
 SpectraUtils.C:48
 SpectraUtils.C:49
 SpectraUtils.C:50
 SpectraUtils.C:51
 SpectraUtils.C:52
 SpectraUtils.C:53
 SpectraUtils.C:54
 SpectraUtils.C:55
 SpectraUtils.C:56
 SpectraUtils.C:57
 SpectraUtils.C:58
 SpectraUtils.C:59
 SpectraUtils.C:60
 SpectraUtils.C:61
 SpectraUtils.C:62
 SpectraUtils.C:63
 SpectraUtils.C:64
 SpectraUtils.C:65
 SpectraUtils.C:66
 SpectraUtils.C:67
 SpectraUtils.C:68
 SpectraUtils.C:69
 SpectraUtils.C:70
 SpectraUtils.C:71
 SpectraUtils.C:72
 SpectraUtils.C:73
 SpectraUtils.C:74
 SpectraUtils.C:75
 SpectraUtils.C:76
 SpectraUtils.C:77
 SpectraUtils.C:78
 SpectraUtils.C:79
 SpectraUtils.C:80
 SpectraUtils.C:81
 SpectraUtils.C:82
 SpectraUtils.C:83
 SpectraUtils.C:84
 SpectraUtils.C:85
 SpectraUtils.C:86
 SpectraUtils.C:87
 SpectraUtils.C:88
 SpectraUtils.C:89
 SpectraUtils.C:90
 SpectraUtils.C:91
 SpectraUtils.C:92
 SpectraUtils.C:93
 SpectraUtils.C:94
 SpectraUtils.C:95
 SpectraUtils.C:96
 SpectraUtils.C:97
 SpectraUtils.C:98
 SpectraUtils.C:99
 SpectraUtils.C:100
 SpectraUtils.C:101
 SpectraUtils.C:102
 SpectraUtils.C:103
 SpectraUtils.C:104
 SpectraUtils.C:105
 SpectraUtils.C:106
 SpectraUtils.C:107
 SpectraUtils.C:108
 SpectraUtils.C:109
 SpectraUtils.C:110
 SpectraUtils.C:111
 SpectraUtils.C:112
 SpectraUtils.C:113
 SpectraUtils.C:114
 SpectraUtils.C:115
 SpectraUtils.C:116
 SpectraUtils.C:117
 SpectraUtils.C:118
 SpectraUtils.C:119
 SpectraUtils.C:120
 SpectraUtils.C:121
 SpectraUtils.C:122
 SpectraUtils.C:123
 SpectraUtils.C:124
 SpectraUtils.C:125
 SpectraUtils.C:126
 SpectraUtils.C:127
 SpectraUtils.C:128
 SpectraUtils.C:129
 SpectraUtils.C:130
 SpectraUtils.C:131
 SpectraUtils.C:132
 SpectraUtils.C:133
 SpectraUtils.C:134
 SpectraUtils.C:135
 SpectraUtils.C:136
 SpectraUtils.C:137
 SpectraUtils.C:138
 SpectraUtils.C:139
 SpectraUtils.C:140
 SpectraUtils.C:141
 SpectraUtils.C:142
 SpectraUtils.C:143
 SpectraUtils.C:144
 SpectraUtils.C:145
 SpectraUtils.C:146
 SpectraUtils.C:147
 SpectraUtils.C:148
 SpectraUtils.C:149
 SpectraUtils.C:150
 SpectraUtils.C:151
 SpectraUtils.C:152
 SpectraUtils.C:153
 SpectraUtils.C:154
 SpectraUtils.C:155
 SpectraUtils.C:156
 SpectraUtils.C:157
 SpectraUtils.C:158
 SpectraUtils.C:159
 SpectraUtils.C:160
 SpectraUtils.C:161
 SpectraUtils.C:162
 SpectraUtils.C:163
 SpectraUtils.C:164
 SpectraUtils.C:165
 SpectraUtils.C:166
 SpectraUtils.C:167
 SpectraUtils.C:168
 SpectraUtils.C:169
 SpectraUtils.C:170
 SpectraUtils.C:171
 SpectraUtils.C:172
 SpectraUtils.C:173
 SpectraUtils.C:174
 SpectraUtils.C:175
 SpectraUtils.C:176
 SpectraUtils.C:177
 SpectraUtils.C:178
 SpectraUtils.C:179
 SpectraUtils.C:180
 SpectraUtils.C:181
 SpectraUtils.C:182
 SpectraUtils.C:183
 SpectraUtils.C:184
 SpectraUtils.C:185
 SpectraUtils.C:186
 SpectraUtils.C:187
 SpectraUtils.C:188
 SpectraUtils.C:189
 SpectraUtils.C:190
 SpectraUtils.C:191
 SpectraUtils.C:192
 SpectraUtils.C:193
 SpectraUtils.C:194
 SpectraUtils.C:195
 SpectraUtils.C:196
 SpectraUtils.C:197
 SpectraUtils.C:198
 SpectraUtils.C:199
 SpectraUtils.C:200
 SpectraUtils.C:201
 SpectraUtils.C:202
 SpectraUtils.C:203
 SpectraUtils.C:204
 SpectraUtils.C:205
 SpectraUtils.C:206
 SpectraUtils.C:207
 SpectraUtils.C:208
 SpectraUtils.C:209
 SpectraUtils.C:210
 SpectraUtils.C:211
 SpectraUtils.C:212
 SpectraUtils.C:213
 SpectraUtils.C:214
 SpectraUtils.C:215
 SpectraUtils.C:216
 SpectraUtils.C:217
 SpectraUtils.C:218
 SpectraUtils.C:219
 SpectraUtils.C:220
 SpectraUtils.C:221
 SpectraUtils.C:222
 SpectraUtils.C:223
 SpectraUtils.C:224
 SpectraUtils.C:225
 SpectraUtils.C:226
 SpectraUtils.C:227
 SpectraUtils.C:228
 SpectraUtils.C:229
 SpectraUtils.C:230
 SpectraUtils.C:231
 SpectraUtils.C:232
 SpectraUtils.C:233
 SpectraUtils.C:234
 SpectraUtils.C:235
 SpectraUtils.C:236
 SpectraUtils.C:237
 SpectraUtils.C:238
 SpectraUtils.C:239
 SpectraUtils.C:240
 SpectraUtils.C:241
 SpectraUtils.C:242
 SpectraUtils.C:243
 SpectraUtils.C:244
 SpectraUtils.C:245
 SpectraUtils.C:246
 SpectraUtils.C:247
 SpectraUtils.C:248
 SpectraUtils.C:249
 SpectraUtils.C:250
 SpectraUtils.C:251
 SpectraUtils.C:252
 SpectraUtils.C:253
 SpectraUtils.C:254
 SpectraUtils.C:255
 SpectraUtils.C:256
 SpectraUtils.C:257
 SpectraUtils.C:258
 SpectraUtils.C:259
 SpectraUtils.C:260
 SpectraUtils.C:261
 SpectraUtils.C:262
 SpectraUtils.C:263
 SpectraUtils.C:264
 SpectraUtils.C:265
 SpectraUtils.C:266
 SpectraUtils.C:267
 SpectraUtils.C:268
 SpectraUtils.C:269
 SpectraUtils.C:270
 SpectraUtils.C:271
 SpectraUtils.C:272
 SpectraUtils.C:273
 SpectraUtils.C:274
 SpectraUtils.C:275
 SpectraUtils.C:276
 SpectraUtils.C:277
 SpectraUtils.C:278
 SpectraUtils.C:279
 SpectraUtils.C:280
 SpectraUtils.C:281
 SpectraUtils.C:282
 SpectraUtils.C:283
 SpectraUtils.C:284
 SpectraUtils.C:285
 SpectraUtils.C:286
 SpectraUtils.C:287
 SpectraUtils.C:288
 SpectraUtils.C:289
 SpectraUtils.C:290
 SpectraUtils.C:291
 SpectraUtils.C:292
 SpectraUtils.C:293
 SpectraUtils.C:294
 SpectraUtils.C:295
 SpectraUtils.C:296
 SpectraUtils.C:297
 SpectraUtils.C:298
 SpectraUtils.C:299
 SpectraUtils.C:300
 SpectraUtils.C:301
 SpectraUtils.C:302
 SpectraUtils.C:303
 SpectraUtils.C:304
 SpectraUtils.C:305
 SpectraUtils.C:306
 SpectraUtils.C:307
 SpectraUtils.C:308
 SpectraUtils.C:309
 SpectraUtils.C:310
 SpectraUtils.C:311
 SpectraUtils.C:312
 SpectraUtils.C:313
 SpectraUtils.C:314
 SpectraUtils.C:315
 SpectraUtils.C:316
 SpectraUtils.C:317
 SpectraUtils.C:318
 SpectraUtils.C:319
 SpectraUtils.C:320
 SpectraUtils.C:321
 SpectraUtils.C:322
 SpectraUtils.C:323
 SpectraUtils.C:324
 SpectraUtils.C:325
 SpectraUtils.C:326
 SpectraUtils.C:327
 SpectraUtils.C:328
 SpectraUtils.C:329
 SpectraUtils.C:330
 SpectraUtils.C:331
 SpectraUtils.C:332
 SpectraUtils.C:333
 SpectraUtils.C:334
 SpectraUtils.C:335
 SpectraUtils.C:336
 SpectraUtils.C:337
 SpectraUtils.C:338
 SpectraUtils.C:339
 SpectraUtils.C:340
 SpectraUtils.C:341
 SpectraUtils.C:342
 SpectraUtils.C:343
 SpectraUtils.C:344
 SpectraUtils.C:345
 SpectraUtils.C:346
 SpectraUtils.C:347
 SpectraUtils.C:348
 SpectraUtils.C:349
 SpectraUtils.C:350
 SpectraUtils.C:351
 SpectraUtils.C:352
 SpectraUtils.C:353
 SpectraUtils.C:354
 SpectraUtils.C:355
 SpectraUtils.C:356
 SpectraUtils.C:357
 SpectraUtils.C:358
 SpectraUtils.C:359
 SpectraUtils.C:360
 SpectraUtils.C:361
 SpectraUtils.C:362
 SpectraUtils.C:363
 SpectraUtils.C:364
 SpectraUtils.C:365
 SpectraUtils.C:366
 SpectraUtils.C:367
 SpectraUtils.C:368
 SpectraUtils.C:369
 SpectraUtils.C:370
 SpectraUtils.C:371
 SpectraUtils.C:372
 SpectraUtils.C:373
 SpectraUtils.C:374
 SpectraUtils.C:375
 SpectraUtils.C:376
 SpectraUtils.C:377
 SpectraUtils.C:378
 SpectraUtils.C:379
 SpectraUtils.C:380
 SpectraUtils.C:381
 SpectraUtils.C:382
 SpectraUtils.C:383
 SpectraUtils.C:384
 SpectraUtils.C:385
 SpectraUtils.C:386
 SpectraUtils.C:387
 SpectraUtils.C:388
 SpectraUtils.C:389
 SpectraUtils.C:390
 SpectraUtils.C:391
 SpectraUtils.C:392
 SpectraUtils.C:393
 SpectraUtils.C:394
 SpectraUtils.C:395
 SpectraUtils.C:396
 SpectraUtils.C:397
 SpectraUtils.C:398
 SpectraUtils.C:399
 SpectraUtils.C:400
 SpectraUtils.C:401
 SpectraUtils.C:402
 SpectraUtils.C:403
 SpectraUtils.C:404
 SpectraUtils.C:405
 SpectraUtils.C:406
 SpectraUtils.C:407
 SpectraUtils.C:408
 SpectraUtils.C:409
 SpectraUtils.C:410
 SpectraUtils.C:411
 SpectraUtils.C:412
 SpectraUtils.C:413
 SpectraUtils.C:414
 SpectraUtils.C:415
 SpectraUtils.C:416
 SpectraUtils.C:417
 SpectraUtils.C:418
 SpectraUtils.C:419
 SpectraUtils.C:420
 SpectraUtils.C:421
 SpectraUtils.C:422
 SpectraUtils.C:423
 SpectraUtils.C:424
 SpectraUtils.C:425
 SpectraUtils.C:426
 SpectraUtils.C:427
 SpectraUtils.C:428
 SpectraUtils.C:429
 SpectraUtils.C:430
 SpectraUtils.C:431
 SpectraUtils.C:432
 SpectraUtils.C:433
 SpectraUtils.C:434
 SpectraUtils.C:435
 SpectraUtils.C:436
 SpectraUtils.C:437
 SpectraUtils.C:438
 SpectraUtils.C:439
 SpectraUtils.C:440
 SpectraUtils.C:441
 SpectraUtils.C:442
 SpectraUtils.C:443
 SpectraUtils.C:444
 SpectraUtils.C:445
 SpectraUtils.C:446
 SpectraUtils.C:447
 SpectraUtils.C:448
 SpectraUtils.C:449
 SpectraUtils.C:450
 SpectraUtils.C:451
 SpectraUtils.C:452
 SpectraUtils.C:453
 SpectraUtils.C:454
 SpectraUtils.C:455
 SpectraUtils.C:456
 SpectraUtils.C:457
 SpectraUtils.C:458
 SpectraUtils.C:459
 SpectraUtils.C:460
 SpectraUtils.C:461
 SpectraUtils.C:462
 SpectraUtils.C:463
 SpectraUtils.C:464
 SpectraUtils.C:465
 SpectraUtils.C:466
 SpectraUtils.C:467
 SpectraUtils.C:468
 SpectraUtils.C:469
 SpectraUtils.C:470
 SpectraUtils.C:471
 SpectraUtils.C:472
 SpectraUtils.C:473
 SpectraUtils.C:474
 SpectraUtils.C:475
 SpectraUtils.C:476
 SpectraUtils.C:477
 SpectraUtils.C:478
 SpectraUtils.C:479
 SpectraUtils.C:480
 SpectraUtils.C:481
 SpectraUtils.C:482
 SpectraUtils.C:483
 SpectraUtils.C:484
 SpectraUtils.C:485
 SpectraUtils.C:486
 SpectraUtils.C:487
 SpectraUtils.C:488
 SpectraUtils.C:489
 SpectraUtils.C:490
 SpectraUtils.C:491
 SpectraUtils.C:492
 SpectraUtils.C:493
 SpectraUtils.C:494
 SpectraUtils.C:495
 SpectraUtils.C:496
 SpectraUtils.C:497
 SpectraUtils.C:498
 SpectraUtils.C:499
 SpectraUtils.C:500
 SpectraUtils.C:501
 SpectraUtils.C:502
 SpectraUtils.C:503
 SpectraUtils.C:504
 SpectraUtils.C:505
 SpectraUtils.C:506
 SpectraUtils.C:507
 SpectraUtils.C:508
 SpectraUtils.C:509
 SpectraUtils.C:510
 SpectraUtils.C:511
 SpectraUtils.C:512
 SpectraUtils.C:513
 SpectraUtils.C:514
 SpectraUtils.C:515
 SpectraUtils.C:516
 SpectraUtils.C:517
 SpectraUtils.C:518
 SpectraUtils.C:519
 SpectraUtils.C:520
 SpectraUtils.C:521
 SpectraUtils.C:522
 SpectraUtils.C:523
 SpectraUtils.C:524
 SpectraUtils.C:525
 SpectraUtils.C:526
 SpectraUtils.C:527
 SpectraUtils.C:528
 SpectraUtils.C:529
 SpectraUtils.C:530
 SpectraUtils.C:531
 SpectraUtils.C:532
 SpectraUtils.C:533
 SpectraUtils.C:534
 SpectraUtils.C:535
 SpectraUtils.C:536
 SpectraUtils.C:537
 SpectraUtils.C:538
 SpectraUtils.C:539
 SpectraUtils.C:540
 SpectraUtils.C:541
 SpectraUtils.C:542
 SpectraUtils.C:543
 SpectraUtils.C:544
 SpectraUtils.C:545
 SpectraUtils.C:546
 SpectraUtils.C:547
 SpectraUtils.C:548
 SpectraUtils.C:549
 SpectraUtils.C:550
 SpectraUtils.C:551
 SpectraUtils.C:552
 SpectraUtils.C:553
 SpectraUtils.C:554
 SpectraUtils.C:555
 SpectraUtils.C:556
 SpectraUtils.C:557
 SpectraUtils.C:558
 SpectraUtils.C:559
 SpectraUtils.C:560
 SpectraUtils.C:561
 SpectraUtils.C:562
 SpectraUtils.C:563
 SpectraUtils.C:564
 SpectraUtils.C:565
 SpectraUtils.C:566
 SpectraUtils.C:567
 SpectraUtils.C:568
 SpectraUtils.C:569
 SpectraUtils.C:570
 SpectraUtils.C:571
 SpectraUtils.C:572
 SpectraUtils.C:573
 SpectraUtils.C:574
 SpectraUtils.C:575
 SpectraUtils.C:576
 SpectraUtils.C:577
 SpectraUtils.C:578
 SpectraUtils.C:579
 SpectraUtils.C:580
 SpectraUtils.C:581
 SpectraUtils.C:582
 SpectraUtils.C:583
 SpectraUtils.C:584
 SpectraUtils.C:585
 SpectraUtils.C:586
 SpectraUtils.C:587
 SpectraUtils.C:588
 SpectraUtils.C:589
 SpectraUtils.C:590
 SpectraUtils.C:591
 SpectraUtils.C:592
 SpectraUtils.C:593
 SpectraUtils.C:594
 SpectraUtils.C:595
 SpectraUtils.C:596
 SpectraUtils.C:597
 SpectraUtils.C:598
 SpectraUtils.C:599
 SpectraUtils.C:600
 SpectraUtils.C:601
 SpectraUtils.C:602
 SpectraUtils.C:603
 SpectraUtils.C:604
 SpectraUtils.C:605
 SpectraUtils.C:606
 SpectraUtils.C:607
 SpectraUtils.C:608
 SpectraUtils.C:609
 SpectraUtils.C:610
 SpectraUtils.C:611
 SpectraUtils.C:612
 SpectraUtils.C:613
 SpectraUtils.C:614
 SpectraUtils.C:615
 SpectraUtils.C:616
 SpectraUtils.C:617
 SpectraUtils.C:618
 SpectraUtils.C:619
 SpectraUtils.C:620
 SpectraUtils.C:621
 SpectraUtils.C:622
 SpectraUtils.C:623
 SpectraUtils.C:624
 SpectraUtils.C:625
 SpectraUtils.C:626
 SpectraUtils.C:627
 SpectraUtils.C:628
 SpectraUtils.C:629
 SpectraUtils.C:630
 SpectraUtils.C:631
 SpectraUtils.C:632
 SpectraUtils.C:633
 SpectraUtils.C:634
 SpectraUtils.C:635
 SpectraUtils.C:636
 SpectraUtils.C:637
 SpectraUtils.C:638
 SpectraUtils.C:639
 SpectraUtils.C:640
 SpectraUtils.C:641
 SpectraUtils.C:642
 SpectraUtils.C:643
 SpectraUtils.C:644
 SpectraUtils.C:645
 SpectraUtils.C:646
 SpectraUtils.C:647
 SpectraUtils.C:648
 SpectraUtils.C:649
 SpectraUtils.C:650
 SpectraUtils.C:651
 SpectraUtils.C:652
 SpectraUtils.C:653
 SpectraUtils.C:654
 SpectraUtils.C:655
 SpectraUtils.C:656
 SpectraUtils.C:657
 SpectraUtils.C:658
 SpectraUtils.C:659
 SpectraUtils.C:660
 SpectraUtils.C:661
 SpectraUtils.C:662
 SpectraUtils.C:663
 SpectraUtils.C:664
 SpectraUtils.C:665
 SpectraUtils.C:666
 SpectraUtils.C:667
 SpectraUtils.C:668
 SpectraUtils.C:669
 SpectraUtils.C:670
 SpectraUtils.C:671
 SpectraUtils.C:672
 SpectraUtils.C:673
 SpectraUtils.C:674
 SpectraUtils.C:675
 SpectraUtils.C:676
 SpectraUtils.C:677
 SpectraUtils.C:678
 SpectraUtils.C:679
 SpectraUtils.C:680
 SpectraUtils.C:681
 SpectraUtils.C:682
 SpectraUtils.C:683
 SpectraUtils.C:684
 SpectraUtils.C:685
 SpectraUtils.C:686
 SpectraUtils.C:687
 SpectraUtils.C:688
 SpectraUtils.C:689
 SpectraUtils.C:690
 SpectraUtils.C:691
 SpectraUtils.C:692
 SpectraUtils.C:693
 SpectraUtils.C:694
 SpectraUtils.C:695
 SpectraUtils.C:696
 SpectraUtils.C:697
 SpectraUtils.C:698
 SpectraUtils.C:699
 SpectraUtils.C:700
 SpectraUtils.C:701
 SpectraUtils.C:702
 SpectraUtils.C:703
 SpectraUtils.C:704
 SpectraUtils.C:705
 SpectraUtils.C:706
 SpectraUtils.C:707
 SpectraUtils.C:708
 SpectraUtils.C:709
 SpectraUtils.C:710
 SpectraUtils.C:711
 SpectraUtils.C:712
 SpectraUtils.C:713
 SpectraUtils.C:714
 SpectraUtils.C:715
 SpectraUtils.C:716
 SpectraUtils.C:717
 SpectraUtils.C:718
 SpectraUtils.C:719
 SpectraUtils.C:720
 SpectraUtils.C:721
 SpectraUtils.C:722
 SpectraUtils.C:723
 SpectraUtils.C:724
 SpectraUtils.C:725
 SpectraUtils.C:726
 SpectraUtils.C:727
 SpectraUtils.C:728
 SpectraUtils.C:729
 SpectraUtils.C:730
 SpectraUtils.C:731
 SpectraUtils.C:732
 SpectraUtils.C:733
 SpectraUtils.C:734
 SpectraUtils.C:735
 SpectraUtils.C:736
 SpectraUtils.C:737
 SpectraUtils.C:738
 SpectraUtils.C:739
 SpectraUtils.C:740
 SpectraUtils.C:741
 SpectraUtils.C:742
 SpectraUtils.C:743
 SpectraUtils.C:744
 SpectraUtils.C:745
 SpectraUtils.C:746
 SpectraUtils.C:747
 SpectraUtils.C:748
 SpectraUtils.C:749
 SpectraUtils.C:750
 SpectraUtils.C:751
 SpectraUtils.C:752
 SpectraUtils.C:753
 SpectraUtils.C:754
 SpectraUtils.C:755
 SpectraUtils.C:756
 SpectraUtils.C:757
 SpectraUtils.C:758
 SpectraUtils.C:759
 SpectraUtils.C:760
 SpectraUtils.C:761
 SpectraUtils.C:762
 SpectraUtils.C:763
 SpectraUtils.C:764
 SpectraUtils.C:765
 SpectraUtils.C:766
 SpectraUtils.C:767
 SpectraUtils.C:768
 SpectraUtils.C:769
 SpectraUtils.C:770
 SpectraUtils.C:771
 SpectraUtils.C:772
 SpectraUtils.C:773
 SpectraUtils.C:774
 SpectraUtils.C:775
 SpectraUtils.C:776
 SpectraUtils.C:777
 SpectraUtils.C:778
 SpectraUtils.C:779
 SpectraUtils.C:780
 SpectraUtils.C:781
 SpectraUtils.C:782
 SpectraUtils.C:783
 SpectraUtils.C:784
 SpectraUtils.C:785
 SpectraUtils.C:786
 SpectraUtils.C:787
 SpectraUtils.C:788
 SpectraUtils.C:789
 SpectraUtils.C:790
 SpectraUtils.C:791
 SpectraUtils.C:792
 SpectraUtils.C:793
 SpectraUtils.C:794
 SpectraUtils.C:795
 SpectraUtils.C:796
 SpectraUtils.C:797
 SpectraUtils.C:798
 SpectraUtils.C:799
 SpectraUtils.C:800
 SpectraUtils.C:801
 SpectraUtils.C:802
 SpectraUtils.C:803
 SpectraUtils.C:804
 SpectraUtils.C:805
 SpectraUtils.C:806
 SpectraUtils.C:807
 SpectraUtils.C:808
 SpectraUtils.C:809
 SpectraUtils.C:810
 SpectraUtils.C:811
 SpectraUtils.C:812
 SpectraUtils.C:813
 SpectraUtils.C:814
 SpectraUtils.C:815
 SpectraUtils.C:816
 SpectraUtils.C:817
 SpectraUtils.C:818
 SpectraUtils.C:819
 SpectraUtils.C:820
 SpectraUtils.C:821
 SpectraUtils.C:822
 SpectraUtils.C:823
 SpectraUtils.C:824
 SpectraUtils.C:825
 SpectraUtils.C:826
 SpectraUtils.C:827
 SpectraUtils.C:828
 SpectraUtils.C:829
 SpectraUtils.C:830
 SpectraUtils.C:831
 SpectraUtils.C:832
 SpectraUtils.C:833
 SpectraUtils.C:834
 SpectraUtils.C:835
 SpectraUtils.C:836
 SpectraUtils.C:837
 SpectraUtils.C:838
 SpectraUtils.C:839
 SpectraUtils.C:840
 SpectraUtils.C:841
 SpectraUtils.C:842
 SpectraUtils.C:843
 SpectraUtils.C:844
 SpectraUtils.C:845
 SpectraUtils.C:846
 SpectraUtils.C:847
 SpectraUtils.C:848
 SpectraUtils.C:849
 SpectraUtils.C:850
 SpectraUtils.C:851
 SpectraUtils.C:852
 SpectraUtils.C:853
 SpectraUtils.C:854
 SpectraUtils.C:855
 SpectraUtils.C:856
 SpectraUtils.C:857
 SpectraUtils.C:858
 SpectraUtils.C:859
 SpectraUtils.C:860
 SpectraUtils.C:861
 SpectraUtils.C:862
 SpectraUtils.C:863
 SpectraUtils.C:864
 SpectraUtils.C:865
 SpectraUtils.C:866
 SpectraUtils.C:867
 SpectraUtils.C:868
 SpectraUtils.C:869
 SpectraUtils.C:870
 SpectraUtils.C:871
 SpectraUtils.C:872
 SpectraUtils.C:873
 SpectraUtils.C:874
 SpectraUtils.C:875
 SpectraUtils.C:876
 SpectraUtils.C:877
 SpectraUtils.C:878
 SpectraUtils.C:879
 SpectraUtils.C:880
 SpectraUtils.C:881
 SpectraUtils.C:882
 SpectraUtils.C:883
 SpectraUtils.C:884
 SpectraUtils.C:885
 SpectraUtils.C:886
 SpectraUtils.C:887
 SpectraUtils.C:888
 SpectraUtils.C:889
 SpectraUtils.C:890
 SpectraUtils.C:891
 SpectraUtils.C:892
 SpectraUtils.C:893
 SpectraUtils.C:894
 SpectraUtils.C:895
 SpectraUtils.C:896
 SpectraUtils.C:897
 SpectraUtils.C:898
 SpectraUtils.C:899
 SpectraUtils.C:900
 SpectraUtils.C:901
 SpectraUtils.C:902
 SpectraUtils.C:903
 SpectraUtils.C:904
 SpectraUtils.C:905
 SpectraUtils.C:906
 SpectraUtils.C:907
 SpectraUtils.C:908
 SpectraUtils.C:909
 SpectraUtils.C:910
 SpectraUtils.C:911
 SpectraUtils.C:912
 SpectraUtils.C:913
 SpectraUtils.C:914
 SpectraUtils.C:915
 SpectraUtils.C:916
 SpectraUtils.C:917
 SpectraUtils.C:918
 SpectraUtils.C:919
 SpectraUtils.C:920
 SpectraUtils.C:921
 SpectraUtils.C:922
 SpectraUtils.C:923
 SpectraUtils.C:924
 SpectraUtils.C:925
 SpectraUtils.C:926
 SpectraUtils.C:927
 SpectraUtils.C:928
 SpectraUtils.C:929
 SpectraUtils.C:930
 SpectraUtils.C:931
 SpectraUtils.C:932
 SpectraUtils.C:933
 SpectraUtils.C:934
 SpectraUtils.C:935
 SpectraUtils.C:936
 SpectraUtils.C:937
 SpectraUtils.C:938
 SpectraUtils.C:939
 SpectraUtils.C:940
 SpectraUtils.C:941
 SpectraUtils.C:942
 SpectraUtils.C:943
 SpectraUtils.C:944
 SpectraUtils.C:945
 SpectraUtils.C:946
 SpectraUtils.C:947
 SpectraUtils.C:948
 SpectraUtils.C:949
 SpectraUtils.C:950
 SpectraUtils.C:951
 SpectraUtils.C:952
 SpectraUtils.C:953
 SpectraUtils.C:954
 SpectraUtils.C:955
 SpectraUtils.C:956
 SpectraUtils.C:957
 SpectraUtils.C:958
 SpectraUtils.C:959
 SpectraUtils.C:960
 SpectraUtils.C:961
 SpectraUtils.C:962
 SpectraUtils.C:963
 SpectraUtils.C:964
 SpectraUtils.C:965
 SpectraUtils.C:966
 SpectraUtils.C:967
 SpectraUtils.C:968
 SpectraUtils.C:969
 SpectraUtils.C:970
 SpectraUtils.C:971
 SpectraUtils.C:972
 SpectraUtils.C:973
 SpectraUtils.C:974
 SpectraUtils.C:975
 SpectraUtils.C:976
 SpectraUtils.C:977
 SpectraUtils.C:978
 SpectraUtils.C:979
 SpectraUtils.C:980
 SpectraUtils.C:981
 SpectraUtils.C:982
 SpectraUtils.C:983
 SpectraUtils.C:984
 SpectraUtils.C:985
 SpectraUtils.C:986
 SpectraUtils.C:987
 SpectraUtils.C:988
 SpectraUtils.C:989
 SpectraUtils.C:990
 SpectraUtils.C:991
 SpectraUtils.C:992
 SpectraUtils.C:993
 SpectraUtils.C:994
 SpectraUtils.C:995
 SpectraUtils.C:996
 SpectraUtils.C:997
 SpectraUtils.C:998
 SpectraUtils.C:999
 SpectraUtils.C:1000
 SpectraUtils.C:1001
 SpectraUtils.C:1002
 SpectraUtils.C:1003
 SpectraUtils.C:1004
 SpectraUtils.C:1005
 SpectraUtils.C:1006
 SpectraUtils.C:1007
 SpectraUtils.C:1008
 SpectraUtils.C:1009
 SpectraUtils.C:1010
 SpectraUtils.C:1011
 SpectraUtils.C:1012
 SpectraUtils.C:1013
 SpectraUtils.C:1014
 SpectraUtils.C:1015
 SpectraUtils.C:1016
 SpectraUtils.C:1017
 SpectraUtils.C:1018
 SpectraUtils.C:1019
 SpectraUtils.C:1020
 SpectraUtils.C:1021
 SpectraUtils.C:1022
 SpectraUtils.C:1023
 SpectraUtils.C:1024
 SpectraUtils.C:1025
 SpectraUtils.C:1026
 SpectraUtils.C:1027
 SpectraUtils.C:1028
 SpectraUtils.C:1029
 SpectraUtils.C:1030
 SpectraUtils.C:1031
 SpectraUtils.C:1032
 SpectraUtils.C:1033
 SpectraUtils.C:1034
 SpectraUtils.C:1035
 SpectraUtils.C:1036
 SpectraUtils.C:1037
 SpectraUtils.C:1038
 SpectraUtils.C:1039
 SpectraUtils.C:1040
 SpectraUtils.C:1041
 SpectraUtils.C:1042
 SpectraUtils.C:1043
 SpectraUtils.C:1044
 SpectraUtils.C:1045
 SpectraUtils.C:1046
 SpectraUtils.C:1047
 SpectraUtils.C:1048
 SpectraUtils.C:1049
 SpectraUtils.C:1050
 SpectraUtils.C:1051
 SpectraUtils.C:1052
 SpectraUtils.C:1053
 SpectraUtils.C:1054
 SpectraUtils.C:1055
 SpectraUtils.C:1056
 SpectraUtils.C:1057
 SpectraUtils.C:1058
 SpectraUtils.C:1059
 SpectraUtils.C:1060
 SpectraUtils.C:1061
 SpectraUtils.C:1062
 SpectraUtils.C:1063
 SpectraUtils.C:1064
 SpectraUtils.C:1065
 SpectraUtils.C:1066
 SpectraUtils.C:1067
 SpectraUtils.C:1068
 SpectraUtils.C:1069
 SpectraUtils.C:1070
 SpectraUtils.C:1071
 SpectraUtils.C:1072
 SpectraUtils.C:1073
 SpectraUtils.C:1074
 SpectraUtils.C:1075
 SpectraUtils.C:1076
 SpectraUtils.C:1077
 SpectraUtils.C:1078
 SpectraUtils.C:1079
 SpectraUtils.C:1080
 SpectraUtils.C:1081
 SpectraUtils.C:1082
 SpectraUtils.C:1083
 SpectraUtils.C:1084
 SpectraUtils.C:1085
 SpectraUtils.C:1086
 SpectraUtils.C:1087
 SpectraUtils.C:1088
 SpectraUtils.C:1089
 SpectraUtils.C:1090
 SpectraUtils.C:1091
 SpectraUtils.C:1092
 SpectraUtils.C:1093
 SpectraUtils.C:1094
 SpectraUtils.C:1095
 SpectraUtils.C:1096
 SpectraUtils.C:1097
 SpectraUtils.C:1098
 SpectraUtils.C:1099
 SpectraUtils.C:1100
 SpectraUtils.C:1101
 SpectraUtils.C:1102
 SpectraUtils.C:1103
 SpectraUtils.C:1104
 SpectraUtils.C:1105
 SpectraUtils.C:1106
 SpectraUtils.C:1107
 SpectraUtils.C:1108
 SpectraUtils.C:1109
 SpectraUtils.C:1110
 SpectraUtils.C:1111
 SpectraUtils.C:1112
 SpectraUtils.C:1113
 SpectraUtils.C:1114
 SpectraUtils.C:1115
 SpectraUtils.C:1116
 SpectraUtils.C:1117
 SpectraUtils.C:1118
 SpectraUtils.C:1119
 SpectraUtils.C:1120
 SpectraUtils.C:1121
 SpectraUtils.C:1122
 SpectraUtils.C:1123
 SpectraUtils.C:1124
 SpectraUtils.C:1125
 SpectraUtils.C:1126
 SpectraUtils.C:1127
 SpectraUtils.C:1128
 SpectraUtils.C:1129
 SpectraUtils.C:1130
 SpectraUtils.C:1131
 SpectraUtils.C:1132
 SpectraUtils.C:1133
 SpectraUtils.C:1134
 SpectraUtils.C:1135
 SpectraUtils.C:1136
 SpectraUtils.C:1137
 SpectraUtils.C:1138
 SpectraUtils.C:1139
 SpectraUtils.C:1140
 SpectraUtils.C:1141
 SpectraUtils.C:1142
 SpectraUtils.C:1143
 SpectraUtils.C:1144
 SpectraUtils.C:1145
 SpectraUtils.C:1146
 SpectraUtils.C:1147
 SpectraUtils.C:1148
 SpectraUtils.C:1149
 SpectraUtils.C:1150
 SpectraUtils.C:1151
 SpectraUtils.C:1152
 SpectraUtils.C:1153
 SpectraUtils.C:1154
 SpectraUtils.C:1155
 SpectraUtils.C:1156
 SpectraUtils.C:1157
 SpectraUtils.C:1158
 SpectraUtils.C:1159
 SpectraUtils.C:1160
 SpectraUtils.C:1161
 SpectraUtils.C:1162
 SpectraUtils.C:1163
 SpectraUtils.C:1164
 SpectraUtils.C:1165
 SpectraUtils.C:1166
 SpectraUtils.C:1167
 SpectraUtils.C:1168
 SpectraUtils.C:1169
 SpectraUtils.C:1170
 SpectraUtils.C:1171
 SpectraUtils.C:1172
 SpectraUtils.C:1173
 SpectraUtils.C:1174
 SpectraUtils.C:1175
 SpectraUtils.C:1176
 SpectraUtils.C:1177
 SpectraUtils.C:1178
 SpectraUtils.C:1179
 SpectraUtils.C:1180
 SpectraUtils.C:1181
 SpectraUtils.C:1182
 SpectraUtils.C:1183
 SpectraUtils.C:1184
 SpectraUtils.C:1185
 SpectraUtils.C:1186
 SpectraUtils.C:1187
 SpectraUtils.C:1188
 SpectraUtils.C:1189
 SpectraUtils.C:1190
 SpectraUtils.C:1191
 SpectraUtils.C:1192
 SpectraUtils.C:1193
 SpectraUtils.C:1194
 SpectraUtils.C:1195
 SpectraUtils.C:1196
 SpectraUtils.C:1197
 SpectraUtils.C:1198
 SpectraUtils.C:1199
 SpectraUtils.C:1200
 SpectraUtils.C:1201
 SpectraUtils.C:1202
 SpectraUtils.C:1203
 SpectraUtils.C:1204
 SpectraUtils.C:1205
 SpectraUtils.C:1206
 SpectraUtils.C:1207
 SpectraUtils.C:1208
 SpectraUtils.C:1209
 SpectraUtils.C:1210
 SpectraUtils.C:1211
 SpectraUtils.C:1212
 SpectraUtils.C:1213
 SpectraUtils.C:1214
 SpectraUtils.C:1215
 SpectraUtils.C:1216
 SpectraUtils.C:1217
 SpectraUtils.C:1218
 SpectraUtils.C:1219
 SpectraUtils.C:1220
 SpectraUtils.C:1221
 SpectraUtils.C:1222
 SpectraUtils.C:1223
 SpectraUtils.C:1224
 SpectraUtils.C:1225
 SpectraUtils.C:1226
 SpectraUtils.C:1227
 SpectraUtils.C:1228
 SpectraUtils.C:1229
 SpectraUtils.C:1230
 SpectraUtils.C:1231
 SpectraUtils.C:1232
 SpectraUtils.C:1233
 SpectraUtils.C:1234
 SpectraUtils.C:1235
 SpectraUtils.C:1236
 SpectraUtils.C:1237
 SpectraUtils.C:1238
 SpectraUtils.C:1239
 SpectraUtils.C:1240
 SpectraUtils.C:1241
 SpectraUtils.C:1242
 SpectraUtils.C:1243
 SpectraUtils.C:1244
 SpectraUtils.C:1245
 SpectraUtils.C:1246
 SpectraUtils.C:1247
 SpectraUtils.C:1248
 SpectraUtils.C:1249
 SpectraUtils.C:1250
 SpectraUtils.C:1251
 SpectraUtils.C:1252
 SpectraUtils.C:1253
 SpectraUtils.C:1254
 SpectraUtils.C:1255
 SpectraUtils.C:1256
 SpectraUtils.C:1257
 SpectraUtils.C:1258
 SpectraUtils.C:1259
 SpectraUtils.C:1260
 SpectraUtils.C:1261
 SpectraUtils.C:1262
 SpectraUtils.C:1263
 SpectraUtils.C:1264
 SpectraUtils.C:1265
 SpectraUtils.C:1266
 SpectraUtils.C:1267
 SpectraUtils.C:1268
 SpectraUtils.C:1269
 SpectraUtils.C:1270
 SpectraUtils.C:1271
 SpectraUtils.C:1272
 SpectraUtils.C:1273
 SpectraUtils.C:1274
 SpectraUtils.C:1275
 SpectraUtils.C:1276
 SpectraUtils.C:1277
 SpectraUtils.C:1278
 SpectraUtils.C:1279
 SpectraUtils.C:1280
 SpectraUtils.C:1281
 SpectraUtils.C:1282
 SpectraUtils.C:1283
 SpectraUtils.C:1284
 SpectraUtils.C:1285
 SpectraUtils.C:1286
 SpectraUtils.C:1287
 SpectraUtils.C:1288
 SpectraUtils.C:1289
 SpectraUtils.C:1290
 SpectraUtils.C:1291
 SpectraUtils.C:1292
 SpectraUtils.C:1293
 SpectraUtils.C:1294
 SpectraUtils.C:1295
 SpectraUtils.C:1296
 SpectraUtils.C:1297
 SpectraUtils.C:1298
 SpectraUtils.C:1299
 SpectraUtils.C:1300
 SpectraUtils.C:1301
 SpectraUtils.C:1302
 SpectraUtils.C:1303
 SpectraUtils.C:1304
 SpectraUtils.C:1305
 SpectraUtils.C:1306
 SpectraUtils.C:1307
 SpectraUtils.C:1308
 SpectraUtils.C:1309
 SpectraUtils.C:1310
 SpectraUtils.C:1311
 SpectraUtils.C:1312
 SpectraUtils.C:1313
 SpectraUtils.C:1314
 SpectraUtils.C:1315
 SpectraUtils.C:1316
 SpectraUtils.C:1317
 SpectraUtils.C:1318
 SpectraUtils.C:1319
 SpectraUtils.C:1320
 SpectraUtils.C:1321
 SpectraUtils.C:1322
 SpectraUtils.C:1323
 SpectraUtils.C:1324
 SpectraUtils.C:1325
 SpectraUtils.C:1326
 SpectraUtils.C:1327
 SpectraUtils.C:1328
 SpectraUtils.C:1329
 SpectraUtils.C:1330
 SpectraUtils.C:1331
 SpectraUtils.C:1332
 SpectraUtils.C:1333
 SpectraUtils.C:1334
 SpectraUtils.C:1335
 SpectraUtils.C:1336
 SpectraUtils.C:1337
 SpectraUtils.C:1338
 SpectraUtils.C:1339
 SpectraUtils.C:1340
 SpectraUtils.C:1341
 SpectraUtils.C:1342
 SpectraUtils.C:1343
 SpectraUtils.C:1344
 SpectraUtils.C:1345
 SpectraUtils.C:1346
 SpectraUtils.C:1347
 SpectraUtils.C:1348
 SpectraUtils.C:1349
 SpectraUtils.C:1350
 SpectraUtils.C:1351
 SpectraUtils.C:1352
 SpectraUtils.C:1353
 SpectraUtils.C:1354
 SpectraUtils.C:1355
 SpectraUtils.C:1356
 SpectraUtils.C:1357
 SpectraUtils.C:1358
 SpectraUtils.C:1359
 SpectraUtils.C:1360
 SpectraUtils.C:1361
 SpectraUtils.C:1362
 SpectraUtils.C:1363
 SpectraUtils.C:1364
 SpectraUtils.C:1365
 SpectraUtils.C:1366
 SpectraUtils.C:1367
 SpectraUtils.C:1368
 SpectraUtils.C:1369
 SpectraUtils.C:1370
 SpectraUtils.C:1371
 SpectraUtils.C:1372
 SpectraUtils.C:1373
 SpectraUtils.C:1374
 SpectraUtils.C:1375
 SpectraUtils.C:1376
 SpectraUtils.C:1377
 SpectraUtils.C:1378
 SpectraUtils.C:1379
 SpectraUtils.C:1380
 SpectraUtils.C:1381
 SpectraUtils.C:1382
 SpectraUtils.C:1383
 SpectraUtils.C:1384
 SpectraUtils.C:1385
 SpectraUtils.C:1386
 SpectraUtils.C:1387
 SpectraUtils.C:1388
 SpectraUtils.C:1389
 SpectraUtils.C:1390
 SpectraUtils.C:1391
 SpectraUtils.C:1392
 SpectraUtils.C:1393
 SpectraUtils.C:1394
 SpectraUtils.C:1395
 SpectraUtils.C:1396
 SpectraUtils.C:1397
 SpectraUtils.C:1398
 SpectraUtils.C:1399
 SpectraUtils.C:1400
 SpectraUtils.C:1401
 SpectraUtils.C:1402
 SpectraUtils.C:1403
 SpectraUtils.C:1404
 SpectraUtils.C:1405
 SpectraUtils.C:1406
 SpectraUtils.C:1407
 SpectraUtils.C:1408
 SpectraUtils.C:1409
 SpectraUtils.C:1410
 SpectraUtils.C:1411
 SpectraUtils.C:1412
 SpectraUtils.C:1413
 SpectraUtils.C:1414
 SpectraUtils.C:1415
 SpectraUtils.C:1416
 SpectraUtils.C:1417
 SpectraUtils.C:1418
 SpectraUtils.C:1419
 SpectraUtils.C:1420
 SpectraUtils.C:1421
 SpectraUtils.C:1422
 SpectraUtils.C:1423
 SpectraUtils.C:1424
 SpectraUtils.C:1425
 SpectraUtils.C:1426
 SpectraUtils.C:1427
 SpectraUtils.C:1428
 SpectraUtils.C:1429
 SpectraUtils.C:1430
 SpectraUtils.C:1431
 SpectraUtils.C:1432
 SpectraUtils.C:1433
 SpectraUtils.C:1434
 SpectraUtils.C:1435
 SpectraUtils.C:1436
 SpectraUtils.C:1437
 SpectraUtils.C:1438
 SpectraUtils.C:1439
 SpectraUtils.C:1440
 SpectraUtils.C:1441
 SpectraUtils.C:1442
 SpectraUtils.C:1443
 SpectraUtils.C:1444
 SpectraUtils.C:1445
 SpectraUtils.C:1446
 SpectraUtils.C:1447
 SpectraUtils.C:1448
 SpectraUtils.C:1449
 SpectraUtils.C:1450
 SpectraUtils.C:1451
 SpectraUtils.C:1452
 SpectraUtils.C:1453
 SpectraUtils.C:1454
 SpectraUtils.C:1455
 SpectraUtils.C:1456
 SpectraUtils.C:1457
 SpectraUtils.C:1458
 SpectraUtils.C:1459
 SpectraUtils.C:1460
 SpectraUtils.C:1461
 SpectraUtils.C:1462
 SpectraUtils.C:1463
 SpectraUtils.C:1464
 SpectraUtils.C:1465
 SpectraUtils.C:1466
 SpectraUtils.C:1467
 SpectraUtils.C:1468
 SpectraUtils.C:1469
 SpectraUtils.C:1470
 SpectraUtils.C:1471
 SpectraUtils.C:1472
 SpectraUtils.C:1473
 SpectraUtils.C:1474
 SpectraUtils.C:1475
 SpectraUtils.C:1476
 SpectraUtils.C:1477
 SpectraUtils.C:1478
 SpectraUtils.C:1479
 SpectraUtils.C:1480
 SpectraUtils.C:1481
 SpectraUtils.C:1482
 SpectraUtils.C:1483
 SpectraUtils.C:1484
 SpectraUtils.C:1485
 SpectraUtils.C:1486
 SpectraUtils.C:1487
 SpectraUtils.C:1488
 SpectraUtils.C:1489
 SpectraUtils.C:1490
 SpectraUtils.C:1491
 SpectraUtils.C:1492
 SpectraUtils.C:1493
 SpectraUtils.C:1494
 SpectraUtils.C:1495
 SpectraUtils.C:1496
 SpectraUtils.C:1497
 SpectraUtils.C:1498
 SpectraUtils.C:1499
 SpectraUtils.C:1500
 SpectraUtils.C:1501
 SpectraUtils.C:1502
 SpectraUtils.C:1503
 SpectraUtils.C:1504
 SpectraUtils.C:1505
 SpectraUtils.C:1506
 SpectraUtils.C:1507
 SpectraUtils.C:1508
 SpectraUtils.C:1509
 SpectraUtils.C:1510
 SpectraUtils.C:1511
 SpectraUtils.C:1512
 SpectraUtils.C:1513
 SpectraUtils.C:1514
 SpectraUtils.C:1515
 SpectraUtils.C:1516
 SpectraUtils.C:1517
 SpectraUtils.C:1518
 SpectraUtils.C:1519
 SpectraUtils.C:1520
 SpectraUtils.C:1521
 SpectraUtils.C:1522
 SpectraUtils.C:1523
 SpectraUtils.C:1524
 SpectraUtils.C:1525
 SpectraUtils.C:1526
 SpectraUtils.C:1527
 SpectraUtils.C:1528
 SpectraUtils.C:1529
 SpectraUtils.C:1530
 SpectraUtils.C:1531
 SpectraUtils.C:1532
 SpectraUtils.C:1533
 SpectraUtils.C:1534
 SpectraUtils.C:1535
 SpectraUtils.C:1536
 SpectraUtils.C:1537
 SpectraUtils.C:1538
 SpectraUtils.C:1539
 SpectraUtils.C:1540
 SpectraUtils.C:1541
 SpectraUtils.C:1542
 SpectraUtils.C:1543
 SpectraUtils.C:1544
 SpectraUtils.C:1545
 SpectraUtils.C:1546
 SpectraUtils.C:1547
 SpectraUtils.C:1548
 SpectraUtils.C:1549
 SpectraUtils.C:1550
 SpectraUtils.C:1551
 SpectraUtils.C:1552
 SpectraUtils.C:1553
 SpectraUtils.C:1554
 SpectraUtils.C:1555
 SpectraUtils.C:1556
 SpectraUtils.C:1557
 SpectraUtils.C:1558
 SpectraUtils.C:1559
 SpectraUtils.C:1560
 SpectraUtils.C:1561
 SpectraUtils.C:1562
 SpectraUtils.C:1563
 SpectraUtils.C:1564
 SpectraUtils.C:1565
 SpectraUtils.C:1566
 SpectraUtils.C:1567
 SpectraUtils.C:1568
 SpectraUtils.C:1569
 SpectraUtils.C:1570
 SpectraUtils.C:1571
 SpectraUtils.C:1572
 SpectraUtils.C:1573
 SpectraUtils.C:1574
 SpectraUtils.C:1575
 SpectraUtils.C:1576
 SpectraUtils.C:1577
 SpectraUtils.C:1578
 SpectraUtils.C:1579
 SpectraUtils.C:1580
 SpectraUtils.C:1581
 SpectraUtils.C:1582
 SpectraUtils.C:1583
 SpectraUtils.C:1584
 SpectraUtils.C:1585
 SpectraUtils.C:1586
 SpectraUtils.C:1587
 SpectraUtils.C:1588
 SpectraUtils.C:1589
 SpectraUtils.C:1590
 SpectraUtils.C:1591
 SpectraUtils.C:1592
 SpectraUtils.C:1593
 SpectraUtils.C:1594
 SpectraUtils.C:1595
 SpectraUtils.C:1596
 SpectraUtils.C:1597
 SpectraUtils.C:1598
 SpectraUtils.C:1599
 SpectraUtils.C:1600
 SpectraUtils.C:1601
 SpectraUtils.C:1602
 SpectraUtils.C:1603
 SpectraUtils.C:1604
 SpectraUtils.C:1605
 SpectraUtils.C:1606
 SpectraUtils.C:1607
 SpectraUtils.C:1608
 SpectraUtils.C:1609
 SpectraUtils.C:1610
 SpectraUtils.C:1611
 SpectraUtils.C:1612
 SpectraUtils.C:1613
 SpectraUtils.C:1614
 SpectraUtils.C:1615
 SpectraUtils.C:1616
 SpectraUtils.C:1617
 SpectraUtils.C:1618
 SpectraUtils.C:1619
 SpectraUtils.C:1620
 SpectraUtils.C:1621
 SpectraUtils.C:1622
 SpectraUtils.C:1623
 SpectraUtils.C:1624
 SpectraUtils.C:1625
 SpectraUtils.C:1626
 SpectraUtils.C:1627
 SpectraUtils.C:1628
 SpectraUtils.C:1629
 SpectraUtils.C:1630
 SpectraUtils.C:1631
 SpectraUtils.C:1632
 SpectraUtils.C:1633
 SpectraUtils.C:1634
 SpectraUtils.C:1635
 SpectraUtils.C:1636
 SpectraUtils.C:1637
 SpectraUtils.C:1638
 SpectraUtils.C:1639
 SpectraUtils.C:1640
 SpectraUtils.C:1641
 SpectraUtils.C:1642
 SpectraUtils.C:1643
 SpectraUtils.C:1644
 SpectraUtils.C:1645
 SpectraUtils.C:1646
 SpectraUtils.C:1647
 SpectraUtils.C:1648
 SpectraUtils.C:1649
 SpectraUtils.C:1650
 SpectraUtils.C:1651
 SpectraUtils.C:1652
 SpectraUtils.C:1653
 SpectraUtils.C:1654
 SpectraUtils.C:1655
 SpectraUtils.C:1656
 SpectraUtils.C:1657
 SpectraUtils.C:1658
 SpectraUtils.C:1659
 SpectraUtils.C:1660
 SpectraUtils.C:1661
 SpectraUtils.C:1662
 SpectraUtils.C:1663
 SpectraUtils.C:1664
 SpectraUtils.C:1665
 SpectraUtils.C:1666
 SpectraUtils.C:1667
 SpectraUtils.C:1668
 SpectraUtils.C:1669
 SpectraUtils.C:1670
 SpectraUtils.C:1671
 SpectraUtils.C:1672
 SpectraUtils.C:1673
 SpectraUtils.C:1674
 SpectraUtils.C:1675
 SpectraUtils.C:1676
 SpectraUtils.C:1677
 SpectraUtils.C:1678
 SpectraUtils.C:1679
 SpectraUtils.C:1680
 SpectraUtils.C:1681
 SpectraUtils.C:1682
 SpectraUtils.C:1683
 SpectraUtils.C:1684
 SpectraUtils.C:1685
 SpectraUtils.C:1686
 SpectraUtils.C:1687
 SpectraUtils.C:1688
 SpectraUtils.C:1689
 SpectraUtils.C:1690
 SpectraUtils.C:1691
 SpectraUtils.C:1692
 SpectraUtils.C:1693
 SpectraUtils.C:1694
 SpectraUtils.C:1695
 SpectraUtils.C:1696
 SpectraUtils.C:1697
 SpectraUtils.C:1698
 SpectraUtils.C:1699
 SpectraUtils.C:1700
 SpectraUtils.C:1701
 SpectraUtils.C:1702
 SpectraUtils.C:1703
 SpectraUtils.C:1704
 SpectraUtils.C:1705
 SpectraUtils.C:1706
 SpectraUtils.C:1707
 SpectraUtils.C:1708
 SpectraUtils.C:1709
 SpectraUtils.C:1710
 SpectraUtils.C:1711
 SpectraUtils.C:1712
 SpectraUtils.C:1713
 SpectraUtils.C:1714
 SpectraUtils.C:1715
 SpectraUtils.C:1716
 SpectraUtils.C:1717
 SpectraUtils.C:1718
 SpectraUtils.C:1719
 SpectraUtils.C:1720
 SpectraUtils.C:1721
 SpectraUtils.C:1722
 SpectraUtils.C:1723
 SpectraUtils.C:1724
 SpectraUtils.C:1725
 SpectraUtils.C:1726
 SpectraUtils.C:1727
 SpectraUtils.C:1728
 SpectraUtils.C:1729
 SpectraUtils.C:1730
 SpectraUtils.C:1731
 SpectraUtils.C:1732
 SpectraUtils.C:1733
 SpectraUtils.C:1734
 SpectraUtils.C:1735
 SpectraUtils.C:1736
 SpectraUtils.C:1737
 SpectraUtils.C:1738
 SpectraUtils.C:1739
 SpectraUtils.C:1740
 SpectraUtils.C:1741
 SpectraUtils.C:1742
 SpectraUtils.C:1743
 SpectraUtils.C:1744
 SpectraUtils.C:1745
 SpectraUtils.C:1746
 SpectraUtils.C:1747
 SpectraUtils.C:1748
 SpectraUtils.C:1749
 SpectraUtils.C:1750
 SpectraUtils.C:1751
 SpectraUtils.C:1752
 SpectraUtils.C:1753
 SpectraUtils.C:1754
 SpectraUtils.C:1755
 SpectraUtils.C:1756
 SpectraUtils.C:1757
 SpectraUtils.C:1758
 SpectraUtils.C:1759
 SpectraUtils.C:1760
 SpectraUtils.C:1761
 SpectraUtils.C:1762
 SpectraUtils.C:1763
 SpectraUtils.C:1764
 SpectraUtils.C:1765
 SpectraUtils.C:1766
 SpectraUtils.C:1767
 SpectraUtils.C:1768
 SpectraUtils.C:1769
 SpectraUtils.C:1770
 SpectraUtils.C:1771
 SpectraUtils.C:1772
 SpectraUtils.C:1773
 SpectraUtils.C:1774
 SpectraUtils.C:1775
 SpectraUtils.C:1776
 SpectraUtils.C:1777
 SpectraUtils.C:1778
 SpectraUtils.C:1779
 SpectraUtils.C:1780
 SpectraUtils.C:1781
 SpectraUtils.C:1782
 SpectraUtils.C:1783
 SpectraUtils.C:1784
 SpectraUtils.C:1785
 SpectraUtils.C:1786
 SpectraUtils.C:1787
 SpectraUtils.C:1788
 SpectraUtils.C:1789
 SpectraUtils.C:1790
 SpectraUtils.C:1791
 SpectraUtils.C:1792
 SpectraUtils.C:1793
 SpectraUtils.C:1794
 SpectraUtils.C:1795
 SpectraUtils.C:1796
 SpectraUtils.C:1797
 SpectraUtils.C:1798
 SpectraUtils.C:1799
 SpectraUtils.C:1800
 SpectraUtils.C:1801
 SpectraUtils.C:1802
 SpectraUtils.C:1803
 SpectraUtils.C:1804
 SpectraUtils.C:1805
 SpectraUtils.C:1806
 SpectraUtils.C:1807
 SpectraUtils.C:1808
 SpectraUtils.C:1809
 SpectraUtils.C:1810
 SpectraUtils.C:1811
 SpectraUtils.C:1812
 SpectraUtils.C:1813
 SpectraUtils.C:1814
 SpectraUtils.C:1815
 SpectraUtils.C:1816
 SpectraUtils.C:1817
 SpectraUtils.C:1818
 SpectraUtils.C:1819
 SpectraUtils.C:1820
 SpectraUtils.C:1821
 SpectraUtils.C:1822
 SpectraUtils.C:1823
 SpectraUtils.C:1824
 SpectraUtils.C:1825
 SpectraUtils.C:1826
 SpectraUtils.C:1827
 SpectraUtils.C:1828
 SpectraUtils.C:1829
 SpectraUtils.C:1830
 SpectraUtils.C:1831
 SpectraUtils.C:1832
 SpectraUtils.C:1833
 SpectraUtils.C:1834
 SpectraUtils.C:1835
 SpectraUtils.C:1836
 SpectraUtils.C:1837
 SpectraUtils.C:1838
 SpectraUtils.C:1839
 SpectraUtils.C:1840
 SpectraUtils.C:1841
 SpectraUtils.C:1842
 SpectraUtils.C:1843
 SpectraUtils.C:1844
 SpectraUtils.C:1845
 SpectraUtils.C:1846
 SpectraUtils.C:1847
 SpectraUtils.C:1848
 SpectraUtils.C:1849
 SpectraUtils.C:1850
 SpectraUtils.C:1851
 SpectraUtils.C:1852
 SpectraUtils.C:1853
 SpectraUtils.C:1854
 SpectraUtils.C:1855
 SpectraUtils.C:1856
 SpectraUtils.C:1857
 SpectraUtils.C:1858
 SpectraUtils.C:1859
 SpectraUtils.C:1860
 SpectraUtils.C:1861
 SpectraUtils.C:1862
 SpectraUtils.C:1863
 SpectraUtils.C:1864
 SpectraUtils.C:1865
 SpectraUtils.C:1866
 SpectraUtils.C:1867
 SpectraUtils.C:1868
 SpectraUtils.C:1869
 SpectraUtils.C:1870
 SpectraUtils.C:1871
 SpectraUtils.C:1872
 SpectraUtils.C:1873
 SpectraUtils.C:1874
 SpectraUtils.C:1875
 SpectraUtils.C:1876
 SpectraUtils.C:1877
 SpectraUtils.C:1878
 SpectraUtils.C:1879
 SpectraUtils.C:1880
 SpectraUtils.C:1881
 SpectraUtils.C:1882
 SpectraUtils.C:1883
 SpectraUtils.C:1884
 SpectraUtils.C:1885
 SpectraUtils.C:1886
 SpectraUtils.C:1887
 SpectraUtils.C:1888
 SpectraUtils.C:1889
 SpectraUtils.C:1890
 SpectraUtils.C:1891
 SpectraUtils.C:1892
 SpectraUtils.C:1893
 SpectraUtils.C:1894
 SpectraUtils.C:1895
 SpectraUtils.C:1896
 SpectraUtils.C:1897
 SpectraUtils.C:1898
 SpectraUtils.C:1899
 SpectraUtils.C:1900
 SpectraUtils.C:1901
 SpectraUtils.C:1902
 SpectraUtils.C:1903
 SpectraUtils.C:1904
 SpectraUtils.C:1905
 SpectraUtils.C:1906
 SpectraUtils.C:1907
 SpectraUtils.C:1908
 SpectraUtils.C:1909
 SpectraUtils.C:1910
 SpectraUtils.C:1911
 SpectraUtils.C:1912
 SpectraUtils.C:1913
 SpectraUtils.C:1914
 SpectraUtils.C:1915
 SpectraUtils.C:1916
 SpectraUtils.C:1917
 SpectraUtils.C:1918
 SpectraUtils.C:1919
 SpectraUtils.C:1920
 SpectraUtils.C:1921
 SpectraUtils.C:1922
 SpectraUtils.C:1923
 SpectraUtils.C:1924
 SpectraUtils.C:1925