Skip to content

Instantly share code, notes, and snippets.

@pllim
Created November 11, 2016 22:15
Show Gist options
  • Save pllim/4ae0873b0342c770a928a334ce013a48 to your computer and use it in GitHub Desktop.
Save pllim/4ae0873b0342c770a928a334ce013a48 to your computer and use it in GitHub Desktop.
How to use Glue from Jupyter Notebook (by Tom Robitaille)
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Using Glue from the Jupyter Notebook"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%gui qt"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from glue import qglue"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"array = np.random.random((1000,1000))"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"app = qglue(foo=array)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"DataCollection (1 data set)\n",
"\t 0: foo"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"app.data_collection"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"viewer = app.viewers[0][0]"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"foo"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"viewer.attribute"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"Data (label: foo)"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"viewer.layers[0].layer"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.16246753, 0.35537997, 0.38471734, ..., 0.70458036,\n",
" 0.83518023, 0.58757432],\n",
" [ 0.94533194, 0.03160519, 0.37947688, ..., 0.33152329,\n",
" 0.96400637, 0.06685871],\n",
" [ 0.88623453, 0.46850102, 0.54816571, ..., 0.85734047,\n",
" 0.47349252, 0.77572612],\n",
" ..., \n",
" [ 0.18616184, 0.29723114, 0.56537987, ..., 0.74484991,\n",
" 0.05560389, 0.33837415],\n",
" [ 0.11347518, 0.39041683, 0.8933118 , ..., 0.79063587,\n",
" 0.78705679, 0.04581144],\n",
" [ 0.05843158, 0.23398407, 0.69897906, ..., 0.31565362,\n",
" 0.59749609, 0.74257233]])"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"viewer.layers[0].layer[viewer.attribute]"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"data = app.data_collection[1]"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.ndim"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(18949,)"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.shape"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[24mag,\n",
" 4.5mag,\n",
" 8.0mag,\n",
" DEdeg,\n",
" Emag,\n",
" G3.6mag,\n",
" G4.5mag,\n",
" G5.8mag,\n",
" G8.0mag,\n",
" Hmag,\n",
" Jmag,\n",
" Kmag,\n",
" Name,\n",
" Pixel Axis 0 [x],\n",
" RAdeg,\n",
" World 0,\n",
" b,\n",
" f_Name,\n",
" i2,\n",
" i4,\n",
" l,\n",
" m1,\n",
" srctype]"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.components"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from astropy.table import Table"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"t = Table({comp.label:data[comp] for comp in data.visible_components})"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0.00000000e+00, 1.00000000e+00, 2.00000000e+00, ...,\n",
" 1.89460000e+04, 1.89470000e+04, 1.89480000e+04])"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data['Name']"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"comp = data.get_component('Name')"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"comp.categorical"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"t = Table()\n",
"for cid in data.visible_components:\n",
" comp = data.get_component(cid)\n",
" if comp.categorical:\n",
" t[cid.label] = comp.labels\n",
" else:\n",
" t[cid.label] = comp.data"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<Table length=18949>\n",
"<table id=\"table5329227504\" class=\"table-striped table-bordered table-condensed\">\n",
"<thead><tr><th>Name</th><th>l</th><th>b</th><th>RAdeg</th><th>DEdeg</th><th>Jmag</th><th>Hmag</th><th>Kmag</th><th>G3.6mag</th><th>G4.5mag</th><th>G5.8mag</th><th>G8.0mag</th><th>4.5mag</th><th>8.0mag</th><th>Emag</th><th>24mag</th><th>f_Name</th><th>srctype</th><th>i2</th><th>i4</th><th>m1</th></tr></thead>\n",
"<thead><tr><th>str25</th><th>float32</th><th>float32</th><th>float32</th><th>float32</th><th>float32</th><th>float32</th><th>float32</th><th>float32</th><th>float32</th><th>float32</th><th>float32</th><th>float32</th><th>float32</th><th>float32</th><th>float32</th><th>str2</th><th>str4</th><th>float32</th><th>float32</th><th>float32</th></tr></thead>\n",
"<tr><td>SSTGLMC G000.0000+00.1611</td><td>0.0</td><td>0.1611</td><td>266.248</td><td>-28.8521</td><td>nan</td><td>nan</td><td>nan</td><td>9.78</td><td>9.19</td><td>8.64</td><td>8.05</td><td>9.13</td><td>8.17</td><td>nan</td><td>nan</td><td>AA</td><td>YSO</td><td>9.19</td><td>8.05</td><td>nan</td></tr>\n",
"<tr><td>SSTGLMC G000.0000-00.4342</td><td>0.0</td><td>-0.4342</td><td>266.829</td><td>-29.1617</td><td>nan</td><td>nan</td><td>11.73</td><td>8.29</td><td>6.89</td><td>5.37</td><td>4.3</td><td>6.89</td><td>4.31</td><td>nan</td><td>0.89</td><td>IA</td><td>xAGB</td><td>6.89</td><td>4.3</td><td>0.89</td></tr>\n",
"<tr><td>SSTGLMC G000.0031-00.5072</td><td>0.0031</td><td>-0.5072</td><td>266.903</td><td>-29.1969</td><td>nan</td><td>nan</td><td>nan</td><td>12.62</td><td>10.37</td><td>7.6</td><td>5.68</td><td>10.37</td><td>5.69</td><td>nan</td><td>1.41</td><td>IA</td><td>YSO</td><td>10.37</td><td>5.68</td><td>1.41</td></tr>\n",
"<tr><td>SSTGLMC G000.0046+01.1431</td><td>0.0046</td><td>1.1432</td><td>265.299</td><td>-28.3321</td><td>10.64</td><td>9.87</td><td>9.4</td><td>7.63</td><td>6.67</td><td>5.78</td><td>5.04</td><td>6.64</td><td>5.03</td><td>nan</td><td>4.5</td><td>AA</td><td>xAGB</td><td>6.67</td><td>5.04</td><td>4.5</td></tr>\n",
"<tr><td>SSTGLMC G000.0058+00.1527</td><td>0.0058</td><td>0.1528</td><td>266.26</td><td>-28.8516</td><td>13.62</td><td>11.98</td><td>10.73</td><td>9.1</td><td>8.53</td><td>7.85</td><td>6.78</td><td>8.56</td><td>6.76</td><td>nan</td><td>3.59</td><td>AA</td><td>YSO</td><td>8.53</td><td>6.78</td><td>3.59</td></tr>\n",
"<tr><td>SSTGLMC G000.0083-00.4818</td><td>0.0084</td><td>-0.4817</td><td>266.881</td><td>-29.1792</td><td>nan</td><td>nan</td><td>nan</td><td>9.74</td><td>8.79</td><td>7.85</td><td>7.19</td><td>8.88</td><td>7.18</td><td>nan</td><td>3.97</td><td>AA</td><td>YSO</td><td>8.79</td><td>7.19</td><td>3.97</td></tr>\n",
"<tr><td>SSTGLMC G000.0085+00.1542</td><td>0.0085</td><td>0.1543</td><td>266.26</td><td>-28.8484</td><td>nan</td><td>nan</td><td>12.57</td><td>8.31</td><td>6.86</td><td>5.78</td><td>5.31</td><td>6.87</td><td>5.29</td><td>nan</td><td>2.94</td><td>AA</td><td>xAGB</td><td>6.86</td><td>5.31</td><td>2.94</td></tr>\n",
"<tr><td>SSTGLMC G000.0098+00.1625</td><td>0.0098</td><td>0.1626</td><td>266.253</td><td>-28.843</td><td>nan</td><td>13.39</td><td>nan</td><td>8.34</td><td>7.59</td><td>7.07</td><td>6.32</td><td>7.5</td><td>6.26</td><td>nan</td><td>2.54</td><td>AA</td><td>xAGB</td><td>7.59</td><td>6.32</td><td>2.54</td></tr>\n",
"<tr><td>SSTGLMC G000.0106-00.7315</td><td>0.0106</td><td>-0.7314</td><td>267.127</td><td>-29.3063</td><td>11.31</td><td>8.97</td><td>7.77</td><td>nan</td><td>7.18</td><td>nan</td><td>6.07</td><td>7.21</td><td>6.01</td><td>nan</td><td>2.6</td><td>AA</td><td>xAGB</td><td>7.18</td><td>6.07</td><td>2.6</td></tr>\n",
"<tr><td>SSTGLMC G000.0110-01.0237</td><td>0.011</td><td>-1.0236</td><td>267.415</td><td>-29.4564</td><td>nan</td><td>nan</td><td>nan</td><td>9.25</td><td>8.32</td><td>7.27</td><td>6.3</td><td>8.44</td><td>6.24</td><td>nan</td><td>2.15</td><td>AA</td><td>YSO</td><td>8.32</td><td>6.3</td><td>2.15</td></tr>\n",
"<tr><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td></tr>\n",
"<tr><td>SSTGLMC G359.9801-00.4589</td><td>359.98</td><td>-0.4589</td><td>266.842</td><td>-29.1915</td><td>13.04</td><td>12.07</td><td>11.57</td><td>10.2</td><td>9.69</td><td>9.04</td><td>8.3</td><td>9.66</td><td>8.33</td><td>nan</td><td>nan</td><td>AA</td><td>YSO</td><td>9.69</td><td>8.3</td><td>nan</td></tr>\n",
"<tr><td>SSTGLMC G359.9878-00.1789</td><td>359.988</td><td>-0.1789</td><td>266.573</td><td>-29.0397</td><td>nan</td><td>12.59</td><td>9.93</td><td>7.4</td><td>6.76</td><td>6.0</td><td>5.64</td><td>6.85</td><td>5.69</td><td>nan</td><td>3.31</td><td>AA</td><td>xAGB</td><td>6.76</td><td>5.64</td><td>3.31</td></tr>\n",
"<tr><td>SSTGLMC G359.9880-00.6399</td><td>359.988</td><td>-0.6399</td><td>267.024</td><td>-29.2784</td><td>nan</td><td>nan</td><td>nan</td><td>11.46</td><td>11.13</td><td>10.27</td><td>9.51</td><td>11.13</td><td>9.64</td><td>nan</td><td>nan</td><td>IA</td><td>YSO</td><td>11.13</td><td>9.51</td><td>nan</td></tr>\n",
"<tr><td>SSTGLMC G359.9888+00.1907</td><td>359.989</td><td>0.1908</td><td>266.212</td><td>-28.8462</td><td>nan</td><td>nan</td><td>nan</td><td>9.91</td><td>9.26</td><td>7.63</td><td>5.74</td><td>9.26</td><td>5.67</td><td>nan</td><td>1.04</td><td>IA</td><td>YSO</td><td>9.26</td><td>5.74</td><td>1.04</td></tr>\n",
"<tr><td>SSTGLMC G359.9929+00.1755</td><td>359.993</td><td>0.1756</td><td>266.23</td><td>-28.8507</td><td>nan</td><td>nan</td><td>9.21</td><td>7.31</td><td>6.67</td><td>5.98</td><td>5.66</td><td>6.69</td><td>5.59</td><td>nan</td><td>3.57</td><td>AA</td><td>xAGB</td><td>6.67</td><td>5.66</td><td>3.57</td></tr>\n",
"<tr><td>SSTGLMC G359.9938+01.7542</td><td>359.994</td><td>1.7544</td><td>264.705</td><td>-28.0167</td><td>12.88</td><td>11.66</td><td>11.08</td><td>10.3</td><td>10.08</td><td>9.6</td><td>8.97</td><td>10.2</td><td>8.95</td><td>nan</td><td>nan</td><td>AA</td><td>YSO</td><td>10.08</td><td>8.97</td><td>nan</td></tr>\n",
"<tr><td>SSTGLMC G359.9942+00.0853</td><td>359.994</td><td>0.0854</td><td>266.318</td><td>-28.8966</td><td>nan</td><td>nan</td><td>12.11</td><td>8.18</td><td>6.62</td><td>5.71</td><td>5.51</td><td>6.67</td><td>5.51</td><td>nan</td><td>nan</td><td>AA</td><td>xAGB</td><td>6.62</td><td>5.51</td><td>nan</td></tr>\n",
"<tr><td>SSTGLMC G359.9948+00.1477</td><td>359.995</td><td>0.1478</td><td>266.258</td><td>-28.8635</td><td>nan</td><td>nan</td><td>11.81</td><td>9.75</td><td>9.03</td><td>8.34</td><td>7.79</td><td>8.98</td><td>7.79</td><td>nan</td><td>nan</td><td>AI</td><td>YSO</td><td>9.03</td><td>7.79</td><td>nan</td></tr>\n",
"<tr><td>SSTGLMC G359.9972+01.9148</td><td>359.997</td><td>1.9149</td><td>264.554</td><td>-27.9281</td><td>10.94</td><td>9.35</td><td>8.43</td><td>7.52</td><td>7.36</td><td>6.91</td><td>6.26</td><td>7.39</td><td>6.21</td><td>nan</td><td>4.1</td><td>AA</td><td>xAGB</td><td>7.36</td><td>6.26</td><td>4.1</td></tr>\n",
"<tr><td>SSTGLMC G359.9991+00.1550</td><td>359.999</td><td>0.1551</td><td>266.253</td><td>-28.856</td><td>nan</td><td>nan</td><td>12.43</td><td>10.22</td><td>9.28</td><td>8.53</td><td>7.93</td><td>9.29</td><td>7.85</td><td>nan</td><td>nan</td><td>AA</td><td>YSO</td><td>9.28</td><td>7.93</td><td>nan</td></tr>\n",
"</table>"
],
"text/plain": [
"<Table length=18949>\n",
" Name l b RAdeg ... i2 i4 m1 \n",
" str25 float32 float32 float32 ... float32 float32 float32\n",
"------------------------- ------- ------- ------- ... ------- ------- -------\n",
"SSTGLMC G000.0000+00.1611 0.0 0.1611 266.248 ... 9.19 8.05 nan\n",
"SSTGLMC G000.0000-00.4342 0.0 -0.4342 266.829 ... 6.89 4.3 0.89\n",
"SSTGLMC G000.0031-00.5072 0.0031 -0.5072 266.903 ... 10.37 5.68 1.41\n",
"SSTGLMC G000.0046+01.1431 0.0046 1.1432 265.299 ... 6.67 5.04 4.5\n",
"SSTGLMC G000.0058+00.1527 0.0058 0.1528 266.26 ... 8.53 6.78 3.59\n",
"SSTGLMC G000.0083-00.4818 0.0084 -0.4817 266.881 ... 8.79 7.19 3.97\n",
"SSTGLMC G000.0085+00.1542 0.0085 0.1543 266.26 ... 6.86 5.31 2.94\n",
"SSTGLMC G000.0098+00.1625 0.0098 0.1626 266.253 ... 7.59 6.32 2.54\n",
"SSTGLMC G000.0106-00.7315 0.0106 -0.7314 267.127 ... 7.18 6.07 2.6\n",
"SSTGLMC G000.0110-01.0237 0.011 -1.0236 267.415 ... 8.32 6.3 2.15\n",
" ... ... ... ... ... ... ... ...\n",
"SSTGLMC G359.9801-00.4589 359.98 -0.4589 266.842 ... 9.69 8.3 nan\n",
"SSTGLMC G359.9878-00.1789 359.988 -0.1789 266.573 ... 6.76 5.64 3.31\n",
"SSTGLMC G359.9880-00.6399 359.988 -0.6399 267.024 ... 11.13 9.51 nan\n",
"SSTGLMC G359.9888+00.1907 359.989 0.1908 266.212 ... 9.26 5.74 1.04\n",
"SSTGLMC G359.9929+00.1755 359.993 0.1756 266.23 ... 6.67 5.66 3.57\n",
"SSTGLMC G359.9938+01.7542 359.994 1.7544 264.705 ... 10.08 8.97 nan\n",
"SSTGLMC G359.9942+00.0853 359.994 0.0854 266.318 ... 6.62 5.51 nan\n",
"SSTGLMC G359.9948+00.1477 359.995 0.1478 266.258 ... 9.03 7.79 nan\n",
"SSTGLMC G359.9972+01.9148 359.997 1.9149 264.554 ... 7.36 6.26 4.1\n",
"SSTGLMC G359.9991+00.1550 359.999 0.1551 266.253 ... 9.28 7.93 nan"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"t"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"data2d = app.data_collection[0]"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.16246753, 0.35537997, 0.38471734, ..., 0.70458036,\n",
" 0.83518023, 0.58757432],\n",
" [ 0.94533194, 0.03160519, 0.37947688, ..., 0.33152329,\n",
" 0.96400637, 0.06685871],\n",
" [ 0.88623453, 0.46850102, 0.54816571, ..., 0.85734047,\n",
" 0.47349252, 0.77572612],\n",
" ..., \n",
" [ 0.18616184, 0.29723114, 0.56537987, ..., 0.74484991,\n",
" 0.05560389, 0.33837415],\n",
" [ 0.11347518, 0.39041683, 0.8933118 , ..., 0.79063587,\n",
" 0.78705679, 0.04581144],\n",
" [ 0.05843158, 0.23398407, 0.69897906, ..., 0.31565362,\n",
" 0.59749609, 0.74257233]])"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data2d['foo']"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.16246753, 0.35537997, 0.38471734, ..., 0.70458036,\n",
" 0.83518023, 0.58757432],\n",
" [ 0.94533194, 0.03160519, 0.37947688, ..., 0.33152329,\n",
" 0.96400637, 0.06685871],\n",
" [ 0.88623453, 0.46850102, 0.54816571, ..., 0.85734047,\n",
" 0.47349252, 0.77572612],\n",
" ..., \n",
" [ 0.18616184, 0.29723114, 0.56537987, ..., 0.74484991,\n",
" 0.05560389, 0.33837415],\n",
" [ 0.11347518, 0.39041683, 0.8933118 , ..., 0.79063587,\n",
" 0.78705679, 0.04581144],\n",
" [ 0.05843158, 0.23398407, 0.69897906, ..., 0.31565362,\n",
" 0.59749609, 0.74257233]])"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data2d.get_component('foo').data"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data_wcs = app.data_collection[2]"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"WCS Keywords\n",
"\n",
"Number of WCS axes: 2\n",
"CTYPE : 'GLON-CAR' 'GLAT-CAR' \n",
"CRVAL : 0.0 0.0 \n",
"CRPIX : 299.62799999999999 299.39400000000001 \n",
"NAXIS : 599 599"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_wcs.coords.wcs"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [default]",
"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.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
@pllim
Copy link
Author

pllim commented Nov 15, 2016

@astrofrog , in app = qglue(foo=array), if I have WCS associated with that data array, how do I pass WCS into that Glue app? It is unclear from your example here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment