Newer
Older
Master_thesis / .ipynb_checkpoints / raremodel-nb-checkpoint.ipynb
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Import"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\sa_li\\.conda\\envs\\rmd\\lib\\site-packages\\zfit\\util\\execution.py:57: UserWarning: Not running on Linux. Determining available cpus for thread can failand be overestimated. Workaround (only if too many cpus are used):`zfit.run.set_n_cpu(your_cpu_number)`\n",
      "  warnings.warn(\"Not running on Linux. Determining available cpus for thread can fail\"\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: The TensorFlow contrib module will not be included in TensorFlow 2.0.\n",
      "For more information, please see:\n",
      "  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n",
      "  * https://github.com/tensorflow/addons\n",
      "If you depend on functionality not listed there, please file an issue.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "# os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"-1\"\n",
    "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": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# chunksize = 10000\n",
    "# zfit.run.chunking.active = True\n",
    "# zfit.run.chunking.max_n_points = chunksize"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Build model and graphs\n",
    "## Create graphs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "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": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def G(y):\n",
    "    \n",
    "    def inner_rect_bracket(q):\n",
    "        return tf.log(ztf.to_complex((1+tf.sqrt(q))/(1-tf.sqrt(q)))-tf.complex(ztf.constant(0), -1*ztf.constant(np.pi)))    \n",
    "    \n",
    "    def inner_right(q):\n",
    "        return ztf.to_complex(2 * tf.atan(1/tf.sqrt(tf.math.real(-q))))\n",
    "    \n",
    "    big_bracket = tf.where(tf.math.real(y) > ztf.constant(0.0), inner_rect_bracket(y), inner_right(y))\n",
    "    \n",
    "    return ztf.to_complex(tf.sqrt(tf.abs(y))) * big_bracket\n",
    "\n",
    "def h_S(m, q):\n",
    "    \n",
    "    return ztf.to_complex(2) - G(ztf.to_complex(1) - ztf.to_complex(4*tf.pow(m, 2)) / ztf.to_complex(tf.pow(q, 2)))\n",
    "\n",
    "def h_P(m, q):\n",
    "    \n",
    "    return ztf.to_complex(2/3) + (ztf.to_complex(1) - ztf.to_complex(4*tf.pow(m, 2)) / ztf.to_complex(tf.pow(q, 2))) * h_S(m,q)\n",
    "\n",
    "def two_p_ccbar(mD, m_D_bar, m_D_star, q):\n",
    "    \n",
    "    \n",
    "    #Load constants\n",
    "    nu_D_bar = ztf.to_complex(pdg[\"nu_D_bar\"])\n",
    "    nu_D = ztf.to_complex(pdg[\"nu_D\"])\n",
    "    nu_D_star = ztf.to_complex(pdg[\"nu_D_star\"])\n",
    "    \n",
    "    phase_D_bar = ztf.to_complex(pdg[\"phase_D_bar\"])\n",
    "    phase_D = ztf.to_complex(pdg[\"phase_D\"])\n",
    "    phase_D_star = ztf.to_complex(pdg[\"phase_D_star\"])\n",
    "    \n",
    "    #Calculation\n",
    "    left_part =  nu_D_bar * tf.exp(tf.complex(ztf.constant(0.0), phase_D_bar)) * h_S(m_D_bar, q) \n",
    "    \n",
    "    right_part_D = nu_D * tf.exp(tf.complex(ztf.constant(0.0), phase_D)) * h_P(m_D, q) \n",
    "    \n",
    "    right_part_D_star = nu_D_star * tf.exp(tf.complex(ztf.constant(0.0), phase_D_star)) * h_P(m_D_star, q) \n",
    "\n",
    "    return left_part + right_part_D + right_part_D_star"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Build pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "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": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From C:\\Users\\sa_li\\.conda\\envs\\rmd\\lib\\site-packages\\tensorflow\\python\\ops\\resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    }
   ],
   "source": [
    "# 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": 7,
   "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": 8,
   "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": 9,
   "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": 10,
   "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": 11,
   "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": 12,
   "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": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.clf()\n",
    "# plt.plot(x_part, calcs, '.')\n",
    "plt.plot(test_q, calcs_test)#, label = 'pdf (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": 14,
   "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": 15,
   "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": 16,
   "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": 17,
   "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": 18,
   "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": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# total_f._sample_and_weights = UniformSampleAndWeights"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Constraints"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "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": 21,
   "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": 22,
   "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": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "36668\n",
      "5404696\n"
     ]
    }
   ],
   "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": 24,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.         0.00025263 0.00040526 0.00055789 0.00071053 0.00086316\n",
      " 0.00101579 0.00116842 0.00132105 0.00147368 0.00162632 0.00177895\n",
      " 0.00193158 0.00208421 0.00223684 0.00238947 0.00254211 0.00269474\n",
      " 0.00284737 0.003     ]\n",
      "[0.         0.24525574 0.31063037 0.36446136 0.41130637 0.45333628\n",
      " 0.49178719 0.5274424  0.5608354  0.59234888 0.62226847 0.65081403\n",
      " 0.67815909 0.70444347 0.72978178 0.75426939 0.77798661 0.80100188\n",
      " 0.82337407 0.84515425]\n",
      "WARNING:tensorflow:From C:\\Users\\sa_li\\.conda\\envs\\rmd\\lib\\site-packages\\zfit\\core\\sample.py:163: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.cast instead.\n"
     ]
    }
   ],
   "source": [
    "# zfit.run.numeric_checks = False   \n",
    "\n",
    "load = True\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",
    "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",
    "# newset = True\n",
    "\n",
    "#-----------------------------------------------------\n",
    "\n",
    "if not load:\n",
    "    for Ctt_step in Ctt_steps:\n",
    "\n",
    "#         if not newset:\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 not newset:\n",
    "#                 break\n",
    "            \n",
    "            newset = True\n",
    "            \n",
    "            while newset:\n",
    "                \n",
    "                for floaty in [True, False]:\n",
    "                    Ctt.floating = floaty\n",
    "                    \n",
    "                    if 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",
    "                            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": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of jobs: 1000\n"
     ]
    }
   ],
   "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": 27,
   "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": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "# print(variab['mi'] != mi)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(20, 1000)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAANQAAAFhCAYAAAAIroRqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAMTQAADE0B0s6tTgAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3de3RU1dk/8O+Z++RGapBImAwTNAEFJCkKEYoWsKAo1h+hP7BEkxYKfUFomy4ur7a+eAFR27wuL7yk1UYgwhII/Fi1VC5KBSrlRWOQi0iEhMyAEESuycyZ2/P748CUQDJkyOw5yZzns9YsktlnZp4MebKfs/eefSQiIjDGokKndgCMxRNOKMaiiBOKsSjihGIsijihGIsiTijGoogTirEo4oTqAIqLi1FYWNjuY64kSRK2bNnS3tBYpIjR8ePHqbi4mDIyMshsNlNmZiaNHz+eTp48GZPXP3v2LJ09ezb0fY8ePai8vDzsMdfzzTffkCzLRES0efNmEvFfvWrVKho+fDh973vfo9TUVBo9ejTt2bMn7GPOnDlDU6dOpe7du1NCQgI98sgj5HK5Qu2NjY1UUFBASUlJlJ+fT4cPHw61+Xw+ys3Npd27d0f9Z4kW7qEAFBQUoK6uDqtXr8bBgwexfPly2O12NDY2xuT1u3Tpgi5durT7mCvdcsstMJlM7Q0trO3bt2Ps2LHYsmULdu7cifT0dIwaNQpnzpxp9THFxcWorq7G+vXrsXv3bhgMBjzyyCMIBoMAgMWLF+PcuXOoqqrC4MGDMXfu3NBjX3vtNQwePBh33XWX0J+rXdTOaLWdOXOGANCnn34a9rjPPvuM7rvvPrJYLNSzZ0965plnyOfzhdoBUHl5OY0cOZKsVit9//vfb/bX+rPPPqOhQ4dSQkICpaam0r333ktnzpwhIqKioiKaNGkSERHdd999BCB0u++++645ZtasWfTggw82i+/kyZOk1+tDPwcA2rx5M9XW1jZ7vstxjh49mmbPnt3sObZs2UKJiYl04cKFG3gnibxeL1ksFvrb3/7WYvvFixdJkiTasWNH6L7L7/+WLVuIiOgXv/gF/fnPfyYioi+++IL69+9PRETHjh2jrKwsOn369A3FFiua76ESExORmJiI9evXw+/3t3jM6dOn8aMf/QhjxozB3r178c4772DFihX44x//2Oy45557DjNnzkR1dTUyMjLws5/9LNRWWFiIoUOHYu/evdixYwcmTZrU4mutXbsW3bt3x6uvvopvvvkGa9euveaYiRMnYsuWLfjuu+9C961ZswZZWVkYOHBgs2MzMzOxatUqAMA333yDb775BhMmTEBxcTHefffdUM8AAMuXL8e4ceOQlJQEALDZbHjhhRfCvX3NnD9/HrIs46abbmqxXZZlEBGsVmvoPrPZDJ1Oh08++QQAcMcdd+Cjjz5CIBDAxo0b0a9fPwDAb37zGzz99NOtPneHoXZGdwQrVqyg5ORkSkpKohEjRtCCBQua1fXPPvssFRQUNHvMu+++S7feemvoewD00ksvhb7/5JNPCEDor31SUhJt27atxde/svchavkc6spjgsEg9ezZM/SXnEjp2Z5++ulm8WzevJmIWj6HcrvdlJqaSps2bSIi5dwlKSkp9JjLz/k///M/Lcbckl/+8pd05513UiAQaPWY73//+zR27Fg6ffo0NTU10a9+9SsCQNOnTycioqamJnriiSfIbrfTqFGjqL6+njZv3kz5+fnU0NBADz30EN122230yiuvtDmuWOKEuuTChQu0fv16mjt3LmVnZ1NKSgpVV1cTEdH48ePJaDRSYmJi6GaxWEiv14d+eQDQhg0bQs935MgRAhA6qZ43bx5ZLBb68Y9/TG+88QadOnUqdGykCUVENHv2bLr//vuJSBmA0Ol09MUXX4Tar5dQRETTpk2jxx9/nIiIKioqyGazhU2GcP74xz9S165d6csvvwx73Jdffkl33XUXSZJEer2eHnvsMRowYAA9+eSTLR4vyzLdfvvtVFVVRf/xH/9BCxYsoAsXLlDv3r2vOwCiBs2XfJclJSXhkUcewaJFi7B//35kZmaGSrqLFy9i4sSJqK6uDt327t2LgwcPQqf791toNBpDX0uSBAChkurFF1/E7t27kZ+fj+XLl6N3796oqam54XgnTJiArVu3oqGhAatXr0bv3r3Rv3//iJ6juLgYa9euRWNjI5YtW4bCwsJmP09bLV68GM8//zw2bdqEPn36hD22T58+2L17N7777js0NDRgxYoVOHbsGLKyslo8/uWXX8aIESOQl5eH7du3Y/z48UhKSsKDDz6IHTt2RByraAa1A+iIjEYjevXqFRrlGzBgALZs2YLbbrutXc/br18/9OvX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\n",
      "text/plain": [
       "<Figure size 216x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "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": [
    "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": 49,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "BR: 0.0003\n",
      "0.7253086419753086\n",
      "\n",
      "BR: 0.0004\n",
      "0.6373456790123457\n",
      "\n",
      "BR: 0.0006\n",
      "0.5509259259259259\n",
      "\n",
      "BR: 0.0007\n",
      "0.4367283950617284\n",
      "\n",
      "BR: 0.0009\n",
      "0.345679012345679\n",
      "\n",
      "BR: 0.0010\n",
      "0.2993827160493827\n",
      "\n",
      "BR: 0.0012\n",
      "0.24228395061728394\n",
      "\n",
      "BR: 0.0013\n",
      "0.21141975308641975\n",
      "\n",
      "BR: 0.0015\n",
      "0.16820987654320987\n",
      "\n",
      "BR: 0.0016\n",
      "0.1419753086419753\n",
      "\n",
      "BR: 0.0018\n",
      "0.10185185185185185\n",
      "\n",
      "BR: 0.0019\n",
      "0.09104938271604938\n",
      "\n",
      "BR: 0.0021\n",
      "0.09259259259259259\n",
      "\n",
      "BR: 0.0022\n",
      "0.05864197530864197\n",
      "\n",
      "BR: 0.0024\n",
      "0.040123456790123455\n",
      "\n",
      "BR: 0.0025\n",
      "0.033950617283950615\n",
      "\n",
      "BR: 0.0027\n",
      "0.026234567901234566\n",
      "\n",
      "BR: 0.0028\n",
      "0.037037037037037035\n",
      "\n",
      "BR: 0.0030\n",
      "0.029320987654320986\n",
      "\n"
     ]
    }
   ],
   "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": 31,
   "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": 32,
   "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": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4 min, 1 \n"
     ]
    }
   ],
   "source": [
    "print(display_time(int(time.time()-start)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "integrate = False\n",
    "\n",
    "if integrate:\n",
    "\n",
    "    probs = total_f_fit.pdf(test_q, norm_range=False)\n",
    "\n",
    "    calcs_test = zfit.run(probs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "if integrate:\n",
    "\n",
    "    plt.clf()\n",
    "    plt.plot(test_q, calcs_test)\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": 36,
   "metadata": {},
   "outputs": [],
   "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 = 1000\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(l/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-1)*_max_size:], norm_range=False)\n",
    "\n",
    "    inte_fl = zfit.run(_c)\n",
    "\n",
    "    for i in range(int(l/step_size)):\n",
    "        _list.append(np.mean(steps[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": 37,
   "metadata": {},
   "outputs": [],
   "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)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "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": [
    "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 key == 'Dbar_s':\n",
    "            continue\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('Amplitude of ' + r'$\\overline{D}$' + ' contribution with ' + r'$C_{ \\tau \\tau }$' + ' = {:.2f}'.format(Ctt_steps[int(step/2)]))\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": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.36486862499697814"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rho_scale*rho_width/rho_mass+omega_scale*omega_width/omega_mass+phi_scale*phi_width/phi_mass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}