Skip to content

Instantly share code, notes, and snippets.

@manzt
Created February 14, 2022 16:56
Show Gist options
  • Save manzt/213fec8ddd8643e7a31d57fabc00008e to your computer and use it in GitHub Desktop.
Save manzt/213fec8ddd8643e7a31d57fabc00008e to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"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