ROOT logo
#include <iomanip>
#ifndef __CINT__
#include <iostream>
#include <TH1.h>
#include <TH2.h>
#include <TRandom.h>
#include <TCanvas.h>
#include <TArrayD.h>
#include <TStyle.h>
// #include <TFitResult.h>
#include <TGraphErrors.h>
#include <TF1.h>
#include <TMath.h>
#include <THStack.h>
#include <TList.h>
#include <TLatex.h>
#include <TProfile.h>
#include <TLegend.h>
#include <TLegendEntry.h>
#else
class TH1;
class TH2;
class TArrayD;
class TRandom;
class TCanvas;
class TF1;
#endif

//___________________________________________________________________
static Double_t landauGaus1(Double_t* xp, Double_t* pp);
static Double_t landauGausN(Double_t* xp, Double_t* pp);
static Double_t landauGausI(Double_t* xp, Double_t* pp);

//====================================================================
/**
 * 
 * 
 * @ingroup pwglf_forward_scripts_tests
 */
struct Function
{
  /**
   * Enumeration of parameters 
   * 
   */
  enum { 
    /// Constant 
    kC, 
    /// MPV of landau
    kDelta, 
    /// Width of landau
    kXi, 
    /// Sigma of gaussian
    kSigma, 
    /// Number of particles
    kN, 
    /// Weights 
    kA 
  };
  /// MP shift
  static const Double_t fgkMPShift;
  /// 1 / sqrt(2 * pi)
  static const Double_t fgkInvRoot2Pi;
  /// Number of sigmas to integrate over
  static const Double_t fgkConvNSigma;
  /// Number of steps in integration 
  static const Double_t fgkConvNSteps;
  /** 
   * Evaluate shifted landay 
   * @f[                                                                        
   *    f'_{L}(x;\Delta,\xi) = f_L(x;\Delta+0.22278298\xi)                      
   * @f]                                                                        
   *                                                                            
   * where @f$ f_{L}@f$ is the ROOT implementation of the Landau                
   * distribution (known to have @f$ \Delta_{p}=-0.22278298@f$ for              
   * @f$\Delta=0,\xi=1@f$.                                                      
   *                                                                            
   * @param x      Where to evaluate @f$ f'_{L}@f$                              
   * @param delta  Most probable value                                          
   * @param xi     The 'width' of the distribution                              
   *                                                                            
   * @return @f$ f'_{L}(x;\Delta,\xi) @f$                                       
   */
  static Double_t  Landau(Double_t x, Double_t delta, Double_t xi)
  {
    return TMath::Landau(x, delta - xi * fgkMPShift, xi);
  }
  /** 
   * Calculate the value of a Landau convolved with a Gaussian                  
   *                                                                            
   * @f[                                                                        
   * f(x;\Delta,\xi,\sigma') = \frac{1}{\sigma' \sqrt{2 \pi}}                   
   *    \int_{-\infty}^{+\infty} d\Delta' f'_{L}(x;\Delta',\xi)                 
   *    \exp{-\frac{(\Delta-\Delta')^2}{2\sigma^2}}                            
   * @f]                                                                        
   *                                                                            
   * where @f$ f'_{L}@f$ is the Landau distribution, @f$ \Delta@f$ the
   * energy loss, @f$ \xi@f$ the width of the Landau, and @f$\sigma@f$
   * is the variance of the Gaussian.
   *                                                                            
   * Note that this function uses the constants fgkConvNSteps and          
   * fgkConvNSigma                                                        
   *                                                                            
   * References: 
   *  - <a href="dx.doi.org/10.1016/0168-583X(84)90472-5">
   *   Nucl.Instrum.Meth.B1:16</a>
   *  - <a href="dx.doi.org/10.1103/PhysRevA.28.615">Phys.Rev.A28:615</a>
   *  - <a href="root.cern.ch/root/htmldoc/tutorials/fit/langaus.C.html">
   *   ROOT implementation</a> 
   *                                                                            
   * @param x         where to evaluate @f$ f@f$                                
   * @param delta     @f$ \Delta@f$ of @f$ f(x;\Delta,\xi,\sigma')@f$           
   * @param xi        @f$ \xi@f$ of @f$ f(x;\Delta,\xi,\sigma')@f$  
   * @param sigma     @f$ \sigma@f$ of Gaussian
   *                                                                            
   * @return @f$ f@f$ evaluated at @f$ x@f$.                                    
   */
  static Double_t  LandauGaus(Double_t x,  Double_t delta, 
			      Double_t xi, Double_t sigma) 
  {
    Double_t deltap = delta - xi * fgkMPShift;
    Double_t xlow   = x - fgkConvNSigma * sigma;
    Double_t xhigh  = x + fgkConvNSigma * sigma;
    Double_t step   = (xhigh - xlow) / fgkConvNSteps;
    Double_t sum    = 0;

    for (Int_t i = 0; i < fgkConvNSteps / 2; i++) { 
      Double_t x1 = xlow  + (i - .5) * step;
      Double_t x2 = xhigh - (i - .5) * step;

      Double_t s1 = 
	TMath::Landau(x1, deltap, xi, kTRUE) * TMath::Gaus(x, x1, sigma);
      Double_t s2 = 
	TMath::Landau(x2, deltap, xi, kTRUE) * TMath::Gaus(x, x2, sigma);
      sum += s1 + s2;
    }
    Double_t ret = step * sum * fgkInvRoot2Pi / sigma;
    return ret;
  }
  /** 
   * Evaluate                                                                   
   * @f[                                                                        
   *    f_i(x;\Delta,\xi,\sigma) = f(x;\Delta_i,\xi_i,\sigma_i)               
   * @f]                                                                        
   * corresponding to @f$ i@f$ particles i.e., with the substitutions           
   * @f{eqnarray*}{                                                             
   *    \Delta    \rightarrow \Delta_i    &=& i(\Delta + \xi\log(i))\\          
   *    \xi       \rightarrow \xi_i       &=& i \xi\\                           
   *    \sigma    \rightarrow \sigma_i    &=& \sqrt{i}\sigma\\
   * @f}                                                                        
   *                                                                            
   * @param x        Where to evaluate                                          
   * @param delta    @f$ \Delta@f$                                              
   * @param xi       @f$ \xi@f$                                                 
   * @param sigma    @f$ \sigma@f$                                              
   * @param i        @f$ i @f$                                                  
   *                                                                            
   * @return @f$ f_i @f$ evaluated        * 
   */
  static Double_t ILandauGaus(Int_t i, Double_t x, Double_t delta, 
			      Double_t xi, Double_t sigma)
  {
    if (i <= 1) return LandauGaus(x, delta, xi, sigma);
    Double_t di      = i;
    Double_t deltai  = i * (delta + xi * TMath::Log(di));
    Double_t xii     = i * xi;
    Double_t sigmai  = TMath::Sqrt(di) * sigma;
    
    if (sigmai < 1e-10) return Landau(x, deltai, xii);
    Double_t ret =  LandauGaus(x, deltai, xii, sigmai);;
    // Info("ILandauGaus", "Fi(%f;%d,%f,%f,%f)->%f",
    //      x, i, deltai, xii, sigmai, ret);
    return ret;
  }
  /** 
   * Numerically evaluate 
   * @f[ 
   *    \left.\frac{\partial f_i}{\partial p_i}\right|_{x}
   * @f] 
   * where @f$ p_i@f$ is the @f$ i^{\mbox{th}}@f$ parameter.  The mapping 
   * of the parameters is given by 
   *
   * - 0: @f$\Delta@f$ 
   * - 1: @f$\xi@f$ 
   * - 2: @f$\sigma@f$ 
   *
   * This is the partial derivative with respect to the parameter of
   * the response function corresponding to @f$ i@f$ particles i.e.,
   * with the substitutions
   * @f[ 
   *    \Delta    \rightarrow \Delta_i    = i(\Delta + \xi\log(i))\\
   *    \xi       \rightarrow \xi_i       = i \xi\\
   *    \sigma    \rightarrow \sigma_i    = \sqrt{i}\sigma\\
   * @f] 
   * 
   * @param x        Where to evaluate 
   * @param ipar     Parameter number 
   * @param dp       @f$ \epsilon\delta p_i@f$ for some value of @f$\epsilon@f$
   * @param delta    @f$ \Delta@f$ 
   * @param xi       @f$ \xi@f$ 
   * @param sigma    @f$ \sigma@f$ 
   * @param i        @f$ i@f$
   * 
   * @return @f$ f_i@f$ evaluated
   */  
  static Double_t IdLandauGausdPar(Int_t    i,     Double_t x, 
				   UShort_t ipar,  Double_t dPar, 
				   Double_t delta, Double_t xi, 
				   Double_t sigma)
  {
    if (dPar == 0) return 0;
    Double_t dp      = dPar;
    Double_t d2      = dPar / 2;
    Double_t deltaI  =  i * (delta + xi * TMath::Log(i));
    Double_t xiI     =  i * xi;
    Double_t si      =  TMath::Sqrt(Double_t(i));
    Double_t sigmaI  =  si*sigma;
    Double_t y1      = 0;
    Double_t y2      = 0;
    Double_t y3      = 0;
    Double_t y4      = 0;
    switch (ipar) {
    case 0: 
      y1 = ILandauGaus(i, x, deltaI+i*dp, xiI, sigmaI);
      y2 = ILandauGaus(i, x, deltaI+i*d2, xiI, sigmaI);
      y3 = ILandauGaus(i, x, deltaI-i*d2, xiI, sigmaI);
      y4 = ILandauGaus(i, x, deltaI-i*dp, xiI, sigmaI);
      break;
    case 1: 
      y1 = ILandauGaus(i, x, deltaI, xiI+i*dp, sigmaI);
      y2 = ILandauGaus(i, x, deltaI, xiI+i*d2, sigmaI);
      y3 = ILandauGaus(i, x, deltaI, xiI-i*d2, sigmaI);
      y4 = ILandauGaus(i, x, deltaI, xiI-i*dp, sigmaI);
      break;
    case 2: 
      y1 = ILandauGaus(i, x, deltaI, xiI, sigmaI+si*dp);
      y2 = ILandauGaus(i, x, deltaI, xiI, sigmaI+si*d2);
      y3 = ILandauGaus(i, x, deltaI, xiI, sigmaI-si*d2);
      y4 = ILandauGaus(i, x, deltaI, xiI, sigmaI-si*dp);
      break;
    default:
      return 0;
    } 
    
    Double_t d0  = y1 - y4;
    Double_t d1  = 2 * (y2 - y3);
    
    Double_t g   = 1/(2*dp) * (4*d1 - d0) / 3;
    
    return g;
  }
  /** 
   * Evaluate                                                                   
   * @f[                                                                        
   *   f_N(x;\Delta,\xi,\sigma') = \sum_{i=1}^N a_i f_i(x;\Delta,\xi,\sigma'a)  
   * @f]                                                                        
   *                                                                            
   * where @f$ f(x;\Delta,\xi,\sigma')@f$ is the convolution of a               
   * Landau with a Gaussian (see LandauGaus).  Note that                        
   * @f$ a_1 = 1@f$, @f$\Delta_i = i(\Delta_1 + \xi\log(i))@f$,                 
   * @f$\xi_i=i\xi_1@f$, and @f$\sigma_i'^2 = \sigma_n^2 + i\sigma_1^2@f$.      
   *                                                                            
   * References:                                                                
   *  - <a href="dx.doi.org/10.1016/0168-583X(84)90472-5">
   *    Nucl.Instrum.Meth.B1:16</a>
   *  - <a href="dx.doi.org/10.1103/PhysRevA.28.615">Phys.Rev.A28:615</a>
   * @param x        Where to evaluate @f$ f_N@f$                               
   * @param delta    @f$ \Delta_1@f$                                            
   * @param xi       @f$ \xi_1@f$                                               
   * @param sigma    @f$ \sigma_1@f$                                            
   * @param n        @f$ N@f$ in the sum above.                                 
   * @param a        Array of size @f$ N-1@f$ of the weights @f$ a_i@f$ for     
   *                 @f$ i > 1@f$                                               
   *                                                                            
   * @return @f$ f_N(x;\Delta,\xi,\sigma)@f$                                   
   */  
  static Double_t NLandauGaus(Double_t x, Double_t delta, Double_t xi, 
			      Double_t sigma, Int_t n, Double_t* a)
  {
    Double_t res = LandauGaus(x, delta, xi, sigma);
    for (Int_t i = 2; i <= n; i++) 
      res += a[i-2] * ILandauGaus(i, x, delta, xi, sigma);
    return res;
  }
  /** 
   * Calculate the the estimate of number of particle contribtutions
   * at energy loss @a x 
   * @f[
   *   E(\Delta;\Delta_p,\xi,\sigma,\mathbf{a}) = 
   *   \frac{\sum_{i=1}^N i a_i f_i(x;\Delta_p,\xi,\sigma)}{
   *     \sum_{i=1}^N a_i f_i(x;\Delta_p,\xi,\sigma)}
   * @f]
   * where @f$a_1=1@f$ 
   * 
   * @param x      Energy loss @f$\Delta@f$
   * @param delta  @f$\Delta_{p}@f$
   * @param xi     @f$\xi@f$ 
   * @param sigma  @f$\sigma@f$
   * @param n      Maximum number of particles @f$N@f$ 
   * @param a      Weights @f$a_i@f$ for @f$i=2,...,N@f$ 
   * 
   * @return @f$E(\Delta;\Delta_p,\xi,\sigma,\mathbf{a})@f$
   */
  Double_t NEstimate(Double_t x, Double_t delta, Double_t xi, 
		     Double_t sigma, Int_t n, Double_t* a)
  {
    Double_t num = LandauGaus(x, delta, xi, sigma);
    Double_t den = num;
    for (Int_t i = 2; i <= n; i++) {
      Double_t f =  ILandauGaus(i, x, delta, xi, sigma);
      num        += a[i-2] * f * i;
      den        += a[i-2] * f;
    }
    if (den < 1e-4) return 0;
    return num / den;
  }
  /** 
   * Calculate the partial derivative of the function 
   * @f$E(\Delta;\Delta_p,\xi,\sigma,\mathbf{a})@f$ with respect to
   * one of the parameters @f$\Delta_{p}@f$, @f$\xi@f$, @f$\sigma@f$,
   * or @f$a_i@f$.  Note for that 
   * @f{eqnarray*}
   *   \frac{\partial E}{\partial C}   & \equiv & 0\\
   *   \frac{\partial E}{\partial a_1} & \equiv & 0\\
   *   \frac{\partial E}{\partial N}   & \equiv & 0\\
   * @f{eqnarray*}
   * 
   * @param x       Where to evaluate the derivative
   * @param ipar    Parameter to differentiate relative to 
   * @param dPar    Variation in parameter to use in calculation
   * @param delta   @f$\Delta_{p}@f$ 
   * @param xi      @f$\xi@f$
   * @param sigma   @f$\sigma@f$ 
   * @param n       @f$N@f$ 
   * @param a       @f$\mathbf{a} = (a_2,...,a_N)@f$ 
   * 
   * @return @f$\partial E/\partial p|_{x}@f$  
   */
  Double_t DEstimatePar(Double_t x, Int_t ipar, Double_t delta, Double_t xi, 
			Double_t sigma, UShort_t n, Double_t* a, 
			Double_t dPar=0.001) 
  {
    Double_t dp    = dPar;
    Double_t d2    = dPar / 2;
    Double_t y1    = 0;
    Double_t y2    = 0;
    Double_t y3    = 0;
    Double_t y4    = 0;
    switch (ipar) { 
    case Function::kC: 
    case Function::kN: 
      return 0;
    case Function::kDelta:
      y1 = NEstimate(x, delta+dp, xi, sigma, n, a);
      y2 = NEstimate(x, delta+d2, xi, sigma, n, a);
      y3 = NEstimate(x, delta-d2, xi, sigma, n, a);
      y4 = NEstimate(x, delta-dp, xi, sigma, n, a);
      break;
    case Function::kXi:
      y1 = NEstimate(x, delta, xi+dp, sigma, n, a);
      y2 = NEstimate(x, delta, xi+d2, sigma, n, a);
      y3 = NEstimate(x, delta, xi-d2, sigma, n, a);
      y4 = NEstimate(x, delta, xi-dp, sigma, n, a);
      break;
    case Function::kSigma:
      y1 = NEstimate(x, delta, xi, sigma+dp, n, a);
      y2 = NEstimate(x, delta, xi, sigma+d2, n, a);
      y3 = NEstimate(x, delta, xi, sigma-d2, n, a);
      y4 = NEstimate(x, delta, xi, sigma-dp, n, a);
      break;
    default: {
      Int_t j = ipar-kA;
      if (j+1 > n) return 0;
      Double_t aa = a[j];
      a[j] = aa+dp; y1 = NEstimate(x, delta, xi, sigma, n, a);
      a[j] = aa+d2; y2 = NEstimate(x, delta, xi, sigma, n, a);
      a[j] = aa-d2; y3 = NEstimate(x, delta, xi, sigma, n, a);
      a[j] = aa-dp; y4 = NEstimate(x, delta, xi, sigma, n, a);
      a[j] = aa;
    }
      break;
    }
    Double_t d0  = y1 - y4;
    Double_t d1  = 2 * (y2 - y3);
    
    Double_t g   = 1/(2*dp) * (4*d1 - d0) / 3;    
    return g;
  }
  /** 
   * Generate a TF1 object of @f$ f_I@f$                                        
   *                                                                            
   * @param n        @f$ n@f$ - the number of particles                         
   * @param c        Constant                                                   
   * @param delta    @f$ \Delta@f$                                              
   * @param xi       @f$ \xi_1@f$                                               
   * @param sigma    @f$ \sigma_1@f$                                            
   * @param a        Array of @f$a_i@f$ for @f$i > 1@f$
   * @param xmin     Least value of range                                       
   * @param xmax     Largest value of range                                     
   *                                                                            
   * @return Newly allocated TF1 object                                         
   */  
  static TF1* MakeFunc(Int_t n, Double_t c, Double_t delta, 
		       Double_t xi, Double_t sigma, Double_t* a, 
		       Double_t xmin, Double_t xmax)
  {
    Int_t nPar = kN + n;
    TF1* f = new TF1(Form("landGaus%d",n), &landauGausN, xmin, xmax, nPar);
    f->SetNpx(500);
    f->SetParName(kC,      "C");
    f->SetParName(kDelta,  "#Delta_{p}");
    f->SetParName(kXi,     "#xi");
    f->SetParName(kSigma,  "#sigma");
    f->SetParName(kN,      "N");
    f->SetParameter(kC,     c);
    f->SetParameter(kDelta, delta);
    f->SetParameter(kXi,    xi);
    f->SetParameter(kSigma, sigma);
    f->FixParameter(kN,     n);
    f->SetParLimits(kDelta, xmin, 4);
    f->SetParLimits(kXi,    0.00, 4);
    f->SetParLimits(kSigma, 0.01, 0.11);

    for (Int_t i = 2; i <= n; i++) { 
      Int_t j = i-2;
      f->SetParName(kA+j, Form("a_{%d}", i));
      f->SetParameter(kA+j, a[j]);
      f->SetParLimits(kA+j, 0, 1);
    }
    return f;
  }
  /** 
   * Make a ROOT TF1 function object corresponding to a single 
   * component for @f$ i@f$ particles 
   * 
   * @param i        Number of particles
   * @param c        @f$C@f$ 
   * @param delta    @f$ \Delta@f$                                              
   * @param xi       @f$ \xi_1@f$                                               
   * @param sigma    @f$ \sigma_1@f$                                            
   * @param xmin     Minimum of range of @f$\Delta@f$
   * @param xmax     Maximum of range of @f$\Delta@f$
   * 
   * @return Pointer to newly allocated ROOT TF1 object 
   */
  static TF1* MakeIFunc(Int_t i, Double_t c, Double_t delta, 
			Double_t xi, Double_t sigma,
			Double_t xmin, Double_t xmax)
  {
    Int_t nPar = 5;
    TF1* f = new TF1(Form("landGausI%d",i), &landauGausI, xmin, xmax, nPar);
    f->SetNpx(100);
    f->SetParName(kC,      "C");
    f->SetParName(kDelta,  "#Delta_{p}");
    f->SetParName(kXi,     "#xi");
    f->SetParName(kSigma,  "#sigma");
    f->SetParName(kN,      "N");
    f->SetParameter(kC,     c);
    f->SetParameter(kDelta, delta);
    f->SetParameter(kXi,    xi);
    f->SetParameter(kSigma, sigma);
    f->FixParameter(kN,     i);
    return f;
  }

