{
 "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](http://matplotlib.org/)\n",
    " * [NumPy](http://www.numpy.org/)\n",
    " * [Pandas](http://pandas.pydata.org/)\n",
    " * [Scikit-image](http://scikit-image.org/)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "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": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "screenId = 3  # sysgro"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Method definitions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "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": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def getLengthsFromStrain(astrain, lenlen=100):\n",
    "    lengths = []\n",
    "    for we in sysgroba[sysgroba[\"Characteristics [Strain]\"] == astrain].Well.values:\n",
    "        we = conn.getObject('Well', we)\n",
    "        ii = 0\n",
    "        while True:\n",
    "            imid = we.getImage(ii)\n",
    "            ii = ii+1\n",
    "            if imid == None:\n",
    "                break\n",
    "            imId = imid.getId()\n",
    "            result = roiService.findByImage(imId, None)\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",
    "                ori = skmes.regionprops(1 * imroi)[0].orientation\n",
    "                imroi = sktrans.rotate(1. * imroi, -ori/(np.pi)*180, resize=True, order=0)\n",
    "                bbox = skmes.regionprops(skmes.label(imroi))[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": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "conn = connection()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "roiService = conn.getRoiService()\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": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "WTls = getLengthsFromStrain('MS1404', lenlen=200)\n",
    "ash2ls = getLengthsFromStrain('ash2', lenlen=200)\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": null,
   "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": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADfFJREFUeJzt3V+sHPV5xvHnaUwumqDWxgfqppy6VBSVXoSgI8uUNsKi\nEBdVgVRKFVRFViE6iRSiUBWpppFSpF6QtEq4qKpUTm1hVZSmVUJBldNgWZZQJTuqjQwYmWCwHOLg\n2vypClUvWpO3F/s7dHMyc/bf7Ozs6+9HWu3sb39z9mXO+GHO7L47jggBAObfT826AABAMwh0AEiC\nQAeAJAh0AEiCQAeAJAh0AEiCQAeAJAh0AEiCQAeAJNa1+WIbN26MzZs3t/mSADD3jh49+npELAya\n12qgb968WUeOHGnzJQFg7tn+/jDzOOUCAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQ\nBIEOAEm02imKOXPwwerxbfe3WweAoXCEDgBJEOgAkASBDgBJEOgAkASBDgBJEOgAkASBDgBJEOgA\nkASBDgBJEOgAkASBDgBJEOgAkASBDgBJEOgAkASBDgBJEOgAkASBDgBJEOgAkASBDgBJEOgAkASB\nDgBJEOgAkMTAQLd9pe2Dtk/Yft7258v4Btv7bZ8s9+unXy4AoM4wR+gXJP1RRPyqpK2SPmv7Wkk7\nJR2IiKslHSiPAQAzMjDQI+JsRDxdlt+WdELSByTdLmlvmbZX0h3TKhIAMNhI59Btb5b0IUnflXRF\nRJyVeqEv6fKmiwMADG/oQLf9fknflHRvRLw1wnrLto/YPvLaa6+NUyMAYAhDBbrtS9QL80ci4ltl\n+JztTeX5TZLOV60bEbsiYikilhYWFpqoGQBQYZhPuVjSbkknIuKrfU89IWlHWd4h6fHmywMADGvd\nEHNulPRJSc/ZPlbG/kTSlyT9g+27Jb0i6ePTKREAMIyBgR4R/yrJNU/f3Gw5AIBx0SkKAEkQ6ACQ\nBIEOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEO\nAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ\n6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQxMBAt73H9nnbx/vGHrD9Q9vH\nyu226ZYJABhkmCP0hyVtrxh/KCKuK7d9zZYFABjVwECPiKckvdlCLQCACUxyDv0e28+WUzLrG6sI\nADCWdWOu9zVJfyYpyv1XJN1VNdH2sqRlSVpcXBzz5ebLQ/tfrBz/w1t+peVKWnTwwerxbfe3Wwdw\nERvrCD0izkXEOxHxI0lfl7Rljbm7ImIpIpYWFhbGrRMAMMBYgW57U9/Dj0k6XjcXANCOgadcbD8q\n6SZJG22fkfSnkm6yfZ16p1xOS/r0FGsEAAxhYKBHxJ0Vw7unUAsAYAJ0igJAEgQ6ACRBoANAEgQ6\nACQxbmMRGjTzRqS6piAAc4UjdABIgkAHgCQIdABIgkAHgCQIdABIgkAHgCQIdABIgkAHgCQuvsai\nqiaaWVxVp6+Ora+88e7y4cXl9msBkAJH6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEO\nAElcfI1Fc2TmVzICMFc4QgeAJAh0AEiCQAeAJAh0AEiCQAeAJAh0AEiCQAeAJAh0AEiCxqIJ1DX+\nDDO//ypFE5nCFZgOnaqu7YarLqt/TQAzxxE6ACRBoANAEgQ6ACRBoANAEgMD3fYe2+dtH+8b22B7\nv+2T5X79dMsEAAwyzBH6w5K2rxrbKelARFwt6UB5DACYoYGBHhFPSXpz1fDtkvaW5b2S7mi4LgDA\niMY9h35FRJyVpHJ/eXMlAQDGMfXGItvLkpYlaXFxcdov147SWLO6Oejw4vJPTN36yq7GX35Qg9Lh\nCz/e8NS1KxxVNWR1rUZgHo17hH7O9iZJKvfn6yZGxK6IWIqIpYWFhTFfDgAwyLiB/oSkHWV5h6TH\nmykHADCuYT62+KikQ5KusX3G9t2SviTpFtsnJd1SHgMAZmjgOfSIuLPmqZsbrgUAMAE6RQEgCQId\nAJIg0AEgCQIdAJLgikV96q5ANO9NLyv/XaubnN69AtGQBl7JqAOy/g6BYXCEDgBJEOgAkASBDgBJ\nEOgAkASBDgBJEOgAkASBDgBJEOgAkASNRWtYacQ5tHvGhcypQ6fekE7d9xPjW6smHyzNSdvur3ju\nweoXqJoLXMQ4QgeAJAh0AEiCQAeAJAh0AEiCQAeAJAh0AEiCQAeAJAh0AEiCxiLp3caVra9UX5Fn\nWKuvCITpOXTqDR2+UH11omniikjoMo7QASAJAh0AkiDQASAJAh0AkiDQASAJAh0AkiDQASAJAh0A\nkpifxqJRr1pTN39OjdK01HaD06FTkzVkreWh/S9O3PC18nOq1DUE1c1v6ucD08AROgAkQaADQBIE\nOgAkQaADQBITvSlq+7SktyW9I+lCRCw1URQAYHRNfMplW0S83sDPAQBMgFMuAJDEpIEekp60fdT2\nchMFAQDGM+kplxsj4lXbl0vab/uFiHiqf0IJ+mVJWlxcnPDlKgxoIKprernhqsuar6UBbTYFTbMh\naF6M2kAEdNlER+gR8Wq5Py/pMUlbKubsioiliFhaWFiY5OUAAGsYO9Btv8/2pSvLkm6VdLypwgAA\no5nklMsVkh6zvfJz/i4i/qWRqgAAIxs70CPilKQPNlgLAGACfGwRAJIg0AEgCQIdAJIg0AEgifm5\nYlHDaKrplpXfx+ELkzf61DVnHV5sv5mZKxmhTRyhA0ASBDoAJEGgA0ASBDoAJEGgA0ASBDoAJEGg\nA0ASBDoAJHHRNhZh/rV5dadZo0EJw+AIHQCSINABIAkCHQCSINABIAkCHQCSINABIAkCHQCSINAB\nIIk0jUVcgSiHaTYLdelKRsA0cIQOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQBIEOAEkQ6ACQRJrG\nImBcozQzNdWEdGj3fVP72dN2UVw96eCD1ePb7h+46iy3D0foAJAEgQ4ASRDoAJAEgQ4ASUwU6La3\n2/6e7Zds72yqKADA6MYOdNvvkfRXkn5b0rWS7rR9bVOFAQBGM8kR+hZJL0XEqYj4H0l/L+n2ZsoC\nAIxqkkD/gKQf9D0+U8YAADPgiBhvRfvjkj4SEZ8qjz8paUtEfG7VvGVJKx0T10j63hA/fqOk18cq\nrH3zUuu81ClR6zTMS50StVb5xYhYGDRpkk7RM5Ku7Hv8C5JeXT0pInZJGum6YraPRMTSBLW1Zl5q\nnZc6JWqdhnmpU6LWSUxyyuXfJF1t+5dsv1fSJyQ90UxZAIBRjX2EHhEXbN8j6TuS3iNpT0Q831hl\nAICRTPTlXBGxT9K+hmrpN71LvzdvXmqdlzolap2GealTotaxjf2mKACgW2j9B4AkZhbotq+xfazv\n9pbte1fNucn2f/bN+WKL9e2xfd728b6xDbb32z5Z7tfXrLujzDlpe8cM6vwL2y/Yftb2Y7Z/tmbd\n07afK9v2yDTrXKPWB2z/sO93fFvNuq1+zURNrd/oq/O07WM167a2XW1fafug7RO2n7f9+TLexX21\nrtZO7a9r1NnJffXHRMTMb+q9qfrv6n3Wsn/8Jkn/PKOaPizpeknH+8b+XNLOsrxT0pcr1tsg6VS5\nX1+W17dc562S1pXlL1fVWZ47LWnjjLfpA5LuG2L/eFnSVZLeK+kZSde2Xeuq578i6Yuz3q6SNkm6\nvixfKulF9b6Ko4v7al2tndpf16izk/tq/60rp1xulvRyRHx/1oWsiIinJL25avh2SXvL8l5Jd1Ss\n+hFJ+yPizYj4D0n7JW1vs86IeDIiLpSHh9XrEZi5mm06jNa/ZmKtWm1b0u9JenSaNQwjIs5GxNNl\n+W1JJ9Tr2O7ivlpZa9f21zW26TBm+pUoXQn0T6j+H8cNtp+x/W3bv9ZmURWuiIizUu+XLunyijld\n+0qEuyR9u+a5kPSk7aOlo3dW7il/bu+pOTXQtW36m5LORcTJmudnsl1tb5b0IUnfVcf31VW19uvU\n/lpRZ6f31ZkHemlK+qikf6x4+mn1TsN8UNJfSvqnNmsbkyvGZvJRIttfkHRB0iM1U26MiOvV+8bM\nz9r+cGvF/b+vSfplSddJOqveqYzVOrNNizu19tF569vV9vslfVPSvRHx1rCrVYxNfbvW1dq1/bWi\nzs7vqzMPdPV+OU9HxLnVT0TEWxHxX2V5n6RLbG9su8A+52xvkqRyf75izlBfiTBt5Q2u35H0+1FO\n7q0WEa+W+/OSHlPvz8VWRcS5iHgnIn4k6es1NXRim0qS7XWSflfSN+rmtL1dbV+iXvA8EhHfKsOd\n3Fdrau3c/lpV5zzsq10I9NqjHds/V85XyvYW9ep9o8XaVntC0sonAXZIerxiznck3Wp7ffmT7NYy\n1hrb2yX9saSPRsR/18x5n+1LV5bVq/N41dxpWgmd4mM1NXTpayZ+S9ILEXGm6sm2t2v597Fb0omI\n+GrfU53bV+tq7dr+ukad3d9X23r3teYd4Z9WL6B/pm/sM5I+U5bvkfS8eu8UH5b06y3W9qh6f1b9\nr3r/171b0mWSDkg6We43lLlLkv6mb927JL1Ubn8wgzpfUu883rFy++sy9+cl7SvLV5Xt+kzZxl+Y\n0Tb9W0nPSXpWvR1/0+pay+Pb1Pu0wcuzqrWMP7yyf/bNndl2lfQb6v1J/2zf7/u2ju6rdbV2an9d\no85O7qv9NzpFASCJLpxyAQA0gEAHgCQIdABIgkAHgCQIdABIgkAHgCQIdABIgkAHgCT+D5sRfz0n\nOJq/AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2bc32282d0>"
      ]
     },
     "metadata": {},
     "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": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Ttest_indResult(statistic=-3.9099766965779321, pvalue=0.00010626848336313707)"
      ]
     },
     "execution_count": 8,
     "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": "OMERO 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.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}