From b21d6089c1a065edf86f0e9af4dfd6bf155bd75f Mon Sep 17 00:00:00 2001
From: Charlie Paxman <cp00474@surrey.ac.uk>
Date: Mon, 7 Feb 2022 16:24:39 +0000
Subject: [PATCH] * e793s - fit function to 3BBreakup  * using semicircle
 function, translated in x and scaled in y;  * f(x) = s * sqrt( r^2 - (x -
 t)^2 )  * attempted to add this to background function, but failed so far

---
 Projects/e793s/macro/DrawPlots.h        |  1 +
 Projects/e793s/macro/KnownPeakFitter.h  | 62 ++++++++++++++++++++++++-
 Projects/e793s/macro/ThreeBodyBreakup.h | 42 +++++++++++++++--
 3 files changed, 99 insertions(+), 6 deletions(-)
 mode change 100755 => 100644 Projects/e793s/macro/KnownPeakFitter.h

diff --git a/Projects/e793s/macro/DrawPlots.h b/Projects/e793s/macro/DrawPlots.h
index 055c48c4d..9c6462d00 100755
--- a/Projects/e793s/macro/DrawPlots.h
+++ b/Projects/e793s/macro/DrawPlots.h
@@ -1,3 +1,4 @@
+#include <math.h>
 #include "NPReaction.h"
 #include <string>
 #include <sstream>
