Newer
Older
Master_thesis / raremodel-nb.ipynb
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Import"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\sa_li\\.conda\\envs\\rmd\\lib\\site-packages\\zfit\\util\\execution.py:53: UserWarning: Not running on Linux. Determining available cpus for thread can failand be overestimated. Workaround (only if too many cpus are used):`zfit.run.set_n_cpu(your_cpu_number)`\n",
      "  warnings.warn(\"Not running on Linux. Determining available cpus for thread can fail\"\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: The TensorFlow contrib module will not be included in TensorFlow 2.0.\n",
      "For more information, please see:\n",
      "  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n",
      "  * https://github.com/tensorflow/addons\n",
      "If you depend on functionality not listed there, please file an issue.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from pdg_const import pdg\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "import pickle as pkl\n",
    "import sys\n",
    "import time\n",
    "from helperfunctions import display_time, prepare_plot\n",
    "import cmath as c\n",
    "import scipy.integrate as integrate\n",
    "from scipy.optimize import fminbound\n",
    "from array import array as arr\n",
    "import collections\n",
    "from itertools import compress\n",
    "import tensorflow as tf\n",
    "import zfit\n",
    "from zfit import ztf\n",
    "from IPython.display import clear_output\n",
    "import os"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Build model and graphs\n",
    "## Create graphs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def formfactor( q2, subscript): #returns real value\n",
    "    #check if subscript is viable\n",
    "\n",
    "    if subscript != \"0\" and subscript != \"+\" and subscript != \"T\":\n",
    "        raise ValueError('Wrong subscript entered, choose either 0, + or T')\n",
    "\n",
    "    #get constants\n",
    "\n",
    "    mK = ztf.constant(pdg['Ks_M'])\n",
    "    mbstar0 = ztf.constant(pdg[\"mbstar0\"])\n",
    "    mbstar = ztf.constant(pdg[\"mbstar\"])\n",
    "    b0 = ztf.constant(pdg[\"b0\"])\n",
    "    bplus = ztf.constant(pdg[\"bplus\"])\n",
    "    bT = ztf.constant(pdg[\"bT\"])\n",
    "\n",
    "    mmu = ztf.constant(pdg['muon_M'])\n",
    "    mb = ztf.constant(pdg['bquark_M'])\n",
    "    ms = ztf.constant(pdg['squark_M'])\n",
    "    mB = ztf.constant(pdg['Bplus_M'])\n",
    "\n",
    "    #N comes from derivation in paper\n",
    "\n",
    "    N = 3\n",
    "\n",
    "    #some helperfunctions\n",
    "\n",
    "    tpos = (mB - mK)**2\n",
    "    tzero = (mB + mK)*(ztf.sqrt(mB)-ztf.sqrt(mK))**2\n",
    "\n",
    "    z_oben = ztf.sqrt(tpos - q2) - ztf.sqrt(tpos - tzero)\n",
    "    z_unten = ztf.sqrt(tpos - q2) + ztf.sqrt(tpos - tzero)\n",
    "    z = tf.divide(z_oben, z_unten)\n",
    "\n",
    "    #calculate f0\n",
    "\n",
    "    if subscript == \"0\":\n",
    "        prefactor = 1/(1 - q2/(mbstar0**2))\n",
    "        _sum = 0\n",
    "\n",
    "        for i in range(N):\n",
    "            _sum += b0[i]*(tf.pow(z,i))\n",
    "\n",
    "        return tf.complex(prefactor * _sum, ztf.constant(0.0))\n",
    "\n",
    "    #calculate f+ or fT\n",
    "\n",
    "    else:\n",
    "        prefactor = 1/(1 - q2/(mbstar**2))\n",
    "        _sum = 0\n",
    "\n",
    "        if subscript == \"T\":\n",
    "            b = bT\n",
    "        else:\n",
    "            b = bplus\n",
    "\n",
    "        for i in range(N):\n",
    "            _sum += b[i] * (tf.pow(z, i) - ((-1)**(i-N)) * (i/N) * tf.pow(z, N))\n",
    "\n",
    "        return tf.complex(prefactor * _sum, ztf.constant(0.0))\n",
    "\n",
    "def resonance(q, _mass, width, phase, scale):\n",
    "\n",
    "    q2 = tf.pow(q, 2)\n",
    "\n",
    "    mmu = ztf.constant(pdg['muon_M'])\n",
    "\n",
    "    p = 0.5 * ztf.sqrt(q2 - 4*(mmu**2))\n",
    "\n",
    "    p0 =  0.5 * ztf.sqrt(_mass**2 - 4*mmu**2)\n",
    "\n",
    "    gamma_j = tf.divide(p, q2) * _mass * width / p0\n",
    "\n",
    "    #Calculate the resonance\n",
    "\n",
    "    _top = tf.complex(_mass * width, ztf.constant(0.0))\n",
    "\n",
    "    _bottom = tf.complex(_mass**2 - q2, -_mass*gamma_j)\n",
    "\n",
    "    com = _top/_bottom\n",
    "\n",
    "    #Rotate by the phase\n",
    "\n",
    "    r = ztf.to_complex(scale*tf.abs(com))\n",
    "\n",
    "    _phase = tf.angle(com)\n",
    "\n",
    "    _phase += phase\n",
    "\n",
    "    com = r * tf.exp(tf.complex(ztf.constant(0.0), _phase))\n",
    "\n",
    "    return com\n",
    "\n",
    "def bifur_gauss(q, mean, sigma_L, sigma_R, scale):\n",
    "\n",
    "    _exp = tf.where(q < mean, ztf.exp(- tf.pow((q-mean),2) / (2 * sigma_L**2)), ztf.exp(- tf.pow((q-mean),2) / (2 * sigma_R**2)))\n",
    "\n",
    "    #Scale so the total area under curve is 1 and the top of the cusp is continuous\n",
    "\n",
    "    dgamma = scale*_exp/(ztf.sqrt(2*np.pi))*2*(sigma_L*sigma_R)/(sigma_L+sigma_R)\n",
    "\n",
    "    com = ztf.complex(dgamma, ztf.constant(0.0))\n",
    "\n",
    "    return com\n",
    "\n",
    "def axiv_nonres(q):\n",
    "\n",
    "    GF = ztf.constant(pdg['GF'])\n",
    "    alpha_ew = ztf.constant(pdg['alpha_ew'])\n",
    "    Vtb = ztf.constant(pdg['Vtb'])\n",
    "    Vts = ztf.constant(pdg['Vts'])\n",
    "    C10eff = ztf.constant(pdg['C10eff'])\n",
    "\n",
    "    mmu = ztf.constant(pdg['muon_M'])\n",
    "    mb = ztf.constant(pdg['bquark_M'])\n",
    "    ms = ztf.constant(pdg['squark_M'])\n",
    "    mK = ztf.constant(pdg['Ks_M'])\n",
    "    mB = ztf.constant(pdg['Bplus_M'])\n",
    "\n",
    "    q2 = tf.pow(q, 2)\n",
    "\n",
    "    #Some helperfunctions\n",
    "\n",
    "    beta = ztf.sqrt(tf.abs(1. - 4. * mmu**2. / q2))\n",
    "\n",
    "    kabs = ztf.sqrt(mB**2. +tf.pow(q2, 2)/mB**2. + mK**4./mB**2. - 2. * (mB**2. * mK**2. + mK**2. * q2 + mB**2. * q2) / mB**2.)\n",
    "\n",
    "    #prefactor in front of whole bracket\n",
    "\n",
    "    prefactor1 = GF**2. *alpha_ew**2. * (tf.abs(Vtb*Vts))**2. * kabs * beta / (128. * np.pi**5.)\n",
    "\n",
    "    #left term in bracket\n",
    "\n",
    "    bracket_left = 2./3. * kabs**2. * beta**2. *tf.abs(tf.complex(C10eff, ztf.constant(0.0))*formfactor(q2, \"+\"))**2.\n",
    "\n",
    "    #middle term in bracket\n",
    "\n",
    "    _top = 4. * mmu**2. * (mB**2. - mK**2.) * (mB**2. - mK**2.)\n",
    "\n",
    "    _under = q2 * mB**2.\n",
    "\n",
    "    bracket_middle = _top/_under *tf.pow(tf.abs(tf.complex(C10eff, ztf.constant(0.0)) * formfactor(q2, \"0\")), 2)\n",
    "\n",
    "    #Note sqrt(q2) comes from derivation as we use q2 and plot q\n",
    "\n",
    "    return prefactor1 * (bracket_left + bracket_middle) * 2 *ztf.sqrt(q2)\n",
    "\n",
    "def vec(q, funcs):\n",
    "    \n",
    "    q2 = tf.pow(q, 2)\n",
    "\n",
    "    GF = ztf.constant(pdg['GF'])\n",
    "    alpha_ew = ztf.constant(pdg['alpha_ew'])\n",
    "    Vtb = ztf.constant(pdg['Vtb'])\n",
    "    Vts = ztf.constant(pdg['Vts'])\n",
    "    C7eff = ztf.constant(pdg['C7eff'])\n",
    "\n",
    "    mmu = ztf.constant(pdg['muon_M'])\n",
    "    mb = ztf.constant(pdg['bquark_M'])\n",
    "    ms = ztf.constant(pdg['squark_M'])\n",
    "    mK = ztf.constant(pdg['Ks_M'])\n",
    "    mB = ztf.constant(pdg['Bplus_M'])\n",
    "\n",
    "    #Some helperfunctions\n",
    "\n",
    "    beta = ztf.sqrt(tf.abs(1. - 4. * mmu**2. / q2))\n",
    "\n",
    "    kabs = ztf.sqrt(mB**2. + tf.pow(q2, 2)/mB**2. + mK**4./mB**2. - 2 * (mB**2 * mK**2 + mK**2 * q2 + mB**2 * q2) / mB**2)\n",
    "\n",
    "    #prefactor in front of whole bracket\n",
    "\n",
    "    prefactor1 = GF**2. *alpha_ew**2. * (tf.abs(Vtb*Vts))**2 * kabs * beta / (128. * np.pi**5.)\n",
    "\n",
    "    #right term in bracket\n",
    "\n",
    "    prefactor2 = kabs**2 * (1. - 1./3. * beta**2)\n",
    "\n",
    "    abs_bracket = tf.abs(c9eff(q, funcs) * formfactor(q2, \"+\") + tf.complex(2.0 * C7eff * (mb + ms)/(mB + mK), ztf.constant(0.0)) * formfactor(q2, \"T\"))**2\n",
    "\n",
    "    bracket_right = prefactor2 * abs_bracket\n",
    "\n",
    "    #Note sqrt(q2) comes from derivation as we use q2 and plot q\n",
    "\n",
    "    return prefactor1 * bracket_right * 2 * ztf.sqrt(q2)\n",
    "\n",
    "def c9eff(q, funcs):\n",
    "\n",
    "    C9eff_nr = tf.complex(ztf.constant(pdg['C9eff']), ztf.constant(0.0))\n",
    "\n",
    "    c9 = C9eff_nr\n",
    "\n",
    "    c9 = c9 + funcs\n",
    "\n",
    "    return c9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def G(y):\n",
    "    \n",
    "    def inner_rect_bracket(q):\n",
    "        return tf.log(ztf.to_complex((1+tf.sqrt(q))/(1-tf.sqrt(q)))-tf.complex(ztf.constant(0), -1*ztf.constant(np.pi)))    \n",
    "    \n",
    "    def inner_right(q):\n",
    "        return ztf.to_complex(2 * tf.atan(1/tf.sqrt(-q)))\n",
    "    \n",
    "    big_bracket = tf.where(y > ztf.const(0.0), inner_rect_bracket(y), inner_right(y))\n",
    "    \n",
    "    return ztf.to_complex(tf.sqrt(tf.abs(y))) * big_bracket\n",
    "\n",
    "def h_S(m, q):\n",
    "    \n",
    "    return ztf.to_complex(2) - G(ztf.to_complex(1) - 4*tf.pow(m, 2) / ztf.to_complex(tf.pow(q, 2)))\n",
    "\n",
    "def h_P(m,q):\n",
    "    \n",
    "    return ztf.to_complex(2/3) + (ztf.to_complex(1) - 4*tf.pow(m, 2) / ztf.to_complex(tf.pow(q, 2))) * h_S(m,q)\n",
    "\n",
    "def two_p_ccbar(mD, m_D_bar, m_D_star, q):\n",
    "    \n",
    "    \n",
    "    #Load constants\n",
    "    nu_D_bar = ztf.to_complex(pdg[\"nu_D_bar\"])\n",
    "    nu_D = ztf.to_complex(pdg[\"nu_D\"])\n",
    "    nu_D_star = ztf.to_complex(pdg[\"nu_D_star\"])\n",
    "    \n",
    "    phase_D_bar = ztf.to_complex(pdg[\"phase_D_bar\"])\n",
    "    phase_D = ztf.to_complex(pdg[\"phase_D\"])\n",
    "    phase_D_star = ztf.to_complex(pdg[\"phase_D_star\"])\n",
    "    \n",
    "    #Calculation\n",
    "    left_part =  nu_D_bar * tf.exp(tf.complex(ztf.constant(0.0), phase_D_bar)) * h_S(m_D_bar, q) \n",
    "    \n",
    "    right_part_D = nu_D * tf.exp(tf.complex(ztf.constant(0.0), phase_D)) * h_P(m_D, q) \n",
    "    \n",
    "    right_part_D_star = nu_D_star * tf.exp(tf.complex(ztf.constant(0.0), phase_D_star)) * h_P(m_D_star, q) \n",
    "\n",
    "    return left_part + right_part_D + right_part_D_star"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Build pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "class total_pdf(zfit.pdf.ZPDF):\n",
    "    _N_OBS = 1  # dimension, can be omitted\n",
    "    _PARAMS = ['jpsi_mass', 'jpsi_scale', 'jpsi_phase', 'jpsi_width',\n",
    "                'psi2s_mass', 'psi2s_scale', 'psi2s_phase', 'psi2s_width'#,\n",
    "                #'cusp_mass', 'sigma_L', 'sigma_R', 'cusp_scale'\n",
    "                ]  # the name of the parameters\n",
    "\n",
    "    def _unnormalized_pdf(self, x):\n",
    "        \n",
    "        x = x.unstack_x()\n",
    "\n",
    "        def jpsi_res(q):\n",
    "            return resonance(q, _mass = self.params['jpsi_mass'], scale = self.params['jpsi_scale'], phase = self.params['jpsi_phase'], width = self.params['jpsi_width'])\n",
    "\n",
    "        def psi2s_res(q):\n",
    "            return resonance(q, _mass = self.params['psi2s_mass'], scale = self.params['psi2s_scale'], phase = self.params['psi2s_phase'], width = self.params['psi2s_width'])\n",
    "\n",
    "        def cusp(q):\n",
    "            return bifur_gauss(q, mean = self.params['cusp_mass'], sigma_L = self.params['sigma_L'], sigma_R = self.params['sigma_R'], scale = self.params['cusp_scale'])\n",
    "\n",
    "        funcs = jpsi_res(x) + psi2s_res(x) #+ cusp(x)\n",
    "\n",
    "        vec_f = vec(x, funcs)\n",
    "\n",
    "        axiv_nr = axiv_nonres(x)\n",
    "\n",
    "        tot = vec_f + axiv_nr\n",
    "\n",
    "        return tot"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_min = 2*pdg['muon_M']\n",
    "x_max = (pdg[\"Bplus_M\"]-pdg[\"Ks_M\"]-0.1)\n",
    "\n",
    "obs = zfit.Space('q', limits = (x_min, x_max))\n",
    "\n",
    "# with open(r\"./data/slim_points/slim_points_toy_0_range({0}-{1}).pkl\".format(int(x_min), int(x_max)), \"rb\") as input_file:\n",
    "#     part_set = pkl.load(input_file)\n",
    "\n",
    "# x_part = part_set['x_part']\n",
    "\n",
    "# x_part = x_part.astype('float64')\n",
    "\n",
    "# data = zfit.data.Data.from_numpy(array=x_part, obs=obs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From c:\\users\\sa_li\\.conda\\envs\\rmd\\lib\\site-packages\\tensorflow\\python\\ops\\resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    }
   ],
   "source": [
    "#jpsi\n",
    "\n",
    "jpsi_mass, jpsi_width, jpsi_phase, jpsi_scale = pdg[\"jpsi\"]\n",
    "# jpsi_scale *= pdg[\"factor_jpsi\"]\n",
    "\n",
    "jpsi_m = zfit.Parameter(\"jpsi_m\", ztf.constant(jpsi_mass), floating = False)\n",
    "jpsi_w = zfit.Parameter(\"jpsi_w\", ztf.constant(jpsi_width), floating = False)\n",
    "jpsi_p = zfit.Parameter(\"jpsi_p\", ztf.constant(jpsi_phase))\n",
    "jpsi_s = zfit.Parameter(\"jpsi_s\", ztf.constant(jpsi_scale))\n",
    "\n",
    "#psi2s\n",
    "\n",
    "psi2s_mass, psi2s_width, psi2s_phase, psi2s_scale = pdg[\"psi2s\"]\n",
    "\n",
    "psi2s_m = zfit.Parameter(\"psi2s_m\", ztf.constant(psi2s_mass), floating = False)\n",
    "psi2s_w = zfit.Parameter(\"psi2s_w\", ztf.constant(psi2s_width), floating = False)\n",
    "psi2s_p = zfit.Parameter(\"psi2s_p\", ztf.constant(psi2s_phase))\n",
    "psi2s_s = zfit.Parameter(\"psi2s_s\", ztf.constant(psi2s_scale))\n",
    "\n",
    "#cusp\n",
    "\n",
    "# cusp_mass, sigma_R, sigma_L, cusp_scale = 3550, 3e-7, 200, 0\n",
    "\n",
    "# cusp_m = zfit.Parameter(\"cusp_m\", ztf.constant(cusp_mass), floating = False)\n",
    "# sig_L = zfit.Parameter(\"sig_L\", ztf.constant(sigma_L), floating = False)\n",
    "# sig_R = zfit.Parameter(\"sig_R\", ztf.constant(sigma_R), floating = False)\n",
    "# cusp_s = zfit.Parameter(\"cusp_s\", ztf.constant(cusp_scale), floating = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "total_f = total_pdf(obs=obs, jpsi_mass = jpsi_m, jpsi_scale = jpsi_s, jpsi_phase = jpsi_p, jpsi_width = jpsi_w,\n",
    "            psi2s_mass = psi2s_m, psi2s_scale = psi2s_s, psi2s_phase = psi2s_p, psi2s_width = psi2s_w)#,\n",
    "            #cusp_mass = cusp_m, sigma_L = sig_L, sigma_R = sig_R, cusp_scale = cusp_s)\n",
    "\n",
    "# print(total_pdf.obs)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Test if graphs actually work and compute values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def total_test_tf(xq):\n",
    "\n",
    "    def jpsi_res(q):\n",
    "        return resonance(q, jpsi_m, jpsi_s, jpsi_p, jpsi_w)\n",
    "\n",
    "    def psi2s_res(q):\n",
    "        return resonance(q, psi2s_m, psi2s_s, psi2s_p, psi2s_w)\n",
    "\n",
    "    def cusp(q):\n",
    "        return bifur_gauss(q, cusp_m, sig_L, sig_R, cusp_s)\n",
    "\n",
    "    funcs = jpsi_res(xq) + psi2s_res(xq) + cusp(xq)\n",
    "\n",
    "    vec_f = vec(xq, funcs)\n",
    "\n",
    "    axiv_nr = axiv_nonres(xq)\n",
    "\n",
    "    tot = vec_f + axiv_nr\n",
    "    \n",
    "    return tot\n",
    "\n",
    "def jpsi_res(q):\n",
    "    return resonance(q, jpsi_m, jpsi_s, jpsi_p, jpsi_w)\n",
    "\n",
    "# calcs = zfit.run(total_test_tf(x_part))\n",
    "\n",
    "test_q = np.linspace(x_min, x_max, 2000000)\n",
    "\n",
    "probs = total_f.pdf(test_q)\n",
    "\n",
    "calcs_test = zfit.run(probs)\n",
    "res_y = zfit.run(jpsi_res(test_q))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.clf()\n",
    "# plt.plot(x_part, calcs, '.')\n",
    "plt.plot(test_q, calcs_test, label = 'pdf')\n",
    "# plt.plot(test_q, res_y, label = 'res')\n",
    "plt.legend()\n",
    "plt.ylim(0.0, 4e-4)\n",
    "# plt.yscale('log')\n",
    "# plt.xlim(3080, 3110)\n",
    "plt.savefig('test.png')\n",
    "# print(jpsi_width)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Adjust scaling of different parts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# total_f.update_integration_options(draws_per_dim=2000000, mc_sampler=None)\n",
    "# inte = total_f.integrate(limits = (3090, 3102), norm_range=False)\n",
    "# inte_fl = zfit.run(inte)\n",
    "# print(inte_fl)\n",
    "# print(pdg[\"jpsi_BR\"]/pdg[\"NR_BR\"], inte_fl/pdg[\"NR_auc\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# factor_jpsi = pdg[\"NR_auc\"]*pdg[\"jpsi_BR\"]/(pdg[\"NR_BR\"]*pdg[\"jpsi_auc\"])\n",
    "# factor_jpsi = pdg[\"NR_auc\"]*pdg[\"jpsi_BR\"]/(pdg[\"NR_BR\"]*inte_fl)\n",
    "# print(np.sqrt(factor_jpsi)*jpsi_scale)\n",
    "# print(np.sqrt(factor_jpsi))\n",
    "# # print(psi2s_scale)\n",
    "# factor_psi2s = pdg[\"NR_auc\"]*pdg[\"psi2s_BR\"]/(pdg[\"NR_BR\"]*pdg[\"psi2s_auc\"])\n",
    "# factor_psi2s = pdg[\"NR_auc\"]*pdg[\"psi2s_BR\"]/(pdg[\"NR_BR\"]*inte_fl)\n",
    "# print(np.sqrt(factor_psi2s)*psi2s_scale)\n",
    "# print(np.sqrt(factor_psi2s))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# def _t_f(xq):\n",
    "\n",
    "#     def jpsi_res(q):\n",
    "#         return resonance(q, jpsi_m, jpsi_s, jpsi_p, jpsi_w)\n",
    "\n",
    "#     def psi2s_res(q):\n",
    "#         return resonance(q, psi2s_m, psi2s_s, psi2s_p, psi2s_w)\n",
    "\n",
    "#     def cusp(q):\n",
    "#         return bifur_gauss(q, cusp_m, sig_L, sig_R, cusp_s)\n",
    "\n",
    "#     funcs = psi2s_res(xq) + jpsi_res(xq) + cusp(xq)\n",
    "\n",
    "#     vec_f = vec(xq, funcs)\n",
    "\n",
    "#     axiv_nr = axiv_nonres(xq)\n",
    "\n",
    "#     tot = vec_f + axiv_nr\n",
    "    \n",
    "#     return tot\n",
    "\n",
    "# def t_f(x):\n",
    "#     probs = zfit.run(_t_f(ztf.constant(x)))\n",
    "#     return probs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# print(36000*(1+ pdg[\"jpsi_BR\"]/pdg[\"NR_BR\"] + pdg[\"psi2s_BR\"]/pdg[\"NR_BR\"]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# start = time.time()\n",
    "\n",
    "# result, err = integrate.quad(lambda x: t_f(x), x_min, x_max, limit = 50)\n",
    "# print(result, \"{0:.2f} %\".format(err/result))\n",
    "# print(\"Time:\", time.time()-start)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sampling\n",
    "## One sample"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# nevents = int(pdg[\"number_of_decays\"])\n",
    "# event_stack = 5000\n",
    "\n",
    "# calls = int(nevents/event_stack + 1)\n",
    "\n",
    "# total_samp = []\n",
    "\n",
    "# start = time.time()\n",
    "\n",
    "# samp = total_f.sample(n=event_stack)\n",
    "# s = samp.unstack_x()\n",
    "\n",
    "# for call in range(calls):\n",
    "\n",
    "#     sam = zfit.run(s)\n",
    "#     clear_output(wait=True)\n",
    "    \n",
    "# #     if call != 0:\n",
    "# #         print(np.sum(_last_sam-sam))\n",
    "    \n",
    "# #     _last_sam = sam\n",
    "    \n",
    "#     c = call + 1    \n",
    "#     print(\"{0}/{1}\".format(c, calls))\n",
    "#     print(\"Time taken: {}\".format(display_time(int(time.time() - start))))\n",
    "#     print(\"Projected time left: {}\".format(display_time(int((time.time() - start)/c*(calls-c)))))\n",
    "    \n",
    "#     with open(\"data/zfit_toys/toy_1/{}.pkl\".format(call), \"wb\") as f:\n",
    "#         pkl.dump(sam, f, pkl.HIGHEST_PROTOCOL)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# print(\"Time to generate full toy: {} s\".format(int(time.time()-start)))\n",
    "\n",
    "# total_samp = []\n",
    "\n",
    "# for call in range(calls):\n",
    "#     with open(r\"data/zfit_toys/toy_1/{}.pkl\".format(call), \"rb\") as input_file:\n",
    "#         sam = pkl.load(input_file)\n",
    "#         total_samp = np.append(total_samp, sam)\n",
    "\n",
    "# total_samp = total_samp.astype('float64')\n",
    "\n",
    "# data2 = zfit.data.Data.from_numpy(array=total_samp[:int(nevents)], obs=obs)\n",
    "\n",
    "# print(total_samp[:nevents].shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# bins = int((x_max-x_min)/7)\n",
    "\n",
    "# # calcs = zfit.run(total_test_tf(samp))\n",
    "\n",
    "# plt.hist(total_samp[:event_stack], bins = bins, range = (x_min,x_max))\n",
    "\n",
    "# # plt.plot(sam, calcs, '.')\n",
    "# # plt.plot(test_q, calcs_test)\n",
    "# plt.ylim(0, 20)\n",
    "# # plt.xlim(3000, 3750)\n",
    "\n",
    "# plt.savefig('test2.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Toys"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "55/55\n",
      "Time taken: 6 h, 21 min\n",
      "Projected time left: \n"
     ]
    }
   ],
   "source": [
    "nr_of_toys = 1\n",
    "nevents = int(pdg[\"number_of_decays\"])\n",
    "event_stack = 100000\n",
    "\n",
    "calls = int(nevents/event_stack + 1)\n",
    "\n",
    "total_samp = []\n",
    "\n",
    "start = time.time()\n",
    "\n",
    "sampler = total_f.create_sampler(n=event_stack)\n",
    "\n",
    "for toy in range(nr_of_toys):\n",
    "    \n",
    "    dirName = 'data/zfit_toys/toy_{0}'.format(toy)\n",
    "    \n",
    "    if not os.path.exists(dirName):\n",
    "        os.mkdir(dirName)\n",
    "        print(\"Directory \" , dirName ,  \" Created \")\n",
    "\n",
    "    for call in range(calls):\n",
    "\n",
    "        sampler.resample(n=event_stack)\n",
    "        s = sampler.unstack_x()\n",
    "        sam = zfit.run(s)\n",
    "        clear_output(wait=True)\n",
    "\n",
    "        c = call + 1    \n",
    "        print(\"{0}/{1}\".format(c, calls))\n",
    "        print(\"Time taken: {}\".format(display_time(int(time.time() - start))))\n",
    "        print(\"Projected time left: {}\".format(display_time(int((time.time() - start)/c*(calls-c)))))\n",
    "\n",
    "        with open(\"data/zfit_toys/toy_{0}/{1}.pkl\".format(toy, call), \"wb\") as f:\n",
    "            pkl.dump(sam, f, pkl.HIGHEST_PROTOCOL)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# with open(r\"data/zfit_toys/toy_0/0.pkl\", \"rb\") as input_file:\n",
    "#     sam = pkl.load(input_file)\n",
    "# print(sam[:10])\n",
    "\n",
    "# with open(r\"data/zfit_toys/toy_0/1.pkl\", \"rb\") as input_file:\n",
    "#     sam2 = pkl.load(input_file)\n",
    "# print(sam2[:10])\n",
    "\n",
    "# print(np.sum(sam-sam2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Time to generate full toy: 22915 s\n",
      "(5404696,)\n"
     ]
    }
   ],
   "source": [
    "print(\"Time to generate full toy: {} s\".format(int(time.time()-start)))\n",
    "\n",
    "total_samp = []\n",
    "\n",
    "for call in range(calls):\n",
    "    with open(r\"data/zfit_toys/toy_0/{}.pkl\".format(call), \"rb\") as input_file:\n",
    "        sam = pkl.load(input_file)\n",
    "        total_samp = np.append(total_samp, sam)\n",
    "\n",
    "total_samp = total_samp.astype('float64')\n",
    "\n",
    "data2 = zfit.data.Data.from_numpy(array=total_samp[:int(nevents)], obs=obs)\n",
    "\n",
    "print(total_samp[:nevents].shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "bins = int((x_max-x_min)/7)\n",
    "\n",
    "# calcs = zfit.run(total_test_tf(samp))\n",
    "\n",
    "plt.hist(total_samp[:event_stack], bins = bins, range = (x_min,x_max))\n",
    "\n",
    "# plt.plot(sam, calcs, '.')\n",
    "# plt.plot(test_q, calcs_test)\n",
    "plt.ylim(0, 20)\n",
    "# plt.xlim(3000, 3750)\n",
    "\n",
    "plt.savefig('test2.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# sampler = total_f.create_sampler(n=nevents)\n",
    "# nll = zfit.loss.UnbinnedNLL(model=total_f, data=sampler, fit_range = (x_min, x_max))\n",
    "\n",
    "# # for param in pdf.get_dependents():\n",
    "# #     param.set_value(initial_value)\n",
    "\n",
    "# sampler.resample(n=nevents)\n",
    "\n",
    "# # Randomise initial values\n",
    "# # for param in pdf.get_dependents():\n",
    "# #     param.set_value(random value here)\n",
    "\n",
    "# # Minimise the NLL\n",
    "# minimizer = zfit.minimize.MinuitMinimizer(verbosity = 10)\n",
    "# minimum = minimizer.minimize(nll)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fitting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<hr>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <tr>\n",
       "        <td title=\"Minimum value of function\">FCN = 18215610.730149463</td>\n",
       "        <td title=\"Total number of call to FCN so far\">TOTAL NCALL = 76</td>\n",
       "        <td title=\"Number of call in last migrad\">NCALLS = 76</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"Estimated distance to minimum\">EDM = 6.769469250461445e-05</td>\n",
       "        <td title=\"Maximum EDM definition of convergence\">GOAL EDM = 5e-06</td>\n",
       "        <td title=\"Error def. Amount of increase in FCN to be defined as 1 standard deviation\">\n",
       "        UP = 0.5</td>\n",
       "    </tr>\n",
       "</table>\n",
       "<table>\n",
       "    <tr>\n",
       "        <td align=\"center\" title=\"Validity of the migrad call\">Valid</td>\n",
       "        <td align=\"center\" title=\"Validity of parameters\">Valid Param</td>\n",
       "        <td align=\"center\" title=\"Is Covariance matrix accurate?\">Accurate Covar</td>\n",
       "        <td align=\"center\" title=\"Positive definiteness of covariance matrix\">PosDef</td>\n",
       "        <td align=\"center\" title=\"Was covariance matrix made posdef by adding diagonal element\">Made PosDef</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td align=\"center\" style=\"background-color:#92CCA6\">True</td>\n",
       "        <td align=\"center\" style=\"background-color:#92CCA6\">True</td>\n",
       "        <td align=\"center\" style=\"background-color:#92CCA6\">True</td>\n",
       "        <td align=\"center\" style=\"background-color:#92CCA6\">True</td>\n",
       "        <td align=\"center\" style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td align=\"center\" title=\"Was last hesse call fail?\">Hesse Fail</td>\n",
       "        <td align=\"center\" title=\"Validity of covariance\">HasCov</td>\n",
       "        <td align=\"center\" title=\"Is EDM above goal EDM?\">Above EDM</td>\n",
       "        <td align=\"center\"></td>\n",
       "        <td align=\"center\" title=\"Did last migrad call reach max call limit?\">Reach calllim</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td align=\"center\" style=\"background-color:#92CCA6\">False</td>\n",
       "        <td align=\"center\" style=\"background-color:#92CCA6\">True</td>\n",
       "        <td align=\"center\" style=\"background-color:#92CCA6\">False</td>\n",
       "        <td align=\"center\"></td>\n",
       "        <td align=\"center\" style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "</table>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<table>\n",
       "    <tr>\n",
       "        <td><a href=\"#\" onclick=\"$('#JIwWuWnKke').toggle()\">+</a></td>\n",
       "        <td title=\"Variable name\">Name</td>\n",
       "        <td title=\"Value of parameter\">Value</td>\n",
       "        <td title=\"Hesse error\">Hesse Error</td>\n",
       "        <td title=\"Minos lower error\">Minos Error-</td>\n",
       "        <td title=\"Minos upper error\">Minos Error+</td>\n",
       "        <td title=\"Lower limit of the parameter\">Limit-</td>\n",
       "        <td title=\"Upper limit of the parameter\">Limit+</td>\n",
       "        <td title=\"Is the parameter fixed in the fit\">Fixed?</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td>0</td>\n",
       "        <td>psi2s_p</td>\n",
       "        <td>-69.4248</td>\n",
       "        <td>0.023096</td>\n",
       "        <td></td>\n",
       "        <td></td>\n",
       "        <td></td>\n",
       "        <td></td>\n",
       "        <td>No</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td>1</td>\n",
       "        <td>jpsi_p</td>\n",
       "        <td>-21.9928</td>\n",
       "        <td>0.0112012</td>\n",
       "        <td></td>\n",
       "        <td></td>\n",
       "        <td></td>\n",
       "        <td></td>\n",
       "        <td>No</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td>2</td>\n",
       "        <td>jpsi_s</td>\n",
       "        <td>464.531</td>\n",
       "        <td>0.227734</td>\n",
       "        <td></td>\n",
       "        <td></td>\n",
       "        <td></td>\n",
       "        <td></td>\n",
       "        <td>No</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td>3</td>\n",
       "        <td>psi2s_s</td>\n",
       "        <td>76.5102</td>\n",
       "        <td>0.0504588</td>\n",
       "        <td></td>\n",
       "        <td></td>\n",
       "        <td></td>\n",
       "        <td></td>\n",
       "        <td>No</td>\n",
       "    </tr>\n",
       "</table>\n",
       "<pre id=\"JIwWuWnKke\" style=\"display:none;\">\n",
       "<textarea rows=\"14\" cols=\"50\" onclick=\"this.select()\" readonly>\n",
       "\\begin{tabular}{|c|r|r|r|r|r|r|r|c|}\n",
       "\\hline\n",
       " & Name & Value & Hesse Error & Minos Error- & Minos Error+ & Limit- & Limit+ & Fixed?\\\\\n",
       "\\hline\n",
       "0 & $psi2s_{p}$ & -69.4248 & 0.023096 &  &  &  &  & No\\\\\n",
       "\\hline\n",
       "1 & $jpsi_{p}$ & -21.9928 & 0.0112012 &  &  &  &  & No\\\\\n",
       "\\hline\n",
       "2 & $jpsi_{s}$ & 464.531 & 0.227734 &  &  &  &  & No\\\\\n",
       "\\hline\n",
       "3 & $psi2s_{s}$ & 76.5102 & 0.0504588 &  &  &  &  & No\\\\\n",
       "\\hline\n",
       "\\end{tabular}\n",
       "</textarea>\n",
       "</pre>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<hr>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<span>Minos status for psi2s_p: <span style=\"background-color:#92CCA6\">VALID</span></span>\n",
       "<table>\n",
       "    <tr>\n",
       "        <td title=\"lower and upper minos error of the parameter\">Error</td>\n",
       "        <td>-0.02330745637825202</td>\n",
       "        <td>0.025582271077546587</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"Validity of minos error\">Valid</td>\n",
       "        <td style=\"background-color:#92CCA6\">True</td>\n",
       "        <td style=\"background-color:#92CCA6\">True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"Did minos error search hit limit of any parameter?\">At Limit</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"I don't really know what this one means... Post it in issue if you know\">Max FCN</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"New minimum found when doing minos scan.\">New Min</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "</table>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<span>Minos status for jpsi_p: <span style=\"background-color:#FF7878\">PROBLEM</span></span>\n",
       "<table>\n",
       "    <tr>\n",
       "        <td title=\"lower and upper minos error of the parameter\">Error</td>\n",
       "        <td>-0.011201240182803458</td>\n",
       "        <td>0.011201240182803458</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"Validity of minos error\">Valid</td>\n",
       "        <td style=\"background-color:#FF7878\">False</td>\n",
       "        <td style=\"background-color:#FF7878\">False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"Did minos error search hit limit of any parameter?\">At Limit</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"I don't really know what this one means... Post it in issue if you know\">Max FCN</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"New minimum found when doing minos scan.\">New Min</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "</table>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<span>Minos status for jpsi_s: <span style=\"background-color:#FF7878\">PROBLEM</span></span>\n",
       "<table>\n",
       "    <tr>\n",
       "        <td title=\"lower and upper minos error of the parameter\">Error</td>\n",
       "        <td>-0.22773449479366195</td>\n",
       "        <td>0.22773449479366195</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"Validity of minos error\">Valid</td>\n",
       "        <td style=\"background-color:#FF7878\">False</td>\n",
       "        <td style=\"background-color:#FF7878\">False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"Did minos error search hit limit of any parameter?\">At Limit</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"I don't really know what this one means... Post it in issue if you know\">Max FCN</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"New minimum found when doing minos scan.\">New Min</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "</table>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<span>Minos status for psi2s_s: <span style=\"background-color:#FF7878\">PROBLEM</span></span>\n",
       "<table>\n",
       "    <tr>\n",
       "        <td title=\"lower and upper minos error of the parameter\">Error</td>\n",
       "        <td>-0.05045879620181111</td>\n",
       "        <td>0.05045879620181111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"Validity of minos error\">Valid</td>\n",
       "        <td style=\"background-color:#FF7878\">False</td>\n",
       "        <td style=\"background-color:#FF7878\">False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"Did minos error search hit limit of any parameter?\">At Limit</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"I don't really know what this one means... Post it in issue if you know\">Max FCN</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "        <td title=\"New minimum found when doing minos scan.\">New Min</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "        <td style=\"background-color:#92CCA6\">False</td>\n",
       "    </tr>\n",
       "</table>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "psi2s_p: ^{+0.025582271077546587}_{-0.02330745637825202}\n",
      "jpsi_p: ^{+0.011201240182803458}_{-0.011201240182803458}\n",
      "jpsi_s: ^{+0.22773449479366195}_{-0.22773449479366195}\n",
      "psi2s_s: ^{+0.05045879620181111}_{-0.05045879620181111}\n",
      "Function minimum: 18215610.730149463\n"
     ]
    }
   ],
   "source": [
    "nll = zfit.loss.UnbinnedNLL(model=total_f, data=data2, fit_range = (x_min, x_max))\n",
    "\n",
    "minimizer = zfit.minimize.MinuitMinimizer()\n",
    "# minimizer._use_tfgrad = False\n",
    "result = minimizer.minimize(nll)\n",
    "\n",
    "param_errors = result.error()\n",
    "\n",
    "for var, errors in param_errors.items():\n",
    "    print('{}: ^{{+{}}}_{{{}}}'.format(var.name, errors['upper'], errors['lower']))\n",
    "\n",
    "print(\"Function minimum:\", result.fmin)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0005069573828973"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(-3.14+2*np.pi)/np.pi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'5 h, 55 min'"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "display_time(int(395*pdg[\"number_of_decays\"]/100000))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "6 h, 12 min\n"
     ]
    }
   ],
   "source": [
    "print(display_time(22376))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "probs = total_f.pdf(test_q)\n",
    "\n",
    "calcs_test = zfit.run(probs)\n",
    "res_y = zfit.run(jpsi_res(test_q))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.09\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.clf()\n",
    "# plt.plot(x_part, calcs, '.')\n",
    "plt.plot(test_q, calcs_test, label = 'pdf')\n",
    "# plt.plot(test_q, res_y, label = 'res')\n",
    "plt.legend()\n",
    "plt.ylim(0.0, 4e-4)\n",
    "# plt.yscale('log')\n",
    "# plt.xlim(3080, 3110)\n",
    "plt.savefig('test3.png')\n",
    "print(jpsi_width)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}