small-fish-gui 2.0.2__py3-none-any.whl → 2.0.3__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.
Files changed (51) hide show
  1. small_fish_gui/__init__.py +2 -2
  2. small_fish_gui/batch/integrity.py +2 -2
  3. small_fish_gui/batch/pipeline.py +46 -11
  4. small_fish_gui/batch/prompt.py +102 -41
  5. small_fish_gui/batch/update.py +26 -13
  6. small_fish_gui/batch/utils.py +1 -1
  7. small_fish_gui/gui/__init__.py +1 -0
  8. small_fish_gui/gui/_napari_widgets.py +418 -6
  9. small_fish_gui/gui/layout.py +332 -112
  10. small_fish_gui/gui/napari_visualiser.py +107 -22
  11. small_fish_gui/gui/prompts.py +161 -48
  12. small_fish_gui/gui/testing.ipynb +231 -24
  13. small_fish_gui/gui/tooltips.py +7 -1
  14. small_fish_gui/hints.py +23 -7
  15. small_fish_gui/interface/__init__.py +7 -1
  16. small_fish_gui/interface/default_settings.py +118 -0
  17. small_fish_gui/interface/image.py +43 -11
  18. small_fish_gui/interface/settings.json +50 -0
  19. small_fish_gui/interface/testing.ipynb +4354 -0
  20. small_fish_gui/interface/user_settings.py +96 -0
  21. small_fish_gui/main_menu.py +13 -1
  22. small_fish_gui/pipeline/{_signaltonoise.py → _bigfish_wrapers.py} +59 -7
  23. small_fish_gui/pipeline/_colocalisation.py +23 -24
  24. small_fish_gui/pipeline/_preprocess.py +46 -32
  25. small_fish_gui/pipeline/actions.py +48 -5
  26. small_fish_gui/pipeline/detection.py +71 -141
  27. small_fish_gui/pipeline/segmentation.py +360 -268
  28. small_fish_gui/pipeline/spots.py +3 -3
  29. small_fish_gui/pipeline/utils.py +5 -1
  30. small_fish_gui/README.md → small_fish_gui-2.0.3.dist-info/METADATA +35 -0
  31. small_fish_gui-2.0.3.dist-info/RECORD +46 -0
  32. {small_fish_gui-2.0.2.dist-info → small_fish_gui-2.0.3.dist-info}/WHEEL +1 -1
  33. small_fish_gui/.github/workflows/python-publish.yml +0 -39
  34. small_fish_gui/LICENSE +0 -24
  35. small_fish_gui/batch/values.txt +0 -65
  36. small_fish_gui/default_values.py +0 -51
  37. small_fish_gui/gui/screenshot/general_help_screenshot.png +0 -0
  38. small_fish_gui/gui/screenshot/mapping_help_screenshot.png +0 -0
  39. small_fish_gui/gui/screenshot/segmentation_help_screenshot.png +0 -0
  40. small_fish_gui/illustrations/DetectionVitrine_filtre.png +0 -0
  41. small_fish_gui/illustrations/DetectionVitrine_signal.png +0 -0
  42. small_fish_gui/illustrations/FocciVitrine.png +0 -0
  43. small_fish_gui/illustrations/FocciVitrine_no_spots.png +0 -0
  44. small_fish_gui/illustrations/Segmentation2D.png +0 -0
  45. small_fish_gui/illustrations/Segmentation2D_with_labels.png +0 -0
  46. small_fish_gui/logo.png +0 -0
  47. small_fish_gui/pipeline/testing.ipynb +0 -3636
  48. small_fish_gui/requirements.txt +0 -19
  49. small_fish_gui-2.0.2.dist-info/METADATA +0 -75
  50. small_fish_gui-2.0.2.dist-info/RECORD +0 -59
  51. {small_fish_gui-2.0.2.dist-info → small_fish_gui-2.0.3.dist-info}/licenses/LICENSE +0 -0
@@ -9,7 +9,7 @@
9
9
  },
10
10
  {
11
11
  "cell_type": "code",
12
- "execution_count": 1,
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": 2,
43
+ "execution_count": 1,
44
44
  "metadata": {},
45
45
  "outputs": [
46
46
  {
47
- "data": {
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
- "text/plain": [
50
- "<Figure size 640x480 with 1 Axes>"
51
- ]
52
- },
53
- "metadata": {},
54
- "output_type": "display_data"
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": 3,
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": 4,
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": 5,
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": 6,
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": 7,
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": 8,
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": 9,
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": 10,
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": 11,
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": 12,
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": 2,
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": "dev",
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.9.21"
734
+ "version": "3.12.3"
528
735
  }
529
736
  },
530
737
  "nbformat": 4,
@@ -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
- cellprob_threshold_cyto : float
16
- cellprob_threshold_nuc : float
17
+ cytoplasm_cellprob_threshold : float
18
+ background_channel : int
17
19
  cytoplasm_segmentation_3D : bool
18
20
  cluster_size : int
19
- cyto_model_name : str
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
- flow_threshold_cyto : int
30
- flow_threshold_nuc : int
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
- save_segmentation_visual : bool
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\ : the unit might not be nm
47
+ /WARINING\\ : the unit might not be nm
47
48
  """
48
49
  try:
49
- img = AICSImage(filepath)
50
- voxel_sizes = img.physical_pixel_sizes # values in meters
51
- if voxel_sizes is None:
52
- return None
53
- x = voxel_sizes.X * 1e3 if voxel_sizes.X else None
54
- y = voxel_sizes.Y * 1e3 if voxel_sizes.Y else None
55
- z = voxel_sizes.Z * 1e3 if voxel_sizes.Z else None
56
- return (z, y, x)
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