Created
February 14, 2022 16:56
-
-
Save manzt/213fec8ddd8643e7a31d57fabc00008e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "ff3b9947", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"import pandas as pd\n", | |
"import pyarrow.parquet as pq\n", | |
"import bioframe as bf\n", | |
"\n", | |
"from pathlib import Path\n", | |
"\n", | |
"data = Path('data')\n", | |
"\n", | |
"df = pq.read_table(data / 'HCT116_Unsynchronized.hg38.250000.E0-E128.trans.eigvecs.pq').to_pandas()\n", | |
"df.dropna(axis=0, subset=['E0', 'E1'], inplace=True)\n", | |
"df.chrom = df.chrom.astype(\"category\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "99faa0c6", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import slugid\n", | |
"from dataclasses import dataclass, field\n", | |
"import numpy as np\n", | |
"from rich import print\n", | |
"import bioframe as bf\n", | |
"import pandas as pd\n", | |
"\n", | |
"\n", | |
"def get_lens(chromsizes: pd.Series):\n", | |
" abslen = chromsizes.cumsum()\n", | |
" starts = pd.Series([0] + abslen[:-1].tolist(), index=abslen.index)\n", | |
" return dict(starts)\n", | |
"\n", | |
"def prepare_tiles(df, starts):\n", | |
" tiles = bf.merge(df)\n", | |
" return [\n", | |
" {\n", | |
" \"chrOffset\": int(starts[l[0]]),\n", | |
" \"xStart\": int(starts[l[0]] + l[1]),\n", | |
" \"xEnd\": int(starts[l[0]] + l[2]),\n", | |
" \"importance\": 0,\n", | |
" \"uid\": slugid.nice(),\n", | |
" \"fields\": [s if isinstance(s, str) else int(s) for s in l]\n", | |
" } for l in tiles.to_records(index=False)\n", | |
" ]\n", | |
"\n", | |
"@dataclass\n", | |
"class Tileset:\n", | |
" df: pd.DataFrame\n", | |
" chromsizes: pd.Series\n", | |
" uid: str = field(default_factory=slugid.nice)\n", | |
" datatype = \"bedlike\"\n", | |
" \n", | |
" def __post_init__(self):\n", | |
" self._starts = get_lens(self.chromsizes)\n", | |
" self._tiles = prepare_tiles(self.df, self._starts)\n", | |
"\n", | |
" \n", | |
" def subset(self, locs):\n", | |
" if locs is None:\n", | |
" df = self.df\n", | |
" else:\n", | |
" df = self.df.iloc[locs]\n", | |
" self._tiles = prepare_tiles(df, self._starts)\n", | |
"\n", | |
" \n", | |
" def info(self):\n", | |
" genome_length = int(np.sum(self.chromsizes.values))\n", | |
" return {\n", | |
" \"uuid\": self.uid,\n", | |
" \"max_width\": genome_length,\n", | |
" \"min_pos\": [1],\n", | |
" \"max_pos\": [genome_length],\n", | |
" \"max_zoom\": 0,\n", | |
" }\n", | |
" \n", | |
" def tiles(self, _tileids):\n", | |
" return [(f\"{self.uid}.0.0\", self._tiles)]\n", | |
" " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"id": "0de8b820", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import hg\n", | |
"\n", | |
"chromsizes = bf.fetch_chromsizes('hg38')[:'chrY']\n", | |
"t = Tileset(df, chromsizes)\n", | |
"ts = hg.server.add(t)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"id": "a2dfffbd", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "b6227b4bcf1b4ca18fd97c1af58636f1", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"HiGlassWidget()" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"remote_tileset = hg.remote(\n", | |
" uid='CQMd6V_cRw6iCI_-Unl3PQ',\n", | |
" server='https://higlass.io/api/v1/',\n", | |
")\n", | |
"\n", | |
"dynamic_track = ts.track()\n", | |
"\n", | |
"v = hg.view(\n", | |
" dynamic_track,\n", | |
" remote_tileset.track('heatmap', height=300),\n", | |
")\n", | |
"\n", | |
"conf = hg.viewconf(v)\n", | |
"w = conf.widget()\n", | |
"w" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"id": "be626760", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "674c3909b4214a96b66a9699bd234592", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"HBox(children=(VBox(children=(Button(button_style='primary', icon='arrows', layout=Layout(width='36px'), style…" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"import ipywidgets as widgets\n", | |
"import jscatter\n", | |
"\n", | |
"scatter = jscatter.Scatter(x='E1', y='E2', color_by=\"GC\", data=df)\n", | |
"scatter.show()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "db5e5251", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def on_selection_change(change):\n", | |
" t.subset(None if len(change[\"new\"]) == 0 else change[\"new\"])\n", | |
" reload_selector = { \"trackId\": dynamic_track.uid, \"viewId\": conf.views[0].uid }\n", | |
" w.reload(reload_selector)\n", | |
" \n", | |
"scatter.widget.observe(on_selection_change, names=\"selection\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "7b0d90cc", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (ipykernel)", | |
"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.9.7" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment