Newer
Older
Master_thesis / .ipynb_checkpoints / raremodel-nb-checkpoint.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:57: 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 os\n",
    "\n",
    "# os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"-1\"\n",
    "\n",
    "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\n",
    "import tensorflow_probability as tfp\n",
    "tfd = tfp.distributions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# chunksize = 10000\n",
    "# zfit.run.chunking.active = True\n",
    "# zfit.run.chunking.max_n_points = chunksize"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Build model and graphs\n",
    "## Create graphs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def formfactor( q2, subscript, b0, bT, bplus): #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, q) * _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, b0, bplus, bT):\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, \"+\", b0, bplus, bT))**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\", b0, bplus, bT)), 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, b0, bplus, bT):\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, \"+\", b0, bplus, bT) + tf.complex(2.0 * C7eff * (mb + ms)/(mB + mK), ztf.constant(0.0)) * formfactor(q2, \"T\", b0, bplus, bT))**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": 4,
   "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(tf.math.real(-q))))\n",
    "    \n",
    "    big_bracket = tf.where(tf.math.real(y) > ztf.constant(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) - ztf.to_complex(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) - ztf.to_complex(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": [
    "## C_q, qbar constraint"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# r = rho_scale * rho_width/rho_mass * np.cos(rho_phase)*(1-np.tan(rho_phase)*rho_width/rho_mass)\n",
    "# o = omega_scale*np.cos(omega_phase)*omega_width/omega_mass\n",
    "# p = phi_scale*np.cos(phi_phase)*phi_width/phi_mass\n",
    "\n",
    "# # phi_s = np.linspace(-500, 5000, 100000)\n",
    "\n",
    "# # p_ = phi_s*np.cos(phi_phase)*phi_width/phi_mass\n",
    "\n",
    "# # p_y = r+o+p_\n",
    "\n",
    "# # plt.plot(phi_s, p_y)\n",
    "\n",
    "# print(r + o + p)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Build pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "class total_pdf(zfit.pdf.ZPDF):\n",
    "    _N_OBS = 1  # dimension, can be omitted\n",
    "    _PARAMS = ['b0_0', 'b0_1', 'b0_2', \n",
    "               'bplus_0', 'bplus_1', 'bplus_2', \n",
    "               'bT_0', 'bT_1', 'bT_2', \n",
    "               'rho_mass', 'rho_scale', 'rho_phase', 'rho_width',\n",
    "               'jpsi_mass', 'jpsi_scale', 'jpsi_phase', 'jpsi_width',\n",
    "               'psi2s_mass', 'psi2s_scale', 'psi2s_phase', 'psi2s_width',\n",
    "               'p3770_mass', 'p3770_scale', 'p3770_phase', 'p3770_width',\n",
    "               'p4040_mass', 'p4040_scale', 'p4040_phase', 'p4040_width',\n",
    "               'p4160_mass', 'p4160_scale', 'p4160_phase', 'p4160_width',\n",
    "               'p4415_mass', 'p4415_scale', 'p4415_phase', 'p4415_width',\n",
    "               'omega_mass', 'omega_scale', 'omega_phase', 'omega_width',\n",
    "               'phi_mass', 'phi_scale', 'phi_phase', 'phi_width',\n",
    "               'Dbar_mass', 'Dbar_scale', 'Dbar_phase',\n",
    "               'DDstar_mass', 'DDstar_scale', 'DDstar_phase',\n",
    "               'tau_mass', 'C_tt']\n",
    "# the name of the parameters\n",
    "\n",
    "    def _unnormalized_pdf(self, x):\n",
    "        \n",
    "        x = x.unstack_x()\n",
    "        \n",
    "        b0 = [self.params['b0_0'], self.params['b0_1'], self.params['b0_2']]\n",
    "        bplus = [self.params['bplus_0'], self.params['bplus_1'], self.params['bplus_2']]\n",
    "        bT = [self.params['bT_0'], self.params['bT_1'], self.params['bT_2']]\n",
    "        \n",
    "        def rho_res(q):\n",
    "            return resonance(q, _mass = self.params['rho_mass'], scale = self.params['rho_scale'],\n",
    "                             phase = self.params['rho_phase'], width = self.params['rho_width'])\n",
    "    \n",
    "        def omega_res(q):\n",
    "            return resonance(q, _mass = self.params['omega_mass'], scale = self.params['omega_scale'],\n",
    "                             phase = self.params['omega_phase'], width = self.params['omega_width'])\n",
    "        \n",
    "        def phi_res(q):\n",
    "            return resonance(q, _mass = self.params['phi_mass'], scale = self.params['phi_scale'],\n",
    "                             phase = self.params['phi_phase'], width = self.params['phi_width'])\n",
    "\n",
    "        def jpsi_res(q):\n",
    "            return resonance(q, _mass = self.params['jpsi_mass'], scale = self.params['jpsi_scale'],\n",
    "                             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'],\n",
    "                             phase = self.params['psi2s_phase'], width = self.params['psi2s_width'])\n",
    "        \n",
    "        def p3770_res(q):\n",
    "            return resonance(q, _mass = self.params['p3770_mass'], scale = self.params['p3770_scale'],\n",
    "                             phase = self.params['p3770_phase'], width = self.params['p3770_width'])\n",
    "        \n",
    "        def p4040_res(q):\n",
    "            return resonance(q, _mass = self.params['p4040_mass'], scale = self.params['p4040_scale'],\n",
    "                             phase = self.params['p4040_phase'], width = self.params['p4040_width'])\n",
    "        \n",
    "        def p4160_res(q):\n",
    "            return resonance(q, _mass = self.params['p4160_mass'], scale = self.params['p4160_scale'],\n",
    "                             phase = self.params['p4160_phase'], width = self.params['p4160_width'])\n",
    "        \n",
    "        def p4415_res(q):\n",
    "            return resonance(q, _mass = self.params['p4415_mass'], scale = self.params['p4415_scale'],\n",
    "                             phase = self.params['p4415_phase'], width = self.params['p4415_width'])\n",
    "        \n",
    "        def P2_D(q):\n",
    "            Dbar_contrib = ztf.to_complex(self.params['Dbar_scale'])*tf.exp(tf.complex(ztf.constant(0.0), self.params['Dbar_phase']))*ztf.to_complex(h_S(self.params['Dbar_mass'], q))\n",
    "            DDstar_contrib = ztf.to_complex(self.params['DDstar_scale'])*tf.exp(tf.complex(ztf.constant(0.0), self.params['DDstar_phase']))*ztf.to_complex(h_P(self.params['DDstar_mass'], q))\n",
    "            return Dbar_contrib + DDstar_contrib\n",
    "        \n",
    "        def ttau_cusp(q):\n",
    "            return ztf.to_complex(self.params['C_tt'])*(ztf.to_complex((h_S(self.params['tau_mass'], q))) - ztf.to_complex(h_P(self.params['tau_mass'], q)))\n",
    "        \n",
    "\n",
    "        funcs = rho_res(x) + omega_res(x) + phi_res(x) + jpsi_res(x) + psi2s_res(x) + p3770_res(x) + p4040_res(x)+ p4160_res(x) + p4415_res(x) + P2_D(x) + ttau_cusp(x)\n",
    "\n",
    "        vec_f = vec(x, funcs, b0, bplus, bT)\n",
    "\n",
    "        axiv_nr = axiv_nonres(x, b0, bplus, bT)\n",
    "\n",
    "        tot = vec_f + axiv_nr\n",
    "\n",
    "        return tot"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "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": 10,
   "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": [
    "# formfactors\n",
    "\n",
    "b0_0 = zfit.Parameter(\"b0_0\", ztf.constant(0.292), lower_limit = -2.0, upper_limit= 2.0)\n",
    "b0_1 = zfit.Parameter(\"b0_1\", ztf.constant(0.281), lower_limit = -2.0, upper_limit= 2.0)\n",
    "b0_2 = zfit.Parameter(\"b0_2\", ztf.constant(0.150), lower_limit = -2.0, upper_limit= 2.0)\n",
    "\n",
    "bplus_0 = zfit.Parameter(\"bplus_0\", ztf.constant(0.466), lower_limit = -2.0, upper_limit= 2.0)\n",
    "bplus_1 = zfit.Parameter(\"bplus_1\", ztf.constant(-0.885), lower_limit = -2.0, upper_limit= 2.0)\n",
    "bplus_2 = zfit.Parameter(\"bplus_2\", ztf.constant(-0.213), lower_limit = -2.0, upper_limit= 2.0)\n",
    "\n",
    "bT_0 = zfit.Parameter(\"bT_0\", ztf.constant(0.460), lower_limit = -2.0, upper_limit= 2.0)\n",
    "bT_1 = zfit.Parameter(\"bT_1\", ztf.constant(-1.089), lower_limit = -2.0, upper_limit= 2.0)\n",
    "bT_2 = zfit.Parameter(\"bT_2\", ztf.constant(-1.114), lower_limit = -2.0, upper_limit= 2.0)\n",
    "\n",
    "\n",
    "#rho\n",
    "\n",
    "rho_mass, rho_width, rho_phase, rho_scale = pdg[\"rho\"]\n",
    "\n",
    "rho_m = zfit.Parameter(\"rho_m\", ztf.constant(rho_mass), floating = False) #lower_limit = rho_mass - rho_width,\n",
    "#                        upper_limit = rho_mass + rho_width)\n",
    "rho_w = zfit.Parameter(\"rho_w\", ztf.constant(rho_width), floating = False)\n",
    "rho_p = zfit.Parameter(\"rho_p\", ztf.constant(rho_phase), floating = False) #, lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "rho_s = zfit.Parameter(\"rho_s\", ztf.constant(rho_scale), floating = False) #, lower_limit=rho_scale-np.sqrt(rho_scale), upper_limit=rho_scale+np.sqrt(rho_scale))\n",
    "\n",
    "#omega\n",
    "\n",
    "omega_mass, omega_width, omega_phase, omega_scale = pdg[\"omega\"]\n",
    "\n",
    "omega_m = zfit.Parameter(\"omega_m\", ztf.constant(omega_mass), floating = False)\n",
    "omega_w = zfit.Parameter(\"omega_w\", ztf.constant(omega_width), floating = False)\n",
    "omega_p = zfit.Parameter(\"omega_p\", ztf.constant(omega_phase), floating = False) #, lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "omega_s = zfit.Parameter(\"omega_s\", ztf.constant(omega_scale), floating = False) #, lower_limit=omega_scale-np.sqrt(omega_scale), upper_limit=omega_scale+np.sqrt(omega_scale))\n",
    "\n",
    "\n",
    "#phi\n",
    "\n",
    "phi_mass, phi_width, phi_phase, phi_scale = pdg[\"phi\"]\n",
    "\n",
    "phi_m = zfit.Parameter(\"phi_m\", ztf.constant(phi_mass), floating = False)\n",
    "phi_w = zfit.Parameter(\"phi_w\", ztf.constant(phi_width), floating = False)\n",
    "phi_p = zfit.Parameter(\"phi_p\", ztf.constant(phi_phase), floating = False) #, lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "phi_s = zfit.Parameter(\"phi_s\", ztf.constant(phi_scale), floating = False) #, lower_limit=phi_scale-np.sqrt(phi_scale), upper_limit=phi_scale+np.sqrt(phi_scale))\n",
    "\n",
    "#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), lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "jpsi_s = zfit.Parameter(\"jpsi_s\", ztf.constant(jpsi_scale), lower_limit=jpsi_scale-np.sqrt(jpsi_scale), upper_limit=jpsi_scale+np.sqrt(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), lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "psi2s_s = zfit.Parameter(\"psi2s_s\", ztf.constant(psi2s_scale), lower_limit=psi2s_scale-np.sqrt(psi2s_scale), upper_limit=psi2s_scale+np.sqrt(psi2s_scale))\n",
    "\n",
    "#psi(3770)\n",
    "\n",
    "p3770_mass, p3770_width, p3770_phase, p3770_scale = pdg[\"p3770\"]\n",
    "\n",
    "p3770_m = zfit.Parameter(\"p3770_m\", ztf.constant(p3770_mass), floating = False)\n",
    "p3770_w = zfit.Parameter(\"p3770_w\", ztf.constant(p3770_width), floating = False)\n",
    "p3770_p = zfit.Parameter(\"p3770_p\", ztf.constant(p3770_phase), floating = False) #, lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "p3770_s = zfit.Parameter(\"p3770_s\", ztf.constant(p3770_scale), floating = False) #, lower_limit=p3770_scale-np.sqrt(p3770_scale), upper_limit=p3770_scale+np.sqrt(p3770_scale))\n",
    "\n",
    "#psi(4040)\n",
    "\n",
    "p4040_mass, p4040_width, p4040_phase, p4040_scale = pdg[\"p4040\"]\n",
    "\n",
    "p4040_m = zfit.Parameter(\"p4040_m\", ztf.constant(p4040_mass), floating = False)\n",
    "p4040_w = zfit.Parameter(\"p4040_w\", ztf.constant(p4040_width), floating = False)\n",
    "p4040_p = zfit.Parameter(\"p4040_p\", ztf.constant(p4040_phase), floating = False) #, lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "p4040_s = zfit.Parameter(\"p4040_s\", ztf.constant(p4040_scale), floating = False) #, lower_limit=p4040_scale-np.sqrt(p4040_scale), upper_limit=p4040_scale+np.sqrt(p4040_scale))\n",
    "\n",
    "#psi(4160)\n",
    "\n",
    "p4160_mass, p4160_width, p4160_phase, p4160_scale = pdg[\"p4160\"]\n",
    "\n",
    "p4160_m = zfit.Parameter(\"p4160_m\", ztf.constant(p4160_mass), floating = False)\n",
    "p4160_w = zfit.Parameter(\"p4160_w\", ztf.constant(p4160_width), floating = False)\n",
    "p4160_p = zfit.Parameter(\"p4160_p\", ztf.constant(p4160_phase), floating = False) #, lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "p4160_s = zfit.Parameter(\"p4160_s\", ztf.constant(p4160_scale), floating = False) #, lower_limit=p4160_scale-np.sqrt(p4160_scale), upper_limit=p4160_scale+np.sqrt(p4160_scale))\n",
    "\n",
    "#psi(4415)\n",
    "\n",
    "p4415_mass, p4415_width, p4415_phase, p4415_scale = pdg[\"p4415\"]\n",
    "\n",
    "p4415_m = zfit.Parameter(\"p4415_m\", ztf.constant(p4415_mass), floating = False)\n",
    "p4415_w = zfit.Parameter(\"p4415_w\", ztf.constant(p4415_width), floating = False)\n",
    "p4415_p = zfit.Parameter(\"p4415_p\", ztf.constant(p4415_phase), floating = False) #, lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "p4415_s = zfit.Parameter(\"p4415_s\", ztf.constant(p4415_scale), floating = False) #, lower_limit=p4415_scale-np.sqrt(p4415_scale), upper_limit=p4415_scale+np.sqrt(p4415_scale))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dynamic generation of 2 particle contribution"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<zfit.util.temporary.TemporarilySet at 0x2279dbb1160>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "_0 = jpsi_scale*np.cos(jpsi_phase)*jpsi_width/jpsi_mass**3 + psi2s_scale*np.cos(psi2s_phase)*psi2s_width/psi2s_mass**3\n",
    "_1 = p3770_scale*np.cos(p3770_phase)*p3770_width/p3770_mass**3 + p4040_scale*np.cos(p4040_phase)*p4040_width/p4040_mass**3\n",
    "_2 = p4160_scale*np.cos(p4160_phase)*p4160_width/p4160_mass**3 + p4415_scale*np.cos(p4415_phase)*p4415_width/p4415_mass**3\n",
    "\n",
    "C_pert = np.random.uniform(0.03, 0.1)\n",
    "# c_pert = 0.1\n",
    "m_c = 1300\n",
    "\n",
    "cDDstar_phase = 10\n",
    "\n",
    "\n",
    "DDstar_eta = 0\n",
    "Dbar_phase = np.random.uniform(0.0, 2*np.pi)\n",
    "DDstar_phase = np.random.uniform(0.0, 2*np.pi)\n",
    "DDstar_mass = pdg['D0_M']\n",
    "\n",
    "if Dbar_phase < np.pi:\n",
    "    Dbar_phase = 0.0\n",
    "else:\n",
    "    Dbar_phase = np.pi\n",
    "\n",
    "R = (C_pert/(m_c**2) - ((_0 + _1 + _2)))\n",
    "\n",
    "Dbar_mass = (pdg['D0_M']+pdg['Dst_M'])/2\n",
    "\n",
    "Dbar_eta = R/np.cos(Dbar_phase)*(6*Dbar_mass**2)\n",
    "\n",
    "# print(np.cos(Dbar_phase))\n",
    "\n",
    "# cDDstar_phase = R_*10*DDstar_mass**2/DDstar_eta\n",
    "\n",
    "\n",
    "# print(Dbar_eta)\n",
    "\n",
    "\n",
    "Dbar_s = zfit.Parameter(\"Dbar_s\", ztf.constant(Dbar_eta), lower_limit=-1.464, upper_limit=1.464)\n",
    "Dbar_m = zfit.Parameter(\"Dbar_m\", ztf.constant(Dbar_mass), floating = False)\n",
    "Dbar_p = zfit.Parameter(\"Dbar_p\", ztf.constant(Dbar_phase), floating = False)\n",
    "DDstar_s = zfit.Parameter(\"DDstar_s\", ztf.constant(DDstar_eta), floating = False)\n",
    "DDstar_m = zfit.Parameter(\"DDstar_m\", ztf.constant(DDstar_mass), floating = False)\n",
    "DDstar_p = zfit.Parameter(\"DDstar_p\", ztf.constant(DDstar_phase), floating = False)\n",
    "\n",
    "Dbar_s.set_value(0.0)\n",
    "DDstar_s.set_value(0.0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tau parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "tau_m = zfit.Parameter(\"tau_m\", ztf.constant(pdg['tau_M']), floating = False)\n",
    "Ctt = zfit.Parameter(\"Ctt\", ztf.constant(0.0), lower_limit=-0.5, upper_limit=0.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "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",
    "                    p3770_mass = p3770_m, p3770_scale = p3770_s, p3770_phase = p3770_p, p3770_width = p3770_w,\n",
    "                    p4040_mass = p4040_m, p4040_scale = p4040_s, p4040_phase = p4040_p, p4040_width = p4040_w,\n",
    "                    p4160_mass = p4160_m, p4160_scale = p4160_s, p4160_phase = p4160_p, p4160_width = p4160_w,\n",
    "                    p4415_mass = p4415_m, p4415_scale = p4415_s, p4415_phase = p4415_p, p4415_width = p4415_w,\n",
    "                    rho_mass = rho_m, rho_scale = rho_s, rho_phase = rho_p, rho_width = rho_w,\n",
    "                    omega_mass = omega_m, omega_scale = omega_s, omega_phase = omega_p, omega_width = omega_w,\n",
    "                    phi_mass = phi_m, phi_scale = phi_s, phi_phase = phi_p, phi_width = phi_w,\n",
    "                    DDstar_mass = DDstar_m, DDstar_scale = DDstar_s, DDstar_phase = DDstar_p,\n",
    "                    Dbar_mass = Dbar_m, Dbar_scale = Dbar_s, Dbar_phase = Dbar_p,\n",
    "                    tau_mass = tau_m, C_tt = Ctt, b0_0 = b0_0, b0_1 = b0_1, b0_2 = b0_2,\n",
    "                    bplus_0 = bplus_0, bplus_1 = bplus_1, bplus_2 = bplus_2,\n",
    "                    bT_0 = bT_0, bT_1 = bT_1, bT_2 = bT_2)\n",
    "                    \n",
    "                   \n",
    "# print(total_pdf.obs)\n",
    "\n",
    "# print(calcs_test)\n",
    "\n",
    "# for param in total_f.get_dependents():\n",
    "#     print(zfit.run(param))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Test if graphs actually work and compute values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "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, 200000)\n",
    "\n",
    "probs = total_f.pdf(test_q)\n",
    "\n",
    "calcs_test = zfit.run(probs)\n",
    "res_y = zfit.run(jpsi_res(test_q))\n",
    "# f0_y = zfit.run(formfactor(test_q,\"0\", b0, bplus, bT))\n",
    "# fplus_y = zfit.run(formfactor(test_q,\"+\", b0, bplus, bT))\n",
    "# fT_y = zfit.run(formfactor(test_q,\"T\", b0, bplus, bT))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "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, f0_y, label = '0')\n",
    "# plt.plot(test_q, fT_y, label = 'T')\n",
    "# plt.plot(test_q, fplus_y, label = '+')\n",
    "# plt.plot(test_q, res_y, label = 'res')\n",
    "plt.legend()\n",
    "plt.ylim(0.0, 6e-6)\n",
    "# plt.yscale('log')\n",
    "# plt.xlim(770, 785)\n",
    "plt.savefig('test.png')\n",
    "# print(jpsi_width)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "\n",
    "# probs = mixture.prob(test_q)\n",
    "# probs_np = zfit.run(probs)\n",
    "# probs_np *= np.max(calcs_test) / np.max(probs_np)\n",
    "# plt.figure()\n",
    "# plt.semilogy(test_q, probs_np,label=\"importance sampling\")\n",
    "# plt.semilogy(test_q, calcs_test, label = 'pdf')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 0.213/(0.00133+0.213+0.015)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Adjust scaling of different parts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "total_f.update_integration_options(draws_per_dim=200000, mc_sampler=None)\n",
    "# inte = total_f.integrate(limits = (2000, x_max), norm_range=False)\n",
    "# inte_fl = zfit.run(inte)\n",
    "# print(inte_fl)\n",
    "# print(pdg[\"jpsi_BR\"]/pdg[\"NR_BR\"], inte_fl*pdg[\"psi2s_auc\"]/pdg[\"NR_auc\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "# # print(\"jpsi:\", inte_fl)\n",
    "# # print(\"Increase am by factor:\", np.sqrt(pdg[\"jpsi_BR\"]/pdg[\"NR_BR\"]*pdg[\"NR_auc\"]/inte_fl))\n",
    "# # print(\"New amp:\", pdg[\"jpsi\"][3]*np.sqrt(pdg[\"jpsi_BR\"]/pdg[\"NR_BR\"]*pdg[\"NR_auc\"]/inte_fl))\n",
    "\n",
    "# # print(\"psi2s:\", inte_fl)\n",
    "# # print(\"Increase am by factor:\", np.sqrt(pdg[\"psi2s_BR\"]/pdg[\"NR_BR\"]*pdg[\"NR_auc\"]/inte_fl))\n",
    "# # print(\"New amp:\", pdg[\"psi2s\"][3]*np.sqrt(pdg[\"psi2s_BR\"]/pdg[\"NR_BR\"]*pdg[\"NR_auc\"]/inte_fl))\n",
    "\n",
    "# name = \"phi\"\n",
    "\n",
    "# print(name+\":\", inte_fl)\n",
    "# print(\"Increase am by factor:\", np.sqrt(pdg[name+\"_BR\"]/pdg[\"NR_BR\"]*pdg[\"NR_auc\"]/inte_fl))\n",
    "# print(\"New amp:\", pdg[name][3]*np.sqrt(pdg[name+\"_BR\"]/pdg[\"NR_BR\"]*pdg[\"NR_auc\"]/inte_fl))\n",
    "\n",
    "\n",
    "# # print(x_min)\n",
    "# # print(x_max)\n",
    "# # # total_f.update_integration_options(draws_per_dim=2000000, mc_sampler=None)\n",
    "# # total_f.update_integration_options(mc_sampler=lambda dim, num_results,\n",
    "# #                                     dtype: tf.random_uniform(maxval=1., shape=(num_results, dim), dtype=dtype),\n",
    "# #                                    draws_per_dim=1000000)\n",
    "# # # _ = []\n",
    "\n",
    "# # # for i in range(10):\n",
    "\n",
    "# # #     inte = total_f.integrate(limits = (x_min, x_max))\n",
    "# # #     inte_fl = zfit.run(inte)\n",
    "# # #     print(inte_fl)\n",
    "# # #     _.append(inte_fl)\n",
    "\n",
    "# # # print(\"mean:\", np.mean(_))\n",
    "\n",
    "# # _ = time.time()\n",
    "\n",
    "# # inte = total_f.integrate(limits = (x_min, x_max))\n",
    "# # inte_fl = zfit.run(inte)\n",
    "# # print(inte_fl)\n",
    "# # print(\"Time taken: {}\".format(display_time(int(time.time() - _))))\n",
    "\n",
    "# print(pdg['NR_BR']/pdg['NR_auc']*inte_fl)\n",
    "# print(0.25**2*4.2/1000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sampling\n",
    "## Toys"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "    \n",
    "# print(list_of_borders[:9])\n",
    "# print(list_of_borders[-9:])\n",
    "\n",
    "\n",
    "class UniformSampleAndWeights(zfit.util.execution.SessionHolderMixin):\n",
    "    def __call__(self, limits, dtype, n_to_produce):\n",
    "        # n_to_produce = tf.cast(n_to_produce, dtype=tf.int32)\n",
    "        low, high = limits.limit1d\n",
    "        low = tf.cast(low, dtype=dtype)\n",
    "        high = tf.cast(high, dtype=dtype)\n",
    "#         uniform = tfd.Uniform(low=low, high=high)\n",
    "#         uniformjpsi = tfd.Uniform(low=tf.constant(3080, dtype=dtype), high=tf.constant(3112, dtype=dtype))\n",
    "#         uniformpsi2s = tfd.Uniform(low=tf.constant(3670, dtype=dtype), high=tf.constant(3702, dtype=dtype))\n",
    "\n",
    "#         list_of_borders = []\n",
    "#         _p = []\n",
    "#         splits = 10\n",
    "\n",
    "#         _ = np.linspace(x_min, x_max, splits)\n",
    "\n",
    "#         for i in range(splits):\n",
    "#             list_of_borders.append(tf.constant(_[i], dtype=dtype))\n",
    "#             _p.append(tf.constant(1/splits, dtype=dtype))\n",
    "    \n",
    "#         mixture = tfd.MixtureSameFamily(mixture_distribution=tfd.Categorical(probs=_p[:(splits-1)]),\n",
    "#                                         components_distribution=tfd.Uniform(low=list_of_borders[:(splits-1)], \n",
    "#                                                                             high=list_of_borders[-(splits-1):]))\n",
    "        mixture = tfd.MixtureSameFamily(mixture_distribution=tfd.Categorical(probs=[tf.constant(0.05, dtype=dtype),\n",
    "                                                                                    tf.constant(0.93, dtype=dtype),\n",
    "                                                                                    tf.constant(0.05, dtype=dtype),\n",
    "                                                                                    tf.constant(0.065, dtype=dtype),\n",
    "                                                                                    tf.constant(0.04, dtype=dtype),\n",
    "                                                                                    tf.constant(0.05, dtype=dtype)]),\n",
    "                                        components_distribution=tfd.Uniform(low=[tf.constant(x_min, dtype=dtype), \n",
    "                                                                                 tf.constant(3090, dtype=dtype),\n",
    "                                                                                 tf.constant(3681, dtype=dtype), \n",
    "                                                                                 tf.constant(3070, dtype=dtype),\n",
    "                                                                                 tf.constant(1000, dtype=dtype),\n",
    "                                                                                 tf.constant(3660, dtype=dtype)], \n",
    "                                                                            high=[tf.constant(x_max, dtype=dtype),\n",
    "                                                                                  tf.constant(3102, dtype=dtype), \n",
    "                                                                                  tf.constant(3691, dtype=dtype),\n",
    "                                                                                  tf.constant(3110, dtype=dtype),\n",
    "                                                                                  tf.constant(1040, dtype=dtype),\n",
    "                                                                                  tf.constant(3710, dtype=dtype)]))\n",
    "#         dtype = tf.float64\n",
    "#         mixture = tfd.MixtureSameFamily(mixture_distribution=tfd.Categorical(probs=[tf.constant(0.04, dtype=dtype),\n",
    "#                                                                                     tf.constant(0.90, dtype=dtype),\n",
    "#                                                                                     tf.constant(0.02, dtype=dtype),\n",
    "#                                                                                     tf.constant(0.07, dtype=dtype),\n",
    "#                                                                                     tf.constant(0.02, dtype=dtype)]),\n",
    "#                                         components_distribution=tfd.Uniform(low=[tf.constant(x_min, dtype=dtype), \n",
    "#                                                                                  tf.constant(3089, dtype=dtype),\n",
    "#                                                                                  tf.constant(3103, dtype=dtype), \n",
    "#                                                                                  tf.constant(3681, dtype=dtype),\n",
    "#                                                                                  tf.constant(3691, dtype=dtype)], \n",
    "#                                                                             high=[tf.constant(3089, dtype=dtype),\n",
    "#                                                                                   tf.constant(3103, dtype=dtype), \n",
    "#                                                                                   tf.constant(3681, dtype=dtype),\n",
    "#                                                                                   tf.constant(3691, dtype=dtype), \n",
    "#                                                                                   tf.constant(x_max, dtype=dtype)]))\n",
    "#         mixture = tfd.Uniform(tf.constant(x_min, dtype=dtype), tf.constant(x_max, dtype=dtype))\n",
    "#         sample = tf.random.uniform((n_to_produce, 1), dtype=dtype)\n",
    "        sample = mixture.sample((n_to_produce, 1))\n",
    "#         sample = tf.random.uniform((n_to_produce, 1), dtype=dtype)\n",
    "        weights = mixture.prob(sample)[:,0]\n",
    "#         weights = tf.broadcast_to(tf.constant(1., dtype=dtype), shape=(n_to_produce,))\n",
    "        # sample = tf.expand_dims(sample, axis=-1)\n",
    "#         print(sample, weights)\n",
    "        \n",
    "#         weights = tf.ones(shape=(n_to_produce,), dtype=dtype)\n",
    "        weights_max = None\n",
    "        thresholds = tf.random_uniform(shape=(n_to_produce,), dtype=dtype)\n",
    "        return sample, thresholds, weights, weights_max, n_to_produce"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "total_f._sample_and_weights = UniformSampleAndWeights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 0.00133/(0.00133+0.213+0.015)*(x_max-3750)/(x_max-x_min)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "# zfit.settings.set_verbosity(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "# # zfit.run.numeric_checks = False   \n",
    "\n",
    "# nr_of_toys = 1\n",
    "# nevents = int(pdg[\"number_of_decays\"])\n",
    "# nevents = pdg[\"number_of_decays\"]\n",
    "# event_stack = 1000000\n",
    "# # zfit.settings.set_verbosity(10)\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",
    "        \n",
    "#         print(\"{0}/{1} of Toy {2}/{3}\".format(c, calls, toy+1, nr_of_toys))\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*(toy))*((nr_of_toys-toy)*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": 26,
   "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": 27,
   "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_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",
    "# data3 = zfit.data.Data.from_numpy(array=total_samp, obs=obs)\n",
    "\n",
    "# print(total_samp[:nevents].shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "# plt.clf()\n",
    "\n",
    "# bins = int((x_max-x_min)/7)\n",
    "\n",
    "# # calcs = zfit.run(total_test_tf(samp))\n",
    "# print(total_samp[:nevents].shape)\n",
    "\n",
    "# plt.hist(total_samp[:nevents], bins = bins, range = (x_min,x_max), label = 'data')\n",
    "# # plt.plot(test_q, calcs_test*nevents , label = 'pdf')\n",
    "\n",
    "# # plt.plot(sam, calcs, '.')\n",
    "# # plt.plot(test_q, calcs_test)\n",
    "# # plt.yscale('log')\n",
    "# plt.ylim(0, 200)\n",
    "# # plt.xlim(3080, 3110)\n",
    "\n",
    "# plt.legend()\n",
    "\n",
    "# plt.savefig('test2.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "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": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "# jpsi_width"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "# plt.hist(sample, weights=1 / prob(sample))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fitting"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "# start = time.time()\n",
    "\n",
    "# for param in total_f.get_dependents():\n",
    "#     param.randomize()\n",
    "    \n",
    "# # for param in total_f.get_dependents():\n",
    "# #     print(zfit.run(param))\n",
    "    \n",
    "# nll = zfit.loss.UnbinnedNLL(model=total_f, data=data2, fit_range = (x_min, x_max))\n",
    "\n",
    "# minimizer = zfit.minimize.MinuitMinimizer(verbosity = 5)\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)\n",
    "# # print(\"Results:\", result.params)\n",
    "# print(\"Hesse errors:\", result.hesse())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "# print(\"Time taken for fitting: {}\".format(display_time(int(time.time()-start))))\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": 34,
   "metadata": {},
   "outputs": [],
   "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, 10e-6)\n",
    "# # plt.yscale('log')\n",
    "# # plt.xlim(3080, 3110)\n",
    "# plt.savefig('test3.png')\n",
    "# # print(jpsi_width)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "# _tot = 4.37e-7+6.02e-5+4.97e-6\n",
    "# _probs = []\n",
    "# _probs.append(6.02e-5/_tot)\n",
    "# _probs.append(4.97e-6/_tot)\n",
    "# _probs.append(4.37e-7/_tot)\n",
    "# print(_probs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "# dtype = 'float64'\n",
    "# # mixture = tfd.Uniform(tf.constant(x_min, dtype=dtype), tf.constant(x_max, dtype=dtype))\n",
    "# mixture = tfd.MixtureSameFamily(mixture_distribution=tfd.Categorical(probs=[tf.constant(0.007, dtype=dtype),\n",
    "#                                                                             tf.constant(0.917, dtype=dtype),\n",
    "#                                                                             tf.constant(0.076, dtype=dtype)]),\n",
    "#                                 components_distribution=tfd.Uniform(low=[tf.constant(x_min, dtype=dtype), \n",
    "#                                                                          tf.constant(3080, dtype=dtype),\n",
    "#                                                                          tf.constant(3670, dtype=dtype)], \n",
    "#                                                                     high=[tf.constant(x_max, dtype=dtype),\n",
    "#                                                                           tf.constant(3112, dtype=dtype), \n",
    "#                                                                           tf.constant(3702, dtype=dtype)]))\n",
    "# # for i in range(10):\n",
    "# #     print(zfit.run(mixture.prob(mixture.sample((10, 1)))))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "# print((zfit.run(jpsi_p)%(2*np.pi))/np.pi)\n",
    "# print((zfit.run(psi2s_p)%(2*np.pi))/np.pi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "#         def jpsi_res(q):\n",
    "#             return resonance(q, _mass = jpsi_mass, scale = jpsi_scale,\n",
    "#                              phase = jpsi_phase, width = jpsi_width)\n",
    "\n",
    "#         def psi2s_res(q):\n",
    "#             return resonance(q, _mass = psi2s_mass, scale = psi2s_scale,\n",
    "#                              phase = psi2s_phase, width = psi2s_width)\n",
    "        \n",
    "#         def p3770_res(q):\n",
    "#             return resonance(q, _mass = p3770_mass, scale = p3770_scale,\n",
    "#                              phase = p3770_phase, width = p3770_width)\n",
    "        \n",
    "#         def p4040_res(q):\n",
    "#             return resonance(q, _mass = p4040_mass, scale = p4040_scale,\n",
    "#                              phase = p4040_phase, width = p4040_width)\n",
    "        \n",
    "#         def p4160_res(q):\n",
    "#             return resonance(q, _mass = p4160_mass, scale = p4160_scale,\n",
    "#                              phase = p4160_phase, width = p4160_width)\n",
    "        \n",
    "#         def p4415_res(q):\n",
    "#             return resonance(q, _mass = p4415_mass, scale = p4415_scale,\n",
    "#                              phase = p4415_phase, width = p4415_width)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 0.15**2*4.2/1000\n",
    "# result.hesse()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Toy 0: Generating data...\n",
      "Toy 0: Data generation finished\n",
      "Toy 0: Loading data...\n",
      "Toy 0: Loading data finished\n",
      "Toy 0: Fitting pdf...\n",
      "------------------------------------------------------------------\n",
      "| FCN = 5.224E+04               |    Ncalls=1261 (1261 total)    |\n",
      "| EDM = 0.000626 (Goal: 5E-06)  |            up = 0.5            |\n",
      "------------------------------------------------------------------\n",
      "|  Valid Min.   | Valid Param.  | Above EDM | Reached call limit |\n",
      "------------------------------------------------------------------\n",
      "|     True      |     True      |   False   |       False        |\n",
      "------------------------------------------------------------------\n",
      "| Hesse failed  |   Has cov.    | Accurate  | Pos. def. | Forced |\n",
      "------------------------------------------------------------------\n",
      "|     False     |     True      |   False   |   False   |  True  |\n",
      "------------------------------------------------------------------\n",
      "Toy 0: Fitting finished\n",
      "Function minimum: 52244.05952457551\n",
      "---------------------------------------------------------------------------------------------\n",
      "|   | Name    |   Value   | Hesse Err | Minos Err- | Minos Err+ | Limit-  | Limit+  | Fixed |\n",
      "---------------------------------------------------------------------------------------------\n",
      "| 0 | b0_1    |   -2.0    |    3.7    |            |            |   -2    |    2    |       |\n",
      "| 1 | bplus_1 |   -2.0    |    2.6    |            |            |   -2    |    2    |       |\n",
      "| 2 | bT_1    |   -1.98   |    0.05   |            |            |   -2    |    2    |       |\n",
      "| 3 | Ctt     |   -0.5    |    0.8    |            |            |  -0.5   |   0.5   |       |\n",
      "| 4 | bplus_0 |   0.27    |   0.09    |            |            |   -2    |    2    |       |\n",
      "| 5 | b0_2    |   -1.9    |    2.8    |            |            |   -2    |    2    |       |\n",
      "| 6 | bT_0    |   0.325   |   0.008   |            |            |   -2    |    2    |       |\n",
      "| 7 | psi2s_p |   3.53    |   0.15    |            |            |-6.28319 | 6.28319 |       |\n",
      "| 8 | bT_2    |   1.99    |   0.28    |            |            |   -2    |    2    |       |\n",
      "| 9 | bplus_2 |   -1.7    |    2.1    |            |            |   -2    |    2    |       |\n",
      "| 10| jpsi_s  |  1.000E4  |  0.015E4  |            |            | 9797.52 | 9996.48 |       |\n",
      "| 11| psi2s_s |   1430    |    40     |            |            | 1358.64 | 1433.36 |       |\n",
      "| 12| b0_0    |   0.18    |   0.76    |            |            |   -2    |    2    |       |\n",
      "| 13| Dbar_s  |   0.67    |   0.21    |            |            | -1.464  |  1.464  |       |\n",
      "| 14| jpsi_p  |    3.2    |    0.6    |            |            |-6.28319 | 6.28319 |       |\n",
      "---------------------------------------------------------------------------------------------\n",
      "-------------------------------------------------------------------------------------------------------------------------------------\n",
      "|         |    b0_1 bplus_1    bT_1     Ctt bplus_0    b0_2    bT_0 psi2s_p    bT_2 bplus_2  jpsi_s psi2s_s    b0_0  Dbar_s  jpsi_p |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------\n",
      "|    b0_1 |   1.000   0.665  -0.601   0.260   0.568   0.573  -0.560   0.465  -0.189  -0.878   0.218   0.050   0.606   0.008   0.041 |\n",
      "| bplus_1 |   0.665   1.000  -0.588   0.285   0.473   0.481  -0.543   0.388  -0.189  -0.826   0.231   0.058   0.555  -0.138   0.083 |\n",
      "|    bT_1 |  -0.601  -0.588   1.000  -0.234  -0.496  -0.437   0.479  -0.359   0.159   0.772  -0.166  -0.054  -0.510   0.024  -0.072 |\n",
      "|     Ctt |   0.260   0.285  -0.234   1.000   0.298   0.192  -0.221   0.253  -0.073  -0.356   0.091  -0.035   0.233   0.237  -0.037 |\n",
      "| bplus_0 |   0.568   0.473  -0.496   0.298   1.000   0.409  -0.453   0.281  -0.163  -0.681   0.204   0.071   0.459  -0.271   0.105 |\n",
      "|    b0_2 |   0.573   0.481  -0.437   0.192   0.409   1.000  -0.407   0.336  -0.138  -0.635   0.159   0.037   0.531  -0.001   0.029 |\n",
      "|    bT_0 |  -0.560  -0.543   0.479  -0.221  -0.453  -0.407   1.000  -0.328   0.150   0.713  -0.157  -0.051  -0.472   0.036  -0.070 |\n",
      "| psi2s_p |   0.465   0.388  -0.359   0.253   0.281   0.336  -0.328   1.000  -0.117  -0.557   0.127   0.083   0.369  -0.222   0.162 |\n",
      "|    bT_2 |  -0.189  -0.189   0.159  -0.073  -0.163  -0.138   0.150  -0.117   1.000   0.246  -0.050  -0.017  -0.163  -0.002  -0.020 |\n",
      "| bplus_2 |  -0.878  -0.826   0.772  -0.356  -0.681  -0.635   0.713  -0.557   0.246   1.000  -0.291  -0.072  -0.750   0.087  -0.079 |\n",
      "|  jpsi_s |   0.218   0.231  -0.166   0.091   0.204   0.159  -0.157   0.127  -0.050  -0.291   1.000   0.027   0.190   0.014   0.030 |\n",
      "| psi2s_s |   0.050   0.058  -0.054  -0.035   0.071   0.037  -0.051   0.083  -0.017  -0.072   0.027   1.000   0.043   0.101  -0.015 |\n",
      "|    b0_0 |   0.606   0.555  -0.510   0.233   0.459   0.531  -0.472   0.369  -0.163  -0.750   0.190   0.043   1.000  -0.050   0.063 |\n",
      "|  Dbar_s |   0.008  -0.138   0.024   0.237  -0.271  -0.001   0.036  -0.222  -0.002   0.087   0.014   0.101  -0.050   1.000   0.141 |\n",
      "|  jpsi_p |   0.041   0.083  -0.072  -0.037   0.105   0.029  -0.070   0.162  -0.020  -0.079   0.030  -0.015   0.063   0.141   1.000 |\n",
      "-------------------------------------------------------------------------------------------------------------------------------------\n",
      "Hesse errors: OrderedDict([(<zfit.Parameter 'b0_1' floating=True>, {'error': 3.7497478938564335}), (<zfit.Parameter 'bplus_1' floating=True>, {'error': 2.583900371125427}), (<zfit.Parameter 'bT_1' floating=True>, {'error': 0.05116452428878748}), (<zfit.Parameter 'Ctt' floating=True>, {'error': 0.8048991558989059}), (<zfit.Parameter 'bplus_0' floating=True>, {'error': 0.09051918266368353}), (<zfit.Parameter 'b0_2' floating=True>, {'error': 2.8398689024624773}), (<zfit.Parameter 'bT_0' floating=True>, {'error': 0.008312746297318485}), (<zfit.Parameter 'psi2s_p' floating=True>, {'error': 0.14518466085144688}), (<zfit.Parameter 'bT_2' floating=True>, {'error': 0.28009841873882135}), (<zfit.Parameter 'bplus_2' floating=True>, {'error': 2.127901204620494}), (<zfit.Parameter 'jpsi_s' floating=True>, {'error': 151.85677990046224}), (<zfit.Parameter 'psi2s_s' floating=True>, {'error': 44.596492883806036}), (<zfit.Parameter 'b0_0' floating=True>, {'error': 0.7563153884664282}), (<zfit.Parameter 'Dbar_s' floating=True>, {'error': 0.20862304880841087}), (<zfit.Parameter 'jpsi_p' floating=True>, {'error': 0.5512466145330324})])\n",
      "Toy 1/5\n",
      "Time taken: 4 min, 31 s\n",
      "Projected time left: 18 min, 6 s\n",
      "Toy 1: Generating data...\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-48-09e5b88853cf>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m     31\u001b[0m     \u001b[1;32mfor\u001b[0m \u001b[0mcall\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcalls\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     32\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 33\u001b[1;33m         \u001b[0msampler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mresample\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mn\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mevent_stack\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     34\u001b[0m         \u001b[0ms\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msampler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0munstack_x\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     35\u001b[0m         \u001b[0msam\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mzfit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\.conda\\envs\\rmd\\lib\\site-packages\\zfit\\core\\data.py\u001b[0m in \u001b[0;36mresample\u001b[1;34m(self, param_values, n)\u001b[0m\n\u001b[0;32m    637\u001b[0m                     \u001b[1;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Cannot set a new `n` if not a Tensor-like object was given\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    638\u001b[0m                 \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mn_samples\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mn\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msession\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msess\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 639\u001b[1;33m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msess\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msample_holder\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minitializer\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    640\u001b[0m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_initial_resampled\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    641\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\.conda\\envs\\rmd\\lib\\site-packages\\tensorflow\\python\\client\\session.py\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m    927\u001b[0m     \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    928\u001b[0m       result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[1;32m--> 929\u001b[1;33m                          run_metadata_ptr)\n\u001b[0m\u001b[0;32m    930\u001b[0m       \u001b[1;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    931\u001b[0m         \u001b[0mproto_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\.conda\\envs\\rmd\\lib\\site-packages\\tensorflow\\python\\client\\session.py\u001b[0m in \u001b[0;36m_run\u001b[1;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m   1150\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m \u001b[1;32mor\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mhandle\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mfeed_dict_tensor\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1151\u001b[0m       results = self._do_run(handle, final_targets, final_fetches,\n\u001b[1;32m-> 1152\u001b[1;33m                              feed_dict_tensor, options, run_metadata)\n\u001b[0m\u001b[0;32m   1153\u001b[0m     \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1154\u001b[0m       \u001b[0mresults\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\.conda\\envs\\rmd\\lib\\site-packages\\tensorflow\\python\\client\\session.py\u001b[0m in \u001b[0;36m_do_run\u001b[1;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m   1326\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1327\u001b[0m       return self._do_call(_run_fn, feeds, fetches, targets, options,\n\u001b[1;32m-> 1328\u001b[1;33m                            run_metadata)\n\u001b[0m\u001b[0;32m   1329\u001b[0m     \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1330\u001b[0m       \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_do_call\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0m_prun_fn\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeeds\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfetches\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\.conda\\envs\\rmd\\lib\\site-packages\\tensorflow\\python\\client\\session.py\u001b[0m in \u001b[0;36m_do_call\u001b[1;34m(self, fn, *args)\u001b[0m\n\u001b[0;32m   1332\u001b[0m   \u001b[1;32mdef\u001b[0m \u001b[0m_do_call\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1333\u001b[0m     \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1334\u001b[1;33m       \u001b[1;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1335\u001b[0m     \u001b[1;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1336\u001b[0m       \u001b[0mmessage\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcompat\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mas_text\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0me\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\.conda\\envs\\rmd\\lib\\site-packages\\tensorflow\\python\\client\\session.py\u001b[0m in \u001b[0;36m_run_fn\u001b[1;34m(feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[0;32m   1317\u001b[0m       \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_extend_graph\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1318\u001b[0m       return self._call_tf_sessionrun(\n\u001b[1;32m-> 1319\u001b[1;33m           options, feed_dict, fetch_list, target_list, run_metadata)\n\u001b[0m\u001b[0;32m   1320\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1321\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0m_prun_fn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mhandle\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\.conda\\envs\\rmd\\lib\\site-packages\\tensorflow\\python\\client\\session.py\u001b[0m in \u001b[0;36m_call_tf_sessionrun\u001b[1;34m(self, options, feed_dict, fetch_list, target_list, run_metadata)\u001b[0m\n\u001b[0;32m   1405\u001b[0m     return tf_session.TF_SessionRun_wrapper(\n\u001b[0;32m   1406\u001b[0m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0moptions\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtarget_list\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1407\u001b[1;33m         run_metadata)\n\u001b[0m\u001b[0;32m   1408\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1409\u001b[0m   \u001b[1;32mdef\u001b[0m \u001b[0m_call_tf_sessionprun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "# zfit.run.numeric_checks = False   \n",
    "\n",
    "Ctt_list = []\n",
    "Ctt_error_list = []\n",
    "\n",
    "nr_of_toys = 5\n",
    "nevents = int(pdg[\"number_of_decays\"])\n",
    "nevents = pdg[\"number_of_decays\"]\n",
    "event_stack = 1000000\n",
    "# zfit.settings.set_verbosity(10)\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",
    "    ### Generate data\n",
    "    \n",
    "    print(\"Toy {}: Generating data...\".format(toy))\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",
    "        \n",
    "        with open(\"data/zfit_toys/toy_{0}/{1}.pkl\".format(toy, call), \"wb\") as f:\n",
    "            pkl.dump(sam, f, pkl.HIGHEST_PROTOCOL)\n",
    "            \n",
    "    print(\"Toy {}: Data generation finished\".format(toy))\n",
    "        \n",
    "    ### Load data\n",
    "    \n",
    "    print(\"Toy {}: Loading data...\".format(toy))\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",
    "    data = zfit.data.Data.from_numpy(array=total_samp[:int(nevents)], obs=obs)\n",
    "    \n",
    "    print(\"Toy {}: Loading data finished\".format(toy))\n",
    "\n",
    "    ### Fit data\n",
    "    \n",
    "    print(\"Toy {}: Fitting pdf...\".format(toy))\n",
    "\n",
    "    for param in total_f.get_dependents():\n",
    "        param.randomize()\n",
    "\n",
    "    nll = zfit.loss.UnbinnedNLL(model=total_f, data=data, fit_range = (jpsi_mass+50.0, psi2s_mass-50.0))\n",
    "\n",
    "    minimizer = zfit.minimize.MinuitMinimizer(verbosity = 5)\n",
    "    # minimizer._use_tfgrad = False\n",
    "    result = minimizer.minimize(nll)\n",
    "    \n",
    "    print(\"Toy {}: Fitting finished\".format(toy))\n",
    "\n",
    "    print(\"Function minimum:\", result.fmin)\n",
    "    print(\"Hesse errors:\", result.hesse())\n",
    "    \n",
    "    params = result.params\n",
    "    Ctt_list.append(params[Ctt]['value'])\n",
    "    Ctt_error_list.append(params[Ctt]['minuit_hesse']['error'])\n",
    "\n",
    "    print(\"Toy {0}/{1}\".format(toy+1, nr_of_toys))\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*(toy))*((nr_of_toys-toy)*calls-c)))))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mean Ctt value = -0.4999046298846563\n",
      "Mean Ctt error = 0.8048991558989059\n"
     ]
    }
   ],
   "source": [
    "print('Mean Ctt value = {}'.format(np.mean(Ctt_list)))\n",
    "print('Mean Ctt error = {}'.format(np.mean(Ctt_error_list)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "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": [
    "calcs_test = zfit.run(probs)\n",
    "res_y = zfit.run(jpsi_res(test_q))\n",
    "plt.clf()\n",
    "# plt.plot(x_part, calcs, '.')\n",
    "plt.plot(test_q, calcs_test, label = 'pdf')\n",
    "# plt.plot(test_q, f0_y, label = '0')\n",
    "# plt.plot(test_q, fT_y, label = 'T')\n",
    "# plt.plot(test_q, fplus_y, label = '+')\n",
    "# plt.plot(test_q, res_y, label = 'res')\n",
    "plt.legend()\n",
    "plt.ylim(0.0, 6e-5)\n",
    "# plt.yscale('log')\n",
    "# plt.xlim(770, 785)\n",
    "plt.savefig('test2.png')"
   ]
  },
  {
   "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
}