{ "cells": [ { "cell_type": "markdown", "source": [ "# Detectors" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "Here we summarise the catalogue detector components and their underlying physical models." ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "| Name | Method | Modes | Measurement Bins | Outcomes |\n", "|:--------------------------------:|:-----------:|:-----:|:----------------:|:--------:|\n", "| Photon-number resolving detector | `pnr` | 1 | 1 | 3+ |\n", "| Threshold detector | `threshold` | 1 | 1 | 1 or 2 |\n", "| Vacuum detector | `vacuum` | 1 | 1 | 1 |\n", "| Parity detector | `parity` | 1 | 1 | 1 |\n", "| Time-partition detector | `partition` | 1 | 1+ | 1+ |" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "The above table summarises the number of measurement bins, the number of possible outcomes for each measurement bin, and the number of modes that the detector monitors. The following sections give more details about each detector type." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 28, "outputs": [], "source": [ "from zpgenerator import *" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-02-14T23:01:25.822135Z", "start_time": "2024-02-14T23:01:25.751113Z" } } }, { "cell_type": "markdown", "source": [ "## Number-Resolving" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "The photon-number-resolving detector (PNRD) provides the probability $p(n)$ of observing $n$ photons at that detector during the detector gate time, and after accounting for detector inefficiency. In practice, the number-resolving detector has a truncation $N$ above which it cannot resolve the number of photons properly. The implementation of this detector follows the [ZPG method](https://journals.aps.org/pra/abstract/10.1103/PhysRevA.109.023713), where a Fourier transform is applied to recover the probabilities. A consequence of this approach is that the actual distribution returned by a 'pnr' detector is accumulated modulo $N$. That is, the outcome $o(n)$ of the detector is\n", "$$\n", "o(n) = \\sum_{k| k~\\text{mod}~N = n}p(k)\n", "$$\n", "\n", "If $N$ is large enough, then $o(n)\\simeq p(n)$. Otherwise, there is an apparent aliasing effect in the photon number distribution." ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "All detectors have an 'efficiency' parameter. The default efficiency is 1, unless the object is created using the efficiency keyword." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 29, "outputs": [ { "data": { "text/plain": "{'efficiency': 1}" }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d = Detector.pnr(resolution=1)\n", "d.default_parameters" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-02-14T23:01:25.862821Z", "start_time": "2024-02-14T23:01:25.759968Z" } } }, { "cell_type": "markdown", "source": [ "The resolution should be chosen large enough to trust that the distribution converges to zero." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 30, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pattern | Probability\n", "0 | 0.36791\n", "1 | 0.36788\n", "2 | 0.18393\n", "3 | 0.06131\n", "4 | 0.01533\n", "5 | 0.00307\n", "6 | 0.00051\n", "7 | 0.00007\n", "\n" ] } ], "source": [ "source = Source.shaped_laser(parameters={'amplitude': 1})\n", "p = Processor() // source // Detector.pnr(resolution=7)\n", "p.probs().display()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-02-14T23:01:25.867930Z", "start_time": "2024-02-14T23:01:25.762875Z" } } }, { "cell_type": "markdown", "source": [ "A resolution that is too small to capture all non-negligible probabilities will be impacted by aliasing (the distribution will 'wrap around')." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 31, "outputs": [ { "data": { "text/plain": "
", "image/png": "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" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "source = Source.shaped_laser(parameters={'amplitude': 5})\n", "p = Processor() // source // Detector.pnr(resolution=35)\n", "pn = p.probs()\n", "plt.plot(pn.keys(), pn.values())\n", "plt.xlabel('Number of photons')\n", "plt.ylabel('Outcome probability, o(n)')\n", "plt.show()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-02-14T23:01:26.023371Z", "start_time": "2024-02-14T23:01:25.799157Z" } } }, { "cell_type": "markdown", "source": [ "## Threshold" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "In some cases, it is not necessary to fully resolve the number of photons. For example, some post-selected linear-optical gates only require the observation of zero photons. Another example is that of measuring the Hong-Ou-Mandel visibility, where it is only necessary to verify the absence of light to estimate a high indistinguishability. A threshold detector (also called an on/off detector) provides the probability of observing at least one photon at that detector during the detector gate time, and after accounting for detector inefficiency." ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "A threshold detector never experiences aliasing because it requires no truncation." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 32, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pattern | Probability\n", "0 | 0.36790\n", "1 | 0.63211\n", "\n" ] } ], "source": [ "source = Source.shaped_laser(parameters={'amplitude': 1})\n", "p = Processor() // source // Detector.threshold()\n", "p.probs().display()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-02-14T23:01:26.110658Z", "start_time": "2024-02-14T23:01:26.026273Z" } } }, { "cell_type": "markdown", "source": [ "## Vacuum" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "A vacuum detector is a fictitious detector that returns only the outcome corresponding to measuring zero photons, thus potentially speeding up the simulation. This is particularly useful when looking at the behaviour of a circuit conditioned on that absence of light at a certain detector. However, because it ignores all cases where photons arrived, the resulting distribution is not normalised." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 33, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pattern | Expectation\n", "0 0 | 0.01995\n", "0 1 | 0.03710\n", "0 2 | 0.03675\n", "0 3 | 0.02445\n", "0 4 | 0.01222\n", "0 5 | 0.00488\n", "\n" ] } ], "source": [ "source = Source.shaped_laser(parameters={'amplitude': 2})\n", "p = Processor() // source // Circuit.bs() // (0, Detector.vacuum()) // (1, Detector.pnr(5))\n", "p.probs().display()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-02-14T23:01:26.203425Z", "start_time": "2024-02-14T23:01:26.110888Z" } } }, { "cell_type": "markdown", "source": [ "## Parity" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "As introduced in the [Wigner Functions](wigner_functions.ipynb) advanced tutorial, the parity detector returns the parity expectation value of the detected photon number distribution. This can be used to obtain the value of the light's Wigner function at the origin of phase space.\n", "\n", "Instead of an integer, the outcome of the parity detector is labeled with 'p'." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 34, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pattern | Expectation\n", "p | 0.36790\n", "\n" ] } ], "source": [ "source = Source.shaped_laser(parameters={'amplitude': 1})\n", "p = Processor() // source // Circuit.bs() // Detector.parity()\n", "p.probs().display()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-02-14T23:01:26.242766Z", "start_time": "2024-02-14T23:01:26.240539Z" } } }, { "cell_type": "markdown", "source": [ "The parity detector can also be combined with the 'pnr' detector type to get conditional measurements of the parity expectation value." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 35, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pattern | Expectation\n", "p 0 | -0.50000\n", "p 1 | 0.50000\n", "\n" ] } ], "source": [ "source = Source.shaped_laser(parameters={'amplitude': 1})\n", "p = Processor() // Source.fock(1) // Circuit.bs() // Detector.parity() // (1, Detector.pnr(3))\n", "pn = p.probs()\n", "pn.display()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-02-14T23:01:26.304494Z", "start_time": "2024-02-14T23:01:26.273967Z" } } }, { "cell_type": "markdown", "source": [ "By splitting a photon on a beam splitter, we can see that the sign of the parity of the first output depends on the number of photons detected at the second output. These values are also multiplied by the probability of detection, which is 1/2 for each outcome using a balanced beam splitter." ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "## Time Partition" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "Many simulations of photonic experiments consider correlations between light emitted at different times. For example, see the [Fibonacci States](fibonacci_states.ipynb) and [Entanglment Generation](entanglement_generation.ipynb) tutorials. The way this can be done in ZPGenerator is to add a detector that partitions time into different bins.\n", "\n", "To partition time, we can simply pass a list of times that define the thresholds between time bins. When photons are detected among these thresholds will determine which bin they will be tallied into. Note that photons that arrive anytime before the first threshold are neglected but photons that arrive anytime after the last threshold will be put into the last bin. Thus, there are as many bins as there are thresholds.\n", "\n", "Let's split a single photon into four bins defined by intervals (0, 1), (1, 2), (2, 3), and (3, $\\infty$)." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 36, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pattern | Probability\n", "1 0 0 0 | 0.63212\n", "0 0 1 0 | 0.08555\n", "0 1 0 0 | 0.23254\n", "0 0 0 1 | 0.04979\n", "\n" ] } ], "source": [ "d = Detector.partition(thresholds=[0, 1, 2, 3])\n", "p = Processor() // Source.fock(1) // d\n", "p.probs().display()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-02-14T23:01:26.374072Z", "start_time": "2024-02-14T23:01:26.298119Z" } } }, { "cell_type": "markdown", "source": [ "This shows that single photons display single-particle anti-bunching in time as well (in addition to the common spatial description using the Hanbury and Brown Twiss setup). Coherent states display no such behaviour." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 37, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pattern | Probability\n", "0 0 0 0 | 0.45817\n", "1 0 0 0 | 0.25635\n", "0 0 1 0 | 0.03910\n", "1 0 1 0 | 0.02188\n", "0 1 0 0 | 0.10466\n", "1 1 0 0 | 0.05856\n", "0 1 1 0 | 0.00893\n", "1 1 1 0 | 0.00500\n", "0 0 0 1 | 0.02277\n", "1 0 0 1 | 0.01274\n", "0 0 1 1 | 0.00194\n", "1 0 1 1 | 0.00109\n", "0 1 0 1 | 0.00520\n", "1 1 0 1 | 0.00291\n", "0 1 1 1 | 0.00044\n", "1 1 1 1 | 0.00025\n", "\n" ] } ], "source": [ "d = Detector.partition(thresholds=[0, 1, 2, 3])\n", "p = Processor() // Source.shaped_laser(parameters={'amplitude':1}) // d\n", "p.probs().display()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-02-14T23:01:26.458309Z", "start_time": "2024-02-14T23:01:26.383670Z" } } }, { "cell_type": "markdown", "source": [ "If one requires the time bins to not be adjacent, the explicit intervals can also be given as a list of lists." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 38, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pattern | Probability\n", "0 0 | 0.23865\n", "1 0 | 0.39347\n", "0 1 | 0.36788\n", "\n" ] } ], "source": [ "d = Detector.partition(thresholds=[[0, 0.5], [1, float('inf')]])\n", "p = Processor() // Source.fock(1) // d\n", "p.probs().display()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-02-14T23:01:26.504081Z", "start_time": "2024-02-14T23:01:26.460334Z" } } }, { "cell_type": "markdown", "source": [ "Note that in this case there is a probability of observing no photons because there is a chance they are emitted between the two time bins (between $t=0.5$ and $t=1$).\n", "\n", "The measurement within each bin defaults to behave like a threshold detector, but we can specify a resolution to get number-resolving behaviour as well. Note that the resolution is applied to all detectors." ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 39, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pattern | Probability\n", "2 0 | 0.39958\n", "1 1 | 0.46509\n", "0 2 | 0.13533\n", "\n" ] } ], "source": [ "d = Detector.partition(thresholds=[0, 1], resolution=2)\n", "p = Processor() // Source.fock(2) // d\n", "p.probs().display()" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-02-14T23:01:26.541845Z", "start_time": "2024-02-14T23:01:26.508745Z" } } }, { "cell_type": "markdown", "source": [], "metadata": { "collapsed": false } } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.6" } }, "nbformat": 4, "nbformat_minor": 0 }