From 198bb31a2c1edee0ed87991b95bf398fcccfce20 Mon Sep 17 00:00:00 2001
From: Jack Christopher Hutchinson Rolph <jack.rolph@desy.de>
Date: Tue, 17 May 2022 17:07:54 +0200
Subject: [PATCH] Created function to return total afterpulse probability. This
 may now be returned as a fit result.

---
 Model.py     | 21 +++++++++++++++++++++
 PeakOTron.py | 18 +++++++++++++++---
 2 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/Model.py b/Model.py
index a6b703f..ef43e9c 100644
--- a/Model.py
+++ b/Model.py
@@ -133,6 +133,27 @@ def PH_max(t_gate, tau):
 def Alpha(tau_R, tau_Ap, t_gate, p_Ap):
     return (p_Ap/(tau_Ap + tau_R))*(tau_Ap - np.exp(-t_gate/tau_Ap)*(tau_Ap + tau_R*(1 - np.exp(-t_gate/tau_R))))
 
+
+########################################################################################################
+## dAlpha(tau_R, tau_Ap, t_gate, p_Ap)
+########################################################################################################
+##
+## Returns error on total afterpulse probability, α, occuring between 0 and t_gate.
+##
+########################################################################################################
+
+
+@njit
+def dAlpha(tau_R, tau_Ap, t_gate, p_Ap, dtau_Ap, dp_Ap):
+    dalphadtauAp = p_Ap*((t_gate*(-tau_Ap - tau_R*(1 - np.exp(-t_gate/tau_R)))*np.exp(-t_gate/tau_Ap))/tau_Ap**2 + 1 - np.exp(-t_gate/tau_Ap))/(tau_Ap+tau_R) - p_Ap*(tau_Ap - (tau_Ap + tau_R*(1 - exp(-t_gate/tau_R)))*np.exp(-t_gate/tau_Ap))/(tau_Ap + tau_R)**2
+    
+    dalphadpAp = (tau_Ap - (tau_Ap + tau_R*(1 - np.exp(-t_gate/tau_R)))*np.exp(-t_gate/tau_Ap))/(tau_Ap + tau_R)
+    
+    dalpha =  np.sqrt((dalphadtauAp**2)*(dtau_Ap**2) + (dalphadpAp**2)*(dp_Ap**2))
+    
+    return dalpha
+
+
 ########################################################################################################
 ## DiracDelta(length, idx_0, dx)
 ########################################################################################################
diff --git a/PeakOTron.py b/PeakOTron.py
index 3678387..2d520c0 100644
--- a/PeakOTron.py
+++ b/PeakOTron.py
@@ -2,7 +2,7 @@ from Bootstrapping import BootstrapKDE, Bootstrap
 from HelperFunctions import GP_gain, GP_lbda, GP_muGP, GetStats
 from HelperFunctions import LatexFormat, Linear, SelectRangeNumba
 from LossFunctions import *
-from Model import DRM
+from Model import DRM, Alpha, dAlpha
 from iminuit import Minuit
 from scipy.signal import find_peaks, peak_widths
 from scipy.integrate import cumtrapz, quad
@@ -16,6 +16,7 @@ import matplotlib.pyplot as plt
 import matplotlib.gridspec as gridspec
 from matplotlib.ticker import MaxNLocator, ScalarFormatter
 from itertools import chain
+from copy import deepcopy
 import warnings 
 warnings.filterwarnings('ignore')
 
@@ -232,12 +233,23 @@ class PeakOTron:
     ##
     ########################################################################################################
     
-    def GetFitResults(self):
+    def GetFitResults(self, return_alpha=False):
         
         if(self._m_DRM is None):
             raise Exception ("Fit has not yet been performed. Please first perform a fit.")
         else:
-            return self._fit_values, self._fit_errors
+            if(return_alpha):
+                temp_values = deepcopy(self._fit_values)
+                temp_errors = deepcopy(self._fit_errors)
+                
+                temp_values["alpha"] = Alpha(self._fit_values["tau_R"], self._fit_values["tau_Ap"], self._fit_values["t_gate"], self._fit_values["pAp"])
+                temp_errors["alpha"] = dAlpha(self._fit_values["tau_R"], self._fit_values["tau_Ap"], self._fit_values["t_gate"], self._fit_values["pAp"], self._fit_errors["tau_Ap"], self._fit_errors["p_Ap"])
+                
+                return temp_values, temp_errors
+                
+            else:
+                return self._fit_values, self._fit_errors
+        
         
         
     ########################################################################################################
-- 
GitLab