ROOT logo
// 
// Utilities used in the forward multiplcity analysis 
// 
//
#ifndef ALIFORWARDUTIL_H
#define ALIFORWARDUTIL_H
/**
 * @file   AliForwardUtil.h
 * @author Christian Holm Christensen <cholm@dalsgaard.hehi.nbi.dk>
 * @date   Wed Mar 23 14:06:54 2011
 * 
 * @brief  
 * 
 * 
 * @ingroup pwglf_forward 
 */
#include <TObject.h>
#include <TString.h>
#include <TObjArray.h>
class TH2D;
class TH1I;
class TH1;
class TF1;
class TAxis;
class TArrayD;
class AliESDEvent;
class AliAODEvent;
class AliAnalysisTaskSE;

/** 
 * Utilities used in the forward multiplcity analysis 
 * 
 * @ingroup pwglf_forward 
 */
class AliForwardUtil : public TObject
{
public:
  enum { 
    kSkipRing = (1 << 19) // Bit for skipping a histogram
  };
  /** 
   * Get the standard color for a ring  
   *
   * @param d Detector
   * @param r Ring 
   * 
   * @return 
   */
  static Color_t RingColor(UShort_t d, Char_t r)
  { 
    return ((d == 1 ? kRed : (d == 2 ? kGreen : kBlue))
	    + ((r == 'I' || r == 'i') ? 2 : -3));
  }
  //==================================================================
  /** 
   * @{ 
   * @name AliROOT version
   */
  /** 
   * Get the revision number of AliROOT
   * 
   * @return Subversion revision number of AliROOT used
   */
  static ULong_t AliROOTRevision();
  /**
   * Get the branch identifier of AliROOT.  In case of trunk, return
   * 0xFFFFFFFF, while for @b vM-N-R{-S}, we get
   *
   * @code 
   *    ((M & 0xFF) << 12 | (N & 0xFF) << 8 | (R & 0xFF) << 3 | (X))
   * @endcode 
   * where @c X is 0xAA if @b S is specified (e.g., analysis tag). 
   *
   * @return branch identifer encoded in bits 
   */
  static ULong_t AliROOTBranch();
  //==================================================================
  /** 
   * @{ 
   * @name Collision/run parameters 
   */
  /**						
   * Defined collision types 
   */
  enum ECollisionSystem {
    kUnknown, 
    kPP, 
    kPbPb,
    kPPb
  };
  //__________________________________________________________________
  /** 
   * Calculate the beam rapidity. 
   *
   * @b Note: The beam energy is given in GeV/charge
   * 
   * @param beam Beam energy in GeV/charge 
   * @param z    Charge number of projectile
   * @param a    Mass number of projectile 
   * 
   * @return The rapidity of the beam
   */
  static Float_t BeamRapidity(Float_t beam, UShort_t z, UShort_t a);
  /** 
   * Calculate the center of mass energy from the beam energy per
   * charge and the nucleus numbers.
   * 
   * @param beam Beam energy in GeV/charge 
   * @param z1   Charge number of projectile
   * @param a1   Mass number of projectile
   * @param z2   Charge number of projectile
   * @param a2 	 Mass number of projectile  
   * 
   * @return The center of mass energy in GeV/nucleon
   */
  static Float_t CenterOfMassEnergy(Float_t beam, UShort_t z1, UShort_t a1, 
				    Short_t z2=-1, Short_t a2=-1);
  /** 
   * Calculate the center of mass rapidity (shift)
   * 
   * @param z1 Charge number of projectile
   * @param a1 Mass number of projectile  
   * @param z2 Charge number of projectile
   * @param a2 Mass number of projectile  
   * x
   * @return Rapidity of the center of mass 
   */
  static Float_t CenterOfMassRapidity(UShort_t z1, UShort_t a1, 
				      Short_t z2=-1, Short_t a2=-1);
  /** 
   * Parse a collision system spec given in a string.   Known values are 
   * 
   *  - "pp", "p-p" which returns kPP 
   *  - "PbPb", "Pb-Pb", "A-A", which returns kPbPb
   *  - "pPb", "p-Pb", "pA", p-A" which returns kPPb
   *  - Everything else gives kUnknown 
   * 
   * @param sys Collision system spec 
   * 
   * @return Collision system id 
   */
  static UShort_t ParseCollisionSystem(const char* sys);
  /** 
   * Get a string representation of the collision system 
   * 
   * @param sys  Collision system 
   * - kPP -> "pp"
   * - kPbPb -> "PbPb" 
   * - kPPb -> "pPb"
   * - anything else gives "unknown"
   * 
   * @return String representation of the collision system 
   */
  static const char* CollisionSystemString(UShort_t sys);
  //__________________________________________________________________
  /** 
   * Parse the center of mass energy given as a float and return known 
   * values as a unsigned integer
   * 
   * @param sys  Collision system (needed for AA)
   * @param cms  Center of mass energy * total charge 
   * 
   * @return Center of mass energy per nucleon
   */
  static UShort_t ParseCenterOfMassEnergy(UShort_t sys, Float_t cms);
  /** 
   * Get a string representation of the center of mass energy per nuclean
   * 
   * @param cms  Center of mass energy per nucleon
   * 
   * @return String representation of the center of mass energy per nuclean
   */
  static const char* CenterOfMassEnergyString(UShort_t cms);
  //__________________________________________________________________
  /** 
   * Parse the magnetic field (in kG) as given by a floating point number
   * 
   * @param field  Magnetic field in kG 
   * 
   * @return Short integer value of magnetic field in kG 
   */
  static Short_t ParseMagneticField(Float_t field);
  /** 
   * Get a string representation of the magnetic field
   * 
   * @param field Magnetic field in kG
   * 
   * @return String representation of the magnetic field
   */
  static const char* MagneticFieldString(Short_t field);
  /* @} */

