Newer
Older
Master_thesis / .ipynb_checkpoints / raremodel-nb-checkpoint.ipynb
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Import"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "# os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"-1\"\n",
    "import random\n",
    "import numpy as np\n",
    "from pdg_const1 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\n",
    "\n",
    "from matplotlib.pyplot import figure"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "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": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def formfactor(q2, subscript, b0_0, b0_1, b0_2, bplus_0, bplus_1, bplus_2, bT_0, bT_1, bT_2): #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",
    "\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",
    "        b0 = [b0_0, b0_1, b0_2]\n",
    "\n",
    "        for i in range(N):\n",
    "            _sum += b0[i]*(tf.pow(z,i))\n",
    "\n",
    "        return ztf.to_complex(prefactor * _sum)\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",
    "            bT = [bT_0, bT_1, bT_2]\n",
    "            for i in range(N):\n",
    "                _sum += bT[i] * (tf.pow(z, i) - ((-1)**(i-N)) * (i/N) * tf.pow(z, N))\n",
    "        else:\n",
    "            bplus = [bplus_0, bplus_1, bplus_2]\n",
    "            for i in range(N):\n",
    "                _sum += bplus[i] * (tf.pow(z, i) - ((-1)**(i-N)) * (i/N) * tf.pow(z, N))\n",
    "\n",
    "        return ztf.to_complex(prefactor * _sum)\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",
    "\n",
    "def axiv_nonres(q, b0_0, b0_1, b0_2, bplus_0, bplus_1, bplus_2, bT_0, bT_1, bT_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",
    "    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 = 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. * tf.pow(kabs,2) * tf.pow(beta,2) * tf.pow(tf.abs(ztf.to_complex(C10eff)*formfactor(q2, \"+\", b0_0, b0_1, b0_2, bplus_0, bplus_1, bplus_2, bT_0, bT_1, bT_2)),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(ztf.to_complex(C10eff) * formfactor(q2, \"0\", b0_0, b0_1, b0_2, bplus_0, bplus_1, bplus_2, bT_0, bT_1, bT_2)), 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 * q\n",
    "\n",
    "def vec(q, funcs, b0_0, b0_1, b0_2, bplus_0, bplus_1, bplus_2, bT_0, bT_1, bT_2):\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 = 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 = tf.pow(kabs,2) * (1. - 1./3. * beta)\n",
    "\n",
    "    abs_bracket = tf.pow(tf.abs(c9eff(q, funcs) * formfactor(q2, \"+\", b0_0, b0_1, b0_2, bplus_0, bplus_1, bplus_2, bT_0, bT_1, bT_2) + ztf.to_complex(2.0 * C7eff * (mb + ms)/(mB + mK)) * formfactor(q2, \"T\", b0_0, b0_1, b0_2, bplus_0, bplus_1, bplus_2, bT_0, bT_1, bT_2)),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 * q\n",
    "\n",
    "def c9eff(q, funcs):\n",
    "\n",
    "    C9eff_nr = ztf.to_complex(ztf.constant(pdg['C9eff']))\n",
    "\n",
    "    c9 = C9eff_nr + funcs\n",
    "\n",
    "    return c9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "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": [
    "## Build pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class total_pdf_cut(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",
    "               'Dstar_mass', 'DDstar_scale', 'DDstar_phase', 'D_mass',\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  ztf.to_complex(tf.pow(q, 2) / tf.pow(self.params['jpsi_mass'], 2)) * resonance(q, _mass = self.params['jpsi_mass'], \n",
    "                                                                                  scale = self.params['jpsi_scale'],\n",
    "                                                                                  phase = self.params['jpsi_phase'], \n",
    "                                                                                  width = self.params['jpsi_width'])\n",
    "        def psi2s_res(q):\n",
    "            return ztf.to_complex(tf.pow(q, 2) / tf.pow(self.params['psi2s_mass'], 2)) * resonance(q, _mass = self.params['psi2s_mass'], \n",
    "                                                                                   scale = self.params['psi2s_scale'],\n",
    "                                                                                   phase = self.params['psi2s_phase'], \n",
    "                                                                                   width = self.params['psi2s_width'])\n",
    "        def p3770_res(q):\n",
    "            return ztf.to_complex(tf.pow(q, 2) / tf.pow(self.params['p3770_mass'], 2)) * resonance(q, _mass = self.params['p3770_mass'], \n",
    "                                                                                   scale = self.params['p3770_scale'],\n",
    "                                                                                   phase = self.params['p3770_phase'], \n",
    "                                                                                   width = self.params['p3770_width'])\n",
    "        \n",
    "        def p4040_res(q):\n",
    "            return ztf.to_complex(tf.pow(q, 2) / tf.pow(self.params['p4040_mass'], 2)) * resonance(q, _mass = self.params['p4040_mass'], \n",
    "                                                                                   scale = self.params['p4040_scale'],\n",
    "                                                                                   phase = self.params['p4040_phase'], \n",
    "                                                                                   width = self.params['p4040_width'])\n",
    "        \n",
    "        def p4160_res(q):\n",
    "            return ztf.to_complex(tf.pow(q, 2) / tf.pow(self.params['p4160_mass'], 2)) * resonance(q, _mass = self.params['p4160_mass'], \n",
    "                                                                                   scale = self.params['p4160_scale'],\n",
    "                                                                                   phase = self.params['p4160_phase'], \n",
    "                                                                                   width = self.params['p4160_width'])\n",
    "        \n",
    "        def p4415_res(q):\n",
    "            return ztf.to_complex(tf.pow(q, 2) / tf.pow(self.params['p4415_mass'], 2)) * resonance(q, _mass = self.params['p4415_mass'], \n",
    "                                                                                   scale = self.params['p4415_scale'],\n",
    "                                                                                   phase = self.params['p4415_phase'], \n",
    "                                                                                   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['Dstar_mass'], q)) + ztf.to_complex(h_P(self.params['D_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_0, b0_1, b0_2, bplus_0, bplus_1, bplus_2, bT_0, bT_1, bT_2)\n",
    "\n",
    "        axiv_nr = axiv_nonres(x, b0_0, b0_1, b0_2, bplus_0, bplus_1, bplus_2, bT_0, bT_1, bT_2)\n",
    "\n",
    "        tot = vec_f + axiv_nr\n",
    "        \n",
    "        #Cut out jpsi and psi2s\n",
    "        \n",
    "        tot = tf.where(tf.math.logical_or(x < ztf.constant(jpsi_mass-60.), x > ztf.constant(jpsi_mass+70.)), tot, 0.0*tot)\n",
    "        \n",
    "        tot = tf.where(tf.math.logical_or(x < ztf.constant(psi2s_mass-50.), x > ztf.constant(psi2s_mass+50.)), tot, 0.0*tot)\n",
    "        \n",
    "        return tot\n",
    "    \n",
    "class total_pdf_full(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",
    "               'Dstar_mass', 'DDstar_scale', 'DDstar_phase', 'D_mass',\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  ztf.to_complex(tf.pow(q, 2) / tf.pow(self.params['jpsi_mass'], 2)) * resonance(q, _mass = self.params['jpsi_mass'], \n",
    "                                                                                  scale = self.params['jpsi_scale'],\n",
    "                                                                                  phase = self.params['jpsi_phase'], \n",
    "                                                                                  width = self.params['jpsi_width'])\n",
    "        def psi2s_res(q):\n",
    "            return ztf.to_complex(tf.pow(q, 2) / tf.pow(self.params['psi2s_mass'], 2)) * resonance(q, _mass = self.params['psi2s_mass'], \n",
    "                                                                                   scale = self.params['psi2s_scale'],\n",
    "                                                                                   phase = self.params['psi2s_phase'], \n",
    "                                                                                   width = self.params['psi2s_width'])\n",
    "        def p3770_res(q):\n",
    "            return ztf.to_complex(tf.pow(q, 2) / tf.pow(self.params['p3770_mass'], 2)) * resonance(q, _mass = self.params['p3770_mass'], \n",
    "                                                                                   scale = self.params['p3770_scale'],\n",
    "                                                                                   phase = self.params['p3770_phase'], \n",
    "                                                                                   width = self.params['p3770_width'])\n",
    "        \n",
    "        def p4040_res(q):\n",
    "            return ztf.to_complex(tf.pow(q, 2) / tf.pow(self.params['p4040_mass'], 2)) * resonance(q, _mass = self.params['p4040_mass'], \n",
    "                                                                                   scale = self.params['p4040_scale'],\n",
    "                                                                                   phase = self.params['p4040_phase'], \n",
    "                                                                                   width = self.params['p4040_width'])\n",
    "        \n",
    "        def p4160_res(q):\n",
    "            return ztf.to_complex(tf.pow(q, 2) / tf.pow(self.params['p4160_mass'], 2)) * resonance(q, _mass = self.params['p4160_mass'], \n",
    "                                                                                   scale = self.params['p4160_scale'],\n",
    "                                                                                   phase = self.params['p4160_phase'], \n",
    "                                                                                   width = self.params['p4160_width'])\n",
    "        \n",
    "        def p4415_res(q):\n",
    "            return ztf.to_complex(tf.pow(q, 2) / tf.pow(self.params['p4415_mass'], 2)) * resonance(q, _mass = self.params['p4415_mass'], \n",
    "                                                                                   scale = self.params['p4415_scale'],\n",
    "                                                                                   phase = self.params['p4415_phase'], \n",
    "                                                                                   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['Dstar_mass'], q)) + ztf.to_complex(h_P(self.params['D_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_0, b0_1, b0_2, bplus_0, bplus_1, bplus_2, bT_0, bT_1, bT_2)\n",
    "\n",
    "        axiv_nr = axiv_nonres(x, b0_0, b0_1, b0_2, bplus_0, bplus_1, bplus_2, bT_0, bT_1, bT_2)\n",
    "\n",
    "        tot = vec_f + axiv_nr\n",
    "        \n",
    "        #Cut out jpsi and psi2s\n",
    "        \n",
    "#         tot = tf.where(tf.math.logical_or(x < ztf.constant(jpsi_mass-60.), x > ztf.constant(jpsi_mass+70.)), tot, 0.0*tot)\n",
    "        \n",
    "#         tot = tf.where(tf.math.logical_or(x < ztf.constant(psi2s_mass-50.), x > ztf.constant(psi2s_mass+50.)), tot, 0.0*tot)\n",
    "        \n",
    "        return tot"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# formfactors\n",
    "\n",
    "b0_0 = zfit.Parameter(\"b0_0\", ztf.constant(0.292), floating = False) #, lower_limit = -2.0, upper_limit= 2.0)\n",
    "b0_1 = zfit.Parameter(\"b0_1\", ztf.constant(0.281), floating = False) #, lower_limit = -2.0, upper_limit= 2.0)\n",
    "b0_2 = zfit.Parameter(\"b0_2\", ztf.constant(0.150), floating = False) #, 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), floating = False) #, lower_limit = -2.0, upper_limit= 2.0)\n",
    "bT_1 = zfit.Parameter(\"bT_1\", ztf.constant(-1.089), floating = False) #, lower_limit = -2.0, upper_limit= 2.0)\n",
    "bT_2 = zfit.Parameter(\"bT_2\", ztf.constant(-1.114), floating = False) #, 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, 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), lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "rho_s = zfit.Parameter(\"rho_s\", ztf.constant(rho_scale), 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), lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "omega_s = zfit.Parameter(\"omega_s\", ztf.constant(omega_scale), 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), lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "phi_s = zfit.Parameter(\"phi_s\", ztf.constant(phi_scale), 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",
    "\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), floating = False) #, 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), floating = False) #, 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), lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "p3770_s = zfit.Parameter(\"p3770_s\", ztf.constant(p3770_scale), 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), lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "p4040_s = zfit.Parameter(\"p4040_s\", ztf.constant(p4040_scale), 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), lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "p4160_s = zfit.Parameter(\"p4160_s\", ztf.constant(p4160_scale), 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), lower_limit=-2*np.pi, upper_limit=2*np.pi)\n",
    "p4415_s = zfit.Parameter(\"p4415_s\", ztf.constant(p4415_scale), 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": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "m_c = 1300\n",
    "\n",
    "Dbar_phase = 0.0\n",
    "DDstar_phase = 0.0\n",
    "Dstar_mass = pdg['Dst_M']\n",
    "Dbar_mass = pdg['D0_M']\n",
    "D_mass = pdg['D0_M']\n",
    "\n",
    "Dbar_s = zfit.Parameter(\"Dbar_s\", ztf.constant(0.0), lower_limit=-0.3, upper_limit=0.3)\n",
    "Dbar_m = zfit.Parameter(\"Dbar_m\", ztf.constant(Dbar_mass), floating = False)\n",
    "Dbar_p = zfit.Parameter(\"Dbar_p\", ztf.constant(Dbar_phase), lower_limit=-2*np.pi, upper_limit=2*np.pi)#, floating = False)\n",
    "DDstar_s = zfit.Parameter(\"DDstar_s\", ztf.constant(0.0), lower_limit=-0.3, upper_limit=0.3)#, floating = False)\n",
    "Dstar_m = zfit.Parameter(\"Dstar_m\", ztf.constant(Dstar_mass), floating = False)\n",
    "D_m = zfit.Parameter(\"D_m\", ztf.constant(D_mass), floating = False)\n",
    "DDstar_p = zfit.Parameter(\"DDstar_p\", ztf.constant(DDstar_phase), lower_limit=-2*np.pi, upper_limit=2*np.pi)#, floating = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tau parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "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=-2.5, upper_limit=2.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_min = 2*pdg['muon_M']\n",
    "x_max = (pdg[\"Bplus_M\"]-pdg[\"Ks_M\"]-0.1)\n",
    "\n",
    "# # Full spectrum\n",
    "\n",
    "obs_toy = zfit.Space('q', limits = (x_min, x_max))\n",
    "\n",
    "# Jpsi and Psi2s cut out\n",
    "\n",
    "obs1 = zfit.Space('q', limits = (x_min, jpsi_mass - 60.))\n",
    "obs2 = zfit.Space('q', limits = (jpsi_mass + 70., psi2s_mass - 50.))\n",
    "obs3 = zfit.Space('q', limits = (psi2s_mass + 50., x_max))\n",
    "\n",
    "obs_fit = obs1 + obs2 + obs3\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 pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "total_f = total_pdf_cut(obs=obs_toy, 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",
    "                    Dstar_mass = Dstar_m, DDstar_scale = DDstar_s, DDstar_phase = DDstar_p, D_mass = D_m,\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",
    "total_f_fit = total_pdf_full(obs=obs_fit, 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",
    "                    Dstar_mass = Dstar_m, DDstar_scale = DDstar_s, DDstar_phase = DDstar_p, D_mass = D_m,\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",
    "# 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": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# total_f_fit.normalization(obs_fit)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Test if graphs actually work and compute values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "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",
    "\n",
    "\n",
    "test_q = np.linspace(x_min, x_max, int(2e6))\n",
    "\n",
    "probs = total_f_fit.pdf(test_q, norm_range=False)\n",
    "\n",
    "calcs_test = zfit.run(probs)\n",
    "\n",
    "Ctt.set_value(0.5)\n",
    "\n",
    "calcs_test1 = zfit.run(probs)\n",
    "\n",
    "Ctt.set_value(0.0)\n",
    "\n",
    "Dbar_s.set_value(0.3)\n",
    "\n",
    "DDstar_s.set_value(0.3)\n",
    "\n",
    "calcs_test2 = zfit.run(probs)\n",
    "# res_y = zfit.run(jpsi_res(test_q))\n",
    "# b0 = [b0_0, b0_1, b0_2]\n",
    "# bplus = [bplus_0, bplus_1, bplus_2]\n",
    "# bT = [bT_0, bT_1, bT_2]\n",
    "# f0_y = zfit.run(tf.math.real(formfactor(test_q,\"0\", b0, bplus, bT)))\n",
    "# fplus_y = zfit.run(tf.math.real(formfactor(test_q,\"+\", b0, bplus, bT)))\n",
    "# fT_y = zfit.run(tf.math.real(formfactor(test_q,\"T\", b0, bplus, bT)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.clf()\n",
    "# plt.plot(x_part, calcs, '.')\n",
    "plt.plot(test_q, calcs_test)#, label = 'pdf (Ctt = 0.0)')\n",
    "# plt.plot(test_q, calcs_test1, label = 'pdf (Ctt = 0.5)')\n",
    "# plt.plot(test_q, calcs_test2, label = 'pdf (D-contribs = 0.3)')\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.axvline(x=jpsi_mass -70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.axvline(x=jpsi_mass +70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.axvline(x=psi2s_mass -50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.axvline(x=psi2s_mass +50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "# plt.legend()\n",
    "plt.ylim(0.0, 1.5e-6)\n",
    "plt.xlabel(r'$q^2 [MeV^2]$')\n",
    "# plt.yscale('log')\n",
    "# plt.xlim(770, 785)\n",
    "plt.savefig('test.png')\n",
    "# print(jpsi_width)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "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": null,
   "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": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "total_f.update_integration_options(draws_per_dim=2000000, mc_sampler=None)\n",
    "# total_f_fit.update_integration_options(draws_per_dim=2000000, mc_sampler=None)\n",
    "# inte = total_f.integrate(limits = (950., 1050.), norm_range=False)\n",
    "# inte_fl = zfit.run(inte)\n",
    "# print(inte_fl/4500)\n",
    "# print(pdg[\"jpsi_BR\"]/pdg[\"NR_BR\"], inte_fl*pdg[\"psi2s_auc\"]/pdg[\"NR_auc\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "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][0]*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",
    "## Mixture distribution for sampling"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "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": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# total_f._sample_and_weights = UniformSampleAndWeights"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Constraints"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1. Constraint - Real part of sum of Psi contrib and D contribs\n",
    "\n",
    "sum_list = []\n",
    "\n",
    "sum_list.append(ztf.to_complex(jpsi_s) * tf.exp(tf.complex(ztf.constant(0.0), jpsi_p)) * ztf.to_complex(jpsi_w / (tf.pow(jpsi_m,3))))\n",
    "sum_list.append(ztf.to_complex(psi2s_s) * tf.exp(tf.complex(ztf.constant(0.0), psi2s_p)) * ztf.to_complex(psi2s_w / (tf.pow(psi2s_m,3))))\n",
    "sum_list.append(ztf.to_complex(p3770_s) * tf.exp(tf.complex(ztf.constant(0.0), p3770_p)) * ztf.to_complex(p3770_w / (tf.pow(p3770_m,3))))\n",
    "sum_list.append(ztf.to_complex(p4040_s) * tf.exp(tf.complex(ztf.constant(0.0), p4040_p)) * ztf.to_complex(p4040_w / (tf.pow(p4040_m,3))))\n",
    "sum_list.append(ztf.to_complex(p4160_s) * tf.exp(tf.complex(ztf.constant(0.0), p4160_p)) * ztf.to_complex(p4160_w / (tf.pow(p4160_m,3))))\n",
    "sum_list.append(ztf.to_complex(p4415_s) * tf.exp(tf.complex(ztf.constant(0.0), p4415_p)) * ztf.to_complex(p4415_w / (tf.pow(p4415_m,3))))\n",
    "sum_list.append(ztf.to_complex(DDstar_s) * tf.exp(tf.complex(ztf.constant(0.0), DDstar_p)) * (ztf.to_complex(1.0 / (10.0*tf.pow(Dstar_m,2)) + 1.0 / (10.0*tf.pow(D_m,2)))))\n",
    "sum_list.append(ztf.to_complex(Dbar_s) * tf.exp(tf.complex(ztf.constant(0.0), Dbar_p)) * ztf.to_complex(1.0 / (6.0*tf.pow(Dbar_m,2))))\n",
    "\n",
    "sum_ru_1 = ztf.to_complex(ztf.constant(0.0))\n",
    "\n",
    "for part in sum_list:\n",
    "    sum_ru_1 += part\n",
    "\n",
    "sum_1 = tf.math.real(sum_ru_1)\n",
    "# constraint1 = zfit.constraint.GaussianConstraint(params = sum_1, mu = ztf.constant(1.7*10**-8), \n",
    "#                                                  sigma = ztf.constant(2.2*10**-8))\n",
    "\n",
    "constraint1 = tf.pow((sum_1-ztf.constant(1.7*10**-8))/ztf.constant(2.2*10**-8),2)/ztf.constant(2.)\n",
    "\n",
    "# 2. Constraint - Abs. of sum of Psi contribs and D contribs\n",
    "\n",
    "sum_2 = tf.abs(sum_ru_1)\n",
    "constraint2 = tf.cond(tf.greater_equal(sum_2, 5.0e-8), lambda: 100000., lambda: 0.)\n",
    "\n",
    "# 3. Constraint - Maximum eta of D contribs\n",
    "\n",
    "constraint3_0 = tf.cond(tf.greater_equal(tf.abs(Dbar_s), 0.2), lambda: 100000., lambda: 0.)\n",
    "\n",
    "constraint3_1 = tf.cond(tf.greater_equal(tf.abs(DDstar_s), 0.2), lambda: 100000., lambda: 0.)\n",
    "\n",
    "# 4. Constraint - Formfactor multivariant gaussian covariance fplus\n",
    "\n",
    "Cov_matrix = [[ztf.constant(   1.), ztf.constant( 0.45), ztf.constant( 0.19), ztf.constant(0.857), ztf.constant(0.598), ztf.constant(0.531), ztf.constant(0.752), ztf.constant(0.229), ztf.constant(0.117)],\n",
    "              [ztf.constant( 0.45), ztf.constant(   1.), ztf.constant(0.677), ztf.constant(0.708), ztf.constant(0.958), ztf.constant(0.927), ztf.constant(0.227), ztf.constant(0.443), ztf.constant(0.287)],\n",
    "              [ztf.constant( 0.19), ztf.constant(0.677), ztf.constant(   1.), ztf.constant(0.595), ztf.constant(0.770), ztf.constant(0.819),ztf.constant(-0.023), ztf.constant( 0.07), ztf.constant(0.196)],\n",
    "              [ztf.constant(0.857), ztf.constant(0.708), ztf.constant(0.595), ztf.constant(   1.), ztf.constant( 0.83), ztf.constant(0.766), ztf.constant(0.582), ztf.constant(0.237), ztf.constant(0.192)],\n",
    "              [ztf.constant(0.598), ztf.constant(0.958), ztf.constant(0.770), ztf.constant( 0.83), ztf.constant(   1.), ztf.constant(0.973), ztf.constant(0.324), ztf.constant(0.372), ztf.constant(0.272)],\n",
    "              [ztf.constant(0.531), ztf.constant(0.927), ztf.constant(0.819), ztf.constant(0.766), ztf.constant(0.973), ztf.constant(   1.), ztf.constant(0.268), ztf.constant(0.332), ztf.constant(0.269)],\n",
    "              [ztf.constant(0.752), ztf.constant(0.227),ztf.constant(-0.023), ztf.constant(0.582), ztf.constant(0.324), ztf.constant(0.268), ztf.constant(   1.), ztf.constant( 0.59), ztf.constant(0.515)],\n",
    "              [ztf.constant(0.229), ztf.constant(0.443), ztf.constant( 0.07), ztf.constant(0.237), ztf.constant(0.372), ztf.constant(0.332), ztf.constant( 0.59), ztf.constant(   1.), ztf.constant(0.897)],\n",
    "              [ztf.constant(0.117), ztf.constant(0.287), ztf.constant(0.196), ztf.constant(0.192), ztf.constant(0.272), ztf.constant(0.269), ztf.constant(0.515), ztf.constant(0.897), ztf.constant(   1.)]]\n",
    "\n",
    "def triGauss(val1,val2,val3,m = Cov_matrix):\n",
    "\n",
    "    mean1 = ztf.constant(0.466)\n",
    "    mean2 = ztf.constant(-0.885)\n",
    "    mean3 = ztf.constant(-0.213)\n",
    "    sigma1 = ztf.constant(0.014/3.)\n",
    "    sigma2 = ztf.constant(0.128/3.)\n",
    "    sigma3 = ztf.constant(0.548/3.)\n",
    "    x1 = (val1-mean1)/sigma1\n",
    "    x2 = (val2-mean2)/sigma2\n",
    "    x3 = (val3-mean3)/sigma3\n",
    "    rho12 = m[0][1]\n",
    "    rho13 = m[0][2]\n",
    "    rho23 = m[1][2]\n",
    "    w = x1*x1*(rho23*rho23-1) + x2*x2*(rho13*rho13-1)+x3*x3*(rho12*rho12-1)+2*(x1*x2*(rho12-rho13*rho23)+x1*x3*(rho13-rho12*rho23)+x2*x3*(rho23-rho12*rho13))\n",
    "    d = 2*(rho12*rho12+rho13*rho13+rho23*rho23-2*rho12*rho13*rho23-1)\n",
    "    \n",
    "    fcn = -w/d\n",
    "    chisq = -2*fcn\n",
    "    return chisq\n",
    "\n",
    "constraint4 = triGauss(bplus_0, bplus_1, bplus_2)\n",
    "\n",
    "# mean1 = ztf.constant(0.466)\n",
    "# mean2 = ztf.constant(-0.885)\n",
    "# mean3 = ztf.constant(-0.213)\n",
    "# sigma1 = ztf.constant(0.014)\n",
    "# sigma2 = ztf.constant(0.128)\n",
    "# sigma3 = ztf.constant(0.548)\n",
    "# constraint4_0 = tf.pow((bplus_0-mean1)/sigma1,2)/ztf.constant(2.)\n",
    "# constraint4_1 = tf.pow((bplus_1-mean2)/sigma2,2)/ztf.constant(2.)\n",
    "# constraint4_2 = tf.pow((bplus_2-mean3)/sigma3,2)/ztf.constant(2.)\n",
    "\n",
    "# 5. Constraint - Abs. of sum of light contribs\n",
    "\n",
    "sum_list_5 = []\n",
    "\n",
    "sum_list_5.append(rho_s*rho_w/rho_m)\n",
    "sum_list_5.append(omega_s*omega_w/omega_m)\n",
    "sum_list_5.append(phi_s*phi_w/phi_m)\n",
    "\n",
    "\n",
    "sum_ru_5 = ztf.constant(0.0)\n",
    "\n",
    "for part in sum_list_5:\n",
    "    sum_ru_5 += part\n",
    "\n",
    "constraint5 = tf.cond(tf.greater_equal(tf.abs(sum_ru_5), ztf.constant(0.02)), lambda: 100000., lambda: 0.)\n",
    "\n",
    "# 6. Constraint on phases of Jpsi and Psi2s for cut out fit\n",
    "\n",
    "\n",
    "# constraint6_0 = zfit.constraint.GaussianConstraint(params = jpsi_p, mu = ztf.constant(pdg[\"jpsi_phase_unc\"]),\n",
    "#                                                    sigma = ztf.constant(jpsi_phase))\n",
    "# constraint6_1 = zfit.constraint.GaussianConstraint(params = psi2s_p, mu = ztf.constant(pdg[\"psi2s_phase_unc\"]),\n",
    "#                                                    sigma = ztf.constant(psi2s_phase))\n",
    "\n",
    "constraint6_0  =  tf.pow((jpsi_p-ztf.constant(jpsi_phase))/ztf.constant(pdg[\"jpsi_phase_unc\"]),2)/ztf.constant(2.)\n",
    "constraint6_1  =  tf.pow((psi2s_p-ztf.constant(psi2s_phase))/ztf.constant(pdg[\"psi2s_phase_unc\"]),2)/ztf.constant(2.)\n",
    "\n",
    "# 7. Constraint on Ctt with higher limits\n",
    "\n",
    "constraint7 = tf.cond(tf.greater_equal(Ctt*Ctt, 0.25), lambda: 100000., lambda: 0.)\n",
    "\n",
    "constraint7dtype = tf.float64\n",
    "\n",
    "# zfit.run(constraint6_0)\n",
    "\n",
    "# ztf.convert_to_tensor(constraint6_0)\n",
    "\n",
    "#List of all constraints\n",
    "\n",
    "constraints = [constraint1, constraint2, constraint3_0, constraint3_1, constraint4, #constraint4_0, constraint4_1, constraint4_2,\n",
    "               constraint6_0, constraint6_1]#, constraint7]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Reset params"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "param_values_dic = {\n",
    "    'jpsi_m': jpsi_mass,\n",
    "    'jpsi_s': jpsi_scale,\n",
    "    'jpsi_p': jpsi_phase,\n",
    "    'jpsi_w': jpsi_width,\n",
    "    'psi2s_m': psi2s_mass,\n",
    "    'psi2s_s': psi2s_scale,\n",
    "    'psi2s_p': psi2s_phase,\n",
    "    'psi2s_w': psi2s_width,\n",
    "    'p3770_m': p3770_mass,\n",
    "    'p3770_s': p3770_scale,\n",
    "    'p3770_p': p3770_phase,\n",
    "    'p3770_w': p3770_width,\n",
    "    'p4040_m': p4040_mass,\n",
    "    'p4040_s': p4040_scale,\n",
    "    'p4040_p': p4040_phase,\n",
    "    'p4040_w': p4040_width,\n",
    "    'p4160_m': p4160_mass,\n",
    "    'p4160_s': p4160_scale,\n",
    "    'p4160_p': p4160_phase,\n",
    "    'p4160_w': p4160_width,\n",
    "    'p4415_m': p4415_mass,\n",
    "    'p4415_s': p4415_scale,\n",
    "    'p4415_p': p4415_phase,\n",
    "    'p4415_w': p4415_width,\n",
    "    'rho_m': rho_mass,\n",
    "    'rho_s': rho_scale,\n",
    "    'rho_p': rho_phase,\n",
    "    'rho_w': rho_width,\n",
    "    'omega_m': omega_mass,\n",
    "    'omega_s': omega_scale,\n",
    "    'omega_p': omega_phase,\n",
    "    'omega_w': omega_width,\n",
    "    'phi_m': phi_mass,\n",
    "    'phi_s': phi_scale,\n",
    "    'phi_p': phi_phase,\n",
    "    'phi_w': phi_width,\n",
    "    'Dstar_m': Dstar_mass,\n",
    "    'DDstar_s': 0.0,\n",
    "    'DDstar_p': 0.0,\n",
    "    'D_m': D_mass,\n",
    "    'Dbar_m': Dbar_mass,\n",
    "    'Dbar_s': 0.0,\n",
    "    'Dbar_p': 0.0,\n",
    "    'tau_m': pdg['tau_M'],\n",
    "    'Ctt': 0.0,\n",
    "    'b0_0': 0.292,\n",
    "    'b0_1': 0.281,\n",
    "    'b0_2': 0.150,\n",
    "    'bplus_0': 0.466,\n",
    "    'bplus_1': -0.885,\n",
    "    'bplus_2': -0.213,\n",
    "    'bT_0': 0.460,\n",
    "    'bT_1': -1.089,\n",
    "    'bT_2': -1.114}\n",
    "\n",
    "\n",
    "def reset_param_values(variation = 0.05):\n",
    "    for param in total_f_fit.get_dependents():\n",
    "        if param.floating:\n",
    "            param.set_value(param_values_dic[param.name] + random.uniform(-1, 1) * param_values_dic[param.name]* variation)\n",
    "#             print(param.name)\n",
    "#     for param in totalf.get_dependents():\n",
    "#         param.set_value()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pull dictionary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# BR_steps = np.linspace(0.0, 1e-3, 11)\n",
    "pull_dic = {}\n",
    "\n",
    "# mi = 2e-4\n",
    "# ma = 6e-4\n",
    "# ste = 5\n",
    "\n",
    "mi = 1e-4\n",
    "ma = 3e-3\n",
    "ste = 20\n",
    "\n",
    "for param in total_f_fit.get_dependents():\n",
    "    if param.floating:\n",
    "        pull_dic[param.name] = []\n",
    "        for step in range(2*ste):\n",
    "            pull_dic[param.name].append([])\n",
    "            \n",
    "\n",
    "\n",
    "def save_pulls(step):\n",
    "    for param in total_f_fit.get_dependents():\n",
    "        if param.floating:\n",
    "            pull_dic[param.name][step].append((params[param]['value'] - param_values_dic[param.name])/params[param]['minuit_hesse']['error'])\n",
    "\n",
    "\n",
    "\n",
    "# for key in pull_dic.keys():\n",
    "#     print(np.shape(pull_dic[key]))\n",
    "# save_pulls(New_step=True)\n",
    "# params[Ctt]['value']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# for param in total_f_fit.get_dependents():\n",
    "#     if param.floating:\n",
    "#         print(param.name)\n",
    "\n",
    "# print(params[Ctt])\n",
    "\n",
    "total_BR = 1.7e-10 + 4.9e-10 + 2.5e-9 + 6.02e-5 + 4.97e-6 + 1.38e-9 + 4.2e-10 + 2.6e-9 + 6.1e-10 + 4.37e-7\n",
    "cut_BR = 1.0 - (6.02e-5 + 4.97e-6)/total_BR\n",
    "\n",
    "nevents = int(pdg[\"number_of_decays\"]*cut_BR)\n",
    "\n",
    "print(nevents)\n",
    "print(int(pdg[\"number_of_decays\"]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# CLS Code"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# zfit.run.numeric_checks = False   \n",
    "\n",
    "load = False\n",
    "\n",
    "bo = True\n",
    "\n",
    "D_contribs = True\n",
    "\n",
    "if not D_contribs:\n",
    "    Dbar_s.floating = False\n",
    "    Dbar_p.floating = False\n",
    "    DDstar_s.floating = False\n",
    "    DDstar_p.floating = False\n",
    "\n",
    "bo_set = 1\n",
    "\n",
    "fitting_range = 'cut'\n",
    "total_BR = 1.7e-10 + 4.9e-10 + 2.5e-9 + 6.02e-5 + 4.97e-6 + 1.38e-9 + 4.2e-10 + 2.6e-9 + 6.1e-10 + 4.37e-7\n",
    "cut_BR = 1.0 - (6.02e-5 + 4.97e-6)/total_BR\n",
    "\n",
    "Ctt_list = []\n",
    "Ctt_error_list = []\n",
    "\n",
    "nr_of_toys = 1\n",
    "nevents = int(pdg[\"number_of_decays\"]*cut_BR)\n",
    "# nevents = pdg[\"number_of_decays\"]\n",
    "event_stack = 1000000\n",
    "# nevents *= 41\n",
    "# zfit.settings.set_verbosity(10)\n",
    "\n",
    "# mi = 1e-4\n",
    "# ma = 3e-3\n",
    "# ste = 13\n",
    "\n",
    "BR_steps = np.linspace(mi, ma, ste)\n",
    "\n",
    "BR_steps[0] = 0.0\n",
    "\n",
    "print(BR_steps)\n",
    "\n",
    "Ctt_steps = np.sqrt(BR_steps/4.2*1000)\n",
    "\n",
    "Ctt_steps[0] = 0.74\n",
    "\n",
    "print(Ctt_steps)\n",
    "\n",
    "# total_samp = []\n",
    "\n",
    "start = time.time()\n",
    "\n",
    "Nll_list = []\n",
    "\n",
    "sampler = total_f.create_sampler(n=nevents, fixed_params = False)\n",
    "sampler.set_data_range(obs_fit)\n",
    "\n",
    "__ = -1\n",
    "\n",
    "pause = False\n",
    "\n",
    "#-----------------------------------------------------\n",
    "\n",
    "if not load:\n",
    "    for Ctt_step in Ctt_steps:\n",
    "\n",
    "        if pause:\n",
    "            break\n",
    "        \n",
    "        __ += 1\n",
    "        \n",
    "        for i in range(2):\n",
    "            Ctt_list.append([])\n",
    "            Ctt_error_list.append([])\n",
    "            Nll_list.append([])\n",
    "\n",
    "            for param in total_f_fit.get_dependents():\n",
    "                if param.floating:\n",
    "                    pull_dic[param.name].append([])\n",
    "        \n",
    "        for toy in range(nr_of_toys):        \n",
    "            \n",
    "            if pause:\n",
    "                break\n",
    "            \n",
    "            newset = True\n",
    "            \n",
    "            while newset:\n",
    "                \n",
    "                for floaty in [True, False]:\n",
    "                    Ctt.floating = floaty\n",
    "                    \n",
    "                    if pause and not floaty:\n",
    "                        break\n",
    "                    \n",
    "                    for bo_step in range(bo_set):\n",
    "\n",
    "                        print('Step: {0}/{1}'.format(int(__), ste))\n",
    "                        print('Current Ctt: {0}'.format(Ctt_step))\n",
    "                        print('Ctt floating: {0}'.format(floaty))\n",
    "                    \n",
    "                        reset_param_values(variation = 0.0)\n",
    "\n",
    "                        if floaty:\n",
    "                            print('Toy {0}/{1} - Fit {2}/{3}'.format(toy, nr_of_toys, bo_step, bo_set))\n",
    "                            Ctt.set_value(Ctt_step)\n",
    "\n",
    "                        else:\n",
    "                            Ctt.set_value(0.0)\n",
    "                            print('Toy {0}/{1} - Fit {2}/{3}'.format(toy, nr_of_toys, bo_step, bo_set))\n",
    "\n",
    "                        if newset:\n",
    "                            sampler.resample(n=nevents)\n",
    "                            data = sampler\n",
    "                            newset = False\n",
    "\n",
    "                        ### Fit data\n",
    "                        \n",
    "                        if floaty:\n",
    "                            plt.clf()\n",
    "                            plt.title('Ctt value: {:.2f}'.format(Ctt_step))\n",
    "                            plt.hist(zfit.run(data), bins = int((x_max-x_min)/7), range = (x_min, x_max))\n",
    "                            plt.savefig('data/CLs/plots/set_histo{}.png'.format(__))\n",
    "                            _step = 2*__\n",
    "                        else:\n",
    "                            _step = 2*__+1\n",
    "\n",
    "                        nll = zfit.loss.UnbinnedNLL(model=total_f_fit, data=data, constraints = constraints)\n",
    "\n",
    "                        minimizer = zfit.minimize.MinuitMinimizer(verbosity = 5)\n",
    "                        # minimizer._use_tfgrad = False\n",
    "                        result = minimizer.minimize(nll)\n",
    "\n",
    "                        print(\"Function minimum:\", result.fmin)\n",
    "                        print(\"Hesse errors:\", result.hesse())\n",
    "\n",
    "                        params = result.params\n",
    "\n",
    "                        if result.converged:\n",
    "                            \n",
    "                            save_pulls(step = _step)\n",
    "                            \n",
    "                            pause = True\n",
    "\n",
    "                            if floaty:\n",
    "                                Nll_list[-2].append(result.fmin)\n",
    "                                Ctt_list[-2].append(params[Ctt]['value'])\n",
    "                                Ctt_error_list[-2].append(params[Ctt]['minuit_hesse']['error'])\n",
    "\n",
    "                            else:\n",
    "                                Nll_list[-1].append(result.fmin)\n",
    "                                Ctt_list[-1].append(0.0)\n",
    "                                Ctt_error_list[-1].append(0.0)\n",
    "                                \n",
    "\n",
    "                        else:\n",
    "                            for _ in [1,2]:\n",
    "                                del Nll_list[-_][toy*bo_set:]\n",
    "#                                 print(np.shape(Nll_list[-_]))\n",
    "                                del Ctt_list[-_][toy*bo_set:]\n",
    "                                del Ctt_error_list[-_][toy*bo_set:]\n",
    "                                for param in total_f_fit.get_dependents():\n",
    "                                    if param.floating:\n",
    "                                        del pull_dic[param.name][_step+1-_][toy*bo_set:]\n",
    "                            newset = True\n",
    "                            break\n",
    "                            \n",
    "                    if not result.converged:\n",
    "                        break\n",
    "            \n",
    "            print()\n",
    "            print('Time taken: {}'.format(display_time(int(time.time()-start))))\n",
    "            print('Estimated time left: {}'.format(display_time(int((time.time()-start)/(__+(toy+1)/nr_of_toys)*(ste-__-(nr_of_toys-toy-1)/nr_of_toys)))))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "if load:\n",
    "    \n",
    "    phase_combi = '(-+)'\n",
    "    \n",
    "    if D_contribs:\n",
    "        D_dir = 'D-True'\n",
    "    else:\n",
    "        D_dir = 'D-False'\n",
    "\n",
    "    _dir = 'data/CLs/finished/f1d1/{}/{}/'.format(phase_combi, D_dir)\n",
    "    \n",
    "    jobs = os.listdir(_dir)\n",
    "    \n",
    "    First = True\n",
    "    \n",
    "    print('Number of jobs: {}'.format(len(jobs)))\n",
    "    \n",
    "    for job in jobs:\n",
    "        \n",
    "        dirName = _dir + str(job) + '/data/CLs'\n",
    "        \n",
    "        if not os.path.exists(\"{}/{}-{}_{}s{}b{}t--CLs_Nll_list.pkl\".format(dirName, mi,ma,ste,bo_set,nr_of_toys)):\n",
    "            print(job)\n",
    "            continue\n",
    "        \n",
    "        with open(r\"{}/variab.pkl\".format(dirName), \"rb\") as input_file:\n",
    "            variab = pkl.load(input_file)\n",
    "#             print(variab)\n",
    "        \n",
    "        ### sanity check:\n",
    "        if variab['mi'] != mi or variab['ma'] != ma or variab['ste'] != ste or bo_set != bo_set:\n",
    "            print('Fitting parameters of data dont equal the ones given -- Job {} skipped!'.format(job))\n",
    "            continue\n",
    "        \n",
    "        with open(r\"{}/{}-{}_{}s{}b{}t--CLs_Nll_list.pkl\".format(dirName, mi,ma,ste,bo_set,nr_of_toys), \"rb\") as input_file:\n",
    "            _Nll_list = pkl.load(input_file)\n",
    "        \n",
    "        with open(r\"{}/{}-{}_{}s{}b{}t--Ctt_list.pkl\".format(dirName, mi,ma,ste,bo_set,nr_of_toys), \"rb\") as input_file:\n",
    "            _Ctt_list = pkl.load(input_file)\n",
    "            \n",
    "        with open(r\"{}/{}-{}_{}s{}b{}t--Ctt_error_list.pkl\".format(dirName, mi,ma,ste,bo_set,nr_of_toys), \"rb\") as input_file:\n",
    "            _Ctt_error_list = pkl.load(input_file)\n",
    "            \n",
    "        with open(r\"{}/{}-{}_{}s{}b{}t--pull_dic.pkl\".format(dirName, mi,ma,ste,bo_set,nr_of_toys), \"rb\") as input_file:\n",
    "            _pull_dic = pkl.load(input_file)\n",
    "        \n",
    "        with open(r\"{}/{}-{}_{}s--CLs_list.pkl\".format(dirName, mi,ma,ste), \"rb\") as input_file:\n",
    "            _CLs_list = pkl.load(input_file)\n",
    "            \n",
    "        \n",
    "        if First:\n",
    "            Nll_list = _Nll_list\n",
    "            Ctt_list = _Ctt_list\n",
    "            Ctt_error_list = _Ctt_error_list\n",
    "            pull_dic = _pull_dic\n",
    "#             print(_pull_dic)\n",
    "            CLs_list = _CLs_list\n",
    "            First = False\n",
    "        else:\n",
    "            for step in range(2*ste):\n",
    "#                 print(Nll_list[step], step)\n",
    "                Nll_list[step].extend(_Nll_list[step])\n",
    "                Ctt_list[step].extend(_Ctt_list[step])\n",
    "                Ctt_error_list[step].extend(_Ctt_error_list[step])\n",
    "                for key in pull_dic.keys():\n",
    "#                     print(key, np.shape(pull_dic[key]))\n",
    "                    pull_dic[key][step].extend(_pull_dic[key][step])\n",
    "            for step in range(ste):\n",
    "                CLs_list[step].extend(_CLs_list[step])\n",
    "\n",
    "#         print('----------------------')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "dirName = 'data/CLs'\n",
    "\n",
    "# if bo and not load:\n",
    "#     for s in range(2*ste):\n",
    "#         Nll_list[s] = [np.min(Nll_list[s])]\n",
    "\n",
    "\n",
    "if not load:\n",
    "        \n",
    "    if not os.path.exists(dirName):\n",
    "        os.mkdir(dirName)\n",
    "        print(\"Directory \" , dirName ,  \" Created \")\n",
    "\n",
    "    with open(\"{}/{}-{}_{}s{}b{}t--CLs_Nll_list.pkl\".format(dirName, mi,ma,ste,bo_set,nr_of_toys), \"wb\") as f:\n",
    "        pkl.dump(Nll_list, f, pkl.HIGHEST_PROTOCOL)\n",
    "    \n",
    "    with open(\"{}/{}-{}_{}s{}b{}t--Ctt_list.pkl\".format(dirName, mi,ma,ste,bo_set,nr_of_toys), \"wb\") as f:\n",
    "        pkl.dump(Ctt_list, f, pkl.HIGHEST_PROTOCOL)\n",
    "    \n",
    "    with open(\"{}/{}-{}_{}s{}b{}t--Ctt_error_list.pkl\".format(dirName, mi,ma,ste,bo_set,nr_of_toys), \"wb\") as f:\n",
    "        pkl.dump(Ctt_error_list, f, pkl.HIGHEST_PROTOCOL)\n",
    " \n",
    "    with open(\"{}/{}-{}_{}s{}b{}t--pull_dic.pkl\".format(dirName, mi,ma,ste,bo_set,nr_of_toys), \"wb\") as f:\n",
    "        pkl.dump(pull_dic, f, pkl.HIGHEST_PROTOCOL)\n",
    "        \n",
    "    variab = {'mi': mi,\n",
    "             'ma': ma,\n",
    "             'ste': ste,\n",
    "             'bo_set': bo_set,\n",
    "             'nr_of_toys': nr_of_toys}\n",
    "    \n",
    "    with open(\"{}/variab.pkl\".format(dirName), \"wb\") as f:\n",
    "        pkl.dump(variab, f, pkl.HIGHEST_PROTOCOL)\n",
    "    \n",
    "    CLs_values = []\n",
    "    \n",
    "    toy_size = bo_set\n",
    "\n",
    "    print(np.shape(Nll_list))\n",
    "    print(Nll_list[0:1])\n",
    "    \n",
    "    for step in range(ste):\n",
    "        CLs_values.append([])\n",
    "        for toy in range(nr_of_toys):\n",
    "            float_min = np.min(Nll_list[2*step][toy*bo_set:(toy+1)*bo_set])\n",
    "            fix_min = np.min(Nll_list[2*step+1][toy*bo_set:(toy+1)*bo_set])\n",
    "            CLs_values[step].append(float_min-fix_min)\n",
    "        \n",
    "    \n",
    "    print(np.shape(CLs_values))\n",
    "    \n",
    "    with open(\"{}/{}-{}_{}s--CLs_list.pkl\".format(dirName, mi,ma,ste), \"wb\") as f:\n",
    "        pkl.dump(CLs_values, f, pkl.HIGHEST_PROTOCOL)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# print(variab['mi'] != mi)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "l = []\n",
    "sensitivity = []\n",
    "\n",
    "if load:\n",
    "    CLs_values = -1*np.array(CLs_list)\n",
    "\n",
    "if not os.path.exists('data/CLs/plots'):\n",
    "    os.mkdir('data/CLs/plots')\n",
    "    print(\"Directory \" , 'data/CLs/plots' ,  \" Created \")\n",
    "\n",
    "print(np.shape(CLs_values))\n",
    "\n",
    "figure(num=None, figsize=(2.7, 5), dpi=80, facecolor='w', edgecolor='k')\n",
    "\n",
    "for step in range(1,ste):\n",
    "    l.append(len(np.where(np.array(CLs_values[step]) < np.mean(CLs_values[0]))[0]))\n",
    "    sensitivity.append(l[-1]/len(np.where(np.array(CLs_values[0]) < np.mean(CLs_values[0]))[0]))\n",
    "    plt.clf()\n",
    "    plt.title('Sensitivity: {:.1f}%'.format(sensitivity[-1]*100))\n",
    "    plt.hist(CLs_values[0], bins = 40, range = (-5, 15), label = r'$C_{ \\tau \\tau }$' + ' = 0', alpha = 0.8)\n",
    "    plt.hist(CLs_values[step], bins = 40, range = (-5, 15), label = r'$C_{ \\tau \\tau }$' + ' = {:.2f}'.format(Ctt_steps[step]), alpha = 0.7)\n",
    "#     plt.hist(CLs_values[0][np.where(np.array(CLs_values[0]) > np.mean(CLs_values[0]))[0]], bins = 40, range = (-5, 15), alpha = 0.9)\n",
    "#     plt.hist(CLs_values[step][np.where(np.array(CLs_values[step]) < np.mean(CLs_values[0]))[0]], bins = 40, range = (-5, 15), alpha = 0.9)\n",
    "    plt.axvline(x=np.mean(CLs_values[0]),color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "    plt.legend()\n",
    "    plt.savefig('data/CLs/plots/CLs-Ctt({:.1E}).png'.format(Ctt_steps[step]))\n",
    "\n",
    "figure()    \n",
    "    \n",
    "for step in range(2*ste):\n",
    "    if step%2 == 0:\n",
    "        floaty = True\n",
    "    else:\n",
    "        floaty = False\n",
    "    for key in pull_dic.keys():\n",
    "        if not os.path.exists('data/CLs/plots/{}'.format(key)):\n",
    "            os.mkdir('data/CLs/plots/{}'.format(key))\n",
    "        plt.clf()\n",
    "        plt.title('Pull {} - Ctt value {:.2f} - floating {}'.format(key, Ctt_steps[int(step/2)], floaty))\n",
    "        plt.hist(pull_dic[key][step], bins = 50, range = (-5,5))\n",
    "        plt.xlabel('Pull')\n",
    "        plt.savefig('data/CLs/plots/{}/{:.2f}Ctt{}s{}f.png'.format(key, Ctt_steps[int(step/2)], step, floaty))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "for s in range(len(l)):\n",
    "    print('BR: {:.4f}'.format(BR_steps[s+1]))\n",
    "    print(sensitivity[s])\n",
    "    print()\n",
    "#     print(l[s], len(CLs_values[s]))\n",
    "#     print()\n",
    "# print(len(CLs_values[0])/2)\n",
    "# print(len(np.where(np.array(CLs_values[0]) < np.mean(CLs_values[0]))[0]))\n",
    "# plt.clf()\n",
    "# # plt.title('Pull {} - Ctt value {:.2f} - floating {}'.format(key, Ctt_steps[int(step/2)], floaty))\n",
    "# plt.hist(CLs_values[0], bins = 150, range = (-25, 50), label = 'Ctt fixed to 0')\n",
    "# plt.axvline(x=np.mean(CLs_values[0]),color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "# plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# for step in range(2*ste):\n",
    "#     for key in pull_dic.keys():\n",
    "#         print(pull_dic[key][step])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# for param in total_f_fit.get_dependents():\n",
    "#     if param.floating:\n",
    "#         print(params[param]['value'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "56 s\n"
     ]
    }
   ],
   "source": [
    "print(display_time(int(time.time()-start)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Smearing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "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": [
    "test_q = np.linspace(x_min, x_max, int(2e6))\n",
    "\n",
    "probs = total_f_fit.pdf(test_q, norm_range=False)\n",
    "\n",
    "calcs_test = zfit.run(probs)\n",
    "\n",
    "plt.clf()\n",
    "# plt.plot(x_part, calcs, '.')\n",
    "plt.title('Fitted curve before smearing')\n",
    "plt.plot(test_q, calcs_test)#, label = 'pdf (Ctt = 0.0)')\n",
    "# plt.plot(test_q, calcs_test1, label = 'pdf (Ctt = 0.5)')\n",
    "# plt.plot(test_q, calcs_test2, label = 'pdf (D-contribs = 0.3)')\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.axvline(x=jpsi_mass -70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.axvline(x=jpsi_mass +70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.axvline(x=psi2s_mass -50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.axvline(x=psi2s_mass +50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "# plt.legend()\n",
    "plt.ylim(0.0, 1.5e-6)\n",
    "plt.xlabel(r'$q^2 [MeV^2]$')\n",
    "# plt.yscale('log')\n",
    "# plt.xlim(770, 785)\n",
    "plt.savefig('fitted_before_smearing.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "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": [
    "integrate = True\n",
    "\n",
    "if integrate:\n",
    "\n",
    "    probs = total_f_fit.pdf(test_q, norm_range=False)\n",
    "\n",
    "    calcs_test1 = zfit.run(probs)\n",
    "    \n",
    "    plt.clf()\n",
    "    plt.plot(test_q, calcs_test1)\n",
    "    plt.title('Fitted curve before smearing')\n",
    "    plt.axvline(x=jpsi_mass -70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "    plt.axvline(x=jpsi_mass +70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "    plt.axvline(x=psi2s_mass -50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "    plt.axvline(x=psi2s_mass +50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "    plt.ylim(0.0, 1.5e-6)\n",
    "    plt.xlabel(r'$q^2 [MeV^2]$')\n",
    "    plt.savefig('test.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [],
   "source": [
    "# if integrate:\n",
    "\n",
    "#     plt.clf()\n",
    "#     plt.plot(test_q, calcs_test1)\n",
    "#     plt.title('Fitted curve before smearing')\n",
    "#     plt.axvline(x=jpsi_mass -70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "#     plt.axvline(x=jpsi_mass +70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "#     plt.axvline(x=psi2s_mass -50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "#     plt.axvline(x=psi2s_mass +50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "#     plt.ylim(0.0, 1.5e-6)\n",
    "#     plt.xlabel(r'$q^2 [MeV^2]$')\n",
    "#     plt.savefig('test.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Integration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "91404000\n",
      "0 45\n",
      "1 45\n",
      "2 45\n",
      "3 45\n",
      "4 45\n",
      "5 45\n",
      "6 45\n",
      "7 45\n",
      "8 45\n",
      "9 45\n",
      "10 45\n",
      "11 45\n",
      "12 45\n",
      "13 45\n",
      "14 45\n",
      "15 45\n",
      "16 45\n",
      "17 45\n",
      "18 45\n",
      "19 45\n",
      "20 45\n",
      "21 45\n",
      "22 45\n",
      "23 45\n",
      "24 45\n",
      "25 45\n",
      "26 45\n",
      "27 45\n",
      "28 45\n",
      "29 45\n",
      "30 45\n",
      "31 45\n",
      "32 45\n",
      "33 45\n",
      "34 45\n",
      "35 45\n",
      "36 45\n",
      "37 45\n",
      "38 45\n",
      "39 45\n",
      "40 45\n",
      "41 45\n",
      "42 45\n",
      "43 45\n",
      "44 45\n",
      "Full integration finished in 12 min, 30 s\n",
      "45702\n"
     ]
    }
   ],
   "source": [
    "# total_f_fit.update_integration_options(draws_per_dim=2000000, mc_sampler=None)\n",
    "\n",
    "if integrate:\n",
    "\n",
    "    start = time.time()\n",
    "\n",
    "    _max_size = 2000000\n",
    "\n",
    "    step_size = 2000\n",
    "\n",
    "    steps = np.arange(x_min, x_max, 0.1/step_size)\n",
    "\n",
    "    l = len(steps)\n",
    "\n",
    "    parts = int(l/_max_size)\n",
    "\n",
    "    print(l)\n",
    "\n",
    "    start_ = time.time()\n",
    "\n",
    "    _list = []\n",
    "\n",
    "    for j in range(parts):\n",
    "\n",
    "        print(j, parts)\n",
    "\n",
    "        _c = total_f_fit.pdf(steps[j*_max_size:(j+1)*_max_size], norm_range=False)\n",
    "\n",
    "        inte_fl = zfit.run(_c)\n",
    "\n",
    "        for i in range(int(_max_size/step_size)):\n",
    "            _list.append(np.mean(inte_fl[int(i*step_size):int((i+1)*step_size)]))\n",
    "\n",
    "    _c = total_f_fit.pdf(steps[(parts)*_max_size:], norm_range=False)\n",
    "\n",
    "    inte_fl = zfit.run(_c)\n",
    "    \n",
    "    rest = l%_max_size\n",
    "\n",
    "    for i in range(int(rest/step_size)):\n",
    "        _list.append(np.mean(inte_fl[int(i*step_size):int((i+1)*step_size)]))\n",
    "\n",
    "    print('Full integration finished in {}'.format(display_time(int(time.time()-start))))\n",
    "    print(len(_list))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "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": [
    "if integrate:\n",
    "\n",
    "    dirName = 'data/CLs'\n",
    "    with open(\"{}/inte_100keV_steps.pkl\".format(dirName), \"wb\") as f:\n",
    "        pkl.dump(_list, f, pkl.HIGHEST_PROTOCOL)\n",
    "\n",
    "if integrate:\n",
    "    \n",
    "    center = np.arange(x_min+0.05, x_max, 0.1)\n",
    "\n",
    "    probs = total_f_fit.pdf(test_q, norm_range=False)\n",
    "\n",
    "    calcs_test1 = zfit.run(probs)\n",
    "    \n",
    "    plt.clf()\n",
    "    plt.title('Integrated curve before smearing')\n",
    "    plt.axvline(x=jpsi_mass -70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "    plt.axvline(x=jpsi_mass +70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "    plt.axvline(x=psi2s_mass -50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "    plt.axvline(x=psi2s_mass +50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "    plt.ylim(0.0, 2.5e-6)\n",
    "    plt.plot(center,_list)\n",
    "    plt.xlabel(r'$q^2 [MeV^2]$')\n",
    "    plt.savefig('integrated_before_smearing.png')\n",
    "# plt.plot(inte_fl)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Smearing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gauss(x, area, m, sig = 7, step_s = 0.1):\n",
    "    \n",
    "    prefac = 1/(sig*np.sqrt(np.pi))\n",
    "    \n",
    "    y = np.zeros(np.shape(x))\n",
    "    \n",
    "    start = time.time()\n",
    "    \n",
    "    for i in range(len(area)):\n",
    "        \n",
    "        y += prefac*area[i]*np.exp(-1/2*((x-m[i])/sig)**2)\n",
    "        \n",
    "        t = time.time()\n",
    "        \n",
    "        j = i+1\n",
    "        \n",
    "        if i % 500 == 0:\n",
    "            print(display_time(int((t-start)/(j)*(len(area)-j))))\n",
    "    \n",
    "    return y*step_s*0.7\n",
    "        \n",
    "        \n",
    "    \n",
    "\n",
    "#             _y += prefac*area*np.exp(-1/2*((x-_m)/sig)**2)   \n",
    "\n",
    "# gauss(scan_x, _list)\n",
    "\n",
    "# print(np.shape(_list)[0], np.shape(center)[0])\n",
    "\n",
    "# print(int(1.25/0.1)*0.1)\n",
    "\n",
    "# print((1.25-1.25%0.1)/0.1)\n",
    "\n",
    "# print((x_max-x_min)*10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\sa_li\\.conda\\envs\\rmd\\lib\\site-packages\\ipykernel_launcher.py:1: DeprecationWarning: object of type <class 'float'> cannot be safely interpreted as an integer.\n",
      "  \"\"\"Entry point for launching an IPython kernel.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "15 min, 11 s\n",
      "8 min, 43 s\n",
      "8 min, 37 s\n",
      "8 min, 24 s\n",
      "8 min, 24 s\n",
      "8 min, 19 s\n",
      "8 min, 12 s\n",
      "8 min, 5 s\n",
      "7 min, 58 s\n",
      "7 min, 50 s\n",
      "7 min, 46 s\n",
      "7 min, 39 s\n",
      "7 min, 33 s\n",
      "7 min, 27 s\n",
      "7 min, 20 s\n",
      "7 min, 14 s\n",
      "7 min, 8 s\n",
      "7 min, 2 s\n",
      "6 min, 55 s\n",
      "6 min, 51 s\n",
      "6 min, 45 s\n",
      "6 min, 39 s\n",
      "6 min, 33 s\n",
      "6 min, 27 s\n",
      "6 min, 21 s\n",
      "6 min, 15 s\n",
      "6 min, 9 s\n",
      "6 min, 3 s\n",
      "5 min, 57 s\n",
      "5 min, 51 s\n",
      "5 min, 45 s\n",
      "5 min, 39 s\n",
      "5 min, 33 s\n",
      "5 min, 28 s\n",
      "5 min, 22 s\n",
      "5 min, 16 s\n",
      "5 min, 10 s\n",
      "5 min, 5 s\n",
      "4 min, 59 s\n",
      "4 min, 54 s\n",
      "4 min, 48 s\n",
      "4 min, 42 s\n",
      "4 min, 37 s\n",
      "4 min, 32 s\n",
      "4 min, 26 s\n",
      "4 min, 21 s\n",
      "4 min, 15 s\n",
      "4 min, 9 s\n",
      "4 min, 4 s\n",
      "3 min, 58 s\n",
      "3 min, 52 s\n",
      "3 min, 46 s\n",
      "3 min, 40 s\n",
      "3 min, 35 s\n",
      "3 min, 29 s\n",
      "3 min, 23 s\n",
      "3 min, 18 s\n",
      "3 min, 12 s\n",
      "3 min, 6 s\n",
      "3 min, 1 \n",
      "2 min, 55 s\n",
      "2 min, 49 s\n",
      "2 min, 44 s\n",
      "2 min, 38 s\n",
      "2 min, 32 s\n",
      "2 min, 27 s\n",
      "2 min, 21 s\n",
      "2 min, 15 s\n",
      "2 min, 10 s\n",
      "2 min, 4 s\n",
      "1 min, 59 s\n",
      "1 min, 53 s\n",
      "1 min, 47 s\n",
      "1 min, 42 s\n",
      "1 min, 36 s\n",
      "1 min, 31 s\n",
      "1 min, 25 s\n",
      "1 min, 19 s\n",
      "1 min, 14 s\n",
      "1 min, 8 s\n",
      "1 min, 3 s\n",
      "57 s\n",
      "52 s\n",
      "46 s\n",
      "40 s\n",
      "35 s\n",
      "29 s\n",
      "24 s\n",
      "18 s\n",
      "13 s\n",
      "7 s\n",
      "2 s\n"
     ]
    }
   ],
   "source": [
    "scan_x = np.linspace(x_min, x_max, 1e5)\n",
    "\n",
    "center = np.arange(x_min+0.05, x_max, 0.1)\n",
    "\n",
    "# for i in range(len(steps)/step_size):\n",
    "#     center.append(i)\n",
    "\n",
    "\n",
    "sum_y = gauss(x =scan_x, m = center, area = _list)\n",
    "\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 223,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\sa_li\\.conda\\envs\\rmd\\lib\\site-packages\\ipykernel_launcher.py:24: UserWarning: Creating legend with loc=\"best\" can be slow with large amounts of data.\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.title('Fitted curve after smearing')\n",
    "plt.axvline(x=jpsi_mass -70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.axvline(x=jpsi_mass +70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.axvline(x=psi2s_mass -50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.axvline(x=psi2s_mass +50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.ylim(0.0, 2.5e-6)\n",
    "plt.plot(scan_x,sum_y)\n",
    "plt.xlabel(r'$q^2 [MeV^2]$')\n",
    "plt.savefig('curve_after_smearing.png')\n",
    "\n",
    "plt.clf()\n",
    "plt.title('Fitted curve after convolution')\n",
    "plt.axvline(x=jpsi_mass -70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.axvline(x=jpsi_mass +70,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.axvline(x=psi2s_mass -50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.axvline(x=psi2s_mass +50,color='red', linewidth=1.0, linestyle = 'dotted')\n",
    "plt.ylim(0.0, 2.5e-6)\n",
    "plt.plot(test_q, calcs_test, label = 'inf. precision')\n",
    "plt.plot(scan_x,sum_y*0.1, label = 'smeared')\n",
    "plt.legend()\n",
    "plt.xlabel(r'$q^2 [MeV^2]$')\n",
    "# plt.xlim(jpsi_mass, psi2s_mass)\n",
    "plt.savefig('curve_after_smearing-vs-before_smearing.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create convonluted data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[18.0, 49.0, 58.0, 80.0, 93.0, 111.0, 111.0, 107.0, 227.0, 120.0, 137.0, 154.0, 159.0, 198.0, 183.0, 216.0, 254.0, 232.0, 247.0, 274.0, 296.0, 315.0, 346.0, 370.0, 363.0, 422.0, 440.0, 459.0, 483.0, 591.0, 919.0, 2475143.0, 1186.0, 673.0, 636.0, 605.0, 715.0, 88046.0, 116824.0, 1112.0, 814.0, 769.0, 863.0, 1081.0, 844.0, 673.0, 699.0, 467.0, 306.0, 82.0]\n"
     ]
    }
   ],
   "source": [
    "nbins = 50\n",
    "\n",
    "b_w = int(len(scan_x)/nbins)\n",
    "\n",
    "conv_data = []\n",
    "\n",
    "means = []\n",
    "\n",
    "_ = np.linspace(x_min, x_max, nbins+1)\n",
    "\n",
    "bin_centers = []\n",
    "\n",
    "_area = np.mean(sum_y)#*(x_max-x_min)\n",
    "\n",
    "# print(_area)\n",
    "\n",
    "_sum_y = sum_y/_area*pdg[\"number_of_decays\"]/100\n",
    "\n",
    "# print(np.mean(_sum_y))\n",
    "\n",
    "for i in range(nbins):\n",
    "    bin_centers.append((_[i]+_[i+1])/2.)\n",
    "    means.append(np.mean(_sum_y[i*b_w:(i+1)*b_w]))\n",
    "    _width = np.sqrt(means[-1])\n",
    "    conv_data.append(np.around(np.random.normal(means[-1], _width)))\n",
    "    \n",
    "print(conv_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "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.hist(x = bin_centers, bins = nbins, range = (x_min, x_max), weights = conv_data, histtype = 'step', label = 'Example data')\n",
    "# plt.plot(bin_centers, conv_data, '.',, color = 'r')\n",
    "plt.plot(scan_x,_sum_y, label = 'Convoluted fit', color = 'darkorange')\n",
    "plt.errorbar(bin_centers, conv_data,yerr = np.sqrt(conv_data), elinewidth=1, fmt = '.', ecolor = 'forestgreen', color = 'forestgreen', label = 'Example data')\n",
    "plt.ylim(0.,1200)\n",
    "plt.legend()\n",
    "plt.title('Convoluted fit with possible data set')\n",
    "# plt.xlim(jpsi_mass, psi2s_mass)\n",
    "# print(conv_data)\n",
    "plt.savefig('smeared_fit_with_data.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}