{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "# Calculate tomographic bins with a user-defined p(z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "In this example, we will calculate dN/dz in tomographic redshift bins, assuming a photometric redshift pdf that is defined by the user. CCL contains built-in routines that describe the true expected redshift distribution of LSST; the functions used in this example all make use of this built-in data.\n",
    "\n",
    "**Note:** Some of the function calls in this example are somewhat computationally intensive, and might take a minute or so on a typical laptop."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pylab as plt\n",
    "import pyccl as ccl\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "### Define a photo-z pdf\n",
    "We begin by defining a custom photo-z function, that returns the probabilty of obtaining a given photometric redshift given a particular spectrosopic (true) redshift."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "def photoz(z_ph, z_s, args=None):\n",
    "    \"\"\"\n",
    "    Photometric redshift probability, p(z_ph | z_s).\n",
    "    \"\"\"\n",
    "    sigma_z = ccl.sigmaz_sources(z_s)\n",
    "    return np.exp(- (z_ph - z_s)**2. / (2.*sigma_z**2.)) \\\n",
    "          / (np.sqrt(2.*np.pi) * sigma_z**2.)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "The first two arguments of this function must be the photometric redshift and spectroscopic (true) redshift respectively. We could have also specified extra function parameters by using the `args` keyword argument if we wanted to. In this case, we have used a built-in `sigma_z` function, which specifies the default LSST `sigma_z` values (i.e. the effective photo-z accuracy).\n",
    "\n",
    "We can see what this pdf looks like for a couple of example (true) redshifts:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAEACAYAAACj0I2EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xu8VXWd//HXh7uAchEC5K5yNQUyb5C6IVG8DlO/TM2i\nmrGaR1nONNNgNXlmHtWUDVlOU+Z0o6kxfJg/RH6OgMgZzZQ0QBBE7jeBg4LITZTL5/fHd2+l04Gz\n99lr7bX22u/n47Ef7r3P2mt/3G7f53s+67u+y9wdERGpfq2SLkBERKKhQBcRyQgFuohIRijQRUQy\nQoEuIpIRCnQRkYxoNtDN7HYzW25my8zsv82svZl1N7N5ZrbKzOaaWddKFCsiIsd3wkA3s0HALcB7\n3P1soDVwAzAVmOfuQ4H5+cciIpKg5kboe4BDQEczawN0BLYC1wHT89tMBybHVqGIiBTlhIHu7ruA\nacAmQpDvdvd5QC93b8hv1gD0irVKERFpVnMtlzOA24BBwGlAZzO7+dhtPKwdoPUDREQS1qaZn78X\n+L277wQwsweBi4DtZtbb3bebWR9gR1MvNjMFvYhIC7i7lfqa5nroK4ELzewkMzPgMmAF8DAwJb/N\nFGDmCYrSLYLbHXfckXgNWbrp89TnmeZbS51whO7uz5vZL4HngKPAIuBe4GTgfjP7K2ADcH2LKxAR\nkUg013LB3e8E7mz09C7CaF1ERFJCZ4pWiVwul3QJmaLPM1r6PNPByunXNLtzM49z/yIiWWRmeAwH\nRUVEpEoo0EVEMkKBLiKSEQp0EZGMUKCLiGSEAl1EJCMU6CIiGaFAFxHJCAW6iEhGKNBFRDJCgS4i\nkhEKdBGRjFCgi4hkhAJdRCQjFOgiIhmhQBcRyQgFuohIRjQb6GY2zMwWH3N73cw+b2bdzWyema0y\ns7lm1rUSBYuISNNKugSdmbUCXgbOB24FXnX3O83sH4Fu7j610fa6BF0Ejh6F2bPhnHNg0KCkqxGR\nuLX0EnSlBvrlwD+5+8VmthK41N0bzKw3UO/uwxttr0Av08aN8IEPwCuvwIAB8MQT0EqNMpFMq9Q1\nRW8A7svf7+XuDfn7DUCvUt9cmnfXXTBuHKxfH0bq996bdEUiklZFj9DNrB2h3TLS3V8xs9fcvdsx\nP9/l7t0bvUYj9DK8+Sb06wfPPANnnAHLl0MuB2vXwimnJF2diMSlpSP0NiVseyXwR3d/Jf+4wcx6\nu/t2M+sD7GjqRXV1dW/fz+Vy5HK5UmusWbNmwbvfHcIc4KyzYMwYePxxmDw52dpEJDr19fXU19eX\nvZ9SRui/Af7H3afnH98J7HT3b5vZVKCrDopG68or4SMfgZtvfue5adNgzRr40Y+Sq0tE4hXrQVEz\n6wRsBAa7+978c92B+4EBwAbgenff3eh1CvQW2rMHTjsNduyAjh3feX75crjmGli3Dqzk/9wiUg1i\nbbm4+36gR6PndgGXlfqGUpxnn4XRo/80zAFGjoRDh2D1ahg6NJnaRCSdNAEupZ5+Gi666M+fN4Mr\nroBHH618TSKSbgr0lHrmGbjwwqZ/dsUVMG9eZesRkfQr6cSikneuHnqLuEPPnrB0aeijN7ZpUwj7\nrVsrX5uIxK9SJxZJBaxeHXrnTYU5QP/+8MYb4YCpiEiBAj2Fnnmm6f55gRmMGgXPP1+5mkQk/RTo\nKdRcoIMCXUT+nAI9hZ5/PkxZPJHRo2HJksrUIyLVQYGeMu7w4oswYsSJt9MIXUQaU6CnTOFA57ve\ndeLtRo4MSwAcPBh/TSJSHRToKfPiiyGsmzutv0OHsGjXihWVqUtE0k+BnjLFtFsKRo9W20VE3qFA\nT5lSAn3ECFi5Mt56RKR6KNBTppRAHzIk9NFFRECBnjqlBPqZZ4azSkVEQGu5pMqePdCnD+zdW9yF\noPfuhd69i99eRKqD1nLJgJUrYdiw4sP55JPDbdu2eOsSkeqgQE+Rl16C4cNLe82QIWq7iEigQE+R\ndeveuSB0sdRHF5ECBXqKrFsHp59e2ms0QheRgqIC3cy6mtkDZvaima0wswvMrLuZzTOzVWY218y6\nxl1s1q1fD4MHl/YaTV0UkYJiR+jfBx5x9xHAOcBKYCowz92HAvPzj6UMLRmhq+UiIgXNTls0sy7A\nYnc/vdHzK4FL3b3BzHoD9e4+vNE2mrZYpIMHoUsXOHAAWrcu/nV790KvXrBvn6YuimRFnNMWBwOv\nmNnPzWyRmf2nmXUCerl7Q36bBqBXqW8u79i4EQYMKC3MIUxb7NJF1xcVEWhT5DbvAT7n7s+a2fdo\n1F5xdzezJofidXV1b9/P5XLkcrkWF5tl69aV3j8vGDQINmyAfv2irEhEKqW+vp76+vqy91NMy6U3\n8LS7D84/fh9wO3A6MN7dt5tZH2CBWi4t98MfwtKlcM89pb/2hhvg2mvhIx+Jvi4RqbzYWi7uvh3Y\nbGZD809dBiwHHgam5J+bAsws9c3lHS05IFowcGBo2YhIbSum5QJwK/BrM2sHrAU+AbQG7jezvwI2\nANfHUmGNWLcOLrigZa8dNAgWL460HBGpQkUFurs/D5zXxI8ui7ac2rV+fXkj9Jn6+0ik5mmiWwq4\nl3dQVC0XEQEFeirs3h1CvVu3lr2+EOg6/ixS2xToKbBpUwjl5i4MfTydO0OnTrBjR7R1iUh1UaCn\nwObN0L9/eftQ20VEFOgpsGlTOEu0HAMHhpOLRKR2KdBTIIpAHzRII3SRWqdATwG1XEQkCgr0FIiq\n5aJAF6ltCvQUUKCLSBQU6Ak7cgS2bYO+fcvbT79+8PLL0dQkItVJgZ6wbdugRw9o1668/fToAfv3\nhwtkiEhtUqAnbPPm8tstEE5K6ttXo3SRWqZAT9imTeXPcCno2xe2bIlmXyJSfRToCYvigGiB+ugi\ntU2BnrCoWi4QAl0jdJHapUBPWJQtFwW6SG1ToCdsy5boLu6sg6IitU2BnrCXXy5/DnqBRugitU2B\nnqBDh2DnTujVK5r9KdBFaltR1xQ1sw3AHuAIcMjdzzez7sAMYCD5i0S7++6Y6sykbdvgXe+CNsVe\nqrsZvXuHXxCHDkHbttHsU0SqR7EjdAdy7j7G3c/PPzcVmOfuQ4H5+cdSgijbLQCtW4dfENu2RbdP\nEakepbRcGl8g7Tpgev7+dGByJBXVkKgDHdR2EallpYzQHzOz58zslvxzvdy9IX+/AYioE1w7FOgi\nEqViu7fj3H2bmfUE5pnZymN/6O5uZk1ec76uru7t+7lcjlwu18JSsyeuQNfURZHqUl9fT319fdn7\nMfcmc/j4LzC7A9gH3ELoq283sz7AAncf3mhbL3X/teSmm+Cqq+Dmm6Pb53e+A9u3w7Rp0e1TRCrL\nzHD3xm3uZjXbcjGzjmZ2cv5+J+ByYBkwC5iS32wKMLPUN691armISJSKabn0Av6vmRW2/7W7zzWz\n54D7zeyvyE9bjK3KjFKgi0iUSm65lLRztVyOyx06doRXX4VOnaLb7/r1MH48bNgQ3T5FpLJia7lI\nPHbtgvbtow1zgNNOg61b4ejRaPcrIumnQE/Iyy9HtyjXsdq3h65dYceO6PctIummQE9IHP3zAk1d\nFKlNCvSExB3oOjAqUnsU6AnZsiW+QNe1RUVqkwI9IRqhi0jUFOgJieugKKiHLlKrFOgJ0QhdRKKm\nQE9InIGuHrpIbdKZogl4440wV/yNN6BVDL9S9+4NVy/atw+s5HPNRCRpOlO0imzdCn36xBPmACef\nHC5Bt1sXBBSpKQr0BMR5QLRAbReR2qNAT0Cc/fMCzXQRqT0K9ATEeVJRQd++CnSRWqNAT0AlRuhq\nuYjUHgV6AioV6Bqhi9QWBXoCKnVQVIEuUlsU6AnQQVERiYMCvcKOHoVt28KVheKkHrpI7Skq0M2s\ntZktNrOH84+7m9k8M1tlZnPNrGu8ZWbHjh3QpUu4slCcevQIZ4wePBjv+4hIehQ7Qv8CsAIonMc/\nFZjn7kOB+fnHUoRK9M8hnIXap084K1VEakOzgW5m/YCrgJ8AhbUFrgOm5+9PBybHUl0GbdlSmUAH\nHRgVqTXFjNDvAv4BOPY68r3cvSF/vwHoFXVhWVXJQNcyuiK1pc2Jfmhm1wA73H2xmeWa2sbd3cyO\nu6RiXV3d2/dzuRy5XJO7qRmVmOFSoBF6I0ePwg9/CHffDUeOwMUXw3e/C927J12Z1Lj6+nrq6+vL\n3s8Jl881s28CHwUOAx2AU4AHgfOAnLtvN7M+wAJ3H97E67V8biMf+xhMmAAf/3j87zVtWhih33VX\n/O+Vem+9BddeG9YUvusu6NYNfvADeOABmDcPRo5MukKRt8WyfK67f9nd+7v7YOAG4HF3/ygwC5iS\n32wKMLPUN65V6qEn5Etfgg4d4Ikn4PzzYcgQ+P734etfhw9+MAS9SJUrdR56Ybj9LWCima0CJuQf\nSxHUcknAgw/CrFnwi19A69Z/+rNPfALGjYPPfCaR0kSipCsWVZA7dO4M27eHi1DEbf16yOVg48b4\n3yu13nwThg2DX/4SLrmk6W3eeCNsc//9cOGFla1PpAm6YlEV2L0b2rSpTJhDOBt1+/ZwLLBm/eQn\noT9+vDAHOOkk+NrX4CtfqVxdIjFQoFdQJfvnEM5GPeUUeOWVyr1nqhw4AN/4RuiTN2fKFNi8GebP\nj78ukZgo0Cuokv3zgpruo//qV+EA6Hve0/y2bdvCV78Kd94Zf10iMVGgV1ClR+hQw4t0ucM998Bn\nP1v8a66/HhYvhrVr46tLJEYK9ApKKtBrcoT+hz/Anj3w/vcX/5oOHULr5d5746tLJEYK9ApKouVS\ns+ui33MPfPrTYZWyUnzqU/Dzn4fZMSJVRoFeQRqhV8i+fWHueUtOxx0yBN79bpg9O/KyROKmQK8g\n9dArZPZsGDsWevZs2etvvBFmzIi2JpEKUKBXkGa5VMiMGfDhD7f89R/4AMyZo+UApOoo0Ctk//4w\nLfrUUyv7vjUX6Hv2wOOPw+Qylug/9dQwwlfbRaqMAr1CClcqspJP5i1Pt25w6FC4HF1NeOihcFZo\n1zKvinj99Wq7SNVRoFdIpS4915hZjY3Sf/tb+NCHyt/P5MnhrNH9+8vfl0iFKNArZMuWyvfPC2om\n0A8ehAUL4Oqry99Xt27w3vdqKQCpKgr0CklihktBzQT6ggVwzjnRHai49lp4+OFo9iVSAQr0Ckmq\n5QI1FOgPPxxCOCrXXhsOjNb0cpVSTRToFZJky6V//7CQYKa5h/C95pro9nnmmdClCyxaFN0+RWKk\nQK+QJFsuNRHoS5eGFRNHjIh2v2q7SBVRoFdIki2Xmgj0OXPgyiujnxd65ZUwd260+xSJiQK9At56\nC3buhF69knn/mgj0uXPhiiui3+/YsfDCC/D669HvWyRiJwx0M+tgZgvNbImZrTCzf80/393M5pnZ\nKjOba2ZlnsWRbdu2hTBvfH3iSunZM5yleuBAMu8fu/37YeHCcAHVqHXoEEK9vj76fYtE7ISB7u4H\ngfHuPho4BxhvZu8DpgLz3H0oMD//WI4jyXYLhC5Ev34ZHqU/8QSce258F2u97DJ47LF49i0SoWZb\nLu5eGNe1A1oDrwHXAdPzz08Hylg4I/uSnOFS0L8/bNqUbA2xmTsXLr88vv0r0KVKNBvoZtbKzJYA\nDcACd18O9HL3hvwmDUBC3eHqkOQMl4JM99HjDvRRo+DVV2twHWKpNm2a28DdjwKjzawLMMfMxjf6\nuZuZH+/1dXV1b9/P5XLk4uhzptymTTBgQLI1ZDbQt20LtzFj4nuPVq1gwoQwSm/JRTNEmlFfX099\nBMdpmg30And/3cz+H3Au0GBmvd19u5n1AXYc73XHBnqt2rgRLr442RoGDAiX2cyc+nq49NL4jzgX\n2i4KdIlB48HuP//zP7doP83NculRmMFiZicBE4HFwCxgSn6zKcDMFr17jdAIPUb19fHMbmls4sQQ\n6H7cP0ZFEtdcD70P8Hi+h74QeNjd5wPfAiaa2SpgQv6xHMfGjTBwYLI1ZPag6IIFMH5889uVa9Ag\n6NwZli+P/71EWsg8xhGHmXmc+68G+/dDjx5hDnilL25xrNdfDzNt9u5Nto5IvfxyOGC5Y0foc8ft\nM5+B4cPhttvify+paWaGu5f8f6rOFI3Z5s1hdJx0iHbpEtrMu3cnW0ekCv3zSoQ5aPqipJ4CPWZp\naLcUZK7tUql2S8H48fDkk+GafiIppECPWRoOiBYMHJjBQK/kNNhTT4XTT4fnnqvce4qUQIEeszSN\n0AcNgg0bkq4iIps2hQMCZ51V2fcdP17rukhqKdBjlqYReqYCvTBdsdIHJ3K58JeBSAop0GO2caMC\nPRaVmn/e2CWXwDPPhDWRRVJGgR6zTZvUcolFpQ+IFnTtCkOGwLPPVv69RZqhQI/RkSOwdWvyC3MV\nDBwY/mKoehs2wBtvhDnhSVAfXVJKgR6jbduge3do3z7pSoLChS727k26kjIl1T8vUB9dUkqBHqP1\n62Hw4KSreIdZaLtU/Sg9qXZLwcUXhyskvflmcjWINEGBHqN168K05TSp+j66e+XnnzfWpUto92Ry\n+UqpZgr0GK1fr0CP3Pr1cPgwDB2abB3qo0sKKdBjtG5duloukIFAL7Rbkl4cR310SSEFeow0Qo9B\n0u2Wgve9L0xdPHgw6UpE3qZAj1EaR+gDB1ZxoLuHNkeSB0QLTjkFRo4MB0dFUkKBHpODB2HnzrAG\neZoMHhz+cqhKa9aEf55xRrJ1FORy6qNLqijQY7JhQzjlP+5LXZaqZ89w1vprryVdSQs8/ni4WHPS\n/fOC8ePVR5dUUaDHJG1z0AvM4MwzYe3apCtpgaTnnzc2blxYSld9dEkJBXpM0jgHveDMM9/pXlSN\nNPXPC04+Gc4+G55+OulKRIAiAt3M+pvZAjNbbmYvmNnn8893N7N5ZrbKzOaaWdf4y60eaR2hQ2hB\nV90I/cUX4aSTwjSdNFEfXVKkmBH6IeBv3f0s4ELgs2Y2ApgKzHP3ocD8/GPJ0wg9YmlrtxSojy4p\n0mygu/t2d1+Sv78PeBHoC1wHTM9vNh2YHFeR1SiNUxYLqrKHntZAHzsWFi0Kq56JJKykHrqZDQLG\nAAuBXu7ekP9RA9Ar0sqq2NGjsHp1WDY7jc44o8pG6EePpq9/XtC5M4wapT66pEKbYjc0s87Ab4Ev\nuPteO2bqmLu7mXlTr6urq3v7fi6XI5eGs/xitnVrOO/klFOSrqRpffuGaYv790OnTklXU4QXXoBu\n3dKzsHxjhT76+9+fdCVSperr66mP4FiMuTeZw3+6kVlbYDbwP+7+vfxzK4Gcu283sz7AAncf3uh1\nXsz+s+bxx+Ff/iXdx8pGjoQZM8IkjdT73vdgxQq4996kK2naY49BXR387ndJVyIZYWa4e8knXBQz\ny8WAnwIrCmGeNwuYkr8/BZhZ6ptn1apVyS8G2JyqOjCa1v55wdixsGRJ+JNHJEHF9NDHATcD481s\ncf42CfgWMNHMVgET8o+F6gn0qjgweuQIPPFEOhbkOp6OHWHMGPj975OuRGpcsz10d/8dxw/+y6It\nJxtWrUp3/kAI9CVLkq6iCEuWQO/e0KdP0pWcWKGPPnFi0pVIDdOZojGohhH68OGwcmXSVRRh/vyw\nfkvaTZgQeukiCVKgR+zQIdi0Kb0nFRWMGBFOvky9Rx+FSZOSrqJ548aF35A7dyZdidQwBXrE1q8P\ns+vatUu6khPr3Tv88nn11aQrOYF9+8JFJNJ8QLSgXTu45BKN0iVRCvSIVUO7BcKqi6kfpdfXw3nn\nhZN3qsGkSeEvCpGEKNAj9tJL6T1DtLHUB/qjj8IVVyRdRfGuuALmzAkrQ4okQIEesRUr4Kyzkq6i\nOKkP9DlzqqN/XnDmmWFFyGXLkq5EapQCPWIvvADvfnfSVRQn1YG+dm3ooZ9zTtKVlGbSpPCLSCQB\nCvQIHT2qEXpk5swJLYy0XG6uWIW2i0gCFOgR2rAhrCHVpUvSlRRn0CB45ZUwEE6dQqBXm/HjYeFC\nLQMgiVCgR+iFF6pksau81q3DAdyXXkq6kkbeeqt6z7o8+WR473vTvTKbZJYCPULV1D8vOPvsFB7D\n+/3vYdgw6NEj6Upa5oorNH1REqFAj1A1Bvro0Slc06Va2y0F6qNLQhToEVq2TIEeiUceqa7pio2N\nGgV794bLVolUkAI9Im+9FdYXHz68+W3TZNSoEOipORdm/XrYvh0uvDDpSlquVSu47jp46KGkK5Ea\no0CPyKpVMHBgOK+kmvTsGc6s37Ah6UryHnoIrr02HLGtZpMnK9Cl4hToEXnuOTj33KSraJlUtV1m\nzgxhWO0mTAg9uB07kq5EaogCPSLPPhvWkapGqQn0V1+FxYuzcbHl9u3h8sth9uykK5EaokCPyHPP\nhenH1Sg1gT57dgjzautbHc/kyeEvDpEKKeYi0T8zswYzW3bMc93NbJ6ZrTKzuWbWNd4y0+2tt8KU\nxTFjkq6kZUaPDgPjxN1/P3zoQ0lXEZ2rr4b//V/YvTvpSqRGFDNC/znQeA7ZVGCeuw8F5ucf16xl\ny+CMM6BTp6QraZnTTw9nqm/dmmARO3fCU0+FA6JZ0aVL6KVrlC4V0mygu/uTwGuNnr4OmJ6/Px3I\nwFGslqvmdguEWXYXXQRPP51gEQ8+GHrO1XIxi2J9+MMwY0bSVUiNaGkPvZe7N+TvNwC9IqqnKlXz\nAdGCsWPDGfeJmTEDbrghwQJicu214Tdlqq/1J1lR9kFRd3cgLaelJEKBXqbt28OfOVddlVABMerU\nKSwF8MADSVciNaBNC1/XYGa93X27mfUBjjvZtq6u7u37uVyOXC7XwrdMp127wsmNo0YlXUl5zjsP\nli6FgwehQ4cKv/mvfgUf+EB2Zrc09rGPwde/Dp/5TNKVSErV19dTH8EKneZFnPNtZoOAh9397Pzj\nO4Gd7v5tM5sKdHX3PzswamZezP6r2UMPwY9+lI3F9c49F+6+G8aNq+CbuocFcO65By6+uIJvXEGH\nD0P//vD44+GqIiLNMDPcveSruxQzbfE+4PfAMDPbbGafAL4FTDSzVcCE/OOaVF8PWfmjY+zYBA6M\nPvtsmPf5vvdV+I0rqE0b+OhH4Re/SLoSybiiRugt3nkNjNDHjAkj9GpeS6pgxgz4r/+q8MmNf/M3\n0K8ffOUrFXzTBLz4YpjCuHlzCHiRE2jpCF2BXoZdu8Jl3HbuhLZtk66mfDt3wuDB4bJ07dtX4A33\n7Akf4NKlIdSzbtw4+OIXw/ECkROIreUix/fkk6FNkYUwBzj11NDifeqpCr3h9Olw2WW1EeYAt94a\nDlKIxESBXobHHgvXBM6Sil1s5+hR+MEPQsjVig9+MFz0YunSpCuRjFKgt5D7O0t3Z8mkSRUK9Llz\noWPHbB8Mbaxt2zB18d//PelKJKMU6C20eHGYr521WWjnnw+bNsG2bTG/0be/DX/7t2Altwmr26c/\nDb/9bcIL50hWKdBbqHAdhqzlUZs2MHFizDNdfvc72LgRbropxjdJqXe9C6ZMge98J+lKJIMU6C00\ncyb8xV8kXUU8brgB7rsvxjf4+tfh9ttrd/re3/99OCCsqxlJxDRtsQXWrg2zW7Zurf5LXzbl4EE4\n7bSwLHDfvhHv/Kmnwsh89Wpo1y7inVeRz342zA397neTrkRSSNMWK+gXvwiromYxzCEcG5g8OYZV\nX48ehb/7O/jGN2o7zAG+9jX45S9hzZqkK5EMUaCX6PBh+NnP4FOfSrqSeN10E/z61xHv9L77wvSg\nWuydN9arVzjJ6B//MelKJEMU6CV65BEYMCCsJ5Vl48eHJbyfey6iHb7+OkydGloMrfS1A+C222DR\nojCFUyQC+j+rRP/5n9kfnUNoJ33hCzBtWkQ7/OIXwzU2a2neeXNOOgl+/OPwhdq7N+lqJAN0ULQE\ny5aFKX1r11bv9UNLsWdPWNtl0SIYOLCMHc2ZE0Jr2TI45ZTI6suMv/7r8Bv0xz9OuhJJCR0UrYA7\n7oAvfak2whxC9n7yk2VOxNi8GT7+cfj5zxXmxzNtWlhHIta5olILNEIv0h//CNddFyYlZPXCOk3Z\nvj0cL3jqKRg2rMQXv/kmXHIJ/OVfhv65HN/zz4eFyubPh3POSboaSZhG6DE6cgQ+/3n4p3+qrTAH\n6N0bvvzl8O9f0u/mw4fhxhvD8riaydG8UaPCSoxXXx2uaSjSAgr0IkybFtZVqoWDoU259VbYsgV+\n85siX3D4MHziE3DgQJhrnbX1EeJy443hl9/EiaFVJVKiGj33unh//GNYduMPf6jd2XZt24brOF9+\nOZx9djNTNvftg+uvD8P5Bx+s0JUyMuRznwu/EMeODQvqVPvVx6WiajSiivPSS3DNNWGq4uDBSVeT\nrDFjwsHRyZNPsFDgkiVhucZ+/WDWrLA8rpTuttvCh33ZZfDTn5bY65JaVlagm9kkM1tpZqvNLFON\n0kWLwl++3/xmCDEJ1zm+5ZYwlXz16mN+sG8ffPWrYQj/la/Avfdm5zJOSfnQh8IVyO++O4wqVq1K\nuiKpAi0OdDNrDfwAmASMBG40s6pfHfzwYfiP/whX7pk2LbSC06C+vj7pEoDQ4r399tAR+K/v78L/\n9VswdChs2BB+C37kI0mXWJS0fJ4ndNZZodeXy4UP/JOfhOXLk66qSVXxedaAckbo5wNr3H2Dux8C\nfgNU7YKy+/eHFU1HjYIHHoAnngiDpLRIxf8w7rB2Lbe0/hlrRn2Qv/y7wTzybyt49LZHOfiTX1XV\ntUFT8XkWo317+Id/CP2/M84Ifzaed164QMgzz8ChQ0lXCFTR55lx5RwU7Qsceyh+C3BBeeVUxv79\n4WzPVavC7amnwu3ii8MB0CuvrOGJGYcPw65dYSGXhobwQa1ZE3osCxeGUL/0UrrcdDVH7/8ph5/s\nyr99D274JkyYABddFA6aDhgQbiefnPS/UEacempoZ02dGuaqz54drn60fn0I+BEjYMgQOPNM6NMH\nunWD7t3DyVw1+2WuPS0+scjMPghMcvdb8o9vBi5w91uP2cYX9rz6mFd5o7uNHze/jeH8ScVNPGfH\n/Du5w5F3ypeQAAADlklEQVQjzpHDcPhImFNuQMeTnI4d4aSO4TvfravT7ti2b1OfS+Pnmnsc4Wvq\nNm+mrn//aN/n0CF44413bgcOhJOBunWDHj2gZ084/fR3guLcc8MosYmAaGgIJzsuXBgGk5s2hVur\nVuHM2o4d37l16BB20apV+Oext6aeK9yi9NJLdQwbVhftThPQ+a1dDHvtGU7bv5rT9q+mz4E1dH2z\ngZMP7aLzoddof+QA+9t05WCbThy2thxu1Y7DrdpxxNpyKP/Po1b4Q93w/AftGOH/FHCz/OP8Nsc8\nX9jm3n2ruKVzqWeeyfFcsGN2i04sKifQLwTq3H1S/vHtwFF3//Yx2+jwvIhIC1Q60NsALwHvB7YC\nfwBudPcXW7RDEREpS4t76O5+2Mw+B8wBWgM/VZiLiCQn1sW5RESkcso+U7SYk4vM7O78z583szHl\nvmeWNfd5mlnOzF43s8X521eTqLMamNnPzKzBzJadYBt9N4vU3Oep72bxzKy/mS0ws+Vm9oKZff44\n25X2/XT3Ft8IrZY1wCCgLbAEGNFom6uAR/L3LwCeKec9s3wr8vPMAbOSrrUabsDFwBhg2XF+ru9m\ntJ+nvpvFf5a9gdH5+50JxyPLzs5yR+jFnFx0HTAdwN0XAl3NrFeZ75tVxZ6spYnFRXD3J4HXTrCJ\nvpslKOLzBH03i+Lu2919Sf7+PuBF4LRGm5X8/Sw30Js6uahvEdtUzymFlVXM5+nA2PyfYI+Y2ciK\nVZc9+m5GS9/NFjCzQYS/fBY2+lHJ389yl88t9ohq49/aOhLbtGI+l0VAf3c/YGZXAjOBofGWlWn6\nbkZH380SmVln4AHgC/mR+p9t0ujxCb+f5Y7QXwb6H/O4P+G3yIm26Zd/Tv5cs5+nu+919wP5+/8D\ntDWz7pUrMVP03YyQvpulMbO2wG+BX7n7zCY2Kfn7WW6gPwcMMbNBZtYO+DAwq9E2s4CPwdtnl+52\n94Yy3zermv08zayXWTg/28zOJ0w93VX5UjNB380I6btZvPzn9FNghbt/7ziblfz9LKvl4sc5ucjM\nPp3/+Y/d/REzu8rM1gD7gZQsSJs+xXyewP8B/sbMDgMHgBsSKzjlzOw+4FKgh5ltBu4gzB7Sd7MF\nmvs80XezFOOAm4GlZrY4/9yXgQHQ8u+nTiwSEckIXYJORCQjFOgiIhmhQBcRyQgFuohIRijQRUQy\nQoEuIpIRCnQRkYxQoIuIZMT/B5g8orurf2jpAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x107b86390>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "z_ph = np.linspace(0., 2., 200)\n",
    "plt.plot(z_ph, photoz(z_ph, z_s=0.5), 'b-')\n",
    "plt.plot(z_ph, photoz(z_ph, z_s=1.0), 'r-')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Now, we must create a new `PhotoZFunction` object to manage the user-defined photo-z pdf. (This allows the function to be called properly by other functions inside CCL, and does some memory management.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "pz = ccl.PhotoZFunction(photoz)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "### Calculate the tomographic redshift bin\n",
    "Now we can calculate dN/dz in a set of tomographic redshift bins, using the `dNdz_tomog` function. This quantity is essentially the true redshft distribution of sources, dN/dz, convolved with a photo-z model, and normalized. First, let's take a look at its call signature:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function dNdz_tomog in module pyccl.lsst_specs:\n",
      "\n",
      "dNdz_tomog(z, dNdz_type, zmin, zmax, pz_func)\n",
      "    Calculates dNdz in a particular tomographic bin, convolved\n",
      "    with a photo-z model (defined by the user), and normalized.\n",
      "    \n",
      "    Args:\n",
      "        z (float or array_like): Spectroscopic redshifts to evaluate dNdz at.\n",
      "        dNdz_type (:obj:`str`): Type of redshift distribution.\n",
      "        zmin (float): Minimum photo-z of the bin.\n",
      "        zmax (float): Maximum photo-z of the bin.\n",
      "        pz_func (callable): User-defined photo-z function.\n",
      "    \n",
      "    Return:\n",
      "        dNdz (float or array_like): dNdz values evalued at each z.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(ccl.dNdz_tomog)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "As well as a set of redshifts, `z`, to evaluate dN/dz over, we'll also need to pass it the photo-z pdf (`pz_func`, a `PhotoZFunction` object), a minimum and maximum redshift for the bin (`zmin`, `zmax`), and the type of observable that the dN/dz function will be used for, `dNdz_type`. The available types are as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['wl_opt', 'nc', 'wl_cons', 'wl_fid']\n"
     ]
    }
   ],
   "source": [
    "print ccl.lsst_specs.dNdz_types.keys()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Here, `nc` stands for 'number counts' and `wl` stands for 'weak lensing'. We'll use the fiducial weak lensing type, `wl_fid` (the others are 'conservative' and 'optimistic', describing pessimistic and optimistic scenarios for how many galaxies will be detected that are suitable for a weak lensing analysis).\n",
    "\n",
    "We can then call `dNdz_tomog` to get the number counts in a bin like so:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "z = np.linspace(0., 2., 100)\n",
    "dNdz = ccl.dNdz_tomog(z, 'wl_fid', 0.1, 0.7, pz)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Note that this can take a little while to calculate. This is slower than in the C version of CCL because the photo-z function is called many times by an integration routine inside the library. Calling a Python function, in this case `photoz()`, is slower than calling an internal C function.\n",
    "\n",
    "We can now plot the results:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1052f4910>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(z, dNdz, 'k-')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "For the sake of completeness, let's also try a few other redshift bin bounds, more in line with how the LSST bins will be defined:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "dNdz1 = ccl.dNdz_tomog(z, 'wl_fid', 0., 0.6, pz)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "dNdz2 = ccl.dNdz_tomog(z, 'wl_fid', 0.6, 1.2, pz)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "dNdz3 = ccl.dNdz_tomog(z, 'wl_fid', 1.2, 1.8, pz)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\ngiS5CyFECPr/vmVTj6AnMn8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10ed30e90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(z, dNdz1, 'b-')\n",
    "plt.plot(z, dNdz2, 'y-')\n",
    "plt.plot(z, dNdz3, 'r-')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "### Effective dN/dz for different types of observable\n",
    "LSST will obtain different galaxy number counts for different types of observable, depending on what the galaxies will be used for. For example, not all detected galaxies will be suitable for weak lensing. The `dNdz_type` argument specifies which _intrinsic_ dN/dz distribution should be used to calculate the observed photometric redshift distribution. Let's compare the various options from above:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "dNdz_wlfid = ccl.dNdz_tomog(z, 'wl_fid', 0.6, 1.2, pz)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "dNdz_wlcons = ccl.dNdz_tomog(z, 'wl_cons', 0.6, 1.2, pz)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "dNdz_wlopt = ccl.dNdz_tomog(z, 'wl_opt', 0.6, 1.2, pz)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true,
    "deletable": true,
    "editable": true
   },
   "outputs": [],
   "source": [
    "dNdz_nc = ccl.dNdz_tomog(z, 'nc', 0.6, 1.2, pz)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false,
    "deletable": true,
    "editable": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nUuxCCGFl/g8ULjrtb/g0zwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10ef27e50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(z, dNdz_wlfid, 'r-')\n",
    "plt.plot(z, dNdz_wlcons, 'y-')\n",
    "plt.plot(z, dNdz_wlopt, 'b-')\n",
    "plt.plot(z, dNdz_nc, 'k--')\n",
    "plt.xlim((0.4, 1.6))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "deletable": true,
    "editable": true
   },
   "source": [
    "Recall that these functions have all been normalised. As such, dN/dz in the optimistic weak lensing case (which assumes that more galaxies suitable for weak lensing will be detected) is not above the conservative curve everywhere in this plot, as it would be if left unnormalised. Notice that it has a heavier tail at high redshift, though."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