  //==================================================================
  /** 
   * @{ 
   * @name Recalculate @f$\eta@f$, @f$\phi@f$, etc. 
   */
  /** 
   * Get the radius of a strip. 
   * 
   * @param ring  Ring identifier 'I' or 'O'
   * @param strip Strip number 
   * 
   * @return Radial distance from beam of the strip 
   */
  static Double_t GetStripR(Char_t ring, UShort_t strip);
  /** 
   * Get eta from strip
   * 
   * @param det, ring, sec, strip, zvtx
   * 
   * @return eta
   */
  static Double_t GetEtaFromStrip(UShort_t det, Char_t ring, 
				  UShort_t sec, UShort_t strip, Double_t zvtx);
  /** 
   * Get the azimuthal angle of a strip
   * 
   * @param ring  Ring identifier 'I' or 'O'
   * @param strip Strip number 
   * @param phi   Straight forward strip phi
   * @param xvtx  Ip X coordinate 
   * @param yvtx  Ip Y coordinate 
   * 
   * @return The phi angle correctef for (X,Y) off set. 
   */  
  static Double_t GetPhiFromStrip(Char_t ring, UShort_t strip, 
				  Double_t phi, Double_t xvtx, Double_t yvtx);
  /* @} */

  //==================================================================
  /** 
   * @{ 
   * @name Manager related tasks 
   */
  /** 
   * Get the AOD event - either from the input (AOD analysis) or the
   * output (ESD analysis)
   * 
   * @param task Task to do the investigation for
   * 
   * @return Found AOD event or null
   */
  static AliAODEvent* GetAODEvent(AliAnalysisTaskSE* task);
  /** 
   * Check if we have something that will provide and AOD event 
   * 
   * @return 0 if there's nothing that provide an AOD event, 1 if it
   * is provided on the input (AOD analysis) or 2 if it is provided on
   * the output (ESD analysis)
   */
  static UShort_t CheckForAOD();
  /** 
   * Check if we have a particular (kind) of task in our train
   * 
   * @param clsOrName  Class name or name of task 
   * @param cls If true, look for a task of a particular class -
   * otherwise search for a speficially name task
   * 
   * @return true if the needed task was found 
   */
  static Bool_t CheckForTask(const char* clsOrName, Bool_t cls=true);
  /* @} */

  //==================================================================
  /** 
   * @{ 
   * @name Member functions to store and retrieve analysis parameters 
   */
  static TObject* MakeParameter(const char* name, UShort_t value);
  static TObject* MakeParameter(const char* name, Int_t value);
  static TObject* MakeParameter(const char* name, Double_t value);
  static TObject* MakeParameter(const char* name, Bool_t value);
  static TObject* MakeParameter(const char* name, ULong_t value);
  static void GetParameter(TObject* o, UShort_t& value);
  static void GetParameter(TObject* o, Int_t& value);
  static void GetParameter(TObject* o, Double_t& value);
  static void GetParameter(TObject* o, Bool_t& value);
  static void GetParameter(TObject* o, ULong_t& value);
  /* @} */

  //==================================================================
  /** 
   * @{ 
   * @name Axis functions 
   */
  static TAxis* MakeFullIpZAxis(Int_t nCenter=20);
  static void MakeFullIpZAxis(Int_t nCenter, TArrayD& bins);
  static void MakeLogScale(Int_t nBins, Int_t minOrder, Int_t maxOrder, TArrayD& bins);
  static void PrintTask(const TObject& o);
  static void PrintName(const char* name);
  static void PrintField(const char* name, const char* value, ...);
  /* @} */

  //==================================================================
#if 0 // Moved to separate classes
  /** 
   * @{ 
   * @name Energy stragling functions 
   */
  //__________________________________________________________________
  /**
   * Number of steps to do in the Landau, Gaussiam convolution 
   */
  static Int_t fgConvolutionSteps; // Number of convolution steps
  //------------------------------------------------------------------
  /** 
   * How many sigma's of the Gaussian in the Landau, Gaussian
   * convolution to integrate over
   */
  static Double_t fgConvolutionNSigma; // Number of convolution sigmas 
  //------------------------------------------------------------------
  /** 
   * Calculate the shifted Landau
   * @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);
  
  //------------------------------------------------------------------
  /** 
   * 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'^2=\sigma^2-\sigma_n^2 @f$.  Here, @f$\sigma@f$ is the
   * variance of the Gaussian, and @f$\sigma_n@f$ is a parameter modelling 
   * noise in the detector.  
   *
   * Note that this function uses the constants fgConvolutionSteps and
   * fgConvolutionNSigma
   * 
   * References: 
   *  - <a href="http://dx.doi.org/10.1016/0168-583X(84)90472-5">Nucl.Instrum.Meth.B1:16</a>
   *  - <a href="http://dx.doi.org/10.1103/PhysRevA.28.615">Phys.Rev.A28:615</a>
   *  - <a href="http://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 @f$\sigma'^2=\sigma^2-\sigma_n^2 @f$
   * @param sigma_n   @f$ \sigma_n@f$ of @f$\sigma'^2=\sigma^2-\sigma_n^2 @f$
   * 
   * @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 sigma_n);

  //------------------------------------------------------------------
  /** 
   * 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\\
   *    \sigma'^2 \rightarrow \sigma_i'^2 &=& \sigma_n^2 + \sigma_i^2
   * @f} 
   * 
   * @param x        Where to evaluate 
   * @param delta    @f$ \Delta@f$ 
   * @param xi       @f$ \xi@f$ 
   * @param sigma    @f$ \sigma@f$ 
   * @param sigma_n  @f$ \sigma_n@f$
   * @param i        @f$ i @f$
   * 
   * @return @f$ f_i @f$ evaluated
   */  
  static Double_t ILandauGaus(Double_t x, Double_t delta, Double_t xi, 
			      Double_t sigma, Double_t sigma_n, Int_t i);

  //------------------------------------------------------------------
  /** 
   * 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$ 
   * - 3: @f$\sigma_n@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\\
   *    \sigma'^2 \rightarrow \sigma_i'^2 = \sigma_n^2 + \sigma_i^2
   * @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 sigma_n  @f$ \sigma_n@f$
   * @param i        @f$ i@f$
   * 
   * @return @f$ f_i@f$ evaluated
   */  
  static Double_t IdLandauGausdPar(Double_t x, UShort_t ipar, Double_t dp,
				   Double_t delta, Double_t xi, 
				   Double_t sigma, Double_t sigma_n, Int_t i);

