small-fish-gui 2.0.2__py3-none-any.whl → 2.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- small_fish_gui/__init__.py +2 -2
- small_fish_gui/batch/integrity.py +2 -2
- small_fish_gui/batch/pipeline.py +46 -11
- small_fish_gui/batch/prompt.py +102 -41
- small_fish_gui/batch/update.py +26 -13
- small_fish_gui/batch/utils.py +1 -1
- small_fish_gui/gui/__init__.py +1 -0
- small_fish_gui/gui/_napari_widgets.py +418 -6
- small_fish_gui/gui/layout.py +332 -112
- small_fish_gui/gui/napari_visualiser.py +107 -22
- small_fish_gui/gui/prompts.py +161 -48
- small_fish_gui/gui/testing.ipynb +231 -24
- small_fish_gui/gui/tooltips.py +7 -1
- small_fish_gui/hints.py +23 -7
- small_fish_gui/interface/__init__.py +7 -1
- small_fish_gui/interface/default_settings.py +118 -0
- small_fish_gui/interface/image.py +43 -11
- small_fish_gui/interface/settings.json +50 -0
- small_fish_gui/interface/testing.ipynb +4354 -0
- small_fish_gui/interface/user_settings.py +96 -0
- small_fish_gui/main_menu.py +13 -1
- small_fish_gui/pipeline/{_signaltonoise.py → _bigfish_wrapers.py} +59 -7
- small_fish_gui/pipeline/_colocalisation.py +23 -24
- small_fish_gui/pipeline/_preprocess.py +46 -32
- small_fish_gui/pipeline/actions.py +48 -5
- small_fish_gui/pipeline/detection.py +71 -141
- small_fish_gui/pipeline/segmentation.py +360 -268
- small_fish_gui/pipeline/spots.py +3 -3
- small_fish_gui/pipeline/utils.py +5 -1
- small_fish_gui/README.md → small_fish_gui-2.1.0.dist-info/METADATA +48 -8
- small_fish_gui-2.1.0.dist-info/RECORD +46 -0
- {small_fish_gui-2.0.2.dist-info → small_fish_gui-2.1.0.dist-info}/WHEEL +1 -1
- small_fish_gui/.github/workflows/python-publish.yml +0 -39
- small_fish_gui/LICENSE +0 -24
- small_fish_gui/batch/values.txt +0 -65
- small_fish_gui/default_values.py +0 -51
- small_fish_gui/gui/screenshot/general_help_screenshot.png +0 -0
- small_fish_gui/gui/screenshot/mapping_help_screenshot.png +0 -0
- small_fish_gui/gui/screenshot/segmentation_help_screenshot.png +0 -0
- small_fish_gui/illustrations/DetectionVitrine_filtre.png +0 -0
- small_fish_gui/illustrations/DetectionVitrine_signal.png +0 -0
- small_fish_gui/illustrations/FocciVitrine.png +0 -0
- small_fish_gui/illustrations/FocciVitrine_no_spots.png +0 -0
- small_fish_gui/illustrations/Segmentation2D.png +0 -0
- small_fish_gui/illustrations/Segmentation2D_with_labels.png +0 -0
- small_fish_gui/logo.png +0 -0
- small_fish_gui/pipeline/testing.ipynb +0 -3636
- small_fish_gui/requirements.txt +0 -19
- small_fish_gui-2.0.2.dist-info/METADATA +0 -75
- small_fish_gui-2.0.2.dist-info/RECORD +0 -59
- {small_fish_gui-2.0.2.dist-info → small_fish_gui-2.1.0.dist-info}/licenses/LICENSE +0 -0
small_fish_gui/gui/testing.ipynb
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
},
|
|
10
10
|
{
|
|
11
11
|
"cell_type": "code",
|
|
12
|
-
"execution_count":
|
|
12
|
+
"execution_count": null,
|
|
13
13
|
"metadata": {},
|
|
14
14
|
"outputs": [],
|
|
15
15
|
"source": [
|
|
@@ -40,18 +40,19 @@
|
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
42
|
"cell_type": "code",
|
|
43
|
-
"execution_count":
|
|
43
|
+
"execution_count": 1,
|
|
44
44
|
"metadata": {},
|
|
45
45
|
"outputs": [
|
|
46
46
|
{
|
|
47
|
-
"
|
|
48
|
-
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAa4AAAGdCAYAAABKG5eZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAkG0lEQVR4nO3df2wU553H8c8a8DoX2eu2gO0NxvxogZaAL0W1a9o0l+BifDkCbS8hFpeYC0kqZKRGNBWhamrSSnVaov5RYpHqGnCqXBMSqRgpyaUHDj8K2KHFtgpJZGHOsUF4jUBh1jbFRvZzfzRsu2HX9oZZ7z7r90v6SuzMM+PvPrveD7M73vEYY4wAALBEWqIbAAAgFgQXAMAqBBcAwCoEFwDAKgQXAMAqBBcAwCoEFwDAKgQXAMAqkxPdgBuGh4d1/vx5ZWZmyuPxJLodAECMjDHq7e2V3+9XWtrIx1QpEVznz59Xfn5+otsAANyks2fPasaMGSOOSYngyszMTHQLETmO48p+fD6fK/sBMHZu/f5K/A7HYiyv5ykRXMn69mBWVlaiWwDwKfH7mxhjeT3n5AwAgFUILgCAVeIWXLW1tZo1a5YyMjJUXFys48ePjzj+9ddf14IFC5SRkaFFixbprbfeildrAACLxSW4du/erU2bNqm6ulrNzc0qLCxUWVmZLly4EHH8sWPHVFFRofXr16ulpUWrV6/W6tWrderUqXi0BwCwmYmDoqIiU1VVFbo9NDRk/H6/qampiTj+gQceMPfee2/YsuLiYvPd7353TD/PcRwjKenKLYm+HxQ1EctNib4vNpXjOKPOp+tHXIODgzpx4oRKS0tDy9LS0lRaWqrGxsaI2zQ2NoaNl6SysrKo4wcGBhQMBsMKADAxuB5cFy9e1NDQkHJycsKW5+TkKBAIRNwmEAjENL6mpkY+ny9U/PExAEwcVp5VuGXLFjmOE6qzZ88muiUAwDhx/Q+Qp06dqkmTJqmnpydseU9Pj3JzcyNuk5ubG9N4r9crr9frTsMAAKu4fsSVnp6uJUuWqKGhIbRseHhYDQ0NKikpibhNSUlJ2HhJ2rdvX9TxAIAJzNVTZz726quvGq/Xa+rq6sz7779vHn/8cZOdnW0CgYAxxpiHHnrIPPXUU6HxR48eNZMnTzbPPfec+eCDD0x1dbWZMmWKOXny5Jh+HmcVUhTldrkp0ffFphrLWYVxCS5jjNm+fbuZOXOmSU9PN0VFRaapqSm07q677jKVlZVh41977TUzb948k56ebhYuXGjefPPNMf8sgouiKLfLTYm+LzbVWILL8/GkWi0YDCblty+7NbXJ+iXCQCpz86WR3+Gxcxxn1C84tvKsQgDAxJUSlzW5bixJPRo3/2eUyv/L4n+jSFa805H6OOICAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYZXKiG3CTz+dLdAsThpuXNU/lS627dd+k5Lx/yYh5Gl9uPceDweCYX8M54gIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYxfXgqqmp0Ve+8hVlZmZq+vTpWr16tdra2kbcpq6uTh6PJ6wyMjLcbg0AkAJcD65Dhw6pqqpKTU1N2rdvn65du6bly5erv79/xO2ysrLU3d0dqs7OTrdbAwCkANcvJPn222+H3a6rq9P06dN14sQJfeMb34i6ncfjUW5urtvtAABSTNyvgOw4jiTps5/97Ijj+vr6VFBQoOHhYX35y1/Wz372My1cuDDi2IGBAQ0MDIRuB4NB9xrGuEvlK9am8n0DpMQ8x+N6csbw8LCeeOIJfe1rX9Ptt98eddz8+fO1c+dO7d27Vy+//LKGh4e1dOlSnTt3LuL4mpoa+Xy+UOXn58frLgAAkozHGGPitfMNGzbof/7nf3TkyBHNmDFjzNtdu3ZNX/ziF1VRUaGf/vSnN6yPdMRFeAGA/RzHUVZW1ohj4vZW4caNG/XGG2/o8OHDMYWWJE2ZMkV33HGH2tvbI673er3yer1utAkAsIzrbxUaY7Rx40bt2bNH77zzjmbPnh3zPoaGhnTy5Enl5eW53R4AwHKuH3FVVVXpd7/7nfbu3avMzEwFAgFJks/n0y233CJJevjhh3XbbbeppqZGkvSTn/xEX/3qV/X5z39ely9f1rZt29TZ2alHH33U7fYAAJZzPbh27NghSfqXf/mXsOW7du3SunXrJEldXV1KS/v7wd5HH32kxx57TIFAQJ/5zGe0ZMkSHTt2TF/60pfcbg8AYLm4npwxXoLBoHw+X6LbAADcpLGcnMF3FQIArEJwAQCsQnABAKxCcAEArEJwAQCsQnABAKxCcAEArEJwAQCsQnABAKxCcAEArEJwAQCsErfrcQFj5dbXZSbiEuIAxh9HXAAAqxBcAACrEFwAAKsQXAAAqxBcAACrEFwAAKsQXAAAqxBcAACrEFwAAKsQXAAAqxBcAACrEFwAAKsQXAAAqxBcAACrEFwAAKsQXAAAqxBcAACrcAXkOOLKvmOTjPcvGR+7ZOwJY8Nj5y6OuAAAViG4AABWIbgAAFYhuAAAViG4AABWcT24tm7dKo/HE1YLFiwYcZvXX39dCxYsUEZGhhYtWqS33nrL7bYAACkiLkdcCxcuVHd3d6iOHDkSdeyxY8dUUVGh9evXq6WlRatXr9bq1at16tSpeLQGALCcx7j1BwYf27p1q+rr69Xa2jqm8WvWrFF/f7/eeOON0LKvfvWr+ud//me98MILY9pHMBiUz+f7NO3GFX+7Ya9kfOySsSeMDY/d2DmOo6ysrBHHxOWI6/Tp0/L7/ZozZ47Wrl2rrq6uqGMbGxtVWloatqysrEyNjY1RtxkYGFAwGAwrAMDE4HpwFRcXq66uTm+//bZ27Nihjo4O3Xnnnert7Y04PhAIKCcnJ2xZTk6OAoFA1J9RU1Mjn88Xqvz8fFfvAwAgebkeXOXl5br//vu1ePFilZWV6a233tLly5f12muvufYztmzZIsdxQnX27FnX9g0ASG5x/67C7OxszZs3T+3t7RHX5+bmqqenJ2xZT0+PcnNzo+7T6/XK6/W62icAwA5x/zuuvr4+nTlzRnl5eRHXl5SUqKGhIWzZvn37VFJSEu/WAAA2Mi77/ve/bw4ePGg6OjrM0aNHTWlpqZk6daq5cOGCMcaYhx56yDz11FOh8UePHjWTJ082zz33nPnggw9MdXW1mTJlijl58uSYf6bjOEZS0pVbEn0/JmIl42OXjD1RPHZul+M4o86D628Vnjt3ThUVFbp06ZKmTZumr3/962pqatK0adMkSV1dXUpL+/uB3tKlS/W73/1OP/rRj/TDH/5QX/jCF1RfX6/bb7/d7dYAACnA9b/jSgT+jgtuS8bHLhl7wtjw2I1dwv6OCwCAeCG4AABWifvp8BPZRDisT1XJ+NglY08Ym1R+7Nx6GzSWj3w44gIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYhSsgf4JbV/OUUvuqp6nOredBqj8HmCck4rHjiAsAYBWCCwBgFYILAGAVggsAYBWCCwBgFYILAGAVggsAYBWCCwBgFYILAGAVggsAYBWCCwBgFYILAGAVggsAYBWCCwBgFdeDa9asWfJ4PDdUVVVVxPF1dXU3jM3IyHC7LQBAinD9elx/+tOfNDQ0FLp96tQpffOb39T9998fdZusrCy1tbWFbnNtHgBANK4H17Rp08JuP/vss5o7d67uuuuuqNt4PB7l5ua63QoAIAXF9TOuwcFBvfzyy3rkkUdGPIrq6+tTQUGB8vPztWrVKr333nvxbAsAYDHXj7j+UX19vS5fvqx169ZFHTN//nzt3LlTixcvluM4eu6557R06VK99957mjFjRsRtBgYGNDAwELodDAYlSY7jKCsr66Z65m1KSMn5PDDGuLKfZLxvQExMHC1fvtz827/9W0zbDA4Omrlz55of/ehHUcdUV1cbSTeU4zg323LE/VJUMpRbUr0nyu4ay+t43N4q7Ozs1P79+/Xoo4/GtN2UKVN0xx13qL29PeqYLVu2yHGcUJ09e/Zm2wUAWCJuwbVr1y5Nnz5d9957b0zbDQ0N6eTJk8rLy4s6xuv1KisrK6wAABNDXIJreHhYu3btUmVlpSZPDv8Y7eGHH9aWLVtCt3/yk5/of//3f/V///d/am5u1n/8x3+os7Mz5iM1AMDEEJeTM/bv36+uri498sgjN6zr6upSWtrf8/Kjjz7SY489pkAgoM985jNasmSJjh07pi996UvxaA0AYDnPxx+MWi0YDMrn83FWIVKaW7+qbj7Hk7En2G0sr+N8VyEAwCoEFwDAKgQXAMAqBBcAwCoEFwDAKgQXAMAqBBcAwCoEFwDAKgQXAMAqBBcAwCoEFwDAKnG9AvJ48/l8iW4BCJMCXwU6olT+jkE3H7tUnqdE4IgLAGAVggsAYBWCCwBgFYILAGAVggsAYBWCCwBgFYILAGAVggsAYBWCCwBgFYILAGAVggsAYBWCCwBgFYILAGAVggsAYBWCCwBgFYILAGAVggsAYBWCCwBglcmJbgB24rLmY5PK9y3V8dglL464AABWIbgAAFYhuAAAViG4AABWIbgAAFaJObgOHz6slStXyu/3y+PxqL6+Pmy9MUY//vGPlZeXp1tuuUWlpaU6ffr0qPutra3VrFmzlJGRoeLiYh0/fjzW1gAAE0DMwdXf36/CwkLV1tZGXP+LX/xCv/rVr/TCCy/o3Xff1a233qqysjJdvXo16j53796tTZs2qbq6Ws3NzSosLFRZWZkuXLgQa3sAgFRnboIks2fPntDt4eFhk5uba7Zt2xZadvnyZeP1es0rr7wSdT9FRUWmqqoqdHtoaMj4/X5TU1Mzpj4cxzGSqHEsNyX6vlAUlTzlOM6orxmufsbV0dGhQCCg0tLS0DKfz6fi4mI1NjZG3GZwcFAnTpwI2yYtLU2lpaVRtxkYGFAwGAwrAMDE4GpwBQIBSVJOTk7Y8pycnNC6T7p48aKGhoZi2qampkY+ny9U+fn5LnQPALCBlWcVbtmyRY7jhOrs2bOJbgkAME5cDa7c3FxJUk9PT9jynp6e0LpPmjp1qiZNmhTTNl6vV1lZWWEFAJgYXA2u2bNnKzc3Vw0NDaFlwWBQ7777rkpKSiJuk56eriVLloRtMzw8rIaGhqjbAAAmsFjPAOvt7TUtLS2mpaXFSDK//OUvTUtLi+ns7DTGGPPss8+a7Oxss3fvXvOXv/zFrFq1ysyePdv89a9/De3jnnvuMdu3bw/dfvXVV43X6zV1dXXm/fffN48//rjJzs42gUBgTD1xVuH4l5sSfV8oikqeGstZhTG/Ah04cCDiD6usrDTG/O2U+Kefftrk5OQYr9drli1bZtra2sL2UVBQYKqrq8OWbd++3cycOdOkp6eboqIi09TUNOaeCK7xLzcl+r5QFJU8NZbg8nz8wmG1YDAon8+X6DYmFDefNlz3CMB1juOMet6ClWcVAgAmLq6AjE+FoyQAicIRFwDAKgQXAMAqBBcAwCoEFwDAKgQXAMAqBBcAwCoEFwDAKgQXAMAqBBcAwCoEFwDAKgQXAMAqBBcAwCoEFwDAKgQXAMAqBBcAwCoEFwDAKgQXAMAqBBcAwCqTE90AgLExxriyH4/H48p+gEThiAsAYBWCCwBgFYILAGAVggsAYBWCCwBgFYILAGAVggsAYBWCCwBgFYILAGAVggsAYBWCCwBgFYILAGAVggsAYBWCCwBglZiD6/Dhw1q5cqX8fr88Ho/q6+tD665du6bNmzdr0aJFuvXWW+X3+/Xwww/r/PnzI+5z69at8ng8YbVgwYKY7wwAIPXFHFz9/f0qLCxUbW3tDeuuXLmi5uZmPf3002pubtbvf/97tbW16b777ht1vwsXLlR3d3eojhw5EmtrAIAJIOYLSZaXl6u8vDziOp/Pp3379oUte/7551VUVKSuri7NnDkzeiOTJys3NzfWdgAAE0zcP+NyHEcej0fZ2dkjjjt9+rT8fr/mzJmjtWvXqqurK+rYgYEBBYPBsAJS3SffTv+0BdgursF19epVbd68WRUVFcrKyoo6rri4WHV1dXr77be1Y8cOdXR06M4771Rvb2/E8TU1NfL5fKHKz8+P110AACQbcxMkmT179kRcNzg4aFauXGnuuOMO4zhOTPv96KOPTFZWlvnNb34Tcf3Vq1eN4zihOnv2rJFEURRFWV5jyYuYP+Mai2vXrumBBx5QZ2en3nnnnRGPtiLJzs7WvHnz1N7eHnG91+uV1+t1o1UAgGVcf6vwemidPn1a+/fv1+c+97mY99HX16czZ84oLy/P7fYAAJaLObj6+vrU2tqq1tZWSVJHR4daW1vV1dWla9eu6d///d/15z//Wf/93/+toaEhBQIBBQIBDQ4OhvaxbNkyPf/886HbTz75pA4dOqQPP/xQx44d07e+9S1NmjRJFRUVN38PAQCpJaYPn4wxBw4ciPi+ZGVlpeno6Ij6vuWBAwdC+ygoKDDV1dWh22vWrDF5eXkmPT3d3HbbbWbNmjWmvb19zD05jpPw92UpiqKom6+xfMblMcYYWS4YDMrn8yW6DQDATXIcZ9TzIviuQgCAVQguAIBVCC4AgFUILgCAVQguAIBVCC4AgFUILgCAVQguAIBVCC4AgFUILgCAVQguAIBV4nI9LrjLza+T5NLt9nLrecBzAG5y63kZy3fOcsQFALAKwQUAsArBBQCwCsEFALAKwQUAsArBBQCwCsEFALAKwQUAsArBBQCwCsEFALAKwQUAsArBBQCwCsEFALAKwQUAsArBBQCwCsEFALAKwQUAsApXQLYAV6yFxPMA7nLzyurjjSMuAIBVCC4AgFUILgCAVQguAIBVCC4AgFViDq7Dhw9r5cqV8vv98ng8qq+vD1u/bt06eTyesFqxYsWo+62trdWsWbOUkZGh4uJiHT9+PNbWAAATQMzB1d/fr8LCQtXW1kYds2LFCnV3d4fqlVdeGXGfu3fv1qZNm1RdXa3m5mYVFhaqrKxMFy5ciLU9AECqMzdBktmzZ0/YssrKSrNq1aqY9lNUVGSqqqpCt4eGhozf7zc1NTVj2t5xHCOJoiiKGmMlm+uv447jjDo2Lp9xHTx4UNOnT9f8+fO1YcMGXbp0KerYwcFBnThxQqWlpaFlaWlpKi0tVWNjY8RtBgYGFAwGwwoAMDG4HlwrVqzQb3/7WzU0NOjnP/+5Dh06pPLycg0NDUUcf/HiRQ0NDSknJydseU5OjgKBQMRtampq5PP5QpWfn+/23QAAJCnXv/LpwQcfDP170aJFWrx4sebOnauDBw9q2bJlrvyMLVu2aNOmTaHbwWCQ8AKACSLup8PPmTNHU6dOVXt7e8T1U6dO1aRJk9TT0xO2vKenR7m5uRG38Xq9ysrKCisAwMQQ9+A6d+6cLl26pLy8vIjr09PTtWTJEjU0NISWDQ8Pq6GhQSUlJfFuDwBgmZiDq6+vT62trWptbZUkdXR0qLW1VV1dXerr69MPfvADNTU16cMPP1RDQ4NWrVqlz3/+8yorKwvtY9myZXr++edDtzdt2qT/+q//0ksvvaQPPvhAGzZsUH9/v/7zP//z5u8hACC1xHrK4oEDByKeWllZWWmuXLlili9fbqZNm2amTJliCgoKzGOPPWYCgUDYPgoKCkx1dXXYsu3bt5uZM2ea9PR0U1RUZJqamsbcE6fDUxRFxVbJJpbT4T3GWHxRlo8Fg0H5fL5EtwEA1ki2l/7rr+OO44x63gLfVQgAsArBBQCwiut/xwXEyq23LFL90vbME5JRIp5PHHEBAKxCcAEArEJwAQCsQnABAKxCcAEArEJwAQCsQnABAKxCcAEArEJwAQCsQnABAKxCcAEArEJwAQCsQnABAKxCcAEArEJwAQCsQnABAKxCcAEArMIVkJFwyXhFXreuNuymZJynVObmcyAZH7tk7GmsOOICAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWIXgAgBYheACAFiF4AIAWCXm4Dp8+LBWrlwpv98vj8ej+vr6sPUejydibdu2Leo+t27desP4BQsWxHxnAACpL+bg6u/vV2FhoWprayOu7+7uDqudO3fK4/HoO9/5zoj7XbhwYdh2R44cibU1AMAEEPOFJMvLy1VeXh51fW5ubtjtvXv36u6779acOXNGbmTy5Bu2BQDgk+L6GVdPT4/efPNNrV+/ftSxp0+flt/v15w5c7R27Vp1dXVFHTswMKBgMBhWAICJIeYjrli89NJLyszM1Le//e0RxxUXF6uurk7z589Xd3e3nnnmGd155506deqUMjMzbxhfU1OjZ555Jl5tpzQuST82ydgTxhfPgSRmboIks2fPnqjr58+fbzZu3Bjzfj/66COTlZVlfvOb30Rcf/XqVeM4TqjOnj1rJFFjqGSU6DmhKCp5ynGcUV8z4nbE9cc//lFtbW3avXt3zNtmZ2dr3rx5am9vj7je6/XK6/XebIsAAAvF7TOuF198UUuWLFFhYWHM2/b19enMmTPKy8uLQ2cAAJvFHFx9fX1qbW1Va2urJKmjo0Otra1hJ1MEg0G9/vrrevTRRyPuY9myZXr++edDt5988kkdOnRIH374oY4dO6ZvfetbmjRpkioqKmJtDwCQ4mJ+q/DPf/6z7r777tDtTZs2SZIqKytVV1cnSXr11VdljIkaPGfOnNHFixdDt8+dO6eKigpdunRJ06ZN09e//nU1NTVp2rRpsbYHAEhxno8/HLdaMBiUz+dLdBtWSMaHm7O3AFznOI6ysrJGHMN3FQIArEJwAQCsQnABAKxCcAEArEJwAQCsQnABAKxCcAEArEJwAQCsQnABAKxCcAEArEJwAQCsEtcrIE90bn0voJvf5cf3AgKwHUdcAACrEFwAAKsQXAAAqxBcAACrEFwAAKsQXAAAqxBcAACrEFwAAKsQXAAAqxBcAACrEFwAAKsQXAAAqxBcAACrEFwAAKsQXAAAqxBcAACrEFwAAKukxBWQ3brSsNuCwWCiWwAAq4zl9Twlgqu3tzfRLUTk8/kS3QIAWKW3t3fU106PSdbDlRgMDw/r/PnzyszMlMfjiTouGAwqPz9fZ8+eVVZW1jh2eHPoe3zZ2rdkb+/0Pb6SsW9jjHp7e+X3+5WWNvKnWClxxJWWlqYZM2aMeXxWVlbSPFixoO/xZWvfkr290/f4Sra+x/ouFSdnAACsQnABAKwyoYLL6/WqurpaXq830a3EhL7Hl619S/b2Tt/jy9a+r0uJkzMAABPHhDriAgDYj+ACAFiF4AIAWIXgAgBYJeWCq7a2VrNmzVJGRoaKi4t1/PjxEce//vrrWrBggTIyMrRo0SK99dZb49Tp39TU1OgrX/mKMjMzNX36dK1evVptbW0jblNXVyePxxNWGRkZ49Tx32zduvWGHhYsWDDiNomea0maNWvWDX17PB5VVVVFHJ/IuT58+LBWrlwpv98vj8ej+vr6sPXGGP34xz9WXl6ebrnlFpWWlur06dOj7jfW3xE3+7527Zo2b96sRYsW6dZbb5Xf79fDDz+s8+fPj7jPT/N8c7NvSVq3bt0NPaxYsWLU/SZyviVFfL57PB5t27Yt6j7HY75vRkoF1+7du7Vp0yZVV1erublZhYWFKisr04ULFyKOP3bsmCoqKrR+/Xq1tLRo9erVWr16tU6dOjVuPR86dEhVVVVqamrSvn37dO3aNS1fvlz9/f0jbpeVlaXu7u5QdXZ2jlPHf7dw4cKwHo4cORJ1bDLMtST96U9/Cut53759kqT7778/6jaJmuv+/n4VFhaqtrY24vpf/OIX+tWvfqUXXnhB7777rm699VaVlZXp6tWrUfcZ6++I231fuXJFzc3Nevrpp9Xc3Kzf//73amtr03333TfqfmN5vrnd93UrVqwI6+GVV14ZcZ+Jnm9JYf12d3dr586d8ng8+s53vjPifuM93zfFpJCioiJTVVUVuj00NGT8fr+pqamJOP6BBx4w9957b9iy4uJi893vfjeufY7kwoULRpI5dOhQ1DG7du0yPp9v/JqKoLq62hQWFo55fDLOtTHGfO973zNz5841w8PDEdcnw1wbY4wks2fPntDt4eFhk5uba7Zt2xZadvnyZeP1es0rr7wSdT+x/o643Xckx48fN5JMZ2dn1DGxPt9uVqS+KysrzapVq2LaTzLO96pVq8w999wz4pjxnu9YpcwR1+DgoE6cOKHS0tLQsrS0NJWWlqqxsTHiNo2NjWHjJamsrCzq+PHgOI4k6bOf/eyI4/r6+lRQUKD8/HytWrVK77333ni0F+b06dPy+/2aM2eO1q5dq66urqhjk3GuBwcH9fLLL+uRRx4Z8cuZk2GuP6mjo0OBQCBsTn0+n4qLi6PO6af5HRkPjuPI4/EoOzt7xHGxPN/i5eDBg5o+fbrmz5+vDRs26NKlS1HHJuN89/T06M0339T69etHHZsM8x1NygTXxYsXNTQ0pJycnLDlOTk5CgQCEbcJBAIxjY+34eFhPfHEE/ra176m22+/Peq4+fPna+fOndq7d69efvllDQ8Pa+nSpTp37ty49VpcXKy6ujq9/fbb2rFjhzo6OnTnnXdGvcRMss21JNXX1+vy5ctat25d1DHJMNeRXJ+3WOb00/yOxNvVq1e1efNmVVRUjPhlr7E+3+JhxYoV+u1vf6uGhgb9/Oc/16FDh1ReXq6hoaGI45Nxvl966SVlZmbq29/+9ojjkmG+R5IS3w6fKqqqqnTq1KlR30suKSlRSUlJ6PbSpUv1xS9+Ub/+9a/105/+NN5tSpLKy8tD/168eLGKi4tVUFCg1157bUz/m0sGL774osrLy+X3+6OOSYa5TlXXrl3TAw88IGOMduzYMeLYZHi+Pfjgg6F/L1q0SIsXL9bcuXN18OBBLVu2bFx6uFk7d+7U2rVrRz3BKBnmeyQpc8Q1depUTZo0ST09PWHLe3p6lJubG3Gb3NzcmMbH08aNG/XGG2/owIEDMV2iRZKmTJmiO+64Q+3t7XHqbnTZ2dmaN29e1B6Saa4lqbOzU/v379ejjz4a03bJMNeSQvMWy5x+mt+ReLkeWp2dndq3b1/Ml9YY7fk2HubMmaOpU6dG7SGZ5luS/vjHP6qtrS3m57yUHPP9j1ImuNLT07VkyRI1NDSElg0PD6uhoSHsf8z/qKSkJGy8JO3bty/q+Hgwxmjjxo3as2eP3nnnHc2ePTvmfQwNDenkyZPKy8uLQ4dj09fXpzNnzkTtIRnm+h/t2rVL06dP17333hvTdskw15I0e/Zs5ebmhs1pMBjUu+++G3VOP83vSDxcD63Tp09r//79+tznPhfzPkZ7vo2Hc+fO6dKlS1F7SJb5vu7FF1/UkiVLVFhYGPO2yTDfYRJ9doibXn31VeP1ek1dXZ15//33zeOPP26ys7NNIBAwxhjz0EMPmaeeeio0/ujRo2by5MnmueeeMx988IGprq42U6ZMMSdPnhy3njds2GB8Pp85ePCg6e7uDtWVK1dCYz7Z9zPPPGP+8Ic/mDNnzpgTJ06YBx980GRkZJj33ntv3Pr+/ve/bw4ePGg6OjrM0aNHTWlpqZk6daq5cOFCxJ6TYa6vGxoaMjNnzjSbN2++YV0yzXVvb69paWkxLS0tRpL55S9/aVpaWkJn3z377LMmOzvb7N271/zlL38xq1atMrNnzzZ//etfQ/u45557zPbt20O3R/sdiXffg4OD5r777jMzZswwra2tYc/5gYGBqH2P9nyLd9+9vb3mySefNI2Njaajo8Ps37/ffPnLXzZf+MIXzNWrV6P2nej5vs5xHPNP//RPZseOHRH3kYj5vhkpFVzGGLN9+3Yzc+ZMk56eboqKikxTU1No3V133WUqKyvDxr/22mtm3rx5Jj093SxcuNC8+eab49qvpIi1a9euqH0/8cQTofuYk5Nj/vVf/9U0NzePa99r1qwxeXl5Jj093dx2221mzZo1pr29PWrPxiR+rq/7wx/+YCSZtra2G9Yl01wfOHAg4nPjen/Dw8Pm6aefNjk5Ocbr9Zply5bdcJ8KCgpMdXV12LKRfkfi3XdHR0fU5/yBAwei9j3a8y3efV+5csUsX77cTJs2zUyZMsUUFBSYxx577IYASrb5vu7Xv/61ueWWW8zly5cj7iMR830zuKwJAMAqKfMZFwBgYiC4AABWIbgAAFYhuAAAViG4AABWIbgAAFYhuAAAViG4AABWIbgAAFYhuAAAViG4AABWIbgAAFb5f41DVUrFbnZtAAAAAElFTkSuQmCC",
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
47
|
+
"ename": "NameError",
|
|
48
|
+
"evalue": "name 'show_spots' is not defined",
|
|
49
|
+
"output_type": "error",
|
|
50
|
+
"traceback": [
|
|
51
|
+
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
|
|
52
|
+
"\u001b[31mNameError\u001b[39m Traceback (most recent call last)",
|
|
53
|
+
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[1]\u001b[39m\u001b[32m, line 18\u001b[39m\n\u001b[32m 16\u001b[39m spot_image = image.copy()\n\u001b[32m 17\u001b[39m spot_image[\u001b[38;5;28mtuple\u001b[39m(\u001b[38;5;28mlist\u001b[39m(\u001b[38;5;28mzip\u001b[39m(*spots)))] = \u001b[32m255\u001b[39m\n\u001b[32m---> \u001b[39m\u001b[32m18\u001b[39m \u001b[43mshow_spots\u001b[49m([spot_image])\n",
|
|
54
|
+
"\u001b[31mNameError\u001b[39m: name 'show_spots' is not defined"
|
|
55
|
+
]
|
|
55
56
|
}
|
|
56
57
|
],
|
|
57
58
|
"source": [
|
|
@@ -84,7 +85,7 @@
|
|
|
84
85
|
},
|
|
85
86
|
{
|
|
86
87
|
"cell_type": "code",
|
|
87
|
-
"execution_count":
|
|
88
|
+
"execution_count": null,
|
|
88
89
|
"metadata": {},
|
|
89
90
|
"outputs": [
|
|
90
91
|
{
|
|
@@ -115,7 +116,7 @@
|
|
|
115
116
|
},
|
|
116
117
|
{
|
|
117
118
|
"cell_type": "code",
|
|
118
|
-
"execution_count":
|
|
119
|
+
"execution_count": null,
|
|
119
120
|
"metadata": {},
|
|
120
121
|
"outputs": [
|
|
121
122
|
{
|
|
@@ -163,7 +164,7 @@
|
|
|
163
164
|
},
|
|
164
165
|
{
|
|
165
166
|
"cell_type": "code",
|
|
166
|
-
"execution_count":
|
|
167
|
+
"execution_count": null,
|
|
167
168
|
"metadata": {},
|
|
168
169
|
"outputs": [
|
|
169
170
|
{
|
|
@@ -193,7 +194,7 @@
|
|
|
193
194
|
},
|
|
194
195
|
{
|
|
195
196
|
"cell_type": "code",
|
|
196
|
-
"execution_count":
|
|
197
|
+
"execution_count": null,
|
|
197
198
|
"metadata": {},
|
|
198
199
|
"outputs": [
|
|
199
200
|
{
|
|
@@ -228,7 +229,7 @@
|
|
|
228
229
|
},
|
|
229
230
|
{
|
|
230
231
|
"cell_type": "code",
|
|
231
|
-
"execution_count":
|
|
232
|
+
"execution_count": null,
|
|
232
233
|
"metadata": {},
|
|
233
234
|
"outputs": [
|
|
234
235
|
{
|
|
@@ -254,7 +255,7 @@
|
|
|
254
255
|
},
|
|
255
256
|
{
|
|
256
257
|
"cell_type": "code",
|
|
257
|
-
"execution_count":
|
|
258
|
+
"execution_count": null,
|
|
258
259
|
"metadata": {},
|
|
259
260
|
"outputs": [],
|
|
260
261
|
"source": [
|
|
@@ -273,7 +274,7 @@
|
|
|
273
274
|
},
|
|
274
275
|
{
|
|
275
276
|
"cell_type": "code",
|
|
276
|
-
"execution_count":
|
|
277
|
+
"execution_count": null,
|
|
277
278
|
"metadata": {},
|
|
278
279
|
"outputs": [
|
|
279
280
|
{
|
|
@@ -304,7 +305,7 @@
|
|
|
304
305
|
},
|
|
305
306
|
{
|
|
306
307
|
"cell_type": "code",
|
|
307
|
-
"execution_count":
|
|
308
|
+
"execution_count": null,
|
|
308
309
|
"metadata": {},
|
|
309
310
|
"outputs": [],
|
|
310
311
|
"source": [
|
|
@@ -321,7 +322,7 @@
|
|
|
321
322
|
},
|
|
322
323
|
{
|
|
323
324
|
"cell_type": "code",
|
|
324
|
-
"execution_count":
|
|
325
|
+
"execution_count": null,
|
|
325
326
|
"metadata": {},
|
|
326
327
|
"outputs": [],
|
|
327
328
|
"source": [
|
|
@@ -347,7 +348,7 @@
|
|
|
347
348
|
},
|
|
348
349
|
{
|
|
349
350
|
"cell_type": "code",
|
|
350
|
-
"execution_count":
|
|
351
|
+
"execution_count": null,
|
|
351
352
|
"metadata": {},
|
|
352
353
|
"outputs": [
|
|
353
354
|
{
|
|
@@ -411,7 +412,7 @@
|
|
|
411
412
|
},
|
|
412
413
|
{
|
|
413
414
|
"cell_type": "code",
|
|
414
|
-
"execution_count":
|
|
415
|
+
"execution_count": null,
|
|
415
416
|
"metadata": {},
|
|
416
417
|
"outputs": [],
|
|
417
418
|
"source": [
|
|
@@ -498,7 +499,213 @@
|
|
|
498
499
|
{
|
|
499
500
|
"cell_type": "markdown",
|
|
500
501
|
"metadata": {},
|
|
501
|
-
"source": [
|
|
502
|
+
"source": [
|
|
503
|
+
"# Updating segmentation layout"
|
|
504
|
+
]
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
"cell_type": "code",
|
|
508
|
+
"execution_count": 10,
|
|
509
|
+
"metadata": {},
|
|
510
|
+
"outputs": [],
|
|
511
|
+
"source": [
|
|
512
|
+
"import FreeSimpleGUI as sg"
|
|
513
|
+
]
|
|
514
|
+
},
|
|
515
|
+
{
|
|
516
|
+
"cell_type": "code",
|
|
517
|
+
"execution_count": 11,
|
|
518
|
+
"metadata": {},
|
|
519
|
+
"outputs": [],
|
|
520
|
+
"source": [
|
|
521
|
+
"cytoplasm_segmentation_3D = True\n",
|
|
522
|
+
"nucleus_segmentation_3D = True\n",
|
|
523
|
+
"is_3D_stack=True"
|
|
524
|
+
]
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
"cell_type": "code",
|
|
528
|
+
"execution_count": 19,
|
|
529
|
+
"metadata": {},
|
|
530
|
+
"outputs": [],
|
|
531
|
+
"source": [
|
|
532
|
+
"def _segmentation_layout(\n",
|
|
533
|
+
" ) :\n",
|
|
534
|
+
" \n",
|
|
535
|
+
" layout = []\n",
|
|
536
|
+
"\n",
|
|
537
|
+
" key_2D = \"cyto_radio_2D\"\n",
|
|
538
|
+
" options_2D = list()\n",
|
|
539
|
+
" key_3D = \"cyto_radio_3D\"\n",
|
|
540
|
+
" options_3D = list()\n",
|
|
541
|
+
" \n",
|
|
542
|
+
" cyto_radio_2D_seg = sg.Radio(\"2D segmentation\", group_id=1, default=((not cytoplasm_segmentation_3D) or (not is_3D_stack)) or (not is_3D_stack), visible = True, enable_events=True, key=key_2D)\n",
|
|
543
|
+
" cyto_radio_max_proj = sg.Radio(\"max proj\", group_id=2, default=False, visible = True)\n",
|
|
544
|
+
" cyto_radio_mean_proj = sg.Radio(\"mean proj\", group_id=2, default=True, visible = True)\n",
|
|
545
|
+
" cyto_radio_slice_proj = sg.Radio(\"select slice\", group_id=2, default=False, visible = True)\n",
|
|
546
|
+
" cyto_int_slice_proj = sg.Spin(list(range(999)), size= (5,1), visible = True, disabled=False)\n",
|
|
547
|
+
"\n",
|
|
548
|
+
" options_2D += [cyto_radio_2D_seg, cyto_radio_max_proj, cyto_radio_mean_proj, cyto_radio_slice_proj, cyto_int_slice_proj]\n",
|
|
549
|
+
"\n",
|
|
550
|
+
" layout += [\n",
|
|
551
|
+
" [cyto_radio_2D_seg],\n",
|
|
552
|
+
" [cyto_radio_max_proj, cyto_radio_mean_proj, cyto_radio_slice_proj, cyto_int_slice_proj]\n",
|
|
553
|
+
" ]\n",
|
|
554
|
+
"\n",
|
|
555
|
+
" if is_3D_stack : \n",
|
|
556
|
+
" cyto_radio_3D_seg = sg.Radio(\"3D segmentation\", group_id=1, default=cytoplasm_segmentation_3D, visible = True,enable_events=True, key=key_3D)\n",
|
|
557
|
+
" layout += [[cyto_radio_3D_seg]]\n",
|
|
558
|
+
"\n",
|
|
559
|
+
" options_3D += []\n",
|
|
560
|
+
" \n",
|
|
561
|
+
" layout += [[sg.Button(\"Ok\")]]\n",
|
|
562
|
+
" \n",
|
|
563
|
+
" #Reference dict\n",
|
|
564
|
+
" event_dict = {\n",
|
|
565
|
+
" key_2D : options_2D,\n",
|
|
566
|
+
" key_3D : options_3D,\n",
|
|
567
|
+
" }\n",
|
|
568
|
+
"\n",
|
|
569
|
+
" return layout, event_dict"
|
|
570
|
+
]
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
"cell_type": "code",
|
|
574
|
+
"execution_count": 20,
|
|
575
|
+
"metadata": {},
|
|
576
|
+
"outputs": [],
|
|
577
|
+
"source": [
|
|
578
|
+
"layout,_dict = _segmentation_layout()\n",
|
|
579
|
+
"window = sg.Window('small fish', layout=layout, margins=(10,10), size=(1000,1000), resizable=False, location=None, enable_close_attempted_event=True)"
|
|
580
|
+
]
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
"cell_type": "code",
|
|
584
|
+
"execution_count": 21,
|
|
585
|
+
"metadata": {},
|
|
586
|
+
"outputs": [],
|
|
587
|
+
"source": [
|
|
588
|
+
"while True :\n",
|
|
589
|
+
" try :\n",
|
|
590
|
+
" event, values = window.read(timeout=300, timeout_key=\"timeout\")\n",
|
|
591
|
+
"\n",
|
|
592
|
+
" if event == sg.WIN_CLOSE_ATTEMPTED_EVENT or event is None:\n",
|
|
593
|
+
" window.close()\n",
|
|
594
|
+
" break\n",
|
|
595
|
+
" elif event == \"Ok\" :\n",
|
|
596
|
+
" window.close()\n",
|
|
597
|
+
" break\n",
|
|
598
|
+
"\n",
|
|
599
|
+
" elif event == \"cyto_radio_3D\" :\n",
|
|
600
|
+
" for elmnt in ['cyto_radio_max_proj', 'cyto_radio_mean_proj','cyto_radio_slice_proj','cyto_int_slice_proj'] :\n",
|
|
601
|
+
" print(_dict[elmnt])\n",
|
|
602
|
+
" _dict[elmnt].update(disabled=True)\n",
|
|
603
|
+
" elif event == \"cyto_radio_2D\" :\n",
|
|
604
|
+
" for elmnt in ['cyto_radio_max_proj', 'cyto_radio_mean_proj','cyto_radio_slice_proj','cyto_int_slice_proj'] :\n",
|
|
605
|
+
" _dict[elmnt].update(disabled=False)\n",
|
|
606
|
+
"\n",
|
|
607
|
+
" elif event != \"timeout\" :\n",
|
|
608
|
+
" print(event)\n",
|
|
609
|
+
" \n",
|
|
610
|
+
" except Exception as e :\n",
|
|
611
|
+
" window.close()\n",
|
|
612
|
+
" raise(e)"
|
|
613
|
+
]
|
|
614
|
+
},
|
|
615
|
+
{
|
|
616
|
+
"cell_type": "markdown",
|
|
617
|
+
"metadata": {},
|
|
618
|
+
"source": [
|
|
619
|
+
"## Testint custom events on Napari"
|
|
620
|
+
]
|
|
621
|
+
},
|
|
622
|
+
{
|
|
623
|
+
"cell_type": "code",
|
|
624
|
+
"execution_count": 1,
|
|
625
|
+
"metadata": {},
|
|
626
|
+
"outputs": [],
|
|
627
|
+
"source": [
|
|
628
|
+
"import os, platform\n",
|
|
629
|
+
"import napari\n",
|
|
630
|
+
"\n",
|
|
631
|
+
"system_type = platform.system()\n",
|
|
632
|
+
"\n",
|
|
633
|
+
"\n",
|
|
634
|
+
"if system_type == \"Linux\" :\n",
|
|
635
|
+
" try :\n",
|
|
636
|
+
" os.environ[\"QT_QPA_PLATFORM\"] = \"xcb\"\n",
|
|
637
|
+
" except Exception :\n",
|
|
638
|
+
" pass\n"
|
|
639
|
+
]
|
|
640
|
+
},
|
|
641
|
+
{
|
|
642
|
+
"cell_type": "code",
|
|
643
|
+
"execution_count": null,
|
|
644
|
+
"metadata": {},
|
|
645
|
+
"outputs": [],
|
|
646
|
+
"source": [
|
|
647
|
+
"from napari.layers import Labels, Points, Image\n",
|
|
648
|
+
"from napari.utils.events import Event, EmitterGroup\n",
|
|
649
|
+
"from magicgui import magicgui\n",
|
|
650
|
+
"from magicgui.widgets import SpinBox, Container\n",
|
|
651
|
+
"\n",
|
|
652
|
+
"class MyWidgetCreator :\n",
|
|
653
|
+
" def __init__(self) :\n",
|
|
654
|
+
" self.events = EmitterGroup(source=self, coucou_event = None)\n",
|
|
655
|
+
" self.widget = self.create_widget()\n",
|
|
656
|
+
"\n",
|
|
657
|
+
" def create_widget(self) :\n",
|
|
658
|
+
"\n",
|
|
659
|
+
" @magicgui(\n",
|
|
660
|
+
" call_button=\"coucou\"\n",
|
|
661
|
+
" )\n",
|
|
662
|
+
" def event_emitter(name: str) :\n",
|
|
663
|
+
" print(\"Coucou !!\")\n",
|
|
664
|
+
" self.events.coucou_event(name=name)\n",
|
|
665
|
+
" return event_emitter\n",
|
|
666
|
+
"\n",
|
|
667
|
+
"\n",
|
|
668
|
+
"class PresenceCounter :\n",
|
|
669
|
+
" def __init__(self) :\n",
|
|
670
|
+
" self.value = 0\n",
|
|
671
|
+
" \n",
|
|
672
|
+
" def _on_salutation(self, event) :\n",
|
|
673
|
+
" self.value += 1\n",
|
|
674
|
+
" print(f\"{event.name} arrived! We are {self.value} now!\")"
|
|
675
|
+
]
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
"cell_type": "code",
|
|
679
|
+
"execution_count": null,
|
|
680
|
+
"metadata": {},
|
|
681
|
+
"outputs": [
|
|
682
|
+
{
|
|
683
|
+
"name": "stdout",
|
|
684
|
+
"output_type": "stream",
|
|
685
|
+
"text": [
|
|
686
|
+
"Coucou !!\n",
|
|
687
|
+
"F arrived! We are 1 now!\n",
|
|
688
|
+
"Coucou !!\n",
|
|
689
|
+
"R arrived! We are 2 now!\n",
|
|
690
|
+
"Coucou !!\n",
|
|
691
|
+
"R arrived! We are 3 now!\n",
|
|
692
|
+
"Coucou !!\n",
|
|
693
|
+
"D arrived! We are 4 now!\n",
|
|
694
|
+
"Coucou !!\n",
|
|
695
|
+
"G arrived! We are 5 now!\n"
|
|
696
|
+
]
|
|
697
|
+
}
|
|
698
|
+
],
|
|
699
|
+
"source": [
|
|
700
|
+
"Viewer = napari.Viewer()\n",
|
|
701
|
+
"my_widget = MyWidgetCreator()\n",
|
|
702
|
+
"presence_counter = PresenceCounter()\n",
|
|
703
|
+
"\n",
|
|
704
|
+
"my_widget.events.coucou_event.connect(presence_counter._on_salutation)\n",
|
|
705
|
+
"Viewer.window.add_dock_widget(my_widget.widget, name='test')\n",
|
|
706
|
+
"\n",
|
|
707
|
+
"napari.run()"
|
|
708
|
+
]
|
|
502
709
|
},
|
|
503
710
|
{
|
|
504
711
|
"cell_type": "code",
|
|
@@ -510,7 +717,7 @@
|
|
|
510
717
|
],
|
|
511
718
|
"metadata": {
|
|
512
719
|
"kernelspec": {
|
|
513
|
-
"display_name": "
|
|
720
|
+
"display_name": "small_fish_3.12",
|
|
514
721
|
"language": "python",
|
|
515
722
|
"name": "python3"
|
|
516
723
|
},
|
|
@@ -524,7 +731,7 @@
|
|
|
524
731
|
"name": "python",
|
|
525
732
|
"nbconvert_exporter": "python",
|
|
526
733
|
"pygments_lexer": "ipython3",
|
|
527
|
-
"version": "3.
|
|
734
|
+
"version": "3.12.3"
|
|
528
735
|
}
|
|
529
736
|
},
|
|
530
737
|
"nbformat": 4,
|
small_fish_gui/gui/tooltips.py
CHANGED
|
@@ -12,4 +12,10 @@ FLOW_THRESHOLD_TOOLTIP = """ (float) from 0. to 1.
|
|
|
12
12
|
The flow_threshold parameter is the maximum allowed error of the flows for each mask.
|
|
13
13
|
Increase this threshold if cellpose is not returning as many ROIs as you’d expect.
|
|
14
14
|
Similarly, decrease this threshold if cellpose is returning too many ill-shaped ROIs.
|
|
15
|
-
""" #Cellpose 4.0.6 doc
|
|
15
|
+
""" #Cellpose 4.0.6 doc
|
|
16
|
+
|
|
17
|
+
MIN_SIZE_TOOLTIP = """ (int) >0 ; pixel
|
|
18
|
+
Default to 15px. Minimum size for predicted regions during cytoplasm or nucleus segmentation. Smaller regions will be discarded.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
REMOVE_BACKGROUND_TOOLTIP = """RANSAC fit + substraction method is applied using selected channel as background and detection channel as signal. \nResulting signal is passed for spot detection and quantification but NOT for segmentation."""
|
small_fish_gui/hints.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
#Add keys hinting to user_parameters instance keys.
|
|
3
3
|
|
|
4
4
|
from typing import TypedDict, Tuple
|
|
5
|
+
from dataclasses import dataclass
|
|
5
6
|
from numpy import ndarray
|
|
6
7
|
|
|
7
8
|
class pipeline_parameters(TypedDict) :
|
|
@@ -11,23 +12,31 @@ class pipeline_parameters(TypedDict) :
|
|
|
11
12
|
alpha : float
|
|
12
13
|
anisotropy : float
|
|
13
14
|
beta : float
|
|
15
|
+
background_max_trial : int
|
|
14
16
|
channel_to_compute : int
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
cytoplasm_cellprob_threshold : float
|
|
18
|
+
background_channel : int
|
|
17
19
|
cytoplasm_segmentation_3D : bool
|
|
18
20
|
cluster_size : int
|
|
19
|
-
|
|
21
|
+
cytoplasm_model_name : str
|
|
20
22
|
cytoplasm_diameter : int
|
|
21
23
|
cytoplasm_channel : int
|
|
24
|
+
cytoplasm_min_size : int
|
|
25
|
+
cytoplasm_max_proj : bool
|
|
26
|
+
cytoplasm_mean_proj : bool
|
|
27
|
+
cytoplasm_select_slice : bool
|
|
28
|
+
cytoplasm_selected_slice : int
|
|
22
29
|
do_cluster_computation : bool
|
|
30
|
+
do_background_removal : bool
|
|
23
31
|
do_dense_regions_deconvolution : bool
|
|
24
32
|
do_spots_excel : bool
|
|
25
33
|
do_spots_feather : bool
|
|
26
34
|
do_spots_csv : bool
|
|
35
|
+
do_background_removal : bool
|
|
27
36
|
dim : int
|
|
28
37
|
filename : str
|
|
29
|
-
|
|
30
|
-
|
|
38
|
+
cytoplasm_flow_threshold : int
|
|
39
|
+
nucleus_flow_threshold : int
|
|
31
40
|
gamma : float
|
|
32
41
|
image_path : str
|
|
33
42
|
image : ndarray
|
|
@@ -42,17 +51,25 @@ class pipeline_parameters(TypedDict) :
|
|
|
42
51
|
minimum_distance_z : float
|
|
43
52
|
is_3D_stack : bool
|
|
44
53
|
is_multichannel : bool
|
|
54
|
+
nucleus_cellprob_threshold : float
|
|
45
55
|
nucleus_channel_signal : int
|
|
46
56
|
nucleus_segmentation_3D : bool
|
|
47
57
|
nucleus_diameter : int
|
|
48
58
|
nucleus_model_name : str
|
|
49
59
|
nucleus_channel : int
|
|
60
|
+
nucleus_min_size : int
|
|
61
|
+
nucleus_max_proj : bool
|
|
62
|
+
nucleus_mean_proj : bool
|
|
63
|
+
nucleus_select_slice : bool
|
|
64
|
+
nucleus_selected_slice : int
|
|
50
65
|
other_nucleus_image : str
|
|
51
66
|
reordered_shape : Tuple[int,int,int,int,int]
|
|
52
67
|
do_segmentation : bool
|
|
53
68
|
shape : Tuple[int,int,int,int,int]
|
|
54
|
-
|
|
69
|
+
save_segmentation_visuals : bool
|
|
70
|
+
segment_only_nuclei : bool
|
|
55
71
|
segmentation_done : bool
|
|
72
|
+
seg_control_saving_path : str
|
|
56
73
|
show_interactive_threshold_selector : bool
|
|
57
74
|
spots_extraction_folder : str
|
|
58
75
|
spots_filename : str
|
|
@@ -60,7 +77,6 @@ class pipeline_parameters(TypedDict) :
|
|
|
60
77
|
spot_size_x : int
|
|
61
78
|
spot_size_y : int
|
|
62
79
|
spot_size_z : int
|
|
63
|
-
segment_only_nuclei : bool
|
|
64
80
|
cytoplasm_segmentation_3D : bool
|
|
65
81
|
nucleus_segmentation_3D : bool
|
|
66
82
|
show_napari_corrector : bool
|
|
@@ -8,4 +8,10 @@ from .image import check_format
|
|
|
8
8
|
from .image import FormatError
|
|
9
9
|
from .image import get_voxel_size
|
|
10
10
|
|
|
11
|
-
from .inoutput import write_results
|
|
11
|
+
from .inoutput import write_results
|
|
12
|
+
|
|
13
|
+
from .user_settings import (SettingsDict,
|
|
14
|
+
get_settings,
|
|
15
|
+
get_default_settings,
|
|
16
|
+
write_settings
|
|
17
|
+
)
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
""""
|
|
2
|
+
Constant submodule to have a common reference for parameters default values
|
|
3
|
+
"""
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
WORKING_DIRECTORY = None
|
|
7
|
+
|
|
8
|
+
#Image
|
|
9
|
+
IS_MULTICHANNEL = False
|
|
10
|
+
IS_3D_STACK = False
|
|
11
|
+
CHANNEL = 0
|
|
12
|
+
NUC_CHANNEL = 1
|
|
13
|
+
|
|
14
|
+
#Segmentation
|
|
15
|
+
FLOW_THRESHOLD = 0.4
|
|
16
|
+
CELLPROB_THRESHOD = 0.
|
|
17
|
+
CYTO_MODEL = "cpsam"
|
|
18
|
+
NUC_MODEL = "cpsam"
|
|
19
|
+
CYTOPLASM_DIAMETER = 90
|
|
20
|
+
NUC_DIAMETER = 60
|
|
21
|
+
ANISOTROPY = 1.
|
|
22
|
+
SHOW_SEGMENTATION = True
|
|
23
|
+
SEGMENT_ONLY_NUCLEI = False
|
|
24
|
+
DO_3D_SEMGENTATION = False
|
|
25
|
+
VISUAL_PATH = os.getcwd()
|
|
26
|
+
SAVE_SEGMENTATION_VISUAL = False
|
|
27
|
+
NUCLEUS_MIN_SIZE = 15
|
|
28
|
+
CYTOPLASM_MIN_SIZE = 15
|
|
29
|
+
CYTOPLASM_max_proj = False
|
|
30
|
+
CYTOPLASM_mean_proj = True
|
|
31
|
+
CYTOPLASM_select_slice = False
|
|
32
|
+
CYTOPLASM_selected_slice = 0
|
|
33
|
+
|
|
34
|
+
NUCLEUS_MIN_SIZE = 15
|
|
35
|
+
NUCLEUS_max_proj = False
|
|
36
|
+
NUCLEUS_mean_proj = True
|
|
37
|
+
NUCLEUS_select_slice = False
|
|
38
|
+
NUCLEUS_selected_slice = 0
|
|
39
|
+
|
|
40
|
+
#Detection
|
|
41
|
+
THRESHOLD = None
|
|
42
|
+
THRESHOLD_PENALTY = 1
|
|
43
|
+
DO_DENSE_REGIONS_DECONVOLUTION = False
|
|
44
|
+
DO_CLUSTER_COMPUTATION = False
|
|
45
|
+
DO_CLUSTER_COMPUTATION = False
|
|
46
|
+
SHOW_NAPARI_CORRECTOR = True
|
|
47
|
+
INTERACTIVE_THRESHOLD = False
|
|
48
|
+
VOXEL_SIZE = (1,2,3)
|
|
49
|
+
|
|
50
|
+
#Background removal
|
|
51
|
+
DO_BACKGROUND_REMOVAL = False
|
|
52
|
+
BACKGROUND_CHANNEL = 0
|
|
53
|
+
|
|
54
|
+
#Deconvolution
|
|
55
|
+
ALPHA = 0.5
|
|
56
|
+
BETA = 1.
|
|
57
|
+
GAMMA = 3.
|
|
58
|
+
|
|
59
|
+
#Clustering
|
|
60
|
+
CLUSTER_SIZE = 400
|
|
61
|
+
MIN_NUMBER_SPOTS = 5
|
|
62
|
+
|
|
63
|
+
#Coloc
|
|
64
|
+
COLOC_RANGE = 400
|
|
65
|
+
|
|
66
|
+
#Spots Extraction
|
|
67
|
+
DO_CSV = False
|
|
68
|
+
DO_EXCEL = False
|
|
69
|
+
SPOT_EXTRACTION_FOLDER = os.getcwd()
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def get_default_settings() :
|
|
73
|
+
return {
|
|
74
|
+
"working_directory" : os.getcwd() if WORKING_DIRECTORY is None else WORKING_DIRECTORY,
|
|
75
|
+
"do_background_removal" : DO_BACKGROUND_REMOVAL,
|
|
76
|
+
"background_channel" : BACKGROUND_CHANNEL,
|
|
77
|
+
"multichannel_stack" : IS_MULTICHANNEL,
|
|
78
|
+
"stack_3D" : IS_3D_STACK,
|
|
79
|
+
"detection_channel" : CHANNEL,
|
|
80
|
+
"nucleus_channel" : NUC_CHANNEL,
|
|
81
|
+
"flow_threshold" : FLOW_THRESHOLD,
|
|
82
|
+
"cellprob_threshold" : CELLPROB_THRESHOD,
|
|
83
|
+
"cytoplasm_diameter" : CYTOPLASM_DIAMETER,
|
|
84
|
+
"nucleus_diameter" : NUC_DIAMETER,
|
|
85
|
+
"anisotropy" : ANISOTROPY,
|
|
86
|
+
"cytoplasm_model" : CYTO_MODEL,
|
|
87
|
+
"nucleus_model" : NUC_MODEL,
|
|
88
|
+
"show_segmentation" : SHOW_SEGMENTATION,
|
|
89
|
+
"segment_only_nuclei" : SEGMENT_ONLY_NUCLEI,
|
|
90
|
+
"do_3D_segmentation" : DO_3D_SEMGENTATION,
|
|
91
|
+
"save_segmentation_visuals" : SAVE_SEGMENTATION_VISUAL,
|
|
92
|
+
"threshold" : THRESHOLD,
|
|
93
|
+
"threshold_penalty" : THRESHOLD_PENALTY,
|
|
94
|
+
"do_dense_regions_deconvolution" : DO_DENSE_REGIONS_DECONVOLUTION,
|
|
95
|
+
"do_cluster" : DO_CLUSTER_COMPUTATION,
|
|
96
|
+
"show_napari_corrector" : SHOW_NAPARI_CORRECTOR,
|
|
97
|
+
"interactive_threshold_selector" : INTERACTIVE_THRESHOLD,
|
|
98
|
+
"alpha" : ALPHA,
|
|
99
|
+
"beta" : BETA,
|
|
100
|
+
"gamma" : GAMMA,
|
|
101
|
+
"cluster_size" : CLUSTER_SIZE ,
|
|
102
|
+
"min_spot" : MIN_NUMBER_SPOTS,
|
|
103
|
+
"coloc_range" : COLOC_RANGE,
|
|
104
|
+
"do_csv" : DO_CSV,
|
|
105
|
+
"do_excel" : DO_EXCEL,
|
|
106
|
+
"spot_extraction_folder" : SPOT_EXTRACTION_FOLDER,
|
|
107
|
+
"voxel_size" : VOXEL_SIZE,
|
|
108
|
+
"nucleus_min_size" : NUCLEUS_MIN_SIZE,
|
|
109
|
+
"cytoplasm_min_size" : CYTOPLASM_MIN_SIZE,
|
|
110
|
+
"cytoplasm_max_proj" : CYTOPLASM_max_proj,
|
|
111
|
+
"cytoplasm_mean_proj" : CYTOPLASM_mean_proj,
|
|
112
|
+
"cytoplasm_select_slice" : CYTOPLASM_select_slice,
|
|
113
|
+
"cytoplasm_selected_slice" : CYTOPLASM_selected_slice,
|
|
114
|
+
"nucleus_max_proj" : NUCLEUS_max_proj,
|
|
115
|
+
"nucleus_mean_proj" : NUCLEUS_mean_proj,
|
|
116
|
+
"nucleus_select_slice" : NUCLEUS_select_slice,
|
|
117
|
+
"nucleus_selected_slice" : NUCLEUS_selected_slice,
|
|
118
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import tifffile
|
|
1
3
|
from bigfish.stack import read_image
|
|
2
4
|
from czifile import imread
|
|
5
|
+
from czifile import CziFile
|
|
3
6
|
from ..utils import check_parameter
|
|
4
|
-
import re
|
|
5
|
-
from aicsimageio import AICSImage
|
|
6
7
|
from typing import Optional, Tuple
|
|
7
8
|
|
|
8
9
|
class FormatError(Exception):
|
|
@@ -43,17 +44,48 @@ def get_voxel_size(filepath: str) -> Optional[Tuple[Optional[float], Optional[fl
|
|
|
43
44
|
"""
|
|
44
45
|
Returns voxel size in nanometers (nm) as a tuple (X, Y, Z).
|
|
45
46
|
Any of the dimensions may be None if not available.
|
|
46
|
-
/WARINING
|
|
47
|
+
/WARINING\\ : the unit might not be nm
|
|
47
48
|
"""
|
|
48
49
|
try:
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
50
|
+
if filepath.endswith('.czi'):
|
|
51
|
+
with CziFile(filepath) as czi:
|
|
52
|
+
metadata = czi.metadata() # returns XML metadata
|
|
53
|
+
# try to parse voxel sizes from XML
|
|
54
|
+
import xml.etree.ElementTree as ET
|
|
55
|
+
root = ET.fromstring(metadata)
|
|
56
|
+
scaling_distance = root.findall('.//Scaling//Items//Distance//Value')
|
|
57
|
+
if len(scaling_distance) in [2,3] :
|
|
58
|
+
for scale in scaling_distance :
|
|
59
|
+
res = [float(scale.text) * 1e9 for scale in scaling_distance] #m to nm
|
|
60
|
+
res.reverse()
|
|
61
|
+
return tuple(res)
|
|
62
|
+
else :
|
|
63
|
+
raise Exception("Couln't find voxel size on xml metadata")
|
|
64
|
+
|
|
65
|
+
elif filepath.endswith(('.tif', '.tiff')):
|
|
66
|
+
with tifffile.TiffFile(filepath) as tif:
|
|
67
|
+
ij_meta = tif.imagej_metadata
|
|
68
|
+
page = tif.pages[0] # first image page
|
|
69
|
+
# X/Y resolution as (numerator, denominator)
|
|
70
|
+
xres = page.tags['XResolution'].value
|
|
71
|
+
yres = page.tags['YResolution'].value
|
|
72
|
+
# ResolutionUnit: must be 'nm' for this calculation
|
|
73
|
+
res_unit = ij_meta.get("unit")
|
|
74
|
+
|
|
75
|
+
if res_unit and str(res_unit) != 'nm':
|
|
76
|
+
xy_size = 1 / (xres[0] / xres[1]) * 1e3 #um to nm
|
|
77
|
+
elif res_unit and str(res_unit) != 'NONE':
|
|
78
|
+
xy_size = 1 / (xres[0] / xres[1]) #um to nm
|
|
79
|
+
else:
|
|
80
|
+
xy_size = None
|
|
81
|
+
|
|
82
|
+
# Z spacing from ImageJ metadata
|
|
83
|
+
if res_unit and str(res_unit) != 'nm':
|
|
84
|
+
z_size = ij_meta.get('spacing', None) * 1e3
|
|
85
|
+
else :
|
|
86
|
+
z_size = ij_meta.get('spacing', None)
|
|
87
|
+
|
|
88
|
+
return (z_size,xy_size, xy_size )
|
|
57
89
|
except Exception as e:
|
|
58
90
|
print(f"Failed to read voxel size from {filepath}: {e}")
|
|
59
91
|
return None
|