  // --- Object code -------------------------------------------------
  /** 
   * Constructor 
   * 
   * @param n 
   * @param c 
   * @param delta 
   * @param xi 
   * @param sigma 
   * @param a 
   * @param xmin 
   * @param xmax 
   * 
   * @return 
   */
  Function(Int_t n, Double_t c, Double_t delta, Double_t xi, Double_t sigma, 
	   Double_t* a, Double_t xmin, Double_t xmax)
    : fF(MakeFunc(n, c, delta, xi, sigma, a, xmin, xmax))
  {}
  Function(TF1* f) : fF(f) {}
  /** 
   * Get pointer to ROOT TF1 object 
   * 
   * @return Pointer to TF1 object
   */
  TF1* GetF1() { return fF; }
  /** 
   * Evaluate the function at @a x
   * @f[ 
   *  f_N(x;\Delta,\xi,\sigma) = 
   *     \sum_{i=1}^{n} a_i f(x;\Delta_i,\xi_i,\sigma_i)
   * @f] 
   * 
   * @param x Where to evaluate 
   * 
   * @return 
   */
  Double_t Evaluate(Double_t x) const
  {
    return fF->Eval(x);
  }
  /** 
   * Evaluate the function at @a x
   * @f[ 
   *  f_N(x;\Delta,\xi,\sigma) = 
   *     \sum_{i=1}^{n} a_i f(x;\Delta_i,\xi_i,\sigma_i)
   * @f] 
   * 
   * This also calculates the error on the point like 
   * @f[
   *   \delta^2 f_N = 
   *    \left(\frac{\partial f_N}{\partial\Delta_p}\right)^2\delta^2\Delta_p+ 
   *    \left(\frac{\partial f_N}{\partial\xi     }\right)^2\delta^2\xi+ 
   *    \left(\frac{\partial f_N}{\partial\sigma  }\right)^2\delta^2\sigma+ 
   *    \sum_{i=2}^N\left(\frac{\partial f_N}{\partial a_i}\right)^2\delta^2a_i
   * @f]
   *
   * @param x Where to evaluate 
   * @param e On return, contains the error @f$\delta f_N@f$ on the
   * function value
   * 
   * @return @f$ f_N(x;\Delta,\xi,\sigma)@f$ 
   */
  Double_t Evaluate(Double_t x, Double_t& e) const
  {
    Double_t delta     = GetDelta();
    Double_t xi        = GetXi();
    Double_t sigma     = GetSigma();
    Double_t dFdDelta2 = 0;
    Double_t dFdXi2    = 0;
    Double_t dFdSigma2 = 0;
    e              = 0;
    for (Int_t i = 1; i <= GetN(); i++) { 
      Double_t a      = GetA(i);
      Double_t dDelta = a*IdLandauGausdPar(i, x, 1, 0.001, delta, xi, sigma); 
      Double_t dXi    = a*IdLandauGausdPar(i, x, 2, 0.001, delta, xi, sigma);
      Double_t dSigma = a*IdLandauGausdPar(i, x, 3, 0.001, delta, xi, sigma);
      Double_t dFda   = a*ILandauGaus(i, x, delta, xi, sigma);
      dFdDelta2 += dDelta * dDelta;
      dFdXi2    += dXi    * dXi;
      dFdSigma2 += dSigma * dSigma;
      e += TMath::Power(dFda * GetEA(i),2);
    }      
    Double_t edelta = GetEDelta();
    Double_t exi    = GetEXi();
    Double_t esigma = GetESigma();
    e += (dFdDelta2 * edelta * edelta + 
	  dFdXi2    * exi    * exi    + 
	  dFdSigma2 * esigma * esigma);
    e = TMath::Sqrt(e);
    return fF->Eval(x);
  }

  /** 
   * Evaluate 
   * @f[ 
   *   E(x;\Delta,\xi,\sigma,\mathbf{a}) = 
   *   \frac{\sum_{i=1}^{n} i a_i f_i(x;\Delta,\xi,\sigma)}{
   *     f_N(x;\Delta,\xi,\sigma)} = 
   *   \frac{\sum_{i=1}^{n} i a_i f(x;\Delta_i,\xi_i,\sigma_i)}{
   *     \sum_{i=1}^{n} a_i f(x;\Delta_i,\xi_i,\sigma_i)}
   * @f] 
   *
   * If the denominator is less than @f$10^{-4}@f$, then 0 is returned.
   * 
   * @param x    Where to evaluate @f$ E@f$ 
   * @param maxN Maximum number of weights 
   * 
   * @return @f$ E(x;\Delta,\xi,\sigma,\mathbf{a})@f$
   */  
  Double_t EstimateNParticles(Double_t x, Short_t maxN=-1)
  {
    UShort_t n     = (maxN < 0 ? GetN() : TMath::Min(UShort_t(maxN), GetN()));
    Double_t delta = GetDelta();
    Double_t xi    = GetXi();
    Double_t sigma = GetSigma();
    return NEstimate(x, delta, xi, sigma, n, GetAs());
  }
  /** 
   * Evaluate 
   * @f[ 
   *   E(x;\Delta,\xi,\sigma,\mathbf{a}) = 
   *   \frac{\sum_{i=1}^{n} i a_i f_i(x;\Delta,\xi,\sigma)}{
   *     f_N(x;\Delta,\xi,\sigma,\mathbf{a})} = 
   *   \frac{\sum_{i=1}^{n} i a_i f(x;\Delta_i,\xi_i,\sigma_i)}{
   *     \sum_{i=1}^{n} a_i f(x;\Delta_i,\xi_i,\sigma_i)}
   * @f] 
   *
   * If @f$f_N(x;\Delta,\xi,\sigma,\mathbf{a})<10^{-4}@f$ then 0 is
   * returned.
   *
   * This also calculatues the error @f$\delta E@f$ of the
   * function value at @f$x@f$: 
   *
   * @f[
   *   \delta^2 E = 
   *    \left(\frac{\partial E}{\partial\Delta_p}\right)^2\delta^2\Delta_p+ 
   *    \left(\frac{\partial E}{\partial\xi     }\right)^2\delta^2\xi+ 
   *    \left(\frac{\partial E}{\partial\sigma  }\right)^2\delta^2\sigma+ 
   *    \sum_{i=2}^N\left(\frac{\partial E}{\partial a_i}\right)^2\delta^2a_i
   * @f]
   * The partial derivatives are evaluated numerically. 
   * 
   * @param x    Where to evaluate @f$ E@f$ 
   * @param e    On return, @f$\delta E|_{x}@f$ 
   * @param maxN Maximum number of weights 
   * 
   * @return @f$ E(x;\Delta,\xi,\sigma,\mathbf{a})@f$
   */  
  Double_t EstimateNParticles(Double_t x, Double_t& e, Short_t maxN=-1)
  {
    
    UShort_t  n      = (maxN < 0 ? GetN() : TMath::Min(UShort_t(maxN), GetN()));
    Double_t  delta  = GetDelta();
    Double_t  xi     = GetXi();
    Double_t  sigma  = GetSigma();
    Double_t* a      = GetAs();
    Double_t  dDelta = (DEstimatePar(x,Function::kDelta,delta,xi,sigma,n,a,\
				     0.01 * GetEDelta()) * GetEDelta());
    Double_t  dXi    = (DEstimatePar(x,Function::kXi,   delta,xi,sigma,n,a,
				     0.01 * GetEXi())    * GetEXi());
    Double_t  dSigma = (DEstimatePar(x,Function::kSigma,delta,xi,sigma,n,a,
				     0.01 * GetESigma()) * GetESigma());
    e                = dDelta * dDelta + dXi * dXi + dSigma * dSigma;
    for (Int_t i = 2; i <= n; i++) { 
      Double_t dAi = (DEstimatePar(x, Function::kA+i-2,delta,xi,sigma,n,a,
				   0.01 * GetEA(i)) * GetEA(i));
      e += dAi * dAi;
    }
    e = TMath::Sqrt(e);
    return NEstimate(x, GetDelta(), GetXi(), GetSigma(), n, GetAs());
  }
  /** 
   * Estimate the number of particles by calculating the weights 
   * @f[ 
   *   w_i = a_i f_i(x;\Delta_p,\xi,\sigma) 
   * @f] 
   * 
   * and then draw a random number @f$r@f$ in the range @f$[0,\sum_i^N
   * w_i]@f$ and return the @f$i@f$ for which @f$w_{i-1} < @r \leq
   * w_{i}@f$ (notem @f$w_{-1}=0@f$).
   * 
   * @param x     Where to evaluate the component functions 
   * @param maxN  Maximum weight to use 
   * 
   * @return Estimate of the number of particles using the procedure
   * outlined above. 
   */
  Double_t RandomEstimateNParticles(Double_t x, Short_t maxN=-1)
  {
    UShort_t n     = (maxN < 0 ? GetN() : TMath::Min(UShort_t(maxN), GetN()));
    TArrayD  p(n);
    Double_t delta = GetDelta();
    Double_t xi    = GetXi();
    Double_t sigma = GetSigma();
    
    if (Evaluate(x) < 1e-4) return 0;

    // std::cout << "RandomEstimateNParticles(" << x << "):";
    for (Int_t i = 1; i <= n; i++) { 
      Double_t a = GetA(i);
      Double_t f = ILandauGaus(i, x, delta, xi, sigma);
      p[i-1]     = a * f;
      // std::cout << p[i-1] << ",";
    }
    Double_t r = gRandom->Uniform(p.GetSum());
    Double_t l = 0;
    // std::cout << "s=" << p.GetSum() << ",r=" << r << ",";
    for (Int_t i = 1; i <= n; i++) { 
      if (r > l && r <= l + p[i-1]) {
	// std::cout << "l=" << l << ",l+p=" << l+p[i-1] << "-> " << i 
	//  << std::endl;
	return i;
      }
      l += p[i-1];
    }
    return 0;
  }
  /** 
   * Draw the function 
   * 
   * @param option Drawing option 
   */
  void Draw(Option_t* option="") { fF->Draw(option); }
  /** @return @f$C@f$ */
  Double_t GetC() const { return fF->GetParameter(kC); }
  /** @return @f$\Delta_{mp}@f$ */
  Double_t GetDelta() const { return fF->GetParameter(kDelta); }
  /** @return @f$\xi@f$ */
  Double_t GetXi() const { return fF->GetParameter(kXi); }
  /** @return @f$\sigma@f$ */
  Double_t GetSigma() const { return fF->GetParameter(kSigma); }
  /** @return @f$N@f$ */
  UShort_t GetN() const { return fF->GetParameter(kN); }
  /** @return @f$a_{i}@f$ */
  Double_t GetA(Int_t i) const { return i == 1 ? 1 : fF->GetParameter(kA+i-2);}
  /** @return @f$a_2,...,a_N@f$ */
  Double_t* GetAs() const { return &(fF->GetParameters()[kA]);}
  /** @return @f$\Delta C@f$ */
  Double_t GetEC() const { return fF->GetParError(kC); }
  /** @return @f$\Delta \Delta_{mp}@f$ */
  Double_t GetEDelta() const { return fF->GetParError(kDelta); }
  /** @return @f$\Delta \xi@f$ */
  Double_t GetEXi() const { return fF->GetParError(kXi); }
  /** @return @f$\Delta \sigma@f$ */
  Double_t GetESigma() const { return fF->GetParError(kSigma); }
  /** @return @f$\Delta N@f$ */
  UShort_t GetEN() const { return 0; }
  /** @return @f$\Delta a_{i}@f$ */
  Double_t GetEA(Int_t i) const { return i == 1 ? 0 : fF->GetParError(kA+i-2);}
  /** @return @f$\Delta a_2,...,\Delta a_N@f$ */
  Double_t* GetEAs() const { return &(fF->GetParErrors()[kA]);}
  /** The ROOT object */
  TF1* fF;
};
#ifndef __CINT__
const Double_t Function::fgkMPShift    = -0.22278298;
const Double_t Function::fgkInvRoot2Pi = 1. / TMath::Sqrt(2*TMath::Pi());
const Double_t Function::fgkConvNSigma = 5;
const Double_t Function::fgkConvNSteps = 100;
#endif
  
//====================================================================
/**
 * 
 * 
 * 
 * @ingroup pwglf_forward_scripts_tests
 */
struct Fitter
{
  // --- Object code ------------------------------------------------
  Fitter(Int_t nMinus) 
    : fNMinus(nMinus)
  {
  }
  /** 
   * 
   * 
   * @param dist 
   * 
   * @return 
   */
  TF1* FitFirst(TH1* dist)
  {
    fFunctions.Clear();
    
    // Get upper edge 
    Int_t    midBin = dist->GetMaximumBin();
    Double_t midE   = dist->GetBinLowEdge(midBin);
    
    // Get low edge 
    Int_t    minBin = midBin - fNMinus;
    Double_t minE  = dist->GetBinCenter(minBin);
    Double_t maxE  = dist->GetBinCenter(midBin+2*fNMinus);
    Double_t a[]   = { 0 };
    TF1* f = Function::MakeFunc(1, 0.5, midE, 0.07, 0.1, a, minE, maxE);

    // Do the fit 
    dist->Fit(f, "RNQS", "", minE, maxE);
    fFunctions.AddAtAndExpand(f, 0);
    return f;
  }
  /** 
   * 
   * 
   * @param dist 
   * @param n 
   * 
   * @return 
   */
  Function* FitN(TH1* dist, Int_t n)
  {
    if (n == 1) return new Function(FitFirst(dist));
    TF1*        f1 = static_cast<TF1*>(fFunctions.At(0));
    if (!f1) { 
      f1 = FitFirst(dist);
      if (!f1) { 
	::Warning("FitN", "First fit missing");
	return 0;
      }
    }
    
    Double_t delta1 = f1->GetParameter(Function::kDelta);
    Double_t xi1    = f1->GetParameter(Function::kXi);
    Double_t maxEi  = n * (delta1 + xi1 * TMath::Log(n)) + 2 * n * xi1;
    Double_t minE   = f1->GetXmin();
    
    TArrayD a(n-1);
    for (UShort_t i = 2; i <= n; i++) a.fArray[i-2] = (n==2? 0.05 : 0.000001);
    
    TF1* fn = Function::MakeFunc(n, f1->GetParameter(Function::kC), 
				 delta1, xi1, 
				 f1->GetParameter(Function::kSigma), 
				 a.fArray, minE, maxEi);
    
    dist->Fit(fn, "RSNQ", "", minE, maxEi);
    dist->Fit(fn, "RSNQM", "", minE, maxEi);
    fFunctions.AddAtAndExpand(fn, n-1);
    
    return new Function(fn);
  }
  Int_t     fNMinus;
  TObjArray fFunctions;
};

//====================================================================
/** 
 * Utility function 
 * 
 * @param xp Pointer to independent variables
 * @param pp Pointer to parameters 
 * 
 * @return Function evaluated at xp[0]
 * 
 * @ingroup pwglf_forward_scripts_tests
 */  
static Double_t landauGaus1(Double_t* xp, Double_t* pp)
{
  Double_t x     = xp[0];
  Double_t c     = pp[Function::kC];
  Double_t delta = pp[Function::kDelta];
  Double_t xi    = pp[Function::kXi];
  Double_t sigma = pp[Function::kSigma];
    
  return c * Function::LandauGaus(x, delta, xi, sigma);
}
/** 
 * Utility function 
 * 
 * @param xp Pointer to independent variables
 * @param pp Pointer to parameters 
 * 
 * @return Function evaluated at xp[0]
 * 
 * @ingroup pwglf_forward_scripts_tests
 */
static Double_t landauGausN(Double_t* xp, Double_t* pp)
{
  Double_t  x     = xp[0];
  Double_t  c     = pp[Function::kC];
  Double_t  delta = pp[Function::kDelta];
  Double_t  xi    = pp[Function::kXi];
  Double_t  sigma = pp[Function::kSigma];
  Int_t     n     = Int_t(pp[Function::kN]);
  Double_t* a     = &pp[Function::kA];
    
  return c * Function::NLandauGaus(x, delta, xi, sigma, n, a);
}
/** 
 * Utility function 
 * 
 * @param xp Pointer to independent variables
 * @param pp Pointer to parameters 
 * 
 * @return Function evaluated at xp[0]
 * 
 * @ingroup pwglf_forward_scripts_tests
 */
static Double_t landauGausI(Double_t* xp, Double_t* pp)
{
  Double_t  x     = xp[0];
  Double_t  c     = pp[Function::kC];
  Double_t  delta = pp[Function::kDelta];
  Double_t  xi    = pp[Function::kXi];
  Double_t  sigma = pp[Function::kSigma];
  Int_t     i     = Int_t(pp[Function::kN]);
    
  return c * Function::ILandauGaus(i, x, delta, xi, sigma);
}

//====================================================================
/**
 * 
 * 
 * 
 * @ingroup pwglf_forward_scripts_tests
 */
struct Generator
{
  Double_t fDelta;
  Double_t fXi;
  Double_t fSigma;
  Int_t    fMaxN;
  TH1*     fSingle;
  TH1*     fSummed;
  TH1*     fSimple;
  TH2*     fNSum;
  TH1*     fN;
  TArrayD  fRP; // Raw probabilities
  TArrayD  fP; // Normalized probabilities 
  TF1*     fF;
  Int_t    fNObs;