  //------------------------------------------------------------------
  /** 
   * 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="http://dx.doi.org/10.1016/0168-583X(84)90472-5">Nucl.Instrum.Meth.B1:16</a>
   *  - <a href="http://dx.doi.org/10.1103/PhysRevA.28.615">Phys.Rev.A28:615</a>
   *  - <a href="http://root.cern.ch/root/htmldoc/tutorials/fit/langaus.C.html">ROOT implementation</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 sigma_n  @f$ \sigma_n@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, Double_t sigma_n, Int_t n, 
			      const Double_t* a);
  /** 
   * Generate a TF1 object of @f$ f_I@f$ 
   * 
   * @param c        Constant
   * @param delta    @f$ \Delta@f$ 
   * @param xi       @f$ \xi_1@f$	       
   * @param sigma    @f$ \sigma_1@f$ 	       
   * @param sigma_n  @f$ \sigma_n@f$ 	       
   * @param i 	     @f$ i@f$ - the number of particles
   * @param xmin     Least value of range
   * @param xmax     Largest value of range
   * 
   * @return Newly allocated TF1 object
   */
  static TF1* MakeILandauGaus(Double_t c, 
			      Double_t delta, Double_t xi, 
			      Double_t sigma, Double_t sigma_n,
			      Int_t    i, 
			      Double_t xmin,  Double_t  xmax);
  /** 
   * Generate a TF1 object of @f$ f_N@f$ 
   * 
   * @param c         Constant			       
   * @param delta     @f$ \Delta@f$ 		       
   * @param xi 	      @f$ \xi_1@f$	       	       
   * @param sigma     @f$ \sigma_1@f$ 	       	       
   * @param sigma_n   @f$ \sigma_n@f$ 	       	       
   * @param n 	      @f$ N@f$ - how many particles to sum to
   * @param a         Array of size @f$ N-1@f$ of the weights @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* MakeNLandauGaus(Double_t c, 
			      Double_t delta, Double_t  xi, 
			      Double_t sigma, Double_t  sigma_n,
			      Int_t    n,     const Double_t* a, 
			      Double_t xmin,  Double_t  xmax);
			    			    
  //__________________________________________________________________
  /** 
   * Structure to do fits to the energy loss spectrum 
   * 
   * @ingroup pwglf_forward 
   */
  struct ELossFitter 
  {
    enum { 
      kC     = 0,
      kDelta, 
      kXi, 
      kSigma, 
      kSigmaN, 
      kN, 
      kA
    };
    /** 
     * Constructor 
     * 
     * @param lowCut     Lower cut of spectrum - data below this cuts is ignored
     * @param maxRange   Maximum range to fit to 
     * @param minusBins  The number of bins below maximum to use 
     */
    ELossFitter(Double_t lowCut, Double_t maxRange, UShort_t minusBins); 
    /** 
     * Destructor
     * 
     */
    virtual ~ELossFitter();
    void SetDebug(Bool_t debug=true) { fDebug = debug; }
    /** 
     * Clear internal arrays
     * 
     */
    void Clear();
    /** 
     * Fit a 1-particle signal to the passed energy loss distribution 
     * 
     * Note that this function clears the internal arrays first 
     *
     * @param dist    Data to fit the function to 
     * @param sigman If larger than zero, the initial guess of the
     *               detector induced noise. If zero or less, then this 
     *               parameter is ignored in the fit (fixed at 0)
     * 
     * @return The function fitted to the data 
     */
    TF1* Fit1Particle(TH1* dist, Double_t sigman=-1);
    /** 
     * Fit a N-particle signal to the passed energy loss distribution 
     *
     * If there's no 1-particle fit present, it does that first 
     *
     * @param dist   Data to fit the function to 
     * @param n      Number of particle signals to fit 
     * @param sigman If larger than zero, the initial guess of the
     *               detector induced noise. If zero or less, then this 
     *               parameter is ignored in the fit (fixed at 0)
     * 
     * @return The function fitted to the data 
     */
    TF1* FitNParticle(TH1* dist, UShort_t n, Double_t sigman=-1);
    /** 
     * Fit a composite distribution of energy loss from both primaries
     * and secondaries
     * 
     * @param dist   Distribution 
     * @param sigman If larger than zero, the initial guess of the
     *                detector included noise.  If zero or less this
     *                parameter is fixed to 0.
     * 
     * @return Function fitted to the data 
     */
    TF1* FitComposite(TH1* dist, Double_t sigman);
    /**
     * Get Lower cut on data 
     *
     * @return Lower cut on data 
     */
    Double_t GetLowCut() const { return fLowCut; }
    /**
     * Get Maximum range to fit 
     *
     * @return Maximum range to fit 
     */
    Double_t GetMaxRange() const { return fMaxRange; }
    /**
     * Get Number of bins from maximum to fit 1st peak
     *
     * @return Number of bins from maximum to fit 1st peak
     */
    UShort_t GetMinusBins() const { return fMinusBins; }
    /**
     * Get Array of fit results 
     *
     * @return Array of fit results 
     */
    const TObjArray& GetFitResults() const { return fFitResults; }
    /** 
     * Get Array of fit results  
     *
     * @return Array of fit results 
     */
    TObjArray& GetFitResults() { return fFitResults; }
    /**
     * Get Array of functions 
     *
     * @return Array of functions 
     */
    const TObjArray& GetFunctions() const { return fFunctions; }
    /** 
     * Get Array of functions  
     *
     * @return Array of functions 
     */
    TObjArray& GetFunctions() { return fFunctions; }
  private:
    const Double_t fLowCut;     // Lower cut on data 
    const Double_t fMaxRange;   // Maximum range to fit 
    const UShort_t fMinusBins;  // Number of bins from maximum to fit 1st peak
    TObjArray fFitResults;      // Array of fit results 
    TObjArray fFunctions;       // Array of functions 
    Bool_t    fDebug;
  };
  /* @} */
#endif      

  //==================================================================
  /** 
   * @{
   * @name Convenience containers 
   */
  /** 
   * Structure to hold histograms 
   *
   * @ingroup pwglf_forward 
   */
  struct Histos : public TObject
  {	
    /** 
     * Constructor 
     * 
     * 
     */
    Histos() : fFMD1i(0), fFMD2i(0), fFMD2o(0), fFMD3i(0), fFMD3o(0) {}
    /** 
     * Copy constructor 
     * 
     * @param o Object to copy from 
     */
    Histos(const Histos& o) 
      : TObject(o), 
	fFMD1i(o.fFMD1i), 
	fFMD2i(o.fFMD2i), 
	fFMD2o(o.fFMD2o), 
	fFMD3i(o.fFMD3i), 
	fFMD3o(o.fFMD3o)
    {}
    /** 
     * Assignement operator 
     * 
     * @return Reference to this 
     */
    Histos& operator=(const Histos&) { return *this;}
    /** 
     * Destructor.  This does not delete the interally allocated
     * memory.  Use the member function Delete for that.
     */
    ~Histos();
    /** 
     * Clear internal memory.  Note, if the internal histograms are
     * added to an output container, then we must not free this
     * memory.
     */
    void Delete(Option_t* opt="");
    /** 
     * Initialize the object 
     * 
     * @param etaAxis Eta axis to use 
     */
    void Init(const TAxis& etaAxis);
    /** 
     * Re-initialize the object with new @f$\eta@f$ axis 
     * 
     * @param etaAxis Eta axis to use 
     */
    void ReInit(const TAxis& etaAxis);
    /** 
     * Make a histogram 
     * 
     * @param d        Detector
     * @param r        Ring 
     * @param etaAxis  Eta axis to use
     * 
     * @return Newly allocated histogram 
     */
    static TH2D* Make(UShort_t d, Char_t r, const TAxis& etaAxis);
    /** 
     * Set the @f$\eta@f$ axis 
     * 
     * @param hist    Histogram
     * @param etaAxis @f$\eta@f$ axis to use
     */
    static void RebinEta(TH2D* hist, const TAxis& etaAxis);
    /** 
     * Clear data 
     * 
     * @param option Not used 
     */
    void  Clear(Option_t* option="");
    // const TH2D* Get(UShort_t d, Char_t r) const;
    /** 
     * Get the histogram for a particular detector,ring
     * 
     * @param d Detector 
     * @param r Ring 
     * 
     * @return Histogram for detector,ring or nul 
     */
    TH2D* Get(UShort_t d, Char_t r) const;
    TH2D* fFMD1i; // Histogram for FMD1i
    TH2D* fFMD2i; // Histogram for FMD2i
    TH2D* fFMD2o; // Histogram for FMD2o
    TH2D* fFMD3i; // Histogram for FMD3i
    TH2D* fFMD3o; // Histogram for FMD3o

    ClassDef(Histos,2) 
  };