diff --git a/Projects/e793s/macro/KnownPeakFitter.h b/Projects/e793s/macro/KnownPeakFitter.h
old mode 100755
new mode 100644
index dddab6f90..a249438cf
--- a/Projects/e793s/macro/KnownPeakFitter.h
+++ b/Projects/e793s/macro/KnownPeakFitter.h
@@ -117,7 +117,7 @@ void FitKnownPeaks(TH1F* hist){
   full->SetParameter(numParams-1,1.0);
   full->SetParLimits(numParams-1,0.0,1e1);
 
-  //Fit full function to histogram
+  //Fit full function tohistogram
   hist->Fit(full, "WWR", "", minFit, maxFit);
   hist->Draw();
  
@@ -160,6 +160,52 @@ void FitKnownPeaks(TH1F* hist){
 
 }
 
+
+
+
+
+
+Double_t f_bg(Double_t *x, Double_t *par){
+  // Flat bg [0] + semicircle [1]*sqrt(6.183^2 - (x-10.829)^2) 
+  Float_t xx = x[0];
+  Double_t f;
+  Double_t a = TMath::Power(6.183,2);
+  Double_t b = TMath::Power(xx-10.829,2);
+  if(a > b){ f = par[0] + (par[1]*TMath::Sqrt(a-b)); }
+  else{ f = par[0]; }
+  return f;
+}
+
+Double_t f_full(Double_t *x, Double_t *par){
+  Float_t xx = x[0];
+  Double_t f;
+  Double_t peaks = (par[2]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[1])/par[0],2))  
+    + (par[4]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[3])/par[0],2)) 
+    + (par[6]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[5])/par[0],2)) 
+    + (par[8]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[7])/par[0],2)) 
+    + (par[10]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[9])/par[0],2)) 
+    + (par[12]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[11])/par[0],2))
+    + (par[14]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[13])/par[0],2)) 
+    + (par[16]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[15])/par[0],2)) 
+    + (par[18]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[17])/par[0],2)) 
+    + (par[20]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[19])/par[0],2)) 
+    + (par[22]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[21])/par[0],2)) 
+    + (par[24]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[23])/par[0],2)) 
+    + (par[26]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[25])/par[0],2)) 
+    + (par[28]/(par[0]*sqrt(2*pi)))*exp(-0.5*pow((xx-par[27])/par[0],2));
+
+  Double_t bg;
+  Double_t a = TMath::Power(6.183,2);
+  Double_t b = TMath::Power(xx-10.829,2);
+  if(a > b){ bg = par[29] + (par[30]*TMath::Sqrt(a-b)); }
+  else{ bg = par[29]; }
+
+  f = peaks + bg;
+  return f;
+}
+
+
+
 vector<vector<double>> FitKnownPeaks_RtrnArry(TH1F* hist){
   double minFit=-1.0, maxFit=5.0; 
   double binWidth = hist->GetXaxis()->GetBinWidth(3);
@@ -223,6 +269,12 @@ vector<vector<double>> FitKnownPeaks_RtrnArry(TH1F* hist){
   bg->SetLineStyle(9);
   bg->SetParNames("Background");
 
+  //Build IMPROVED background function
+  //TF1 *bg = new TF1 ("bg",f_bg, minFit, maxFit);
+  //bg->SetLineColor(kGreen);
+  //bg->SetLineStyle(9);
+  //bg->SetParNames("Background","BreakupScale");
+
   //Build total function
   TF1 *full = new TF1("fitAllPeaks", 
     "  ([2]/([0]*sqrt(2*pi)))*exp(-0.5*pow((x-[1])/[0],2)) " 
@@ -242,6 +294,11 @@ vector<vector<double>> FitKnownPeaks_RtrnArry(TH1F* hist){
     "+ [29]" , minFit, maxFit);
   full->SetLineColor(kRed);
 
+  //Build IMPROVED total function
+  //TF1 *full = new TF1("fitAllPeaks", f_full, minFit, maxFit);
+  //full->SetLineColor(kRed);
+
+
   //Annoyingly long parameter name assignment 
   //(SetParNames only works for up to 11 variables)
   full->SetParName(0,"Sigma");
@@ -260,6 +317,7 @@ vector<vector<double>> FitKnownPeaks_RtrnArry(TH1F* hist){
   full->SetParName(25,"Mean 13"); full->SetParName(26,"Area*BinWidth 13");
   full->SetParName(27,"Mean 14"); full->SetParName(28,"Area*BinWidth 14");
   full->SetParName(29,"Background");
+  full->SetParName(30,"BreakupScale");
 
   //Fix sigma & centroid, only allow area to vary  
   const int numParams = (numPeaks*2)+2;
@@ -295,7 +353,6 @@ vector<vector<double>> FitKnownPeaks_RtrnArry(TH1F* hist){
     allPeaks[i]->Draw("SAME");
   }
 
-
  /* Error propogation:
   * (Abin) +- deltaAbin, B+-0 (no uncertainty)
   * A = Abin/B
@@ -323,3 +380,4 @@ vector<vector<double>> FitKnownPeaks_RtrnArry(TH1F* hist){
   return allpeaks;
 }
 
+ 
diff --git a/Projects/e793s/macro/ThreeBodyBreakup.h b/Projects/e793s/macro/ThreeBodyBreakup.h
index 62ca664d4..5bdbe366e 100644
--- a/Projects/e793s/macro/ThreeBodyBreakup.h
+++ b/Projects/e793s/macro/ThreeBodyBreakup.h
@@ -1,5 +1,15 @@
-void ThreeBodyBreakup(){
+Double_t f_semi(Double_t *x, Double_t *par){
+  Float_t xx = x[0];
+  Double_t f;
+  Double_t a = TMath::Power(par[0],2);
+  Double_t b = TMath::Power(xx-par[1],2);
+  if(a > b){ f = par[2]*TMath::Sqrt(a-b); }
+  else{ f = 0; }
+  return f;
+}
+
 
+void ThreeBodyBreakup(){
   TGenPhaseSpace PS1p;
 
   //47K(d,p)47K+p+n
@@ -18,10 +28,10 @@ void ThreeBodyBreakup(){
 
   double masses1p[3]={p.Mass(),K47.Mass(),n.Mass()};
   //cout << p.Mass() << " " << K47.Mass()<< " " << n.Mass() << endl;
-  auto Ex1p=new TH1D("ex1p","ex1p",300,-10,40); 
+  auto Ex1p=new TH1D("ex1p","ex1p",500,-10,40); 
   PS1p.SetDecay(W,3,masses1p);
 
-  for(unsigned int i = 0 ; i < 1000000 ; i++){
+  for(unsigned int i = 0 ; i < 10000000 ; i++){
      // 1p case
      double weight = PS1p.Generate();
      auto pd = PS1p.GetDecay(0);
@@ -34,6 +44,30 @@ void ThreeBodyBreakup(){
      Ex1p->Fill(ex,weight); 
     }
 
-  Ex1p->Draw("");
+  TCanvas* c_Ex1p = new TCanvas("c_Ex1p","c_Ex1p",1000,500);
+  Ex1p->Draw();
+
+//  TCanvas* c_semi = new TCanvas("c_semi","c_semi",1000,500);
+  TF1 *f1 = new TF1("f_semi",f_semi,-10,40,3);
+  f1->SetParameters(6,10,100);
+  f1->SetParNames("Radius","Centre","VertScale");
+
+  TFitResultPtr result = Ex1p->Fit("f_semi","S+");
+
+  f1->Draw("same");
+
+  cout << "Chi2 = " << result->Chi2() 
+       << "  NDF  = " << result->Ndf() 
+       << "  Chi2/NDF = " << result->Chi2()/result->Ndf() 
+       << endl;
+
+  cout << "==========================================" << endl;
+  cout << " Three-Body Breakup, B(x);" << endl;
+  cout << "     B(x) = " 
+       << result->Value(2) << " * SQRT( (" 
+       << result->Value(0) << ")^2 - (x - " 
+       << result->Value(1) << ")^2 )" 
+       << endl;
+
 }
 
-- 
GitLab