From 1a252280445c6f4dfb35510024e5d556466b92a6 Mon Sep 17 00:00:00 2001
From: Ziyue Zhang <zzhan70@uic.edu>
Date: Tue, 23 Mar 2021 20:56:01 +0000
Subject: [PATCH] Dvmp jpsi mass resolution

---
 benchmarks/dvmp/analysis/vm_mass.cxx | 48 +++++++++++++++++-----------
 include/util.h                       |  2 ++
 options/tracker_reconstruction.py    |  2 +-
 3 files changed, 33 insertions(+), 19 deletions(-)

diff --git a/benchmarks/dvmp/analysis/vm_mass.cxx b/benchmarks/dvmp/analysis/vm_mass.cxx
index 9d9b32b1..577e4a17 100644
--- a/benchmarks/dvmp/analysis/vm_mass.cxx
+++ b/benchmarks/dvmp/analysis/vm_mass.cxx
@@ -68,8 +68,8 @@ int vm_mass(const std::string& config_name)
        {"description", "Invariant Mass Resolution calculated from raw "
                        "tracking data using a Gaussian fit."},
        {"quantity", "resolution"},
-       {"target", ".1"}}};
-
+       {"target", ".2"}}};      //these 2 need to be consistent 
+  double width_target = 0.2;    //going to find a way to use the same variable
   // Run this in multi-threaded mode if desired
   ROOT::EnableImplicitMT(kNumThreads);
 
@@ -112,8 +112,8 @@ int vm_mass(const std::string& config_name)
 
   // Define output histograms
   //auto h_im_rec = d_im.Histo1D({"h_im_rec", ";m_{ll'} (GeV/c^{2});#", (int)(vm_mass+0.5)*2*100, 0., 2.*(int)(vm_mass+0.5)}, "mass_rec"); //real rec 
-  auto h_im_rec = d_im.Histo1D({"h_im_rec", ";m_{ll'} (GeV/c^{2});#", 50, 1., 5.}, "mass_rec");//for dummy_rec
-  auto h_im_sim = d_im.Histo1D({"h_im_sim", ";m_{ll'} (GeV/c^{2});#", 50, 1., 5.}, "mass_sim");
+  auto h_im_rec = d_im.Histo1D({"h_im_rec", ";m_{ll'} (GeV/c^{2});#", 30, 1.5, 4.5}, "mass_rec");//for dummy_rec
+  auto h_im_sim = d_im.Histo1D({"h_im_sim", ";m_{ll'} (GeV/c^{2});#", 30, 1.5, 4.5}, "mass_sim");
 
   auto h_pt_rec = d_im.Histo1D({"h_pt_rec", ";p_{T} (GeV/c);#", 50, 0., 10.}, "pt_rec");
   auto h_pt_sim = d_im.Histo1D({"h_pt_sim", ";p_{T} (GeV/c);#", 50, 0., 10.}, "pt_sim");
@@ -127,7 +127,7 @@ int vm_mass(const std::string& config_name)
   // Plot our histograms.
   // TODO: to start I'm explicitly plotting the histograms, but want to
   // factorize out the plotting code moving forward.
-  {
+  //{
     TCanvas c{"canvas", "canvas", 1200, 1200};
     c.Divide(2, 2, 0.0001, 0.0001);
     // pad 1 mass
@@ -147,8 +147,22 @@ int vm_mass(const std::string& config_name)
     // draw everything
     h11.DrawClone("hist");
     h12.DrawClone("hist same");
+    
+    //Fit
+    TF1* mfMass = new TF1("mfMass", "[2]*TMath::Gaus(x, [0], [1], kFALSE)", 1.5, 4.5);
+    mfMass->SetParameters(3.096, 0.1, 100.);
+    mfMass->SetParLimits(0, 3.0, 3.2);
+    mfMass->SetParLimits(1, 0., 10.);
+    mfMass->SetParLimits(2, 0., 1000.);
+    mfMass->SetNpx(1000);
+    mfMass->SetLineColor(2);
+    mfMass->SetLineStyle(7);
+    
+    TFitResultPtr myFitPtr = h12.Fit(mfMass, "S 0", "", 1.5, 4.5);
+    mfMass->Draw("same");
+    
     // FIXME hardcoded beam configuration
-    plot::draw_label(10, 100, detector);
+    plot::draw_label(10, 100, detector);                                                                                                               
     TText* tptr1;
     auto   t1 = new TPaveText(.6, .8417, .9, .925, "NB NDC");
     t1->SetFillColorAlpha(kWhite, 0);
@@ -175,18 +189,8 @@ int vm_mass(const std::string& config_name)
     h21.GetXaxis()->CenterTitle();
     h21.GetYaxis()->CenterTitle();
     // draw everything
-    //TF1* mfPt = new TF1("mfPt", "[0]*exp(-[1]*x)", 1.2, 10.);
-    //mfPt->SetParameters(5., 1.);
-    //mfPt->SetParLimits(0, 0., 1000000.);
-    //mfPt->SetParLimits(1, 0., 1000000.);
-    //mfPt->SetNpx(1000);
-    //mfPt->SetLineColor(2);
-    //mfPt->SetLineStyle(7);
-    //h21.Fit(mfPt, "", "", 1.2, 10.);
     h21.DrawClone("hist");
     h22.DrawClone("hist same");
-    //mfPt->Draw("same");
-    
     
     // FIXME hardcoded beam configuration
     plot::draw_label(10, 100, detector);
@@ -262,11 +266,19 @@ int vm_mass(const std::string& config_name)
     t4->Draw();
 
     c.Print(fmt::format("{}vm_mass_pt_phi_rapidity.png", output_prefix).c_str());
-  }
+  //}
 
   // TODO we're not actually doing an IM fit yet, so for now just return an
   // error for the test result
-  mass_resolution_test.error(-1);
+  double width = mfMass->GetParameter(1);
+  if(myFitPtr->Status()!=0){
+    mass_resolution_test.error(-1);
+  }else if(width > width_target){
+    mass_resolution_test.fail(width);
+  }else{
+    mass_resolution_test.pass(width);
+  }
+  
 
   // write out our test data
   eic::util::write_test(mass_resolution_test, fmt::format("{}mass.json", output_prefix));
diff --git a/include/util.h b/include/util.h
index eddf1393..8083d38c 100644
--- a/include/util.h
+++ b/include/util.h
@@ -11,6 +11,8 @@
 #include <string>
 #include <vector>
 #include "TF1.h"
+#include "TFitResult.h"
+#include "TFitResultPtr.h"
 
 #include <Math/Vector4D.h>
 
diff --git a/options/tracker_reconstruction.py b/options/tracker_reconstruction.py
index 6bef5d7b..e303b38e 100644
--- a/options/tracker_reconstruction.py
+++ b/options/tracker_reconstruction.py
@@ -57,7 +57,7 @@ podioinput = PodioInput("PodioReader",
 dummy = MC2DummyParticle("MC2Dummy",
         inputCollection="mcparticles",
         outputCollection="DummyReconstructedParticles",
-        smearing = 0.0)
+        smearing = 0.1)
 
 ## copiers to get around input --> output copy bug. Note the "2" appended to the output collection.
 copier = MCCopier("MCCopier", 
-- 
GitLab