  //__________________________________________________________________
  /**
   * Base class for structure holding ring specific histograms
   * 
   * @ingroup pwglf_forward 
   */
  struct RingHistos : public TObject
  {
    /** 
     * Constructor
     * 
     */
    RingHistos() : fDet(0), fRing('\0'), fName(""), fkNSector(0), fkNStrip(0) {}
    /** 
     * 
     * 
     * @param d Detector
     * @param r Ring 
     */
    RingHistos(UShort_t d, Char_t r) 
      : fDet(d), fRing(r), fName(TString::Format("FMD%d%c", d, r)),
	fkNSector(r == 'i' || r == 'I' ? 20 : 40), 
	fkNStrip(r == 'i' || r == 'I' ? 512 : 256)
    {}
    /** 
     * Copy constructor
     * 
     * @param o Object to copy from 
     */
    RingHistos(const RingHistos& o) 
      : TObject(o), fDet(o.fDet), fRing(o.fRing), fName(o.fName),
	fkNSector(o.fkNSector), fkNStrip(o.fkNStrip)
    {}
    /** 
     * 
     */
    virtual ~RingHistos() {}
    /** 
     * Assignement operator
     * 
     * @param o Object to assign from
     * 
     * @return Reference to this
     */
    RingHistos& operator=(const RingHistos& o) 
    {
      if (&o == this) return *this;
      TObject::operator=(o);
      fDet  = o.fDet;
      fRing = o.fRing;
      fName = o.fName;
      fkNSector = o.fkNSector;
      fkNStrip  = o.fkNStrip;
      return *this;
    }
    /** 
     * Define the outout list in @a d
     * 
     * @param d Where to put the output list
     * 
     * @return Newly allocated TList object or null
     */
    TList* DefineOutputList(TList* d) const;
    /** 
     * Get our output list from the container @a d
     * 
     * @param d where to get the output list from 
     * 
     * @return The found TList or null
     */
    TList* GetOutputList(const TList* d) const;
    /** 
     * Find a specific histogram in the source list @a d
     * 
     * @param d     (top)-container 
     * @param name  Name of histogram
     * 
     * @return Found histogram or null
     */
    TH1* GetOutputHist(const TList* d, const char* name) const;
    /** 
     * Get the colour of this ring 
     * 
     * 
     * @return 
     */
    Color_t Color() const 
    { 
      return AliForwardUtil::RingColor(fDet, fRing);
    }
    /** 
     * The name of this ring 
     * 
     * @return Name of this ring 
     */
    const char* GetName() const { return fName.Data(); } 
    /** 
     * Get number of sectors 
     */
    const UShort_t& NSector() const { return fkNSector; }
    /** 
     * Get number of strips 
     */
    const UShort_t& NStrip() const { return fkNStrip; }
    UShort_t fDet;   // Detector
    Char_t   fRing;  // Ring
    TString  fName;  // Name
    UShort_t fkNSector; // Number of sectors 
    UShort_t fkNStrip;  // Number of strips 

    ClassDef(RingHistos,1) 
  };
  /* @} */

  //__________________________________________________________________
  /**
   * A guard idom for producing debug output 
   * 
   */
  struct DebugGuard 
  {
    /** 
     * Constructor 
     * 
     * @param lvl       Current level
     * @param msgLvl    Target level 
     * @param format    @c printf -like format
     * 
     * @return 
     */
    DebugGuard(Int_t lvl, Int_t msgLvl, const char* format, ...);
    /** 
     * Destructor
     */
    ~DebugGuard();
    /** 
     * Make a message 
     * 
     * @param lvl    Current level
     * @param msgLvl Target level 
     * @param format @c printf -like format
     */
    static void Message(Int_t lvl, Int_t msgLvl, const char* format, ...);
  private:
    /** 
     * Output the message 
     * 
     * @param in    Direction
     * @param msg   Message 
     */
    static void Output(int in, TString& msg);
    /** 
     * Format a message 
     * 
     * @param out     Output is stored here
     * @param format  @c printf -like format
     * @param ap      List of arguments
     */
    static void Format(TString& out, const char* format, va_list ap);
    TString fMsg;
  };
private:
  /** 
   * Constructor 
   */
  AliForwardUtil() {}
  /** 
   * Copy constructor 
   * 
   * @param o Object to copy from 
   */
  AliForwardUtil(const AliForwardUtil& o) : TObject(o) {}
  /** 
   * Assingment operator 
   * 
   * 
   * @return Reference to this object 
   */
  AliForwardUtil& operator=(const AliForwardUtil&) { return *this; }
  /** 
   * Destructor
   */
  ~AliForwardUtil() {}
  

  ClassDef(AliForwardUtil,1) // Utilities - do not make object
};

// #ifdef LOG_NO_DEBUG
// # define DGUARD(L,N,F,...) do {} while(false) 
// #else
/** 
 * Macro to declare a DebugGuard
 * 
 * @param L Current debug level
 * @param N Target debug level
 * @param F @c printf -like Format 
 */
# define DGUARD(L,N,F,...)					\
  AliForwardUtil::DebugGuard _GUARD(L,N,F, ## __VA_ARGS__)
/** 
 * Macro to make a debug message, using DebugGuard::Message
 * 
 * @param L Current debug level
 * @param N Target debug level
 * @param F @c printf -like Format 
 */
# define DMSG(L,N,F,...)					\
  AliForwardUtil::DebugGuard::Message(L,N,F, ## __VA_ARGS__)
// #endif
#endif
// Local Variables:
//  mode: C++
// End:

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