{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Sysgro ROI Length\n", "\n", "This notebook loads the polygons which are linked to the images of idr0001-graml-sysgro and compares the length of cells labelled with a particular gene e.g. ASH2 versus the wild type." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dependencies\n", "\n", " * [Matplotlib](https://matplotlib.org/)\n", " * [NumPy](https://www.numpy.org/)\n", " * [Pandas](https://pandas.pydata.org/)\n", " * [Scikit-image](https://scikit-image.org/)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from idr import connection\n", "from pandas import Series\n", "from pandas import DataFrame\n", "from pandas import read_csv\n", "from pandas import merge,concat\n", "from pandas import read_hdf\n", "\n", "import os\n", "import omero\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import skimage.measure as skmes\n", "import skimage.transform as sktrans" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Common variables" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "screenId = 3 # sysgro" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Method definitions" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def getBulkAnnotationAsDf(screenID, conn):\n", " \"\"\"\n", " Download the annotation file from a screen as a Pandas DataFrame\n", " \"\"\"\n", " screen = conn.getObject('Screen', screenID)\n", " for ann in screen.listAnnotations():\n", " if isinstance(ann, omero.gateway.FileAnnotationWrapper):\n", " if (ann.getFile().getName() == 'bulk_annotations'):\n", " if (ann.getFile().getSize() > 147625090):\n", " print \"that's a big file...\"\n", " return None\n", " ofId = ann.getFile().getId()\n", " break\n", "\n", "\n", " original_file = omero.model.OriginalFileI(ofId, False)\n", " table = conn.c.sf.sharedResources().openTable(original_file)\n", " try:\n", " rowCount = table.getNumberOfRows()\n", " column_names = [col.name for col in table.getHeaders()]\n", "\n", " black_list = []\n", " column_indices = []\n", " for column_name in column_names:\n", " if column_name in black_list:\n", " continue\n", " column_indices.append(column_names.index(column_name))\n", "\n", " table_data = table.slice(column_indices, None)\n", " finally:\n", " table.close()\n", "\n", " data = []\n", " for index in range(rowCount):\n", " row_values = [column.values[index] for column in table_data.columns]\n", " data.append(row_values)\n", "\n", " dfAnn = DataFrame(data)\n", " dfAnn.columns = column_names\n", " return dfAnn" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def getLengthsFromStrain(astrain, lenlen=100, verbose=False):\n", " lengths = []\n", " params = omero.sys.ParametersI()\n", " wellids = sysgroba[sysgroba[\"Characteristics [Strain]\"] == astrain].Well.values\n", " params.addIds(wellids)\n", " # Wells and images that contain a ROI\n", " imageswithrois = queryService.projection(\n", " 'SELECT w.id, i.id FROM Image i JOIN i.wellSamples s JOIN s.well w '\n", " 'WHERE w.id in (:ids) AND EXISTS '\n", " '(SELECT 1 FROM Roi AS r WHERE r.image = i) ORDER BY i.id', params)\n", " wellswithrois = {}\n", " for wid, iid in omero.rtypes.unwrap(imageswithrois):\n", " try:\n", " wellswithrois[wid].append(iid)\n", " except KeyError:\n", " wellswithrois[wid] = [iid]\n", "\n", " for wid in sorted(wellswithrois.keys()):\n", " for imId in wellswithrois[wid]:\n", " result = roiService.findByImage(imId, None)\n", " if verbose:\n", " print('Well-id:%d Image-id:%d rois:[%d]' % (wid, imId, len(result.rois)))\n", " for ii in range(len(result.rois)):\n", "\n", " # get the coordinates of the outline of the ROI\n", " s = result.rois[ii].copyShapes()[0]\n", " pts = s.getPoints().getValue()\n", " pts = [int(xx) for x in pts.split(' ') for xx in x.split(',') ]\n", " pts = np.reshape(pts, (len(pts)/2, 2))\n", "\n", " # from coordinates to mask image\n", " M0, m0, M1, m1 = pts[:,0].max(), pts[:,0].min(), pts[:,1].max(), pts[:,1].min()\n", " imroi = np.zeros((M0-m0+1, M1-m1+1))\n", " for i in range(pts.shape[0]):\n", " imroi[pts[i, 0]-m0, pts[i, 1]-m1] = 1 \n", "\n", " iml = skmes.label(1-imroi, connectivity=1)\n", " imroi = 1*(iml==iml[iml.shape[0]/2, iml.shape[1]/2])\n", "\n", " # length of cell as length of bounding box of rotated image\n", " # (thanks to the particular shape of yeast cells)\n", " # default orientation is changing in 0.16 so -pi/2 to make relative to x-axis\n", " # http://scikit-image.org/docs/0.14.x/release_notes_and_installation.html#deprecations\n", " ori = skmes.regionprops(1 * imroi, coordinates='rc')[0].orientation - (np.pi / 2)\n", " imroi = sktrans.rotate(1. * imroi, -ori/(np.pi)*180, resize=True, order=0)\n", " bbox = skmes.regionprops(skmes.label(imroi), coordinates='rc')[0].bbox\n", " lengths.append(bbox[3] - bbox[1])\n", " if len(lengths) > lenlen: # to speed things up when there are a lot of images...\n", " break\n", " return lengths" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Connect" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Connected to IDR ...\n" ] } ], "source": [ "conn = connection()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load data" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "roiService = conn.getRoiService()\n", "queryService = conn.getQueryService()\n", "sysgroba = getBulkAnnotationAsDf(screenId, conn)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Extract length of cells as stored in ROIs in the IDR" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "WTls = getLengthsFromStrain('MS1404', lenlen=1000)\n", "ash2ls = getLengthsFromStrain('ash2', lenlen=1000)\n", "\n", "pixsize = .11 # could be taken from IDR metadata\n", "ash2ls = [x * pixsize for x in ash2ls]\n", "WTls = [x * pixsize for x in WTls]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Disconnect when done loading data" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "conn.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Display comparison of wild type to perturbed cells" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "h1 = plt.hist(ash2ls, bins=50, alpha=.5)\n", "h2 = plt.hist(WTls, bins=50, alpha=.5) " ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "Ttest_indResult(statistic=-13.398273380158818, pvalue=2.5160251562338347e-39)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.stats import ttest_ind\n", "ttest_ind(WTls, ash2ls)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### License\n", "\n", "Copyright (C) 2017 University of Dundee. All Rights Reserved.\n", "\n", "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n", "\n", "This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n", "You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." ] } ], "metadata": { "kernelspec": { "display_name": "IDR Python 2", "language": "python", "name": "python2" }, "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.15" } }, "nbformat": 4, "nbformat_minor": 2 }