void try1(int iShow){
  gROOT->Reset();
  gStyle->SetPalette(1);
  gROOT->SetStyle("Plain");
  gStyle->SetOptStat(0);
  char *s = new char[1];

  TH1D *hFlat = new TH1D("hFlat","",20,-5.0,5.0);
  TH1D *hGaus = new TH1D("hGaus","",20,-5.0,5.0);


  UInt_t mySeed = 3;
  TRandom3 *myRandGen = new TRandom3(mySeed);
  Double_t myRandVal;
  int nToPlot = 10000;
  for (int myInt = 0; myInt < nToPlot; myInt++){
    double xFlat = myRandGen->Uniform(-3.0,3.0);
    double xGaus = myRandGen->Gaus(0.0,1.0);
    hFlat->Fill(xFlat);
    hGaus->Fill(xGaus);
  }


  hFlat->SetLineColor(2);
  hGaus->SetLineColor(4);

  if (iShow == 1){
    hGaus->Draw();
    hFlat->Draw("same");
    
  } 
  

}

///////////////
// data need to be globals to be visible by fcn                                                         
TRandom3 rndm;
TH2D *h1, *h2;
Int_t npfits;

double gauss2D(double *x, double *par) {
  double z1 = double((x[0]-par[1])/par[2]);
  double z2 = double((x[1]-par[3])/par[4]);
  return par[0]*exp(-0.5*(z1*z1+z2*z2));
}
double my2Dfunc(double *x, double *par) {
  return gauss2D(x,&par[0]) + gauss2D(x,&par[5]);
}

void myFcn(Int_t & /*nPar*/, Double_t * /*grad*/ , Double_t &fval, Double_t *p, Int_t /*iflag */  )
{
  TAxis *xaxis1  = h1->GetXaxis();
  TAxis *yaxis1  = h1->GetYaxis();
  TAxis *xaxis2  = h2->GetXaxis();
  TAxis *yaxis2  = h2->GetYaxis();

  int nbinX1 = h1->GetNbinsX();
  int nbinY1 = h1->GetNbinsY();
  int nbinX2 = h2->GetNbinsX();
  int nbinY2 = h2->GetNbinsY();

  double chi2 = 0;
  double x[2];
  double tmp;
  npfits = 0;
  for (int ix = 1; ix <= nbinX1; ++ix) {
    x[0] = xaxis1->GetBinCenter(ix);
    for (int iy = 1; iy <= nbinY1; ++iy) {
      if ( h1->GetBinError(ix,iy) > 0 ) {
	x[1] = yaxis1->GetBinCenter(iy);
	tmp = (h1->GetBinContent(ix,iy) - my2Dfunc(x,p))/h1->GetBinError(ix,iy);
	chi2 += tmp*tmp;
	npfits++;
      }
    }
  }
  for (int ix = 1; ix <= nbinX2; ++ix) {
    x[0] = xaxis2->GetBinCenter(ix);
    for (int iy = 1; iy <= nbinY2; ++iy) {
      if ( h2->GetBinError(ix,iy) > 0 ) {
	x[1] = yaxis2->GetBinCenter(iy);
	tmp = (h2->GetBinContent(ix,iy) - my2Dfunc(x,p))/h2->GetBinError(ix,iy);
	chi2 += tmp*tmp;
	npfits++;
      }
    }
  }
  fval = chi2;
}




//extern void mychi2 (Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t flag)
//{
//  double thechi2 = 0.0;
// Calculate your chi2... 
//  f = thechi2;
//}

/*
void main() {
  TMinuit *myMinuit = new TMinuit(2);
  myMinuit->SetFCN(mychi2);
  Double_t arglist[10];
  arglist[0] = 1;
  Int_t ierflg = 0;
  myMinuit->mnexcm(“SET ERR”, arglist, 1, iflag);
  static Double_t vstart[2] = {0.04,    -0.03};
  static Double_t step[2]   = {0.0001, 0.0001};
  static Double_t minvals[2]= {0.0, 0.0};
  static Double_t maxvals[2]= {0.0, 0.0};
  gMinuit->mnparm(0,"a",vstart[0],step[0],minvals[0],maxvals[0],ierflg);
  gMinuit->mnparm(1,"b",vstart[1],step[1],minvals[1],maxvals[1],ierflg);
  //Call MIGRAD with 5000 iterations maximum
  arglist[0] = 5000;     //max number of iterations
  arglist[1] = 0.01;     //tolerance
  gMinuit->mnexcm("MIGRAD", arglist, 2, ierflg);
}
*/
