{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Plan B: Graficar con Python en Google Colab\n",
    "\n",
    "Si Antigravity no se pudo instalar, este cuaderno reproduce las cuatro figuras del taller sin instalar nada.\n",
    "Corre cada celda con el boton de play (o Shift+Enter). Los datos se generan aqui mismo, no tienes que subir archivos.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Generar los datos de ejemplo\n"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "import numpy as np, pandas as pd\n",
    "rng = np.random.default_rng(2026)\n",
    "\n",
    "# A. Viabilidad por tratamiento\n",
    "g = {\"Control\":100,\"Compuesto A\":74,\"Compuesto B\":51}; sd={\"Control\":4,\"Compuesto A\":7,\"Compuesto B\":8}\n",
    "A = pd.DataFrame([{\"tratamiento\":k,\"replica\":r,\"viabilidad_pct\":round(float(rng.normal(m,sd[k])),1)}\n",
    "                  for k,m in g.items() for r in range(1,7)])\n",
    "\n",
    "# B. Dosis-respuesta\n",
    "dosis = np.array([0.01,0.03,0.1,0.3,1,3,10,30,100])\n",
    "B = pd.DataFrame([{\"concentracion_uM\":c,\"replica\":r,\n",
    "                   \"inhibicion_pct\":round(float(np.clip(100/(1+(2/c))+rng.normal(0,4),0,100)),1)}\n",
    "                  for c in dosis for r in range(1,4)])\n",
    "\n",
    "# C. Expresion genica (log2)\n",
    "genes=[\"TP53\",\"BAX\",\"BCL2\",\"CASP3\",\"MKI67\",\"CDKN1A\",\"VEGFA\",\"HIF1A\",\"IL6\",\"TNF\",\"SOD2\",\"GPX1\"]\n",
    "ef=np.array([1.8,1.5,-1.6,1.2,-2.0,1.7,1.4,1.1,2.1,1.9,-0.8,-1.3]); base=rng.normal(6,.6,len(genes))\n",
    "cond=[\"Control_1\",\"Control_2\",\"Control_3\",\"Tratado_1\",\"Tratado_2\",\"Tratado_3\"]\n",
    "C = pd.DataFrame([{\"gen\":genes[i], **{c:round(float(base[i]+(ef[i] if c.startswith(\"Tratado\") else 0)+rng.normal(0,.25)),2) for c in cond}}\n",
    "                  for i in range(len(genes))])\n",
    "\n",
    "# D. Calibracion\n",
    "conc=np.repeat([0,25,50,100,150,200,300,400],2).astype(float)\n",
    "D = pd.DataFrame({\"concentracion_ug_mL\":conc,\n",
    "                  \"absorbancia_595nm\":np.round(0.045+0.0021*conc+rng.normal(0,.02,conc.size),3)})\n",
    "print(\"Datos listos:\", A.shape, B.shape, C.shape, D.shape)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Figura A. Barras con error y significancia\n"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from scipy import stats\n",
    "orden=[\"Control\",\"Compuesto A\",\"Compuesto B\"]\n",
    "m=A.groupby(\"tratamiento\")[\"viabilidad_pct\"].mean().reindex(orden)\n",
    "se=A.groupby(\"tratamiento\")[\"viabilidad_pct\"].sem().reindex(orden)\n",
    "fig,ax=plt.subplots(figsize=(5.2,4.2))\n",
    "ax.bar(range(3),m,yerr=se,capsize=5,color=[\"#4F7CAC\",\"#E0922A\",\"#7E5BD0\"],edgecolor=\"#162521\")\n",
    "def stars(p): return \"ns\" if p>.05 else \"*\" if p>.01 else \"**\" if p>.001 else \"***\"\n",
    "ctrl=A[A.tratamiento==\"Control\"][\"viabilidad_pct\"]\n",
    "for i,gname in enumerate(orden[1:],1):\n",
    "    p=stats.ttest_ind(ctrl,A[A.tratamiento==gname][\"viabilidad_pct\"],equal_var=False).pvalue\n",
    "    y=m.max()+se.max()+8+(i-1)*11\n",
    "    ax.plot([0,0,i,i],[y,y+2,y+2,y],color=\"#162521\"); ax.text(i/2,y+3,stars(p),ha=\"center\")\n",
    "ax.set_xticks(range(3)); ax.set_xticklabels(orden); ax.set_ylabel(\"Viabilidad celular (%)\")\n",
    "ax.set_title(\"Viabilidad por tratamiento\"); plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Figura B. Curva dosis-respuesta\n"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "from scipy.optimize import curve_fit\n",
    "def hill(x,top,ic50,n): return top/(1+(ic50/x)**n)\n",
    "x,y=B.concentracion_uM.values,B.inhibicion_pct.values\n",
    "p,_=curve_fit(hill,x,y,p0=[100,2,1],maxfev=10000)\n",
    "xx=np.logspace(np.log10(x.min()),np.log10(x.max()),200)\n",
    "fig,ax=plt.subplots(figsize=(5.2,4.2))\n",
    "ax.scatter(x,y,color=\"#E0922A\",edgecolor=\"#162521\",zorder=3)\n",
    "ax.plot(xx,hill(xx,*p),color=\"#4F7CAC\",lw=2); ax.axvline(p[1],ls=\"--\",color=\"#7E5BD0\")\n",
    "ax.text(p[1]*1.1,8,f\"IC50={p[1]:.2f} uM\",color=\"#7E5BD0\")\n",
    "ax.set_xscale(\"log\"); ax.set_xlabel(\"Concentracion (uM)\"); ax.set_ylabel(\"Inhibicion (%)\")\n",
    "ax.set_title(\"Curva dosis-respuesta\"); plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. Figura C. Heatmap de expresion\n"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "z=C.set_index(\"gen\"); z=z.sub(z.mean(1),axis=0).div(z.std(1),axis=0)\n",
    "fig,ax=plt.subplots(figsize=(5.6,5.2))\n",
    "im=ax.imshow(z.values,cmap=\"RdBu_r\",aspect=\"auto\",vmin=-2,vmax=2)\n",
    "ax.set_xticks(range(z.shape[1])); ax.set_xticklabels(z.columns,rotation=45,ha=\"right\")\n",
    "ax.set_yticks(range(z.shape[0])); ax.set_yticklabels(z.index)\n",
    "ax.set_title(\"Expresion genica (z-score)\"); fig.colorbar(im,ax=ax,fraction=.046,pad=.04); plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. Figura D. Dispersion con regresion\n"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "x,y=D.concentracion_ug_mL.values,D.absorbancia_595nm.values\n",
    "r=stats.linregress(x,y)\n",
    "fig,ax=plt.subplots(figsize=(5.2,4.2))\n",
    "ax.scatter(x,y,color=\"#4F7CAC\",edgecolor=\"#162521\",zorder=3)\n",
    "ax.plot(x,r.intercept+r.slope*x,color=\"#E0922A\",lw=2)\n",
    "ax.text(.05,.92,f\"y={r.slope:.4f}x+{r.intercept:.3f}\\nR2={r.rvalue**2:.3f}\",transform=ax.transAxes,va=\"top\")\n",
    "ax.set_xlabel(\"Concentracion de proteina (ug/mL)\"); ax.set_ylabel(\"Absorbancia (595 nm)\")\n",
    "ax.set_title(\"Curva de calibracion\"); plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Con tus datos y con R\n",
    "\n",
    "- Para usar tus propios datos, sube tu CSV con el boton de archivos a la izquierda y reemplaza la generacion de datos por `pd.read_csv(\"tu_archivo.csv\")`.\n",
    "- Colab tambien corre R: puedes abrir un cuaderno con runtime de R, o usar la extension rpy2 con `%load_ext rpy2.ipython` y celdas que empiecen con `%%R`.\n",
    "- La guia 11-planb-colab.md tiene los detalles.\n"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "kernelspec": {
   "name": "python3",
   "display_name": "Python 3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}