Skip to content

Instantly share code, notes, and snippets.

@Pabla007
Created June 3, 2019 20:42
Show Gist options
  • Save Pabla007/144be6eace6efc3893d46c2b52b620db to your computer and use it in GitHub Desktop.
Save Pabla007/144be6eace6efc3893d46c2b52b620db to your computer and use it in GitHub Desktop.
Added the Brush Selector Feature in the Spectrum
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/jasims/anaconda3/envs/simu/lib/python3.6/site-packages/tqdm/autonotebook/__init__.py:14: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n",
" \" (e.g. in jupyter console)\", TqdmExperimentalWarning)\n"
]
}
],
"source": [
"from tardis import run_tardis\n",
"from tardis.io.atom_data.util import download_atom_data"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/site-packages/tardis/io/atom_data/atom_web_download.py:12: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.\n",
" return yaml.load(open(atomic_repo_fname))\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n",
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/site-packages/tardis/io/config_internal.py:18: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.\n",
" return yaml.load(open(config_fpath))\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n",
"[\u001b[1mtardis.io.atom_data.atom_web_download\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Downloading atomic data from https://media.githubusercontent.com/media/tardis-sn/tardis-refdata/master/atom_data/kurucz_cd23_chianti_H_He.h5 to /home/jasims/Downloads/tardis-data/kurucz_cd23_chianti_H_He.h5 (\u001b[1matom_web_download.py\u001b[0m:37)\n"
]
}
],
"source": [
"download_atom_data('kurucz_cd23_chianti_H_He')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/importlib/_bootstrap.py:219: QAWarning: pyne.data is not yet QA compliant.\n",
" return f(*args, **kwds)\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n",
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/importlib/_bootstrap.py:219: QAWarning: pyne.material is not yet QA compliant.\n",
" return f(*args, **kwds)\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n",
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/site-packages/astropy/units/quantity.py:1067: AstropyDeprecationWarning: The truth value of a Quantity is ambiguous. In the future this will raise a ValueError.\n",
" AstropyDeprecationWarning)\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n",
"[\u001b[1mtardis.plasma.standard_plasmas\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Reading Atomic Data from /home/jasims/Desktop/tardis/docs/examples/kurucz_cd23_chianti_H_He.h5 (\u001b[1mstandard_plasmas.py\u001b[0m:76)\n",
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/site-packages/IPython/core/interactiveshell.py:3296: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
" exec(code_obj, self.user_global_ns, self.user_ns)\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n",
"[\u001b[1mtardis.io.atom_data.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Read Atom Data with UUID=6f7b09e887a311e7a06b246e96350010 and MD5=864f1753714343c41f99cb065710cace. (\u001b[1mbase.py\u001b[0m:175)\n",
"[\u001b[1mtardis.io.atom_data.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Non provided atomic data: synpp_refs, ion_cx_th_data, ion_cx_sp_data (\u001b[1mbase.py\u001b[0m:178)\n",
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/site-packages/astropy/units/quantity.py:1067: AstropyDeprecationWarning: The truth value of a Quantity is ambiguous. In the future this will raise a ValueError.\n",
" AstropyDeprecationWarning)\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n",
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/site-packages/tardis/plasma/properties/ion_population.py:59: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
" partition_function.index].dropna())\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n",
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/site-packages/astropy/units/equivalencies.py:90: RuntimeWarning: divide by zero encountered in double_scalars\n",
" (si.m, si.Hz, lambda x: _si.c.value / x),\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n",
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/site-packages/astropy/units/quantity.py:1067: AstropyDeprecationWarning: The truth value of a Quantity is ambiguous. In the future this will raise a ValueError.\n",
" AstropyDeprecationWarning)\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 1/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 7.96915e+42 erg / s Luminosity absorbed = 2.63370e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 9926.501965 10171.209103 0.400392 0.500372\n",
"\t5 9852.611678 10306.111379 0.211205 0.191331\n",
"\t10 9779.813302 10174.379204 0.142695 0.116864\n",
"\t15 9708.082813 9910.442275 0.104556 0.085962\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 9933.952 K -- next t_inner 11453.040 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/site-packages/tardis/plasma/properties/ion_population.py:59: FutureWarning: \n",
"Passing list-likes to .loc or [] with any missing label will raise\n",
"KeyError in the future, you can use .reindex() as an alternative.\n",
"\n",
"See the documentation here:\n",
"https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike\n",
" partition_function.index].dropna())\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 2/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 1.40398e+43 erg / s Luminosity absorbed = 4.68639e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 10171.209103 11518.516702 0.500372 0.538298\n",
"\t5 10306.111379 11554.412119 0.191331 0.217946\n",
"\t10 10174.379204 11373.574056 0.116864 0.132935\n",
"\t15 9910.442275 11040.788763 0.085962 0.099700\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 11453.040 K -- next t_inner 9948.201 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 3/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 8.16814e+42 erg / s Luminosity absorbed = 2.50161e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 11518.516702 10501.129902 0.538298 0.438591\n",
"\t5 11554.412119 10869.940791 0.217946 0.160809\n",
"\t10 11373.574056 10558.269547 0.132935 0.103807\n",
"\t15 11040.788763 10185.648701 0.099700 0.079165\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 9948.201 K -- next t_inner 11328.896 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 4/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 1.34487e+43 erg / s Luminosity absorbed = 4.47931e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 10501.129902 11527.008679 0.438591 0.512509\n",
"\t5 10869.940791 11706.138980 0.160809 0.196458\n",
"\t10 10558.269547 11444.208532 0.103807 0.124092\n",
"\t15 10185.648701 11085.857161 0.079165 0.093694\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 11328.896 K -- next t_inner 10054.300 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 5/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 8.44348e+42 erg / s Luminosity absorbed = 2.68000e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 11527.008679 10659.382763 0.512509 0.433573\n",
"\t5 11706.138980 11038.244897 0.196458 0.158494\n",
"\t10 11444.208532 10790.696726 0.124092 0.099660\n",
"\t15 11085.857161 10450.666394 0.093694 0.074550\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 10054.300 K -- next t_inner 11261.489 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 6/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 1.32492e+43 erg / s Luminosity absorbed = 4.26229e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 10659.382763 11507.437689 0.433573 0.499441\n",
"\t5 11038.244897 11634.568776 0.158494 0.197953\n",
"\t10 10790.696726 11418.594559 0.099660 0.124085\n",
"\t15 10450.666394 10999.619473 0.074550 0.094676\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 11261.489 K -- next t_inner 10069.444 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 7/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 8.49858e+42 erg / s Luminosity absorbed = 2.69247e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 11507.437689 10679.650246 0.499441 0.431088\n",
"\t5 11634.568776 11048.266431 0.197953 0.157179\n",
"\t10 11418.594559 10825.714870 0.124085 0.098608\n",
"\t15 10999.619473 10506.321595 0.094676 0.073794\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 10069.444 K -- next t_inner 11241.826 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 8/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 1.30632e+43 erg / s Luminosity absorbed = 4.31719e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 10679.650246 11459.828312 0.431088 0.506176\n",
"\t5 11048.266431 11688.139012 0.157179 0.193468\n",
"\t10 10825.714870 11441.768967 0.098608 0.122412\n",
"\t15 10506.321595 11099.449886 0.073794 0.090915\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 11241.826 K -- next t_inner 10123.177 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 9/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 8.68357e+42 erg / s Luminosity absorbed = 2.75015e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 11459.828312 10666.223660 0.506176 0.445097\n",
"\t5 11688.139012 11000.288585 0.193468 0.163424\n",
"\t10 11441.768967 10822.884326 0.122412 0.101641\n",
"\t15 11099.449886 10384.181273 0.090915 0.078432\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 10123.177 K -- next t_inner 11180.783 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 10/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 1.28170e+43 erg / s Luminosity absorbed = 4.19511e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 10666.223660 11427.410445 0.445097 0.500788\n",
"\t5 11000.288585 11612.349822 0.163424 0.193129\n",
"\t10 10822.884326 11373.245169 0.101641 0.121622\n",
"\t15 10384.181273 11047.955461 0.078432 0.090937\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 11180.783 K -- next t_inner 10164.432 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 11/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 8.79074e+42 erg / s Luminosity absorbed = 2.82804e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 11427.410445 10741.337822 0.500788 0.439938\n",
"\t5 11612.349822 11230.515356 0.193129 0.153637\n",
"\t10 11373.245169 10870.696315 0.121622 0.101050\n",
"\t15 11047.955461 10538.170159 0.090937 0.074680\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 10164.432 K -- next t_inner 11157.711 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 12/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 1.27128e+43 erg / s Luminosity absorbed = 4.15415e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 10741.337822 11507.877578 0.439938 0.483114\n",
"\t5 11230.515356 11808.852053 0.153637 0.181826\n",
"\t10 10870.696315 11557.412757 0.101050 0.113563\n",
"\t15 10538.170159 11117.762050 0.074680 0.087418\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 11157.711 K -- next t_inner 10184.966 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 13/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 8.90399e+42 erg / s Luminosity absorbed = 2.80864e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 11507.877578 10727.217531 0.483114 0.443706\n",
"\t5 11808.852053 11171.758889 0.181826 0.160824\n",
"\t10 11557.412757 10971.722637 0.113563 0.098588\n",
"\t15 11117.762050 10574.916600 0.087418 0.075266\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 10184.966 K -- next t_inner 11108.923 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 14/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 1.25052e+43 erg / s Luminosity absorbed = 4.07335e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 10727.217531 11413.626870 0.443706 0.489526\n",
"\t5 11171.758889 11697.006992 0.160824 0.184795\n",
"\t10 10971.722637 11424.445844 0.098588 0.116722\n",
"\t15 10574.916600 11047.434163 0.075266 0.088067\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 11108.923 K -- next t_inner 10224.266 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 15/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 9.00727e+42 erg / s Luminosity absorbed = 2.88724e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 11413.626870 10712.622749 0.489526 0.455660\n",
"\t5 11697.006992 11125.894032 0.184795 0.164091\n",
"\t10 11424.445844 10816.390451 0.116722 0.104037\n",
"\t15 11047.434163 10421.687097 0.088067 0.080401\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 10224.266 K -- next t_inner 11087.666 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 16/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 1.23781e+43 erg / s Luminosity absorbed = 4.07435e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 10712.622749 11352.158138 0.455660 0.500754\n",
"\t5 11125.894032 11644.968350 0.164091 0.185289\n",
"\t10 10816.390451 11320.695930 0.104037 0.119195\n",
"\t15 10421.687097 10965.228363 0.080401 0.089940\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 11087.666 K -- next t_inner 10256.946 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 17/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 9.18956e+42 erg / s Luminosity absorbed = 2.86249e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 11352.158138 10738.799194 0.500754 0.452965\n",
"\t5 11644.968350 11210.269586 0.185289 0.160945\n",
"\t10 11320.695930 10911.463205 0.119195 0.103910\n",
"\t15 10965.228363 10545.065525 0.089940 0.078433\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 10256.946 K -- next t_inner 11012.230 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 18/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 1.20741e+43 erg / s Luminosity absorbed = 3.93375e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 10738.799194 11316.665617 0.452965 0.492135\n",
"\t5 11210.269586 11599.094127 0.160945 0.183929\n",
"\t10 10911.463205 11403.508986 0.103910 0.114400\n",
"\t15 10545.065525 10958.974248 0.078433 0.087415\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 11012.230 K -- next t_inner 10314.623 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 19/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 9.29848e+42 erg / s Luminosity absorbed = 3.02011e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Plasma stratification:\n",
"\t t_rad next_t_rad w next_w\n",
"\tShell \n",
"\t0 11316.665617 10862.505720 0.492135 0.444495\n",
"\t5 11599.094127 11194.462074 0.183929 0.162842\n",
"\t10 11403.508986 11065.620645 0.114400 0.099372\n",
"\t15 10958.974248 10599.851144 0.087415 0.077690\n",
"\n",
" (\u001b[1mbase.py\u001b[0m:348)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] t_inner 10314.623 K -- next t_inner 11009.102 K (\u001b[1mbase.py\u001b[0m:350)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Starting iteration 20/20 (\u001b[1mbase.py\u001b[0m:266)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Luminosity emitted = 1.21062e+43 erg / s Luminosity absorbed = 3.88405e+42 erg / s Luminosity requested = 1.05928e+43 erg / s (\u001b[1mbase.py\u001b[0m:357)\n",
"[\u001b[1mtardis.simulation.base\u001b[0m][\u001b[1;37mINFO\u001b[0m ] Simulation finished in 20 iterations and took 102.49 s (\u001b[1mbase.py\u001b[0m:306)\n"
]
}
],
"source": [
"#TARDIS now uses the data in the data repo\n",
"sim = run_tardis('/home/jasims/Desktop/tardis/docs/examples/tardis_example.yml')\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n",
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/site-packages/IPython/core/magics/pylab.py:160: UserWarning: pylab import has clobbered these variables: ['Figure']\n",
"`%matplotlib` prevents importing * from pylab and numpy\n",
" \"\\n`%matplotlib` prevents importing * from pylab and numpy\"\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n",
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/site-packages/astropy/units/quantity.py:1067: AstropyDeprecationWarning: The truth value of a Quantity is ambiguous. In the future this will raise a ValueError.\n",
" AstropyDeprecationWarning)\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n",
"[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] /home/jasims/anaconda3/envs/simu/lib/python3.6/site-packages/tardis/montecarlo/formal_integral.py:167: FutureWarning: Method .as_matrix will be removed in a future version. Use .values instead.\n",
" result = pd.DataFrame(att_S_ul.as_matrix(), index=transitions.transition_line_id.values)\n",
" (\u001b[1mwarnings.py\u001b[0m:99)\n"
]
},
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdeZQcZb0+8PGH6HXheu49VxS851aQRZYICAiCyK6gbIoiCigqiogoRtCa7CQhCdkhCQkhgWyELBCy1eyZPZlMZiaZyez7vmcms2f2fn5/VFd1vd0zk+6p6fRU1/M5p881Xd2Vt8P3nO9zq+p93xAQERERka2EBHoARERERHR+MQASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwDIBEREZHNMAASERER2QwD4ARJTEzEI488gksuuQQhISHYt2+fT98vLCzEPffcg4svvhif//zncdlll2HmzJkYGBgQPrd27VpcffXV+I//+A9cddVV2Lp160T+DCIiIrIBBsAJEh4ejpkzZ2Lv3r3jCoBlZWX44IMPkJWVhcrKShw4cAAXX3wxpk+frn9m3bp1uOiii7Br1y6UlZVh586d+PKXv4yDBw9O9M8hIiKiIMYA6AcjBcD+/n7861//wqWXXoovfvGLuPXWWxEfHz/meaZNm4Y777xT//Ptt9+O1157TfjMK6+8gu9///sTNnYiIiIKfgyAfjBSAHz66adxxx13ICkpCaWlpVi2bBk+//nPo7i4eMRzlJSU4JprrsHMmTP192666SbMmjVL+FxoaCguvPBCj1vFRERERKNhAPQD9wBYWlqKz3zmM6irqxM+d//99wu3eAH1Kt/nP/95hISE4IUXXsDw8LB+bPr06fj617+OjIwMOBwOpKen4+KLL0ZISAjq6+v9+6OIiIgoaDAA+oF7ANyzZw9CQkLwpS99SXh99rOfxS9/+Uvhu9XV1cjL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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7fd679639828>]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%pylab notebook\n",
"\n",
"spectrum = sim.runner.spectrum_integrated\n",
"#x=spectrum.wavelength\n",
"#y=spectrum.luminosity_density_lambda\n",
"plot(spectrum.wavelength, spectrum.luminosity_density_lambda)\n",
"#print(x)\n",
"#print(type(y))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Plotted the Spectrum and will pass the spectrum values as x and y in the brush selector."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Coding for the brush Starts from here."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"from bqplot.interacts import (BrushSelector)\n",
"from ipywidgets import VBox,HTML\n",
"from bqplot import LinearScale, Axis, Lines, Scatter, Figure\n",
"import numpy as np\n",
"\n",
"#p=bigData['S_W'].values\n",
"#o=bigData['S_D'].values\n",
"#print (p,o)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "11fa469d7cc6407c85810895d1eb4727",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HTML(value='[]'), Figure(axes=[Axis(label='Spectrum Wavelenght', scale=LinearScale()), Axis(lab…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sc_x = LinearScale()\n",
"sc_y = LinearScale()\n",
"\n",
"symbol = 'Spectrum Wavelenght'\n",
"symbol2 = 'Spectrum Density'\n",
"\n",
"scatt = Scatter(x=spectrum.wavelength, y=spectrum.luminosity_density_lambda,\n",
" scales={'x': sc_x, 'y': sc_y})\n",
"\n",
"sc_xax = Axis(label=(symbol), scale=sc_x)\n",
"sc_yax = Axis(label=(symbol2), scale=sc_y, orientation='vertical')\n",
"\n",
"br_sel = BrushSelector(x_scale=sc_x, y_scale=sc_y, marks=[scatt], color='black')\n",
"\n",
"\n",
"## We use the HTML widget to see the value of what we are selecting and modify it when an interaction is performed\n",
"## on the selector\n",
"\n",
"db_scat_brush = HTML(value='[]')\n",
"\n",
"## Now, we define a function that will be called when the selectors are interacted with - a callback\n",
"## call back for the selector\n",
"def brush_callback(change):\n",
" db_scat_brush.value = str(br_sel.selected)\n",
" \n",
"br_sel.observe(brush_callback, names=['brushing'])\n",
"\n",
"\n",
"fig_scat_brush = Figure(marks=[scatt], axes=[sc_xax, sc_yax], title='Brush Selector By Pabla007',\n",
" interaction=br_sel,background_style={'fill':'pink'})\n",
"\n",
"VBox([db_scat_brush, fig_scat_brush])"
]
}
],
"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.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment