Created
April 2, 2014 13:47
-
-
Save sburns/9934490 to your computer and use it in GitHub Desktop.
ipython notebook exploring a data-driven approach to ordering the Destrieux labels from freesurfer
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
| { | |
| "metadata": { | |
| "name": "", | |
| "signature": "sha256:7ca65819a129445282796c3868d0f651a25b6885081aac6f1099f317f93e1638" | |
| }, | |
| "nbformat": 3, | |
| "nbformat_minor": 0, | |
| "worksheets": [ | |
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "This notebook will explore methods to intelligently order the advanced Destrieux labels produced by freesurfer." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "import os\n", | |
| "import pandas as pd\n", | |
| "import numpy as np\n", | |
| "from glob import glob\n", | |
| "%matplotlib inline\n", | |
| "import seaborn as sns" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 94 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "def df_from_label(label):\n", | |
| " df = pd.read_table(label,\n", | |
| " sep=r'[\\s]*',\n", | |
| " names=['Vertex', 'X', 'Y', 'Z', '?'],\n", | |
| " skiprows=2,\n", | |
| " header=None,\n", | |
| " index_col='Vertex').drop(['?'], axis=1)\n", | |
| " return df\n", | |
| "\n", | |
| "def distance(record, anchor):\n", | |
| " \"Compute the distance from some label\"\n", | |
| " x2 = pow(record['X'] - anchor['X'], 2)\n", | |
| " y2 = pow(record['Y'] - anchor['Y'], 2)\n", | |
| " z2 = pow(record['Z'] - anchor['Z'], 2)\n", | |
| " return np.sqrt(x2 + y2 + z2)\n", | |
| "\n", | |
| "def cog_from_df(df):\n", | |
| " df.sort_index(by=['X', 'Y', 'Z'], inplace=True)\n", | |
| " df['dist'] = df.apply(distance, axis=1, anchor=df.median())\n", | |
| " df.sort_index(by='dist', inplace=True)\n", | |
| " return df.ix[df.index[0]]" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 91 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "template = '/scratch/burnsss1/freesurfer-subjects/fsaverage/label/lh.*.label'\n", | |
| "data = []\n", | |
| "for label in glob(template):\n", | |
| " roi_from_label = os.path.basename(label).replace('lh.', '').replace('.label', '')\n", | |
| " record = dict(label=roi_from_label)\n", | |
| " cog = cog_from_df(df_from_label(label))\n", | |
| " record['X'], record['Y'], record['Z'] = int(cog['X']), int(cog['Y']), int(cog['Z'])\n", | |
| " data.append(record)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [], | |
| "prompt_number": 102 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "df = pd.DataFrame(data)\n", | |
| "df.index = df.label\n", | |
| "del df['label']\n", | |
| "df.head()" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "html": [ | |
| "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>X</th>\n", | |
| " <th>Y</th>\n", | |
| " <th>Z</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>label</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>BA1</th>\n", | |
| " <td>-42</td>\n", | |
| " <td> -6</td>\n", | |
| " <td> 38</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>BA2</th>\n", | |
| " <td>-38</td>\n", | |
| " <td>-10</td>\n", | |
| " <td> 30</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>BA3a</th>\n", | |
| " <td>-32</td>\n", | |
| " <td> -2</td>\n", | |
| " <td> 22</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>BA3b</th>\n", | |
| " <td>-41</td>\n", | |
| " <td> 5</td>\n", | |
| " <td> 24</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>BA44</th>\n", | |
| " <td>-48</td>\n", | |
| " <td> 30</td>\n", | |
| " <td> 4</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 103, | |
| "text": [ | |
| " X Y Z\n", | |
| "label \n", | |
| "BA1 -42 -6 38\n", | |
| "BA2 -38 -10 30\n", | |
| "BA3a -32 -2 22\n", | |
| "BA3b -41 5 24\n", | |
| "BA44 -48 30 4" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 103 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "df.sort_index(by=['Y', 'X', 'Z'], ascending=False, inplace=True)\n", | |
| "df.head()" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "html": [ | |
| "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n", | |
| "<table border=\"1\" class=\"dataframe\">\n", | |
| " <thead>\n", | |
| " <tr style=\"text-align: right;\">\n", | |
| " <th></th>\n", | |
| " <th>X</th>\n", | |
| " <th>Y</th>\n", | |
| " <th>Z</th>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>label</th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " <th></th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " <tr>\n", | |
| " <th>G_and_S_transv_frontopol</th>\n", | |
| " <td>-14</td>\n", | |
| " <td> 62</td>\n", | |
| " <td> 0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>G_and_S_frontomargin</th>\n", | |
| " <td>-23</td>\n", | |
| " <td> 53</td>\n", | |
| " <td> -6</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>BA45</th>\n", | |
| " <td>-44</td>\n", | |
| " <td> 47</td>\n", | |
| " <td> 0</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>S_front_middle</th>\n", | |
| " <td>-25</td>\n", | |
| " <td> 43</td>\n", | |
| " <td> 16</td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th>G_and_S_cingul-Ant</th>\n", | |
| " <td>-10</td>\n", | |
| " <td> 39</td>\n", | |
| " <td> 8</td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| "</table>\n", | |
| "</div>" | |
| ], | |
| "metadata": {}, | |
| "output_type": "pyout", | |
| "prompt_number": 104, | |
| "text": [ | |
| " X Y Z\n", | |
| "label \n", | |
| "G_and_S_transv_frontopol -14 62 0\n", | |
| "G_and_S_frontomargin -23 53 -6\n", | |
| "BA45 -44 47 0\n", | |
| "S_front_middle -25 43 16\n", | |
| "G_and_S_cingul-Ant -10 39 8" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 104 | |
| }, | |
| { | |
| "cell_type": "code", | |
| "collapsed": false, | |
| "input": [ | |
| "print '\\n'.join(df.index)" | |
| ], | |
| "language": "python", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "stream": "stdout", | |
| "text": [ | |
| "G_and_S_transv_frontopol\n", | |
| "G_and_S_frontomargin\n", | |
| "BA45\n", | |
| "S_front_middle\n", | |
| "G_and_S_cingul-Ant\n", | |
| "S_orbital_lateral\n", | |
| "S_suborbital\n", | |
| "G_rectus\n", | |
| "S_orbital-H_Shaped\n", | |
| "Lat_Fis-ant-Horizont\n", | |
| "G_front_inf-Orbital\n", | |
| "BA44\n", | |
| "G_front_middle\n", | |
| "G_orbital\n", | |
| "G_front_inf-Triangul\n", | |
| "S_orbital_med-olfact\n", | |
| "S_circular_insula_ant\n", | |
| "S_front_inf\n", | |
| "G_front_sup\n", | |
| "Lat_Fis-ant-Vertical\n", | |
| "S_front_sup\n", | |
| "G_subcallosal\n", | |
| "G_and_S_cingul-Mid-Ant\n", | |
| "G_front_inf-Opercular\n", | |
| "G_insular_short\n", | |
| "BA6\n", | |
| "S_circular_insula_sup\n", | |
| "BA3b\n", | |
| "Pole_temporal\n", | |
| "G_temp_sup-Plan_polar\n", | |
| "S_precentral-inf-part\n", | |
| "BA4p\n", | |
| "BA3a\n", | |
| "entorhinal\n", | |
| "BA4a\n", | |
| "BA1\n", | |
| "G_Ins_lg_and_S_cent_ins\n", | |
| "S_pericallosal\n", | |
| "BA2\n", | |
| "G_precentral\n", | |
| "G_and_S_cingul-Mid-Post\n", | |
| "S_precentral-sup-part\n", | |
| "G_and_S_subcentral\n", | |
| "S_circular_insula_inf\n", | |
| "Medial_wall\n", | |
| "Unknown\n", | |
| "G_temp_sup-Lateral\n", | |
| "G_oc-temp_med-Parahip\n", | |
| "S_collat_transv_ant\n", | |
| "G_temp_sup-G_T_transv\n", | |
| "S_central\n", | |
| "aparc\n", | |
| "cortex\n", | |
| "S_temporal_transverse\n", | |
| "G_postcentral\n", | |
| "S_postcentral\n", | |
| "Lat_Fis-post\n", | |
| "G_and_S_paracentral\n", | |
| "G_temporal_middle\n", | |
| "G_cingul-Post-dorsal\n", | |
| "S_cingul-Marginalis\n", | |
| "G_pariet_inf-Supramar\n", | |
| "G_temporal_inf\n", | |
| "S_temporal_inf\n", | |
| "G_temp_sup-Plan_tempo\n", | |
| "G_cingul-Post-ventral\n", | |
| "MT\n", | |
| "S_temporal_sup\n", | |
| "S_oc-temp_med_and_Lingual\n", | |
| "S_oc-temp_lat\n", | |
| "S_subparietal\n", | |
| "S_interm_prim-Jensen\n", | |
| "V1\n", | |
| "G_oc-temp_lat-fusifor\n", | |
| "V2\n", | |
| "G_parietal_sup\n", | |
| "S_intrapariet_and_P_trans\n", | |
| "G_precuneus\n", | |
| "G_pariet_inf-Angular\n", | |
| "S_parieto_occipital\n", | |
| "S_occipital_ant\n", | |
| "S_calcarine\n", | |
| "G_oc-temp_med-Lingual\n", | |
| "S_oc_sup_and_transversal\n", | |
| "S_collat_transv_post\n", | |
| "G_and_S_occipital_inf\n", | |
| "G_cuneus\n", | |
| "G_occipital_middle\n", | |
| "S_oc_middle_and_Lunatus\n", | |
| "G_occipital_sup\n", | |
| "Pole_occipital\n" | |
| ] | |
| } | |
| ], | |
| "prompt_number": 105 | |
| } | |
| ], | |
| "metadata": {} | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment