double LogLikGamma(Vec_I_DP &x)
	{
		//This function returns the negative value of the LogLikelihood
		const double dPi=3.1415926535897932384626433832795;
		int i,j;
		double dTemp=0.;

		double dLog10=log(10.);
		RevTransform(x);

		int nSize=g_vHistNode.size();
		int nComponents=g_GammaTrialNode.nNumComponents;
		int nFuncKey=g_GammaTrialNode.nFuncKey;
		double dX,dX0,dX1;
		const double dH=g_GammaTrialNode.dH;

		double dLogLik=0.;
		double dLik=0.,dExp=0.,dDenorm=0.;
		double dR,dW,dArea;

		dX0=g_GammaTrialNode.fFittingRange.fLeft;
		dX1=g_GammaTrialNode.fFittingRange.fRight;
		dArea=0.;
		for(j=0;j<nComponents;j++)
		{
			dR=g_GammaResultNode.dRol[j];
			dW=g_GammaResultNode.dWeights[j];
			dTemp=GammaDistribution_Area(dH,dR,dX0,dX1);
			dArea+=dTemp;
		}

		switch (nFuncKey)
		{
		case 1:
			for(i=0;i<nSize;i++)
			{
				dLik=0.;
				dX=g_vHistNode[i].dLeft;
				for(j=0;j<nComponents;j++)
				{
					dR=g_GammaResultNode.dRol[j];
					dW=g_GammaResultNode.dWeights[j];
					dTemp=GammaDistribution(dH,dR,dX);
					dLik+=dTemp;
				}
				dLogLik+=log(dLik*dArea)/dLog10;
			}
			break;
		case 2:
			for(i=0;i<nSize;i++)
			{
				dLik=0.;
				dX0=g_vHistNode[i].dLeft;
				dX1=g_vHistNode[i].dRight;
				for(j=0;j<nComponents;j++)
				{
					dR=g_GammaResultNode.dRol[j];
					dW=g_GammaResultNode.dWeights[j];
					dTemp=GammaDistribution_Area(dH,dR,dX0,dX1);
					dLik+=dTemp;
				}
				dLogLik+=log(dLik*dArea*g_vHistNode[i].dData)/dLog10;
			}
			break;
		}
		return -dLogLik;
	}
 Real ChiSquareDistribution::operator()(Real x) const {
     return GammaDistribution(0.5*df_)(0.5*x);
 }