{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [],
   "source": [
    "import plotly.graph_objs as go\n",
    "import plotly.express as px\n",
    "from plotly import tools, subplots\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import ipywidgets as widgets\n",
    "import math\n",
    "from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot\n",
    "from ipywidgets import interact, interactive, fixed, interact_manual\n",
    "init_notebook_mode(connected=True)\n",
    "import scipy.io as sio\n",
    "import random\n",
    "random.seed(123)\n",
    "from plotly.subplots import make_subplots\n",
    "import os \n",
    "\n",
    "import plotly.io as pio\n",
    "pio.renderers.default = \"plotly_mimetype\"\n",
    "data_path = os.path.join(\"..\",\"data\",\"venus-data\")\n",
    "derivativesDir = os.path.join(data_path,\"qMRFlow\")\n",
    "\n",
    "sessions = ['vendor750rev','vendorPRIrev','vendorSKYrev',\n",
    "           'rth750rev','rthPRIrev','rthSKYrev']\n",
    "sides = [\"negative\",\"negative\",\"negative\",\"positive\",\"positive\",\"positive\"]\n",
    "pointpos = [0,0,-0.14,0.14,0,0]\n",
    "convert_tag = {'rth750':'G1<sub>VENUS</sub>','rthPRI':'S1<sub>VENUS</sub>','rthSKY':'S2<sub>VENUS</sub>',\n",
    "               'vendor750':'G1<sub>NATIVE</sub>','vendorPRI':'S1<sub>NATIVE</sub>','vendorSKY':'S2<sub>NATIVE</sub>'}\n",
    "colors = {'rth750':'rgba(255,8,30,1)','rthPRI':'rgba(255,117,0,1)','rthSKY':'rgba(255,220,0,1)',\n",
    "         'vendor750':'rgba(0,75,255,1)','vendorPRI':'rgba(24,231,234,1)','vendorSKY':'rgba(24,234,141,1)'}\n",
    "colors_line = {'rth750':'rgba(255,8,30,0.35)','rthPRI':'rgba(255,117,0,0.35)','rthSKY':'rgba(255,220,0,0.35)',\n",
    "         'vendor750':'rgba(0,75,255,0.35)','vendorPRI':'rgba(24,231,234,0.35)','vendorSKY':'rgba(24,234,141,0.35)'}\n",
    "\n",
    "def plot_ridgelines(subject,sessions,metric,region,colors,sides,sampN,leg,lowlim,uplim):\n",
    "    df = pd.DataFrame()\n",
    "    traces = []\n",
    "    for jj in range(0,len(sessions),1):\n",
    "        avg_array  = []\n",
    "        std_array  =  []\n",
    "        cur_region = derivativesDir + '/sub-' + subject  + '/ses-' + sessions[jj] + '/stat/sub-' + subject + '_ses-' + sessions[jj] + '_desc-' + region + '_metrics.mat'\n",
    "        cur_contents = sio.loadmat(cur_region)\n",
    "        cur_contents = cur_contents[metric]\n",
    "        cur_contents = np.delete(cur_contents, np.where(cur_contents < lowlim))\n",
    "        cur_contents = np.delete(cur_contents, np.where(cur_contents > uplim))\n",
    "        cur_tag = sessions[jj][0:-3]\n",
    "        cur_contents = random.sample(list(cur_contents),sampN)\n",
    "        traces.append(go.Violin(\n",
    "            x=cur_contents,\n",
    "            name = convert_tag[cur_tag],\n",
    "            marker=dict(\n",
    "            opacity = 0.7,    \n",
    "            outliercolor='rgba(255, 255, 255, 0.6)',\n",
    "            line=dict(\n",
    "                outliercolor='rgba(219, 64, 82, 0.6)',\n",
    "                outlierwidth=2)),\n",
    "            line_color= colors[cur_tag],\n",
    "            legendgroup= convert_tag[cur_tag],\n",
    "            showlegend=leg,\n",
    "            side=sides[jj],\n",
    "            pointpos = pointpos[jj]))\n",
    "    return traces\n",
    "\n",
    "def plot_mosaic(metric,axis_title,lowlim,uplim):\n",
    "    nSamp = 10000\n",
    "    traces1 = plot_ridgelines('invivo1',sessions,metric,'wm',colors,sides,nSamp,True,lowlim,uplim)\n",
    "    traces2 = plot_ridgelines('invivo1',sessions,metric,'gm',colors,sides,nSamp,False,lowlim,uplim)\n",
    "    traces3 = plot_ridgelines('invivo2',sessions,metric,'wm',colors,sides,nSamp,False,lowlim,uplim)\n",
    "    traces4 = plot_ridgelines('invivo2',sessions,metric,'gm',colors,sides,nSamp,False,lowlim,uplim)\n",
    "    traces5 = plot_ridgelines('invivo3',sessions,metric,'wm',colors,sides,nSamp,False,lowlim,uplim)\n",
    "    traces6 = plot_ridgelines('invivo3',sessions,metric,'gm',colors,sides,nSamp,False,lowlim,uplim)\n",
    "    fig = make_subplots(rows=3, cols=2,\n",
    "                   subplot_titles=(\"P1 White Matter\", \"P1 Gray Matter\", \"P2 White Matter\", \"P2 Gray Matter\", \"P3 White Matter\", \"P3 Gray Matter\"),\n",
    "                   vertical_spacing = 0.08,\n",
    "                   shared_xaxes=True)\n",
    "    for trace in traces1:\n",
    "        fig.add_trace(trace,row=1, col=1)\n",
    "    for trace in traces2:\n",
    "        fig.add_trace(trace,row=1, col=2)\n",
    "    for trace in traces3:\n",
    "        fig.add_trace(trace,row=2, col=1)\n",
    "    for trace in traces4:\n",
    "        fig.add_trace(trace,row=2, col=2)\n",
    "    for trace in traces5:\n",
    "        fig.add_trace(trace,row=3, col=1)\n",
    "    for trace in traces6:\n",
    "        fig.add_trace(trace,row=3, col=2)\n",
    "    axis_template = dict(linecolor = 'white', \n",
    "                     showticklabels = True,\n",
    "                     tickfont=dict(color=\"white\",size=12), \n",
    "                     gridcolor = 'rgba(255,255,255,0.2)')\n",
    "    fig.update_yaxes(axis_template,showgrid=False)\n",
    "    fig.update_traces(orientation='h')\n",
    "    fig.update_layout(paper_bgcolor = '#1c2a3d',plot_bgcolor = '#1c2a3d')\n",
    "    fig.update_traces(meanline=dict(visible=True,color=\"white\",width=3),\n",
    "                      points= 'outliers', # show all points\n",
    "                      jitter=0.1,\n",
    "                      width=3)  # add some jitter on points for better visibility\n",
    "                      #scalemode='count')\n",
    "    fig.update_xaxes(axis_template)\n",
    "    fig.update_layout(width=800,height=950,title=f\"VENUS vs NATIVE in-vivo {metric} distributions for each participant (P)\", title_font_color=\"white\")\n",
    "    fig.update_annotations(font=dict(color=\"white\", family = \"Courier\"))\n",
    "    for i in range(1,7): \n",
    "        fig['layout']['xaxis{}'.format(i)]['title']= axis_title\n",
    "    fig.for_each_xaxis(lambda axis: axis.title.update(font=dict(color = 'white', size=12,family=\"Courier\"),standoff=0))\n",
    "    fig.update_layout(\n",
    "        legend=dict(\n",
    "            y = 0.5,\n",
    "            font=dict(\n",
    "                family=\"Courier\",\n",
    "                size=16,\n",
    "                color=\"white\")))\n",
    "    return fig\n",
    "\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [],
   "source": [
    "#| label: kdet1cell\n",
    "\n",
    "fig =  plot_mosaic('T1','T1 (s)',0.5,3)\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [],
   "source": [
    "#| label: kdemtrcell\n",
    "\n",
    "fig =  plot_mosaic('MTR','MTR (%)',35,70)\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [],
   "source": [
    "#| label: kdemtsatcell\n",
    "\n",
    "fig =  plot_mosaic('MTsat','MTsat (a.u.)',0.5,5)\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true,
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [],
   "source": [
    "#| label: shiftcell\n",
    "\n",
    "from scipy.stats import norm\n",
    "# generate random numbers from N(0,1)\n",
    "\n",
    "fig = go.Figure()\n",
    "\n",
    "\n",
    "data_normal = norm.rvs(size=10000,loc=0.5,scale=1)\n",
    "data_normal2 = norm.rvs(size=10000,loc=0,scale=2)\n",
    "\n",
    "# Figure for ideal case \n",
    "#data_normal = norm.rvs(size=10000,loc=0,scale=1)\n",
    "#data_normal2 = norm.rvs(size=10000,loc=0,scale=1)\n",
    "\n",
    "fig.add_trace(go.Violin(x=data_normal,\n",
    "    opacity = 1,    \n",
    "    line_color= \"crimson\",\n",
    "    side=\"positive\",\n",
    "    name = \"Y\",\n",
    "    meanline=dict(visible=True,color=\"crimson\",width=4),\n",
    "    width=2\n",
    "))\n",
    "fig.add_trace(go.Violin(x=data_normal2,\n",
    "    marker=dict(\n",
    "    opacity = 0.3,    \n",
    "    outliercolor='rgba(255, 255, 255, 0.6)',\n",
    "    line=dict(\n",
    "        outliercolor='rgba(219, 64, 82, 0.6)',\n",
    "        outlierwidth=2)),\n",
    "    line_color= \"limegreen\",\n",
    "    side=\"positive\",\n",
    "    name = \"X\",\n",
    "    meanline=dict(visible=True,color=\"limegreen\",width=4),\n",
    "    width=2                    \n",
    "))\n",
    "\n",
    "\n",
    "fig.update_traces(orientation='h')\n",
    "fig.update_layout(paper_bgcolor = 'white',plot_bgcolor = 'white',height=600, width=800)\n",
    "fig.update_traces(points=False)\n",
    "qs = pd.qcut(data_normal2, 10, labels=False)\n",
    "aa = []\n",
    "for ii in range(10):\n",
    "    aa.append(np.median(data_normal2[qs==ii]))\n",
    "fig.add_vrect(\n",
    "    x0=aa[9] + 0.8, x1=aa[9]+0.9,\n",
    "    fillcolor=\"limegreen\", opacity=0.7,\n",
    "    layer=\"above\", line_width=0,\n",
    ")\n",
    "\n",
    "for ii in range(0,9,1):\n",
    "    fig.add_vrect(\n",
    "    x0=aa[ii], x1=aa[ii] + 0.02,\n",
    "    fillcolor=\"limegreen\", opacity=0.3,\n",
    "    layer=\"above\", line_width=0)\n",
    "fig.add_vrect(\n",
    "    x0=aa[0], x1=aa[0] + 0.1,\n",
    "    fillcolor=\"limegreen\", opacity=0.7,\n",
    "    layer=\"above\", line_width=0,\n",
    ")\n",
    "qs = pd.qcut(data_normal, 10, labels=False)\n",
    "aa = []\n",
    "for ii in range(10):\n",
    "    aa.append(np.median(data_normal[qs==ii]))  \n",
    "fig.add_vrect(\n",
    "    x0=aa[9], x1=aa[9]+0.1,\n",
    "    fillcolor=\"crimson\", opacity=0.7,\n",
    "    layer=\"above\", line_width=0,\n",
    ")\n",
    "fig.add_vrect(\n",
    "    x0=aa[0], x1=aa[0]+0.1,\n",
    "    fillcolor=\"crimson\", opacity=0.7,\n",
    "    layer=\"above\", line_width=0,\n",
    ")\n",
    "for ii in range(0,9,1):\n",
    "    fig.add_vrect(\n",
    "    x0=aa[ii], x1=aa[ii] + 0.02,\n",
    "    fillcolor=\"crimson\", opacity=0.3,\n",
    "    layer=\"above\", line_width=0)\n",
    "    \n",
    "fig.add_annotation(x=aa[0], y=0.8,\n",
    "            text=\"<b><-- D1</b>\",\n",
    "            showarrow=False,\n",
    "            yshift=10)\n",
    "fig.add_annotation(x=aa[-1], y=0.8,\n",
    "            text=\"<b>D9--></b>\",\n",
    "            showarrow=False,\n",
    "            yshift=10)\n",
    "\n",
    "\n",
    "\n",
    "fig.show()"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Edit Metadata",
  "kernelspec": {
   "display_name": "Python 3",
   "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.6.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