  /** 
   * 
   * 
   * 
   * @return 
   */
  Generator(Double_t delta=.55, Double_t xi=0.06, Double_t sigma=0.02,
	    Int_t maxN=5, const Double_t* a=0)
    : fDelta(delta), fXi(xi), fSigma(sigma), fMaxN(maxN),
      fSingle(0), fSummed(0), fSimple(0), fNSum(0), fRP(), fP(fMaxN), fF(0),
      fNObs(0)
  {
    fMaxN = TMath::Min(fMaxN, 5);
    const Double_t ps[] = { 1, .05, .02, .005, .002 };
    fRP.Set(5, ps);
    if (a) { 
      for (Int_t i = 0; i < maxN; i++) fRP[i] = a[i];
    }

    Double_t sum = 0; 
    for (Int_t i = 0; i < fMaxN; i++) sum += fRP[i];
    for (Int_t i = 0; i < fP.fN; i++) {
      fP[i] = fRP[i] / sum;
      if (i != 0) fP[i] += fP[i-1];
    }

    fSingle = new TH1D("single", "Single signals", 500, 0, 10);
    fSingle->SetXTitle("Signal");
    fSingle->SetYTitle("Events");
    fSingle->SetFillColor(kRed+1);
    fSingle->SetMarkerColor(kRed+1);
    fSingle->SetLineColor(kRed+1);
    fSingle->SetFillStyle(3001);
    fSingle->SetMarkerStyle(21);
    fSingle->SetDirectory(0);
    fSingle->Sumw2();

    fSummed = static_cast<TH1D*>(fSingle->Clone("summed"));
    fSummed->SetTitle("Summed signals");
    fSummed->SetFillColor(kBlue+1);
    fSummed->SetMarkerColor(kBlue+1);
    fSummed->SetLineColor(kBlue+1);
    fSummed->SetDirectory(0);

    fSimple = static_cast<TH1D*>(fSingle->Clone("summed"));
    fSimple->SetTitle("Summed signals");
    fSimple->SetFillColor(kGreen+1);
    fSimple->SetMarkerColor(kGreen+1);
    fSimple->SetLineColor(kGreen+1);
    fSimple->SetDirectory(0);

    fNSum = new TH2D("single", "Observation signals", 
		     fMaxN, .5, fMaxN+.5, 100, 0, 10);
    fNSum->SetMarkerColor(kMagenta+1);
    fNSum->SetLineColor(kMagenta+1);
    fNSum->SetFillColor(kMagenta+1);
    fNSum->SetYTitle("Signal");
    fNSum->SetXTitle("N");
    fNSum->SetZTitle("Events");
    fNSum->SetDirectory(0);
    fNSum->Sumw2();

    fN = new TH1D("n", "Number of particles", fMaxN, .5, fMaxN+.5);
    fN->SetXTitle("N");
    fN->SetYTitle("Events");
    fN->SetMarkerColor(kMagenta+1);
    fN->SetLineColor(kMagenta+1);
    fN->SetFillColor(kMagenta+1);
    fN->SetMarkerStyle(22);
    fN->SetFillStyle(3001);
    fN->SetDirectory(0);

    std::cout << "Probabilities:" << std::setprecision(4) 
	      << "\n  ";
    for (Int_t i = 0; i < fRP.fN; i++) 
      std::cout << std::setw(7) << fRP[i] << " ";
    std::cout << " = " << fRP.GetSum() << "\n  ";
    for (Int_t i = 0; i < fP.fN; i++) 
      std::cout << std::setw(7) << fP[i] << " ";
    std::cout << std::endl;

    Double_t aa[] = { 0 };
    fF = Function::MakeFunc(1, 1, fDelta, fXi, fSigma, aa,  0, 10);
  }
  /** 
   * 
   * 
   */
  void Clear()
  {
    fSingle->Reset();
    fSummed->Reset();
    fNSum->Reset();
    fN->Reset();
  }
  /** 
   * 
   * 
   * 
   * @return 
   */    
  Int_t GenerateN()
  {
    Double_t rndm = gRandom->Uniform();
    Int_t    ret  = 0;
    if      (                 rndm < fP[0]) ret = 1;
    else if (rndm >= fP[0] && rndm < fP[1]) ret = 2;
    else if (rndm >= fP[1] && rndm < fP[2]) ret = 3;
    else if (rndm >= fP[2] && rndm < fP[3]) ret = 4;
    else if (rndm >= fP[3] && rndm < fP[4]) ret = 5;
    // Printf("%f -> %d", rndm, ret);
    fN->Fill(ret);
    return ret;
  }
  /** 
   * 
   * 
   * @param mpv 
   * @param xi 
   * @param sigma 
   * 
   * @return 
   */
  Double_t Generate1Signal()
  {
    Double_t ret = 0;
    if (fF) ret = fF->GetRandom();
    else { 
      Double_t rmpv = gRandom->Gaus(fDelta, fSigma);
      ret           = gRandom->Landau(rmpv, fXi);
    }
    fSingle->Fill(ret);
    fSimple->Fill(gRandom->Landau(fDelta - fXi * Function::fgkMPShift, fXi));
    return ret;
  }
  /** 
   * 
   * 
   * @param n 
   * @param mpv 
   * @param xi 
   * @param sigma 
   * 
   * @return 
   */  
  Double_t GenerateNSignal(Int_t n)
  {
    Double_t ret = 0;
    for (Int_t i = 0; i < n; i++) ret += Generate1Signal();
    fSummed->Fill(ret);
    fNSum->Fill(n, ret);
    return ret;
  }
  /** 
   * 
   * 
   * @param nObs 
   * @param reset 
   */  
  void Generate(Int_t nObs=1000, Bool_t reset=true)
  {
    if (reset) Clear();
    fNObs = nObs;

    for (Int_t i = 0; i < nObs; i++) {
      // if (((i+1) % (nObs/10)) == 0) 
      //	std::cout << "Event " << std::setw(6) << i << std::endl;
      Int_t n = GenerateN();
      GenerateNSignal(n);
    }
    Double_t m = fSingle->GetMaximum();
    fSingle->Scale(1. / m);
    m = fSummed->GetMaximum();
    fSummed->Scale(1. / m);
    m = fSimple->GetMaximum();
    fSimple->Scale(1. / m);

    std::cout << "Resulting probabilities:\n  ";
    for (Int_t i = 1; i <= fN->GetNbinsX(); i++) 
      std::cout << std::setprecision(4) << std::setw(7) 
		<< fN->GetBinContent(i) << " ";
    std::cout << std::endl;
  }
  /** 
   * Pretty print of parameters. 
   * 
   * @param input 
   * @param f 
   * @param i 
   */
  void PrintParameter(Double_t input, TF1* f, Int_t i)
  {
    Double_t val = 0, err = 0;
    if (i < f->GetNpar()) {
      val = f->GetParameter(i);
      err = f->GetParError(i);
    }
    std::cout << "  " << std::setw(16) << f->GetParName(i) << ": "
	      << std::fixed 
	      << std::setprecision(4) << std::setw(6) << input << " -> " 
	      << std::setprecision(4) << std::setw(6) << val   << " +/- "
	      << std::setprecision(5) << std::setw(7) << err   << " [delta:" 
	      << std::setw(3) << int(100 * (input-val) / input) << "%,err:" 
	      << std::setw(3) << int(100 * err / val) << "%]"
	      << std::endl;
  }
  /** 
   * Print the result 
   * 
   * @param f 
   */
  void PrintResult(TF1* f) 
  {
    Double_t chi2 = f->GetChisquare();
    Int_t    ndf  = f->GetNDF();
    std::cout << "Chi^2/NDF = " << chi2 << "/" << ndf << "=" 
	      << chi2/ndf << std::endl;
    PrintParameter(1,      f, Function::kC);
    PrintParameter(fDelta, f, Function::kDelta);
    PrintParameter(fXi,    f, Function::kXi);
    PrintParameter(fSigma, f, Function::kSigma);
    PrintParameter(fMaxN,  f, Function::kN);
    for (Int_t i = 0; i < fMaxN-1; i++) 
      PrintParameter(fRP[i+1], f, Function::kA+i);
  }
  /** 
   * 
   * 
   * @param x 
   * @param y 
   * @param intput 
   * @param f 
   * @param i 
   */
  void DrawParameter(Double_t x, Double_t y, Double_t input, TF1* f, Int_t i)
  {
    Double_t val = 0, err = 0;
    if (i < f->GetNpar()) {
      val = f->GetParameter(i);
      err = f->GetParError(i);
    }

    TLatex* ltx = new TLatex(x, y, f->GetParName(i));
    ltx->SetTextSize(.04);
    ltx->SetTextFont(132);
    ltx->SetTextAlign(11);
    ltx->SetNDC();
    ltx->Draw();
    
    ltx->DrawLatex(x+.05,  y, Form("%5.3f", input));
    ltx->DrawLatex(x+.14, y, "#rightarrow");
    ltx->SetTextAlign(21);
    ltx->DrawLatex(x+.3,  y, Form("%5.3f #pm %6.4f", val, err));
    ltx->SetTextAlign(11);
    ltx->DrawLatex(x+.48,  y, Form("[#Delta=%3d%%, #delta=%3d%%]",
				  int(100 * (input-val)/input), 
				  int(100*err/val)));
  }
  /** 
   * 
   * 
   * @param x 
   * @param y 
   * @param f 
   */
  void DrawResult(Double_t x, Double_t y, TF1* f)
  {
    Double_t chi2 = f->GetChisquare();
    Int_t    ndf  = f->GetNDF();
    TLatex* ltx = new TLatex(x, y, Form("#chi^{2}/NDF=%5.2f/%3d=%6.3f", 
					chi2, ndf, chi2/ndf));
    ltx->SetTextSize(.04);
    ltx->SetNDC();
    ltx->SetTextFont(132);
    ltx->Draw();

    x += .05;
    y -= .035; DrawParameter(x, y, 1,      f, Function::kC);
    y -= .035; DrawParameter(x, y, fDelta, f, Function::kDelta);
    y -= .035; DrawParameter(x, y, fXi,    f, Function::kXi);
    y -= .035; DrawParameter(x, y, fSigma, f, Function::kSigma);
    y -= .035; DrawParameter(x, y, fMaxN,  f, Function::kN);
    for (Int_t i = 0; i < fMaxN-1; i++) {
      y -= .035; DrawParameter(x, y, fRP[i+1], f, Function::kA+i);
    }
  }
  /** 
   * 
   * 
   */
  void Draw(const char* type="png")
  {
    gStyle->SetOptTitle(0);
    gStyle->SetOptStat(0);
    gStyle->SetPalette(1);

    TCanvas* c = new TCanvas("c", "Generator distributions", 1200, 1000);
    c->SetFillColor(0);
    c->SetBorderSize(0);
    c->SetBorderMode(0);
    c->SetTopMargin(0.01);
    c->SetRightMargin(0.01);

    c->Divide(2, 2);

    // --- First pad:  Data (multi, single, landau) + Fit -------------
    TVirtualPad* p = c->cd(1);
    p->SetLogy();
    p->SetBorderSize(0);
    p->SetBorderMode(0);
    p->SetTopMargin(0.01);
    p->SetRightMargin(0.01);
    fSummed->Draw();
    fSingle->Draw("same");
    fSimple->Draw("same");

    if (fF) { 
      Double_t max = fF->GetMaximum();
      Double_t a[] = { 0 };
      TF1* fcopy = Function::MakeFunc(1, 
				      fF->GetParameter(Function::kC) /max, 
				      fF->GetParameter(Function::kDelta), 
				      fF->GetParameter(Function::kXi), 
				      fF->GetParameter(Function::kSigma), 
				      a, 0, 10);
      fcopy->SetLineColor(2);
      fcopy->SetLineStyle(2);
      fcopy->Draw("same");
    }

    Fitter*   fitter = new Fitter(4);
    Function* fit    = fitter->FitN(fSummed, 5);
    TF1*      f      = fit->GetF1();
    f->Draw("same");
    f->SetLineColor(kBlack);
    TF1* fst = static_cast<TF1*>(fitter->fFunctions.At(0));
    fst->SetLineWidth(3);
    fst->SetLineStyle(2);
    fst->SetLineColor(kMagenta);
    fst->Draw("same");
    PrintResult(f);
    DrawResult(.25, .95, f);
    TGraphErrors* gr = new TGraphErrors(fSummed->GetNbinsX());
    gr->SetName("fitError");
    gr->SetTitle("Fit w/errors");
    gr->SetFillColor(kYellow+1);
    gr->SetFillStyle(3001);
    for (Int_t j = 1; j <= fSummed->GetNbinsX(); j++) { 
      Double_t x = fSummed->GetBinCenter(j);
      Double_t e = 0;
      Double_t y = fit->Evaluate(x, e);
      gr->SetPoint(j-1, x, y);
      gr->SetPointError(j-1, 0, e);
    }
    gr->Draw("same l e4");

    TLegend* l = new TLegend(.15, .11, .5, .4);
    l->SetBorderSize(0);
    l->SetFillColor(0);
    l->SetFillStyle(0);
    l->SetTextFont(132);
    l->AddEntry(fSimple, "L: Single-L", "lp");
    l->AddEntry(fSingle, "LG: Single-L#otimesG", "lp");
    l->AddEntry(fSummed,"NLG: Multi-L#otimesG", "lp");
    l->AddEntry(gr, "f_{N}: Fit to NLG");
    l->Draw();

    // --- Second pad:  Data (1, 2, 3, ...) --------------------------
    p = c->cd(2);
    p->SetLogy();
    p->SetBorderSize(0);
    p->SetBorderMode(0);
    p->SetTopMargin(0.01);
    p->SetRightMargin(0.01);
    p->SetGridx();
    THStack* stack = new THStack(fNSum, "y");
    TIter next(stack->GetHists());
    TH1* h = 0;
    Int_t i = 2;
    Double_t max = 0;
    TLegend* l2 = new TLegend(.6, .5, .95, .95);
    l2->SetBorderSize(0);
    l2->SetFillStyle(0);
    l2->SetFillColor(0);
    l2->SetTextFont(132);
    while ((h = static_cast<TH1*>(next()))) { 
      if (i == 2) max = h->GetMaximum();
      h->SetLineColor(i); 
      h->SetFillColor(i); 
      h->SetFillStyle(3001);
      h->Scale(1/max);
      l2->AddEntry(h, Form("%d particles", i - 1), "f");
      i++;
    }
    stack->Draw("hist nostack");
    stack->GetHistogram()->SetXTitle("Signal");
    stack->GetHistogram()->SetYTitle("Events");
    i = 2;
    for (Int_t j = 1; j <= 5; j++) {
      TF1* fi = Function::MakeIFunc(j, fRP[j-1], fDelta, fXi, fSigma, 0, 10);
      if (j == 1) max = fi->GetMaximum();
      fi->SetParameter(0, fRP[j-1]/max);
      fi->SetLineColor(i);
      fi->SetLineWidth(3);
      fi->SetLineStyle(2);
      fi->Draw("same");

      TF1* fj = Function::MakeIFunc(j, fit->GetC() * fit->GetA(j), 
				    fit->GetDelta(), fit->GetXi(), 
				    fit->GetSigma(), 0, 10);
      fj->SetLineColor(i);
      fj->SetLineWidth(2);
      fj->Draw("same");

      std::cout << "Component " << j << " scale=" << fi->GetParameter(0) 
		<< " (" << fRP[j-1] << ")" << " " << fj->GetParameter(0) 
		<< " (" << fit->GetC() << "*" << fit->GetA(j) << ")" 
		<< std::endl;
      i++;
    }
    TLegendEntry* ee = l2->AddEntry("", "Input f_{i}", "l");
    ee->SetLineStyle(2);
    ee->SetLineWidth(3);
    l2->AddEntry("", "Fit f_{i}", "l");
    l2->Draw();
    // fNSum->Draw("lego2");

    // --- Third pad:  Mean multiplicity ------------------------------
    TH1* nhist1 = new TH1F("nhist1", "NHist", 5, 0.5, 5.5);
    nhist1->SetFillColor(kCyan+1);
    nhist1->SetMarkerColor(kCyan+1);
    nhist1->SetLineColor(kCyan+1);
    nhist1->SetFillStyle(3002);
    TH1* nhist2 = new TH1F("nhist2", "NHist", 5, 0.5, 5.5);
    nhist2->SetFillColor(kYellow+1);
    nhist2->SetMarkerColor(kYellow+1);
    nhist2->SetLineColor(kYellow+1);
    nhist2->SetFillStyle(3002);

    TH2* resp = new TH2F("resp", "Reponse", 100, 0, 10, 6, -.5, 5.5);
    resp->SetXTitle("Signal");
    resp->SetYTitle("# particles");
    for (Int_t j = 0; j < fNObs; j++) { 
      if (((j+1) % (fNObs / 10)) == 0) 
	std::cout << "Event # " << j+1 << std::endl;
      Double_t x = fSummed->GetRandom();
      Double_t y = fit->RandomEstimateNParticles(x);
      nhist1->Fill(y);
      resp->Fill(x, y);
    }
    TGraphErrors* graph = new TGraphErrors(fSummed->GetNbinsX());
    graph->SetName("evalWeighted");
    graph->SetTitle("Evaluated function");
    graph->SetLineColor(kBlack);
    graph->SetFillColor(kYellow+1);
    graph->SetFillStyle(3001);
    for (Int_t j = 1; j <= fSummed->GetNbinsX(); j++) { 
      Double_t x = fSummed->GetBinCenter(j);
      Double_t e = 0;
      Double_t y = fit->EstimateNParticles(x, e);
      nhist2->Fill(y, fSummed->GetBinContent(j));
      graph->SetPoint(j-1, x, y);
      graph->SetPointError(j-1, 0, e);
    }
    nhist1->Scale(1. / nhist1->GetMaximum());
    nhist2->Scale(1. / nhist2->GetMaximum());
    fN->Scale(1. / fN->GetMaximum());

    p = c->cd(3);
    p->SetLogy();
    p->SetBorderSize(0);
    p->SetBorderMode(0);
    p->SetTopMargin(0.01);
    p->SetRightMargin(0.01);
    fN->Draw();
    nhist1->Draw("same");
    nhist2->Draw("same");

    TLegend* l3 = new TLegend(.3, .7, .95, .95);
    l3->SetBorderSize(0);
    l3->SetFillStyle(0);
    l3->SetFillColor(0);
    l3->SetTextFont(132);
    l3->AddEntry(fN,  
		 Form("Input n distribution: #bar{m}=%5.3f, s_{m}=%5.3f",
		      fN->GetMean(), fN->GetRMS()), "f");
    l3->AddEntry(nhist1, 
		 Form("Random draw from fit: #bar{m}=%5.3f, s_{m}=%5.3f", 
		      nhist1->GetMean(), nhist1->GetRMS()), "f");
    l3->AddEntry(nhist2, 
		 Form("Weighted evaluation of fit: #bar{m}=%5.3f, s_{m}=%5.3f", 
		      nhist2->GetMean(), nhist2->GetRMS()), "f");
    l3->Draw();
    
    // --- Fourth pad: Reponse function ------------------------------
    p = c->cd(4);
    // p->SetLogy();
    p->SetBorderSize(0);
    p->SetBorderMode(0);
    p->SetTopMargin(0.01);
    p->SetRightMargin(0.01);
    p->SetGridx();
    TProfile* prof1 = fNSum->ProfileY();
    prof1->SetLineColor(kMagenta+1);
    prof1->Draw();
    TProfile* prof2 = resp->ProfileX();
    prof2->SetLineColor(kCyan+2);
    prof2->Draw("same");
    graph->SetLineWidth(2);
    graph->Draw("same LP E4");

    TLegend* l4 = new TLegend(.2, .11, .8, .4);
    l4->SetBorderSize(0);
    l4->SetFillStyle(0);
    l4->SetFillColor(0);
    l4->SetTextFont(132);
    l4->AddEntry(prof1, "Input distribution of N particles", "l");
    l4->AddEntry(prof2, "Random estimate of N particles", "l");
    l4->AddEntry(graph, "E: #sum_{i}^{N}i a_{i}f_{i}/"
		 "#sum_{i}^{N}a_{i}f_{i} evaluated over NLG", "lf");
    l4->Draw();

    c->cd();
    
    if (type && type[0] != '\0') 
      c->Print(Form("TestELossDist.%s", type));
  }
};

/** 
 * Test the energy loss fits
 * 
 * @param type Output graphics type 
 * 
 * @ingroup pwglf_forward_scripts_tests
 */
void
TestELossDist(const char* type="png")
{
  gRandom->SetSeed(12345);
  const Double_t a1[] = { 1, .05, .02, .005, .002 }; // 7TeV pp
  const Double_t a2[] = { 1, .1, .05, .01, .005 };
  const Double_t a3[] = { 1, .2, .10, .05, .01 };

  Generator* g = new Generator(0.55, 0.06, 0.06, 5, a1);
  g->Generate(100000);
  g->Draw(type);

  
}


 TestELossDist.C:1
 TestELossDist.C:2
 TestELossDist.C:3
 TestELossDist.C:4
 TestELossDist.C:5
 TestELossDist.C:6
 TestELossDist.C:7
 TestELossDist.C:8
 TestELossDist.C:9
 TestELossDist.C:10
 TestELossDist.C:11
 TestELossDist.C:12
 TestELossDist.C:13
 TestELossDist.C:14
 TestELossDist.C:15
 TestELossDist.C:16
 TestELossDist.C:17
 TestELossDist.C:18
 TestELossDist.C:19
 TestELossDist.C:20
 TestELossDist.C:21
 TestELossDist.C:22
 TestELossDist.C:23
 TestELossDist.C:24
 TestELossDist.C:25
 TestELossDist.C:26
 TestELossDist.C:27
 TestELossDist.C:28
 TestELossDist.C:29
 TestELossDist.C:30
 TestELossDist.C:31
 TestELossDist.C:32
 TestELossDist.C:33
 TestELossDist.C:34
 TestELossDist.C:35
 TestELossDist.C:36
 TestELossDist.C:37
 TestELossDist.C:38
 TestELossDist.C:39
 TestELossDist.C:40
 TestELossDist.C:41
 TestELossDist.C:42
 TestELossDist.C:43
 TestELossDist.C:44
 TestELossDist.C:45
 TestELossDist.C:46
 TestELossDist.C:47
 TestELossDist.C:48
 TestELossDist.C:49
 TestELossDist.C:50
 TestELossDist.C:51
 TestELossDist.C:52
 TestELossDist.C:53
 TestELossDist.C:54
 TestELossDist.C:55
 TestELossDist.C:56
 TestELossDist.C:57
 TestELossDist.C:58
 TestELossDist.C:59
 TestELossDist.C:60
 TestELossDist.C:61
 TestELossDist.C:62
 TestELossDist.C:63
 TestELossDist.C:64
 TestELossDist.C:65
 TestELossDist.C:66
 TestELossDist.C:67
 TestELossDist.C:68
 TestELossDist.C:69
 TestELossDist.C:70
 TestELossDist.C:71
 TestELossDist.C:72
 TestELossDist.C:73
 TestELossDist.C:74
 TestELossDist.C:75
 TestELossDist.C:76
 TestELossDist.C:77
 TestELossDist.C:78
 TestELossDist.C:79
 TestELossDist.C:80
 TestELossDist.C:81
 TestELossDist.C:82
 TestELossDist.C:83
 TestELossDist.C:84
 TestELossDist.C:85
 TestELossDist.C:86
 TestELossDist.C:87
 TestELossDist.C:88
 TestELossDist.C:89
 TestELossDist.C:90
 TestELossDist.C:91
 TestELossDist.C:92
 TestELossDist.C:93
 TestELossDist.C:94
 TestELossDist.C:95
 TestELossDist.C:96
 TestELossDist.C:97
 TestELossDist.C:98
 TestELossDist.C:99
 TestELossDist.C:100
 TestELossDist.C:101
 TestELossDist.C:102
 TestELossDist.C:103
 TestELossDist.C:104
 TestELossDist.C:105
 TestELossDist.C:106
 TestELossDist.C:107
 TestELossDist.C:108
 TestELossDist.C:109
 TestELossDist.C:110
 TestELossDist.C:111
 TestELossDist.C:112
 TestELossDist.C:113
 TestELossDist.C:114
 TestELossDist.C:115
 TestELossDist.C:116
 TestELossDist.C:117
 TestELossDist.C:118
 TestELossDist.C:119
 TestELossDist.C:120
 TestELossDist.C:121
 TestELossDist.C:122
 TestELossDist.C:123
 TestELossDist.C:124
 TestELossDist.C:125
 TestELossDist.C:126
 TestELossDist.C:127
 TestELossDist.C:128
 TestELossDist.C:129
 TestELossDist.C:130
 TestELossDist.C:131
 TestELossDist.C:132
 TestELossDist.C:133
 TestELossDist.C:134
 TestELossDist.C:135
 TestELossDist.C:136
 TestELossDist.C:137
 TestELossDist.C:138
 TestELossDist.C:139
 TestELossDist.C:140
 TestELossDist.C:141
 TestELossDist.C:142
 TestELossDist.C:143
 TestELossDist.C:144
 TestELossDist.C:145
 TestELossDist.C:146
 TestELossDist.C:147
 TestELossDist.C:148
 TestELossDist.C:149
 TestELossDist.C:150
 TestELossDist.C:151
 TestELossDist.C:152
 TestELossDist.C:153
 TestELossDist.C:154
 TestELossDist.C:155
 TestELossDist.C:156
 TestELossDist.C:157
 TestELossDist.C:158
 TestELossDist.C:159
 TestELossDist.C:160
 TestELossDist.C:161
 TestELossDist.C:162
 TestELossDist.C:163
 TestELossDist.C:164
 TestELossDist.C:165
 TestELossDist.C:166
 TestELossDist.C:167
 TestELossDist.C:168
 TestELossDist.C:169
 TestELossDist.C:170
 TestELossDist.C:171
 TestELossDist.C:172
 TestELossDist.C:173
 TestELossDist.C:174
 TestELossDist.C:175
 TestELossDist.C:176
 TestELossDist.C:177
 TestELossDist.C:178
 TestELossDist.C:179
 TestELossDist.C:180
 TestELossDist.C:181
 TestELossDist.C:182
 TestELossDist.C:183
 TestELossDist.C:184
 TestELossDist.C:185
 TestELossDist.C:186
 TestELossDist.C:187
 TestELossDist.C:188
 TestELossDist.C:189
 TestELossDist.C:190
 TestELossDist.C:191
 TestELossDist.C:192
 TestELossDist.C:193
 TestELossDist.C:194
 TestELossDist.C:195
 TestELossDist.C:196
 TestELossDist.C:197
 TestELossDist.C:198
 TestELossDist.C:199
 TestELossDist.C:200
 TestELossDist.C:201
 TestELossDist.C:202
 TestELossDist.C:203
 TestELossDist.C:204
 TestELossDist.C:205
 TestELossDist.C:206
 TestELossDist.C:207
 TestELossDist.C:208
 TestELossDist.C:209
 TestELossDist.C:210
 TestELossDist.C:211
 TestELossDist.C:212
 TestELossDist.C:213
 TestELossDist.C:214
 TestELossDist.C:215
 TestELossDist.C:216
 TestELossDist.C:217
 TestELossDist.C:218
 TestELossDist.C:219
 TestELossDist.C:220
 TestELossDist.C:221
 TestELossDist.C:222
 TestELossDist.C:223
 TestELossDist.C:224
 TestELossDist.C:225
 TestELossDist.C:226
 TestELossDist.C:227
 TestELossDist.C:228
 TestELossDist.C:229
 TestELossDist.C:230
 TestELossDist.C:231
 TestELossDist.C:232
 TestELossDist.C:233
 TestELossDist.C:234
 TestELossDist.C:235
 TestELossDist.C:236
 TestELossDist.C:237
 TestELossDist.C:238
 TestELossDist.C:239
 TestELossDist.C:240
 TestELossDist.C:241
 TestELossDist.C:242
 TestELossDist.C:243
 TestELossDist.C:244
 TestELossDist.C:245
 TestELossDist.C:246
 TestELossDist.C:247
 TestELossDist.C:248
 TestELossDist.C:249
 TestELossDist.C:250
 TestELossDist.C:251
 TestELossDist.C:252
 TestELossDist.C:253
 TestELossDist.C:254
 TestELossDist.C:255
 TestELossDist.C:256
 TestELossDist.C:257
 TestELossDist.C:258
 TestELossDist.C:259
 TestELossDist.C:260
 TestELossDist.C:261
 TestELossDist.C:262
 TestELossDist.C:263
 TestELossDist.C:264
 TestELossDist.C:265
 TestELossDist.C:266
 TestELossDist.C:267
 TestELossDist.C:268
 TestELossDist.C:269
 TestELossDist.C:270
 TestELossDist.C:271
 TestELossDist.C:272
 TestELossDist.C:273
 TestELossDist.C:274
 TestELossDist.C:275
 TestELossDist.C:276
 TestELossDist.C:277
 TestELossDist.C:278
 TestELossDist.C:279
 TestELossDist.C:280
 TestELossDist.C:281
 TestELossDist.C:282
 TestELossDist.C:283
 TestELossDist.C:284
 TestELossDist.C:285
 TestELossDist.C:286
 TestELossDist.C:287
 TestELossDist.C:288
 TestELossDist.C:289
 TestELossDist.C:290
 TestELossDist.C:291
 TestELossDist.C:292
 TestELossDist.C:293
 TestELossDist.C:294
 TestELossDist.C:295
 TestELossDist.C:296
 TestELossDist.C:297
 TestELossDist.C:298
 TestELossDist.C:299
 TestELossDist.C:300
 TestELossDist.C:301
 TestELossDist.C:302
 TestELossDist.C:303
 TestELossDist.C:304
 TestELossDist.C:305
 TestELossDist.C:306
 TestELossDist.C:307
 TestELossDist.C:308
 TestELossDist.C:309
 TestELossDist.C:310
 TestELossDist.C:311
 TestELossDist.C:312
 TestELossDist.C:313
 TestELossDist.C:314
 TestELossDist.C:315
 TestELossDist.C:316
 TestELossDist.C:317
 TestELossDist.C:318
 TestELossDist.C:319
 TestELossDist.C:320
 TestELossDist.C:321
 TestELossDist.C:322
 TestELossDist.C:323
 TestELossDist.C:324
 TestELossDist.C:325
 TestELossDist.C:326
 TestELossDist.C:327
 TestELossDist.C:328
 TestELossDist.C:329
 TestELossDist.C:330
 TestELossDist.C:331
 TestELossDist.C:332
 TestELossDist.C:333
 TestELossDist.C:334
 TestELossDist.C:335
 TestELossDist.C:336
 TestELossDist.C:337
 TestELossDist.C:338
 TestELossDist.C:339
 TestELossDist.C:340
 TestELossDist.C:341
 TestELossDist.C:342
 TestELossDist.C:343
 TestELossDist.C:344
 TestELossDist.C:345
 TestELossDist.C:346
 TestELossDist.C:347
 TestELossDist.C:348
 TestELossDist.C:349
 TestELossDist.C:350
 TestELossDist.C:351
 TestELossDist.C:352
 TestELossDist.C:353
 TestELossDist.C:354
 TestELossDist.C:355
 TestELossDist.C:356
 TestELossDist.C:357
 TestELossDist.C:358
 TestELossDist.C:359
 TestELossDist.C:360
 TestELossDist.C:361
 TestELossDist.C:362
 TestELossDist.C:363
 TestELossDist.C:364
 TestELossDist.C:365
 TestELossDist.C:366
 TestELossDist.C:367
 TestELossDist.C:368
 TestELossDist.C:369
 TestELossDist.C:370
 TestELossDist.C:371
 TestELossDist.C:372
 TestELossDist.C:373
 TestELossDist.C:374
 TestELossDist.C:375
 TestELossDist.C:376
 TestELossDist.C:377
 TestELossDist.C:378
 TestELossDist.C:379
 TestELossDist.C:380
 TestELossDist.C:381
 TestELossDist.C:382
 TestELossDist.C:383
 TestELossDist.C:384
 TestELossDist.C:385
 TestELossDist.C:386
 TestELossDist.C:387
 TestELossDist.C:388
 TestELossDist.C:389
 TestELossDist.C:390
 TestELossDist.C:391
 TestELossDist.C:392
 TestELossDist.C:393
 TestELossDist.C:394
 TestELossDist.C:395
 TestELossDist.C:396
 TestELossDist.C:397
 TestELossDist.C:398
 TestELossDist.C:399
 TestELossDist.C:400
 TestELossDist.C:401
 TestELossDist.C:402
 TestELossDist.C:403
 TestELossDist.C:404
 TestELossDist.C:405
 TestELossDist.C:406
 TestELossDist.C:407
 TestELossDist.C:408
 TestELossDist.C:409
 TestELossDist.C:410
 TestELossDist.C:411
 TestELossDist.C:412
 TestELossDist.C:413
 TestELossDist.C:414
 TestELossDist.C:415
 TestELossDist.C:416
 TestELossDist.C:417
 TestELossDist.C:418
 TestELossDist.C:419
 TestELossDist.C:420
 TestELossDist.C:421
 TestELossDist.C:422
 TestELossDist.C:423
 TestELossDist.C:424
 TestELossDist.C:425
 TestELossDist.C:426
 TestELossDist.C:427
 TestELossDist.C:428
 TestELossDist.C:429
 TestELossDist.C:430
 TestELossDist.C:431
 TestELossDist.C:432
 TestELossDist.C:433
 TestELossDist.C:434
 TestELossDist.C:435
 TestELossDist.C:436
 TestELossDist.C:437
 TestELossDist.C:438
 TestELossDist.C:439
 TestELossDist.C:440
 TestELossDist.C:441
 TestELossDist.C:442
 TestELossDist.C:443
 TestELossDist.C:444
 TestELossDist.C:445
 TestELossDist.C:446
 TestELossDist.C:447
 TestELossDist.C:448
 TestELossDist.C:449
 TestELossDist.C:450
 TestELossDist.C:451
 TestELossDist.C:452
 TestELossDist.C:453
 TestELossDist.C:454
 TestELossDist.C:455
 TestELossDist.C:456
 TestELossDist.C:457
 TestELossDist.C:458
 TestELossDist.C:459
 TestELossDist.C:460
 TestELossDist.C:461
 TestELossDist.C:462
 TestELossDist.C:463
 TestELossDist.C:464
 TestELossDist.C:465
 TestELossDist.C:466
 TestELossDist.C:467
 TestELossDist.C:468
 TestELossDist.C:469
 TestELossDist.C:470
 TestELossDist.C:471
 TestELossDist.C:472
 TestELossDist.C:473
 TestELossDist.C:474
 TestELossDist.C:475
 TestELossDist.C:476
 TestELossDist.C:477
 TestELossDist.C:478
 TestELossDist.C:479
 TestELossDist.C:480
 TestELossDist.C:481
 TestELossDist.C:482
 TestELossDist.C:483
 TestELossDist.C:484
 TestELossDist.C:485
 TestELossDist.C:486
 TestELossDist.C:487
 TestELossDist.C:488
 TestELossDist.C:489
 TestELossDist.C:490
 TestELossDist.C:491
 TestELossDist.C:492
 TestELossDist.C:493
 TestELossDist.C:494
 TestELossDist.C:495
 TestELossDist.C:496
 TestELossDist.C:497
 TestELossDist.C:498
 TestELossDist.C:499
 TestELossDist.C:500
 TestELossDist.C:501
 TestELossDist.C:502
 TestELossDist.C:503
 TestELossDist.C:504
 TestELossDist.C:505
 TestELossDist.C:506
 TestELossDist.C:507
 TestELossDist.C:508
 TestELossDist.C:509
 TestELossDist.C:510
 TestELossDist.C:511
 TestELossDist.C:512
 TestELossDist.C:513
 TestELossDist.C:514
 TestELossDist.C:515
 TestELossDist.C:516
 TestELossDist.C:517
 TestELossDist.C:518
 TestELossDist.C:519
 TestELossDist.C:520
 TestELossDist.C:521
 TestELossDist.C:522
 TestELossDist.C:523
 TestELossDist.C:524
 TestELossDist.C:525
 TestELossDist.C:526
 TestELossDist.C:527
 TestELossDist.C:528
 TestELossDist.C:529
 TestELossDist.C:530
 TestELossDist.C:531
 TestELossDist.C:532
 TestELossDist.C:533
 TestELossDist.C:534
 TestELossDist.C:535
 TestELossDist.C:536
 TestELossDist.C:537
 TestELossDist.C:538
 TestELossDist.C:539
 TestELossDist.C:540
 TestELossDist.C:541
 TestELossDist.C:542
 TestELossDist.C:543
 TestELossDist.C:544
 TestELossDist.C:545
 TestELossDist.C:546
 TestELossDist.C:547
 TestELossDist.C:548
 TestELossDist.C:549
 TestELossDist.C:550
 TestELossDist.C:551
 TestELossDist.C:552
 TestELossDist.C:553
 TestELossDist.C:554
 TestELossDist.C:555
 TestELossDist.C:556
 TestELossDist.C:557
 TestELossDist.C:558
 TestELossDist.C:559
 TestELossDist.C:560
 TestELossDist.C:561
 TestELossDist.C:562
 TestELossDist.C:563
 TestELossDist.C:564
 TestELossDist.C:565
 TestELossDist.C:566
 TestELossDist.C:567
 TestELossDist.C:568
 TestELossDist.C:569
 TestELossDist.C:570
 TestELossDist.C:571
 TestELossDist.C:572
 TestELossDist.C:573
 TestELossDist.C:574
 TestELossDist.C:575
 TestELossDist.C:576
 TestELossDist.C:577
 TestELossDist.C:578
 TestELossDist.C:579
 TestELossDist.C:580
 TestELossDist.C:581
 TestELossDist.C:582
 TestELossDist.C:583
 TestELossDist.C:584
 TestELossDist.C:585
 TestELossDist.C:586
 TestELossDist.C:587
 TestELossDist.C:588
 TestELossDist.C:589
 TestELossDist.C:590
 TestELossDist.C:591
 TestELossDist.C:592
 TestELossDist.C:593
 TestELossDist.C:594
 TestELossDist.C:595
 TestELossDist.C:596
 TestELossDist.C:597
 TestELossDist.C:598
 TestELossDist.C:599
 TestELossDist.C:600
 TestELossDist.C:601
 TestELossDist.C:602
 TestELossDist.C:603
 TestELossDist.C:604
 TestELossDist.C:605
 TestELossDist.C:606
 TestELossDist.C:607
 TestELossDist.C:608
 TestELossDist.C:609
 TestELossDist.C:610
 TestELossDist.C:611
 TestELossDist.C:612
 TestELossDist.C:613
 TestELossDist.C:614
 TestELossDist.C:615
 TestELossDist.C:616
 TestELossDist.C:617
 TestELossDist.C:618
 TestELossDist.C:619
 TestELossDist.C:620
 TestELossDist.C:621
 TestELossDist.C:622
 TestELossDist.C:623
 TestELossDist.C:624
 TestELossDist.C:625
 TestELossDist.C:626
 TestELossDist.C:627
 TestELossDist.C:628
 TestELossDist.C:629
 TestELossDist.C:630
 TestELossDist.C:631
 TestELossDist.C:632
 TestELossDist.C:633
 TestELossDist.C:634
 TestELossDist.C:635
 TestELossDist.C:636
 TestELossDist.C:637
 TestELossDist.C:638
 TestELossDist.C:639
 TestELossDist.C:640
 TestELossDist.C:641
 TestELossDist.C:642
 TestELossDist.C:643
 TestELossDist.C:644
 TestELossDist.C:645
 TestELossDist.C:646
 TestELossDist.C:647
 TestELossDist.C:648
 TestELossDist.C:649
 TestELossDist.C:650
 TestELossDist.C:651
 TestELossDist.C:652
 TestELossDist.C:653
 TestELossDist.C:654
 TestELossDist.C:655
 TestELossDist.C:656
 TestELossDist.C:657
 TestELossDist.C:658
 TestELossDist.C:659
 TestELossDist.C:660
 TestELossDist.C:661
 TestELossDist.C:662
 TestELossDist.C:663
 TestELossDist.C:664
 TestELossDist.C:665
 TestELossDist.C:666
 TestELossDist.C:667
 TestELossDist.C:668
 TestELossDist.C:669
 TestELossDist.C:670
 TestELossDist.C:671
 TestELossDist.C:672
 TestELossDist.C:673
 TestELossDist.C:674
 TestELossDist.C:675
 TestELossDist.C:676
 TestELossDist.C:677
 TestELossDist.C:678
 TestELossDist.C:679
 TestELossDist.C:680
 TestELossDist.C:681
 TestELossDist.C:682
 TestELossDist.C:683
 TestELossDist.C:684
 TestELossDist.C:685
 TestELossDist.C:686
 TestELossDist.C:687
 TestELossDist.C:688
 TestELossDist.C:689
 TestELossDist.C:690
 TestELossDist.C:691
 TestELossDist.C:692
 TestELossDist.C:693
 TestELossDist.C:694
 TestELossDist.C:695
 TestELossDist.C:696
 TestELossDist.C:697
 TestELossDist.C:698
 TestELossDist.C:699
 TestELossDist.C:700
 TestELossDist.C:701
 TestELossDist.C:702
 TestELossDist.C:703
 TestELossDist.C:704
 TestELossDist.C:705
 TestELossDist.C:706
 TestELossDist.C:707
 TestELossDist.C:708
 TestELossDist.C:709
 TestELossDist.C:710
 TestELossDist.C:711
 TestELossDist.C:712
 TestELossDist.C:713
 TestELossDist.C:714
 TestELossDist.C:715
 TestELossDist.C:716
 TestELossDist.C:717
 TestELossDist.C:718
 TestELossDist.C:719
 TestELossDist.C:720
 TestELossDist.C:721
 TestELossDist.C:722
 TestELossDist.C:723
 TestELossDist.C:724
 TestELossDist.C:725
 TestELossDist.C:726
 TestELossDist.C:727
 TestELossDist.C:728
 TestELossDist.C:729
 TestELossDist.C:730
 TestELossDist.C:731
 TestELossDist.C:732
 TestELossDist.C:733
 TestELossDist.C:734
 TestELossDist.C:735
 TestELossDist.C:736
 TestELossDist.C:737
 TestELossDist.C:738
 TestELossDist.C:739
 TestELossDist.C:740
 TestELossDist.C:741
 TestELossDist.C:742
 TestELossDist.C:743
 TestELossDist.C:744
 TestELossDist.C:745
 TestELossDist.C:746
 TestELossDist.C:747
 TestELossDist.C:748
 TestELossDist.C:749
 TestELossDist.C:750
 TestELossDist.C:751
 TestELossDist.C:752
 TestELossDist.C:753
 TestELossDist.C:754
 TestELossDist.C:755
 TestELossDist.C:756
 TestELossDist.C:757
 TestELossDist.C:758
 TestELossDist.C:759
 TestELossDist.C:760
 TestELossDist.C:761
 TestELossDist.C:762
 TestELossDist.C:763
 TestELossDist.C:764
 TestELossDist.C:765
 TestELossDist.C:766
 TestELossDist.C:767
 TestELossDist.C:768
 TestELossDist.C:769
 TestELossDist.C:770
 TestELossDist.C:771
 TestELossDist.C:772
 TestELossDist.C:773
 TestELossDist.C:774
 TestELossDist.C:775
 TestELossDist.C:776
 TestELossDist.C:777
 TestELossDist.C:778
 TestELossDist.C:779
 TestELossDist.C:780
 TestELossDist.C:781
 TestELossDist.C:782
 TestELossDist.C:783
 TestELossDist.C:784
 TestELossDist.C:785
 TestELossDist.C:786
 TestELossDist.C:787
 TestELossDist.C:788
 TestELossDist.C:789
 TestELossDist.C:790
 TestELossDist.C:791
 TestELossDist.C:792
 TestELossDist.C:793
 TestELossDist.C:794
 TestELossDist.C:795
 TestELossDist.C:796
 TestELossDist.C:797
 TestELossDist.C:798
 TestELossDist.C:799
 TestELossDist.C:800
 TestELossDist.C:801
 TestELossDist.C:802
 TestELossDist.C:803
 TestELossDist.C:804
 TestELossDist.C:805
 TestELossDist.C:806
 TestELossDist.C:807
 TestELossDist.C:808
 TestELossDist.C:809
 TestELossDist.C:810
 TestELossDist.C:811
 TestELossDist.C:812
 TestELossDist.C:813
 TestELossDist.C:814
 TestELossDist.C:815
 TestELossDist.C:816
 TestELossDist.C:817
 TestELossDist.C:818
 TestELossDist.C:819
 TestELossDist.C:820
 TestELossDist.C:821
 TestELossDist.C:822
 TestELossDist.C:823
 TestELossDist.C:824
 TestELossDist.C:825
 TestELossDist.C:826
 TestELossDist.C:827
 TestELossDist.C:828
 TestELossDist.C:829
 TestELossDist.C:830
 TestELossDist.C:831
 TestELossDist.C:832
 TestELossDist.C:833
 TestELossDist.C:834
 TestELossDist.C:835
 TestELossDist.C:836
 TestELossDist.C:837
 TestELossDist.C:838
 TestELossDist.C:839
 TestELossDist.C:840
 TestELossDist.C:841
 TestELossDist.C:842
 TestELossDist.C:843
 TestELossDist.C:844
 TestELossDist.C:845
 TestELossDist.C:846
 TestELossDist.C:847
 TestELossDist.C:848
 TestELossDist.C:849
 TestELossDist.C:850
 TestELossDist.C:851
 TestELossDist.C:852
 TestELossDist.C:853
 TestELossDist.C:854
 TestELossDist.C:855
 TestELossDist.C:856
 TestELossDist.C:857
 TestELossDist.C:858
 TestELossDist.C:859
 TestELossDist.C:860
 TestELossDist.C:861
 TestELossDist.C:862
 TestELossDist.C:863
 TestELossDist.C:864
 TestELossDist.C:865
 TestELossDist.C:866
 TestELossDist.C:867
 TestELossDist.C:868
 TestELossDist.C:869
 TestELossDist.C:870
 TestELossDist.C:871
 TestELossDist.C:872
 TestELossDist.C:873
 TestELossDist.C:874
 TestELossDist.C:875
 TestELossDist.C:876
 TestELossDist.C:877
 TestELossDist.C:878
 TestELossDist.C:879
 TestELossDist.C:880
 TestELossDist.C:881
 TestELossDist.C:882
 TestELossDist.C:883
 TestELossDist.C:884
 TestELossDist.C:885
 TestELossDist.C:886
 TestELossDist.C:887
 TestELossDist.C:888
 TestELossDist.C:889
 TestELossDist.C:890
 TestELossDist.C:891
 TestELossDist.C:892
 TestELossDist.C:893
 TestELossDist.C:894
 TestELossDist.C:895
 TestELossDist.C:896
 TestELossDist.C:897
 TestELossDist.C:898
 TestELossDist.C:899
 TestELossDist.C:900
 TestELossDist.C:901
 TestELossDist.C:902
 TestELossDist.C:903
 TestELossDist.C:904
 TestELossDist.C:905
 TestELossDist.C:906
 TestELossDist.C:907
 TestELossDist.C:908
 TestELossDist.C:909
 TestELossDist.C:910
 TestELossDist.C:911
 TestELossDist.C:912
 TestELossDist.C:913
 TestELossDist.C:914
 TestELossDist.C:915
 TestELossDist.C:916
 TestELossDist.C:917
 TestELossDist.C:918
 TestELossDist.C:919
 TestELossDist.C:920
 TestELossDist.C:921
 TestELossDist.C:922
 TestELossDist.C:923
 TestELossDist.C:924
 TestELossDist.C:925
 TestELossDist.C:926
 TestELossDist.C:927
 TestELossDist.C:928
 TestELossDist.C:929
 TestELossDist.C:930
 TestELossDist.C:931
 TestELossDist.C:932
 TestELossDist.C:933
 TestELossDist.C:934
 TestELossDist.C:935
 TestELossDist.C:936
 TestELossDist.C:937
 TestELossDist.C:938
 TestELossDist.C:939
 TestELossDist.C:940
 TestELossDist.C:941
 TestELossDist.C:942
 TestELossDist.C:943
 TestELossDist.C:944
 TestELossDist.C:945
 TestELossDist.C:946
 TestELossDist.C:947
 TestELossDist.C:948
 TestELossDist.C:949
 TestELossDist.C:950
 TestELossDist.C:951
 TestELossDist.C:952
 TestELossDist.C:953
 TestELossDist.C:954
 TestELossDist.C:955
 TestELossDist.C:956
 TestELossDist.C:957
 TestELossDist.C:958
 TestELossDist.C:959
 TestELossDist.C:960
 TestELossDist.C:961
 TestELossDist.C:962
 TestELossDist.C:963
 TestELossDist.C:964
 TestELossDist.C:965
 TestELossDist.C:966
 TestELossDist.C:967
 TestELossDist.C:968
 TestELossDist.C:969
 TestELossDist.C:970
 TestELossDist.C:971
 TestELossDist.C:972
 TestELossDist.C:973
 TestELossDist.C:974
 TestELossDist.C:975
 TestELossDist.C:976
 TestELossDist.C:977
 TestELossDist.C:978
 TestELossDist.C:979
 TestELossDist.C:980
 TestELossDist.C:981
 TestELossDist.C:982
 TestELossDist.C:983
 TestELossDist.C:984
 TestELossDist.C:985
 TestELossDist.C:986
 TestELossDist.C:987
 TestELossDist.C:988
 TestELossDist.C:989
 TestELossDist.C:990
 TestELossDist.C:991
 TestELossDist.C:992
 TestELossDist.C:993
 TestELossDist.C:994
 TestELossDist.C:995
 TestELossDist.C:996
 TestELossDist.C:997
 TestELossDist.C:998
 TestELossDist.C:999
 TestELossDist.C:1000
 TestELossDist.C:1001
 TestELossDist.C:1002
 TestELossDist.C:1003
 TestELossDist.C:1004
 TestELossDist.C:1005
 TestELossDist.C:1006
 TestELossDist.C:1007
 TestELossDist.C:1008
 TestELossDist.C:1009
 TestELossDist.C:1010
 TestELossDist.C:1011
 TestELossDist.C:1012
 TestELossDist.C:1013
 TestELossDist.C:1014
 TestELossDist.C:1015
 TestELossDist.C:1016
 TestELossDist.C:1017
 TestELossDist.C:1018
 TestELossDist.C:1019
 TestELossDist.C:1020
 TestELossDist.C:1021
 TestELossDist.C:1022
 TestELossDist.C:1023
 TestELossDist.C:1024
 TestELossDist.C:1025
 TestELossDist.C:1026
 TestELossDist.C:1027
 TestELossDist.C:1028
 TestELossDist.C:1029
 TestELossDist.C:1030
 TestELossDist.C:1031
 TestELossDist.C:1032
 TestELossDist.C:1033
 TestELossDist.C:1034
 TestELossDist.C:1035
 TestELossDist.C:1036
 TestELossDist.C:1037
 TestELossDist.C:1038
 TestELossDist.C:1039
 TestELossDist.C:1040
 TestELossDist.C:1041
 TestELossDist.C:1042
 TestELossDist.C:1043
 TestELossDist.C:1044
 TestELossDist.C:1045
 TestELossDist.C:1046
 TestELossDist.C:1047
 TestELossDist.C:1048
 TestELossDist.C:1049
 TestELossDist.C:1050
 TestELossDist.C:1051
 TestELossDist.C:1052
 TestELossDist.C:1053
 TestELossDist.C:1054
 TestELossDist.C:1055
 TestELossDist.C:1056
 TestELossDist.C:1057
 TestELossDist.C:1058
 TestELossDist.C:1059
 TestELossDist.C:1060
 TestELossDist.C:1061
 TestELossDist.C:1062
 TestELossDist.C:1063
 TestELossDist.C:1064
 TestELossDist.C:1065
 TestELossDist.C:1066
 TestELossDist.C:1067
 TestELossDist.C:1068
 TestELossDist.C:1069
 TestELossDist.C:1070
 TestELossDist.C:1071
 TestELossDist.C:1072
 TestELossDist.C:1073
 TestELossDist.C:1074
 TestELossDist.C:1075
 TestELossDist.C:1076
 TestELossDist.C:1077
 TestELossDist.C:1078
 TestELossDist.C:1079
 TestELossDist.C:1080
 TestELossDist.C:1081
 TestELossDist.C:1082
 TestELossDist.C:1083
 TestELossDist.C:1084
 TestELossDist.C:1085
 TestELossDist.C:1086
 TestELossDist.C:1087
 TestELossDist.C:1088
 TestELossDist.C:1089
 TestELossDist.C:1090
 TestELossDist.C:1091
 TestELossDist.C:1092
 TestELossDist.C:1093
 TestELossDist.C:1094
 TestELossDist.C:1095
 TestELossDist.C:1096
 TestELossDist.C:1097
 TestELossDist.C:1098
 TestELossDist.C:1099
 TestELossDist.C:1100
 TestELossDist.C:1101
 TestELossDist.C:1102
 TestELossDist.C:1103
 TestELossDist.C:1104
 TestELossDist.C:1105
 TestELossDist.C:1106
 TestELossDist.C:1107
 TestELossDist.C:1108
 TestELossDist.C:1109
 TestELossDist.C:1110
 TestELossDist.C:1111
 TestELossDist.C:1112
 TestELossDist.C:1113
 TestELossDist.C:1114
 TestELossDist.C:1115
 TestELossDist.C:1116
 TestELossDist.C:1117
 TestELossDist.C:1118
 TestELossDist.C:1119
 TestELossDist.C:1120
 TestELossDist.C:1121
 TestELossDist.C:1122
 TestELossDist.C:1123
 TestELossDist.C:1124
 TestELossDist.C:1125
 TestELossDist.C:1126
 TestELossDist.C:1127
 TestELossDist.C:1128
 TestELossDist.C:1129
 TestELossDist.C:1130
 TestELossDist.C:1131
 TestELossDist.C:1132
 TestELossDist.C:1133
 TestELossDist.C:1134
 TestELossDist.C:1135
 TestELossDist.C:1136
 TestELossDist.C:1137
 TestELossDist.C:1138
 TestELossDist.C:1139
 TestELossDist.C:1140
 TestELossDist.C:1141
 TestELossDist.C:1142
 TestELossDist.C:1143
 TestELossDist.C:1144
 TestELossDist.C:1145
 TestELossDist.C:1146
 TestELossDist.C:1147
 TestELossDist.C:1148
 TestELossDist.C:1149
 TestELossDist.C:1150
 TestELossDist.C:1151
 TestELossDist.C:1152
 TestELossDist.C:1153
 TestELossDist.C:1154
 TestELossDist.C:1155
 TestELossDist.C:1156
 TestELossDist.C:1157
 TestELossDist.C:1158
 TestELossDist.C:1159
 TestELossDist.C:1160
 TestELossDist.C:1161
 TestELossDist.C:1162
 TestELossDist.C:1163
 TestELossDist.C:1164
 TestELossDist.C:1165
 TestELossDist.C:1166
 TestELossDist.C:1167
 TestELossDist.C:1168
 TestELossDist.C:1169
 TestELossDist.C:1170
 TestELossDist.C:1171
 TestELossDist.C:1172
 TestELossDist.C:1173
 TestELossDist.C:1174
 TestELossDist.C:1175
 TestELossDist.C:1176
 TestELossDist.C:1177
 TestELossDist.C:1178
 TestELossDist.C:1179
 TestELossDist.C:1180
 TestELossDist.C:1181
 TestELossDist.C:1182
 TestELossDist.C:1183
 TestELossDist.C:1184
 TestELossDist.C:1185
 TestELossDist.C:1186
 TestELossDist.C:1187
 TestELossDist.C:1188
 TestELossDist.C:1189
 TestELossDist.C:1190
 TestELossDist.C:1191
 TestELossDist.C:1192
 TestELossDist.C:1193
 TestELossDist.C:1194
 TestELossDist.C:1195
 TestELossDist.C:1196
 TestELossDist.C:1197
 TestELossDist.C:1198
 TestELossDist.C:1199
 TestELossDist.C:1200
 TestELossDist.C:1201
 TestELossDist.C:1202
 TestELossDist.C:1203
 TestELossDist.C:1204
 TestELossDist.C:1205
 TestELossDist.C:1206
 TestELossDist.C:1207
 TestELossDist.C:1208
 TestELossDist.C:1209
 TestELossDist.C:1210
 TestELossDist.C:1211
 TestELossDist.C:1212
 TestELossDist.C:1213
 TestELossDist.C:1214
 TestELossDist.C:1215
 TestELossDist.C:1216
 TestELossDist.C:1217
 TestELossDist.C:1218
 TestELossDist.C:1219
 TestELossDist.C:1220
 TestELossDist.C:1221
 TestELossDist.C:1222
 TestELossDist.C:1223
 TestELossDist.C:1224
 TestELossDist.C:1225
 TestELossDist.C:1226
 TestELossDist.C:1227
 TestELossDist.C:1228
 TestELossDist.C:1229
 TestELossDist.C:1230
 TestELossDist.C:1231
 TestELossDist.C:1232
 TestELossDist.C:1233
 TestELossDist.C:1234
 TestELossDist.C:1235
 TestELossDist.C:1236
 TestELossDist.C:1237
 TestELossDist.C:1238
 TestELossDist.C:1239
 TestELossDist.C:1240
 TestELossDist.C:1241
 TestELossDist.C:1242
 TestELossDist.C:1243
 TestELossDist.C:1244
 TestELossDist.C:1245
 TestELossDist.C:1246
 TestELossDist.C:1247
 TestELossDist.C:1248
 TestELossDist.C:1249
 TestELossDist.C:1250
 TestELossDist.C:1251
 TestELossDist.C:1252
 TestELossDist.C:1253
 TestELossDist.C:1254
 TestELossDist.C:1255
 TestELossDist.C:1256
 TestELossDist.C:1257
 TestELossDist.C:1258
 TestELossDist.C:1259
 TestELossDist.C:1260
 TestELossDist.C:1261
 TestELossDist.C:1262
 TestELossDist.C:1263
 TestELossDist.C:1264
 TestELossDist.C:1265
 TestELossDist.C:1266
 TestELossDist.C:1267
 TestELossDist.C:1268
 TestELossDist.C:1269
 TestELossDist.C:1270
 TestELossDist.C:1271
 TestELossDist.C:1272
 TestELossDist.C:1273
 TestELossDist.C:1274
 TestELossDist.C:1275
 TestELossDist.C:1276
 TestELossDist.C:1277
 TestELossDist.C:1278
 TestELossDist.C:1279
 TestELossDist.C:1280
 TestELossDist.C:1281
 TestELossDist.C:1282
 TestELossDist.C:1283
 TestELossDist.C:1284
 TestELossDist.C:1285
 TestELossDist.C:1286
 TestELossDist.C:1287
 TestELossDist.C:1288
 TestELossDist.C:1289
 TestELossDist.C:1290
 TestELossDist.C:1291
 TestELossDist.C:1292
 TestELossDist.C:1293
 TestELossDist.C:1294
 TestELossDist.C:1295
 TestELossDist.C:1296
 TestELossDist.C:1297
 TestELossDist.C:1298
 TestELossDist.C:1299
 TestELossDist.C:1300
 TestELossDist.C:1301
 TestELossDist.C:1302
 TestELossDist.C:1303
 TestELossDist.C:1304
 TestELossDist.C:1305
 TestELossDist.C:1306
 TestELossDist.C:1307
 TestELossDist.C:1308
 TestELossDist.C:1309
 TestELossDist.C:1310
 TestELossDist.C:1311
 TestELossDist.C:1312
 TestELossDist.C:1313
 TestELossDist.C:1314
 TestELossDist.C:1315
 TestELossDist.C:1316
 TestELossDist.C:1317
 TestELossDist.C:1318
 TestELossDist.C:1319
 TestELossDist.C:1320
 TestELossDist.C:1321
 TestELossDist.C:1322
 TestELossDist.C:1323
 TestELossDist.C:1324
 TestELossDist.C:1325
 TestELossDist.C:1326
 TestELossDist.C:1327
 TestELossDist.C:1328
 TestELossDist.C:1329
 TestELossDist.C:1330
 TestELossDist.C:1331
 TestELossDist.C:1332
 TestELossDist.C:1333
 TestELossDist.C:1334
 TestELossDist.C:1335
 TestELossDist.C:1336
 TestELossDist.C:1337
 TestELossDist.C:1338
 TestELossDist.C:1339
 TestELossDist.C:1340
 TestELossDist.C:1341
 TestELossDist.C:1342
 TestELossDist.C:1343
 TestELossDist.C:1344
 TestELossDist.C:1345
 TestELossDist.C:1346
 TestELossDist.C:1347
 TestELossDist.C:1348
 TestELossDist.C:1349
 TestELossDist.C:1350
 TestELossDist.C:1351
 TestELossDist.C:1352
 TestELossDist.C:1353
 TestELossDist.C:1354
 TestELossDist.C:1355
 TestELossDist.C:1356
 TestELossDist.C:1357
 TestELossDist.C:1358
 TestELossDist.C:1359
 TestELossDist.C:1360
 TestELossDist.C:1361
 TestELossDist.C:1362
 TestELossDist.C:1363
 TestELossDist.C:1364
 TestELossDist.C:1365
 TestELossDist.C:1366
 TestELossDist.C:1367
 TestELossDist.C:1368
 TestELossDist.C:1369
 TestELossDist.C:1370
 TestELossDist.C:1371
 TestELossDist.C:1372
 TestELossDist.C:1373
 TestELossDist.C:1374
 TestELossDist.C:1375
 TestELossDist.C:1376
 TestELossDist.C:1377
 TestELossDist.C:1378
 TestELossDist.C:1379
 TestELossDist.C:1380
 TestELossDist.C:1381
 TestELossDist.C:1382
 TestELossDist.C:1383
 TestELossDist.C:1384
 TestELossDist.C:1385
 TestELossDist.C:1386
 TestELossDist.C:1387
 TestELossDist.C:1388
 TestELossDist.C:1389
 TestELossDist.C:1390
 TestELossDist.C:1391
 TestELossDist.C:1392
 TestELossDist.C:1393
 TestELossDist.C:1394
 TestELossDist.C:1395
 TestELossDist.C:1396
 TestELossDist.C:1397
 TestELossDist.C:1398
 TestELossDist.C:1399
 TestELossDist.C:1400
 TestELossDist.C:1401
 TestELossDist.C:1402
 TestELossDist.C:1403
 TestELossDist.C:1404
 TestELossDist.C:1405
 TestELossDist.C:1406
 TestELossDist.C:1407
 TestELossDist.C:1408
 TestELossDist.C:1409
 TestELossDist.C:1410
 TestELossDist.C:1411
 TestELossDist.C:1412
 TestELossDist.C:1413
 TestELossDist.C:1414
 TestELossDist.C:1415
 TestELossDist.C:1416
 TestELossDist.C:1417
 TestELossDist.C:1418
 TestELossDist.C:1419
 TestELossDist.C:1420
 TestELossDist.C:1421
 TestELossDist.C:1422
 TestELossDist.C:1423
 TestELossDist.C:1424
 TestELossDist.C:1425
 TestELossDist.C:1426
 TestELossDist.C:1427
 TestELossDist.C:1428
 TestELossDist.C:1429
 TestELossDist.C:1430
 TestELossDist.C:1431
 TestELossDist.C:1432
 TestELossDist.C:1433
 TestELossDist.C:1434
 TestELossDist.C:1435
 TestELossDist.C:1436
 TestELossDist.C:1437
 TestELossDist.C:1438
 TestELossDist.C:1439
 TestELossDist.C:1440
 TestELossDist.C:1441
 TestELossDist.C:1442
 TestELossDist.C:1443
 TestELossDist.C:1444
 TestELossDist.C:1445
 TestELossDist.C:1446
 TestELossDist.C:1447
 TestELossDist.C:1448
 TestELossDist.C:1449
 TestELossDist.C:1450
 TestELossDist.C:1451
 TestELossDist.C:1452