class  MyFitFun1 {
public: 
  double Evaluate(double *xPtr, double *parPtr) {
    double fitVal = 0.0;
    double xVal = *xPtr;


    double mag1   = parPtr[0];
    double center1 = parPtr[1];
    double gamma1  = parPtr[2];
    double bw1 = mag1/(pow(xVal*xVal - center1*center1,2) + center1*center1*gamma1*gamma1);

    double mag2   = parPtr[3];
    double center2 = parPtr[4];
    double gamma2  = parPtr[5];
    double bw2 = mag2/(pow(xVal*xVal - center2*center2,2) + center2*center2*gamma2*gamma2);

    double mag3   = fabs(parPtr[6]);
    double center3 = parPtr[7];
    double gamma3  = parPtr[8];
    double bw3 = mag3/(pow(xVal*xVal - center3*center3,2) + center3*center3*gamma3*gamma3);

    double mag4   = fabs(parPtr[9]);
    double center4 = parPtr[10];
    double gamma4  = parPtr[11];
    double bw4 = mag4/(pow(xVal*xVal - center4*center4,2) + center4*center4*gamma4*gamma4);


    //Background function
    //double p0Val = parPtr[12];
    //double p1Val = parPtr[13];
    //double p2Val = parPtr[14];
    //double bkg = p0Val + p1Val*xVal + p2Val*xVal*xVal;
    
    
    //double bkg = fabs(p0Val + p1Val*xVal);
    //bkg = 0;
    //Fit value 

    fitVal =  bw1 + bw2 + bw3 + bw4;

    return fitVal;
  }
};



void fitKpKmPi0(int iShow){
  gROOT->Reset();
  gROOT->SetStyle("Plain");
  gStyle->SetOptStat(0);

  char  hId[120];

  //TFile *hFile = new TFile("./dataOut/A.root");//CHANGE ME
  //TH1D *hMassX; hFile->GetObject("hMassKpKmPi0",hMassX);

  TFile *hFile = new TFile("./dataOut/kpkmpi0Stage3Full.root");//CHANGE ME
  TH1D *hMassX; hFile->GetObject("hMass1d1",hMassX);
  hMassX->GetXaxis()->SetRangeUser(1.1,1.5);
  
  //TH1D *hBKG = (TH1D *) hMassX->Clone("hBKG");
  TH1D *hBW1 = (TH1D *) hMassX->Clone("hBW1");
  TH1D *hBW2 = (TH1D *) hMassX->Clone("hBW2");
  TH1D *hBW3 = (TH1D *) hMassX->Clone("hBW3");
  TH1D *hBW4 = (TH1D *) hMassX->Clone("hBW4");

  MyFitFun* fptr1 = new MyFitFun1();
  int nPar = 12;
  TF1 *f1 = new TF1("f1",fptr1,&MyFitFun1::Evaluate,0.0,4.0,nPar,
                        "MyFitFun1","Evaluate");

  f1->SetLineWidth(2);
  f1->SetLineColor(4);
  f1->FixParameter(1,1.2819);
  f1->FixParameter(2,0.027);
  f1->FixParameter(4,1.294); //eta(1295)
  f1->FixParameter(5,0.055);// +/- 5
  //f1->FixParameter(4,1.405); //eta(1405)
  //f1->FixParameter(5,0.0501);// +/- 2.6 
  f1->FixParameter(7,1.4088); //eta(1405)
  f1->FixParameter(8,0.0501);// +/- 2.6

  f1->FixParameter(9,0);
  f1->FixParameter(10,1.416); //h1(1414)
  f1->FixParameter(11,0.09);// +/- 2.6

  //f1->SetParameter(4,1.474); //eta(1475)
  //f1->SetParameter(5,0.090);// +/- 9
  
  hMassX->Fit("f1","B","R",1.2,1.5);

  double par0 = f1->GetParameter(0);
  double par3 = f1->GetParameter(3);
  double par6 = f1->GetParameter(6);
  double par9 = f1->GetParameter(9);
  
  //f1->SetParameter(0,0);
  f1->SetParameter(3,0);
  f1->SetParameter(6,0);
  f1->SetParameter(9,0);

  //hBKG->Eval(f1);

  //f1->SetParameter(12,0);
  //f1->SetParameter(13,0);
  //f1->SetParameter(14,0);

  //f1->SetParameter(0,par0);
  hBW1->Eval(f1);

  f1->SetParameter(0,0);
  f1->SetParameter(3,par3);
  
  hBW2->Eval(f1);

  f1->SetParameter(3,0);
  f1->SetParameter(6,par6);

  hBW3->Eval(f1);

  f1->SetParameter(6,0);
  f1->SetParameter(9,par9);

  hBW4->Eval(f1);


  hMassX->GetXaxis()->SetTitle("Mass[K^{+}K^{-}#pi^{0}]/GeV");
  hMassX->GetYaxis()->SetTitle("Counts");

  hMassX->SetMarkerStyle(20);
  hMassX->SetMarkerColor(1);
  hMassX->SetLineColor(1);
  hMassX->Draw("e1");
  //hBKG->Draw("csame");
  hBW1->SetLineColor(2);
  hBW1->SetLineWidth(2);
  hBW2->SetLineWidth(2);
  hBW2->SetLineColor(3);
  hBW3->SetLineWidth(2);
  hBW3->SetLineColor(7);
  //hBKG->SetLineWidth(2);
  //hBKG->SetLineColor(1);

  hBW1->Draw("csame");
  hBW2->Draw("csame");
  hBW3->Draw("csame");
  hBW4->Draw("csame");
  //hBKG->Draw("csame");


  Double_t xl1=0.13, yl1 = 0.67, xl2=xl1+0.2, yl2=yl1+0.2;
  TLegend *legend = new TLegend(xl1,yl1,xl2,yl2);
  legend->SetFillColor(0);
  legend->SetLineColor(0);
  legend->SetTextSize(0.04);
  //legend->AddEntry(hBKG,"Polynomial background","l");
  legend->AddEntry(hBW1,"f_{1}(1285)","l");
  legend->AddEntry(hBW2,"#eta(1295)","l");
  legend->AddEntry(hBW3,"#eta(1405)","l");
  legend->AddEntry(hBW4,"f_{2}(1430)","l");

  legend->Draw();


}
