physion 1.2__tar.gz → 1.2.1__tar.gz

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 (223) hide show
  1. {physion-1.2/src/physion.egg-info → physion-1.2.1}/PKG-INFO +5 -10
  2. {physion-1.2 → physion-1.2.1}/README.md +3 -8
  3. {physion-1.2 → physion-1.2.1}/pyproject.toml +1 -1
  4. {physion-1.2 → physion-1.2.1}/src/physion/analysis/dataframe.py +5 -4
  5. {physion-1.2 → physion-1.2.1}/src/physion/analysis/process_NWB.py +13 -1
  6. {physion-1.2 → physion-1.2.1}/src/physion/assembling/nwb.py +40 -47
  7. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/raw.py +2 -2
  8. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/tools.py +3 -2
  9. {physion-1.2 → physion-1.2.1}/src/physion/gui/main.py +7 -3
  10. {physion-1.2 → physion-1.2.1}/src/physion/intrinsic/RetinotopicMapping.py +9 -4
  11. {physion-1.2 → physion-1.2.1}/src/physion/intrinsic/analysis.py +60 -8
  12. {physion-1.2 → physion-1.2.1}/src/physion/intrinsic/tools.py +11 -1
  13. {physion-1.2 → physion-1.2.1}/src/physion/pupil/process.py +1 -1
  14. {physion-1.2 → physion-1.2.1}/src/physion/utils/camera.py +41 -12
  15. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/main.py +12 -7
  16. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/preprocess_NI.py +3 -2
  17. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/stimuli/natural_image.py +7 -12
  18. {physion-1.2 → physion-1.2.1/src/physion.egg-info}/PKG-INFO +5 -10
  19. {physion-1.2 → physion-1.2.1}/LICENSE +0 -0
  20. {physion-1.2 → physion-1.2.1}/setup.cfg +0 -0
  21. {physion-1.2 → physion-1.2.1}/src/physion/__init__.py +0 -0
  22. {physion-1.2 → physion-1.2.1}/src/physion/__main__.py +0 -0
  23. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/__init__.py +0 -0
  24. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/configs/Adrianna-Bacci-2P.json +0 -0
  25. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/configs/Jo-Bacci-2P.json +0 -0
  26. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/configs/Taddy-A1-2P.json +0 -0
  27. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/configs/Troubleshooting.json +0 -0
  28. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/configs/Yann-A1-2P.json +0 -0
  29. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/configs/Yann-Bacci-2P.json +0 -0
  30. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/gui.py +0 -0
  31. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/FFDG-contrast-curve+blank.json +0 -0
  32. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/Light-Levels-Symmetric-5b-5g-10blank-5g-5b.json +0 -0
  33. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/Millman-et-al-2020.json +0 -0
  34. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/NDNF-protocol.json +0 -0
  35. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/black-grey-white-20s-each-x5.json +0 -0
  36. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/drifting-gratings.json +0 -0
  37. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/ff-gratings-2orientations-8contrasts-15repeats.json +0 -0
  38. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/ff-gratings-8orientation-2contrasts-15repeats.json +0 -0
  39. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/injection-monitoring.json +0 -0
  40. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/old-NDNF-protocol.json +0 -0
  41. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/quick-spatial-mapping.json +0 -0
  42. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/size-tuning-protocol-linear.json +0 -0
  43. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/size-tuning-protocol-log-long.json +0 -0
  44. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/size-tuning-protocol-log.json +0 -0
  45. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/size-tuning-protocol-long.json +0 -0
  46. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/spatial-mapping.json +0 -0
  47. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/protocols/stim-demo.json +0 -0
  48. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/recordings/Scan1Plane_Screen342V.py +0 -0
  49. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/recordings/Scan1Plane_Screen356VOffPeriodScan.py +0 -0
  50. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/recordings/__init__.py +0 -0
  51. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/run.py +0 -0
  52. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/settings.py +0 -0
  53. {physion-1.2 → physion-1.2.1}/src/physion/acquisition/tools.py +0 -0
  54. {physion-1.2 → physion-1.2.1}/src/physion/analysis/__init__.py +0 -0
  55. {physion-1.2 → physion-1.2.1}/src/physion/analysis/behavior.py +0 -0
  56. {physion-1.2 → physion-1.2.1}/src/physion/analysis/protocols/FFDG.py +0 -0
  57. {physion-1.2 → physion-1.2.1}/src/physion/analysis/protocols/FFDG_with_blank.py +0 -0
  58. {physion-1.2 → physion-1.2.1}/src/physion/analysis/protocols/Light_Levels.py +0 -0
  59. {physion-1.2 → physion-1.2.1}/src/physion/analysis/protocols/__init__.py +0 -0
  60. {physion-1.2 → physion-1.2.1}/src/physion/analysis/protocols/contrast_curves.py +0 -0
  61. {physion-1.2 → physion-1.2.1}/src/physion/analysis/protocols/size_tuning.py +0 -0
  62. {physion-1.2 → physion-1.2.1}/src/physion/analysis/protocols/spatial_mapping.py +0 -0
  63. {physion-1.2 → physion-1.2.1}/src/physion/analysis/read_NWB.py +0 -0
  64. {physion-1.2 → physion-1.2.1}/src/physion/analysis/stat_tools.py +0 -0
  65. {physion-1.2 → physion-1.2.1}/src/physion/analysis/summary_pdf.py +0 -0
  66. {physion-1.2 → physion-1.2.1}/src/physion/analysis/tools.py +0 -0
  67. {physion-1.2 → physion-1.2.1}/src/physion/analysis/trial_averaging.py +0 -0
  68. {physion-1.2 → physion-1.2.1}/src/physion/assembling/FOV_coordinates.py +0 -0
  69. {physion-1.2 → physion-1.2.1}/src/physion/assembling/__init__.py +0 -0
  70. {physion-1.2 → physion-1.2.1}/src/physion/assembling/add_ophys.py +0 -0
  71. {physion-1.2 → physion-1.2.1}/src/physion/assembling/gui.py +0 -0
  72. {physion-1.2 → physion-1.2.1}/src/physion/assembling/realign_from_photodiode.py +0 -0
  73. {physion-1.2 → physion-1.2.1}/src/physion/assembling/tools.py +0 -0
  74. {physion-1.2 → physion-1.2.1}/src/physion/assembling/update_metadata.py +0 -0
  75. {physion-1.2 → physion-1.2.1}/src/physion/behavior/__init__.py +0 -0
  76. {physion-1.2 → physion-1.2.1}/src/physion/behavior/convert_to_movie.py +0 -0
  77. {physion-1.2 → physion-1.2.1}/src/physion/behavior/locomotion.py +0 -0
  78. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/FOV.py +0 -0
  79. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/__init__.py +0 -0
  80. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/camera.py +0 -0
  81. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/dataframe/__init__.py +0 -0
  82. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/episodes/__init__.py +0 -0
  83. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/episodes/behavior.py +0 -0
  84. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/episodes/evoked_raster.py +0 -0
  85. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/episodes/trial_average.py +0 -0
  86. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/gui.py +0 -0
  87. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/imaging.py +0 -0
  88. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/movie.py +0 -0
  89. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/plots.py +0 -0
  90. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/protocols/__init__.py +0 -0
  91. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/protocols/template.py +0 -0
  92. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/pupil.py +0 -0
  93. {physion-1.2 → physion-1.2.1}/src/physion/dataviz/snapshot.py +0 -0
  94. {physion-1.2 → physion-1.2.1}/src/physion/electrophy/__init__.py +0 -0
  95. {physion-1.2 → physion-1.2.1}/src/physion/facemotion/__init__.py +0 -0
  96. {physion-1.2 → physion-1.2.1}/src/physion/facemotion/gui.py +0 -0
  97. {physion-1.2 → physion-1.2.1}/src/physion/facemotion/process.py +0 -0
  98. {physion-1.2 → physion-1.2.1}/src/physion/facemotion/roi.py +0 -0
  99. {physion-1.2 → physion-1.2.1}/src/physion/gui/__init__.py +0 -0
  100. {physion-1.2 → physion-1.2.1}/src/physion/gui/calendar.py +0 -0
  101. {physion-1.2 → physion-1.2.1}/src/physion/gui/menu.py +0 -0
  102. {physion-1.2 → physion-1.2.1}/src/physion/gui/parts.py +0 -0
  103. {physion-1.2 → physion-1.2.1}/src/physion/hardware/Dummy/__init__.py +0 -0
  104. {physion-1.2 → physion-1.2.1}/src/physion/hardware/Dummy/camera.py +0 -0
  105. {physion-1.2 → physion-1.2.1}/src/physion/hardware/FLIRcamera/__init__.py +0 -0
  106. {physion-1.2 → physion-1.2.1}/src/physion/hardware/FLIRcamera/export.py +0 -0
  107. {physion-1.2 → physion-1.2.1}/src/physion/hardware/FLIRcamera/launch.py +0 -0
  108. {physion-1.2 → physion-1.2.1}/src/physion/hardware/FLIRcamera/main.py +0 -0
  109. {physion-1.2 → physion-1.2.1}/src/physion/hardware/FLIRcamera/test.py +0 -0
  110. {physion-1.2 → physion-1.2.1}/src/physion/hardware/Igor/hdf5.py +0 -0
  111. {physion-1.2 → physion-1.2.1}/src/physion/hardware/Igor/igor.py +0 -0
  112. {physion-1.2 → physion-1.2.1}/src/physion/hardware/LogitechWebcam/__init__.py +0 -0
  113. {physion-1.2 → physion-1.2.1}/src/physion/hardware/LogitechWebcam/main.py +0 -0
  114. {physion-1.2 → physion-1.2.1}/src/physion/hardware/LogitechWebcam/test.py +0 -0
  115. {physion-1.2 → physion-1.2.1}/src/physion/hardware/NIdaq/__init__.py +0 -0
  116. {physion-1.2 → physion-1.2.1}/src/physion/hardware/NIdaq/config.py +0 -0
  117. {physion-1.2 → physion-1.2.1}/src/physion/hardware/NIdaq/inputs_for_screen.py +0 -0
  118. {physion-1.2 → physion-1.2.1}/src/physion/hardware/NIdaq/main.py +0 -0
  119. {physion-1.2 → physion-1.2.1}/src/physion/hardware/NIdaq/pulse.py +0 -0
  120. {physion-1.2 → physion-1.2.1}/src/physion/hardware/NIdaq/recording.py +0 -0
  121. {physion-1.2 → physion-1.2.1}/src/physion/hardware/NIdaq/steps.py +0 -0
  122. {physion-1.2 → physion-1.2.1}/src/physion/hardware/NIdaq/subprocess.py +0 -0
  123. {physion-1.2 → physion-1.2.1}/src/physion/hardware/NIdaq/test.py +0 -0
  124. {physion-1.2 → physion-1.2.1}/src/physion/hardware/NIdaq/zero_AO.py +0 -0
  125. {physion-1.2 → physion-1.2.1}/src/physion/hardware/QCamera/camera_core_test.py +0 -0
  126. {physion-1.2 → physion-1.2.1}/src/physion/hardware/QCamera/frame_rate_test.py +0 -0
  127. {physion-1.2 → physion-1.2.1}/src/physion/hardware/RaspberryPi/__init__.py +0 -0
  128. {physion-1.2 → physion-1.2.1}/src/physion/hardware/RaspberryPi/main.py +0 -0
  129. {physion-1.2 → physion-1.2.1}/src/physion/hardware/Thorlabs/__init__.py +0 -0
  130. {physion-1.2 → physion-1.2.1}/src/physion/hardware/Thorlabs/cam_test.py +0 -0
  131. {physion-1.2 → physion-1.2.1}/src/physion/hardware/Thorlabs/thorcam.py +0 -0
  132. {physion-1.2 → physion-1.2.1}/src/physion/hardware/Thorlabs/tkinter_camera_live_view.py +0 -0
  133. {physion-1.2 → physion-1.2.1}/src/physion/hardware/Thorlabs/usb_camera.py +0 -0
  134. {physion-1.2 → physion-1.2.1}/src/physion/hardware/__init__.py +0 -0
  135. {physion-1.2 → physion-1.2.1}/src/physion/hardware/zaber_stage/__init__.py +0 -0
  136. {physion-1.2 → physion-1.2.1}/src/physion/hardware/zaber_stage/main.py +0 -0
  137. {physion-1.2 → physion-1.2.1}/src/physion/imaging/Calcium.py +0 -0
  138. {physion-1.2 → physion-1.2.1}/src/physion/imaging/__init__.py +0 -0
  139. {physion-1.2 → physion-1.2.1}/src/physion/imaging/bruker/__init__.py +0 -0
  140. {physion-1.2 → physion-1.2.1}/src/physion/imaging/bruker/xml_parser.py +0 -0
  141. {physion-1.2 → physion-1.2.1}/src/physion/imaging/convert_to_movie.py +0 -0
  142. {physion-1.2 → physion-1.2.1}/src/physion/imaging/dcnv.py +0 -0
  143. {physion-1.2 → physion-1.2.1}/src/physion/imaging/gui.py +0 -0
  144. {physion-1.2 → physion-1.2.1}/src/physion/imaging/red_label.py +0 -0
  145. {physion-1.2 → physion-1.2.1}/src/physion/imaging/suite2p/__init__.py +0 -0
  146. {physion-1.2 → physion-1.2.1}/src/physion/imaging/suite2p/binary.py +0 -0
  147. {physion-1.2 → physion-1.2.1}/src/physion/imaging/suite2p/default_ops.py +0 -0
  148. {physion-1.2 → physion-1.2.1}/src/physion/imaging/suite2p/preprocessing.py +0 -0
  149. {physion-1.2 → physion-1.2.1}/src/physion/imaging/suite2p/presets.py +0 -0
  150. {physion-1.2 → physion-1.2.1}/src/physion/imaging/suite2p/to_nwb.py +0 -0
  151. {physion-1.2 → physion-1.2.1}/src/physion/intrinsic/SS_analysis.py +0 -0
  152. {physion-1.2 → physion-1.2.1}/src/physion/intrinsic/__init__.py +0 -0
  153. {physion-1.2 → physion-1.2.1}/src/physion/intrinsic/acquisition.py +0 -0
  154. {physion-1.2 → physion-1.2.1}/src/physion/intrinsic/build_protocols.py +0 -0
  155. {physion-1.2 → physion-1.2.1}/src/physion/intrinsic/pdf.py +0 -0
  156. {physion-1.2 → physion-1.2.1}/src/physion/intrinsic/somatosensory.py +0 -0
  157. {physion-1.2 → physion-1.2.1}/src/physion/pupil/__init__.py +0 -0
  158. {physion-1.2 → physion-1.2.1}/src/physion/pupil/gui.py +0 -0
  159. {physion-1.2 → physion-1.2.1}/src/physion/pupil/outliers.py +0 -0
  160. {physion-1.2 → physion-1.2.1}/src/physion/pupil/roi.py +0 -0
  161. {physion-1.2 → physion-1.2.1}/src/physion/utils/__init__.py +0 -0
  162. {physion-1.2 → physion-1.2.1}/src/physion/utils/binary.py +0 -0
  163. {physion-1.2 → physion-1.2.1}/src/physion/utils/files.py +0 -0
  164. {physion-1.2 → physion-1.2.1}/src/physion/utils/hdf5.py +0 -0
  165. {physion-1.2 → physion-1.2.1}/src/physion/utils/management/__init__.py +0 -0
  166. {physion-1.2 → physion-1.2.1}/src/physion/utils/management/delete.py +0 -0
  167. {physion-1.2 → physion-1.2.1}/src/physion/utils/matplotlib_style.py +0 -0
  168. {physion-1.2 → physion-1.2.1}/src/physion/utils/misc.py +0 -0
  169. {physion-1.2 → physion-1.2.1}/src/physion/utils/npz.py +0 -0
  170. {physion-1.2 → physion-1.2.1}/src/physion/utils/paths.py +0 -0
  171. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_export.py +0 -0
  172. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/__init__.py +0 -0
  173. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/setup.py +0 -0
  174. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/adjust_plots.py +0 -0
  175. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/annotations.py +0 -0
  176. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/bar.py +0 -0
  177. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/colors.py +0 -0
  178. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/export.py +0 -0
  179. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/figure.py +0 -0
  180. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/inset.py +0 -0
  181. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/legend.py +0 -0
  182. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/line.py +0 -0
  183. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/morphologies.py +0 -0
  184. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/pie.py +0 -0
  185. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/scatter.py +0 -0
  186. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/time_freq.py +0 -0
  187. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/src/violin.py +0 -0
  188. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/style-sheets/dark-notebook.py +0 -0
  189. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/style-sheets/dark.py +0 -0
  190. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/style-sheets/manuscript.py +0 -0
  191. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/tests/Notebook.py +0 -0
  192. {physion-1.2 → physion-1.2.1}/src/physion/utils/plot_tools/tests/envs.py +0 -0
  193. {physion-1.2 → physion-1.2.1}/src/physion/utils/progressBar.py +0 -0
  194. {physion-1.2 → physion-1.2.1}/src/physion/utils/sharing/__init__.py +0 -0
  195. {physion-1.2 → physion-1.2.1}/src/physion/utils/sharing/prepare_nwb_files.py +0 -0
  196. {physion-1.2 → physion-1.2.1}/src/physion/utils/transfer/__init__.py +0 -0
  197. {physion-1.2 → physion-1.2.1}/src/physion/utils/transfer/__main__.py +0 -0
  198. {physion-1.2 → physion-1.2.1}/src/physion/utils/transfer/gui.py +0 -0
  199. {physion-1.2 → physion-1.2.1}/src/physion/utils/transfer/types.py +0 -0
  200. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/__init__.py +0 -0
  201. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/build.py +0 -0
  202. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/gamma-correction.py +0 -0
  203. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/screens.py +0 -0
  204. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/show.py +0 -0
  205. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/stimuli/__init__.py +0 -0
  206. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/stimuli/center_drifting_grating.py +0 -0
  207. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/stimuli/center_grating.py +0 -0
  208. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/stimuli/flickering_bar.py +0 -0
  209. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/stimuli/gaussian_blob.py +0 -0
  210. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/stimuli/line_moving_dots.py +0 -0
  211. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/stimuli/looming_stim.py +0 -0
  212. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/stimuli/oscillDG.py +0 -0
  213. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/stimuli/random_dots.py +0 -0
  214. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/stimuli/scattered_moving_dots.py +0 -0
  215. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/stimuli/template.py +0 -0
  216. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/stimuli/uniform_bg.py +0 -0
  217. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/tests/opencv.py +0 -0
  218. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/tests/psychopy.py +0 -0
  219. {physion-1.2 → physion-1.2.1}/src/physion/visual_stim/tests/qt.py +0 -0
  220. {physion-1.2 → physion-1.2.1}/src/physion.egg-info/SOURCES.txt +0 -0
  221. {physion-1.2 → physion-1.2.1}/src/physion.egg-info/dependency_links.txt +0 -0
  222. {physion-1.2 → physion-1.2.1}/src/physion.egg-info/requires.txt +0 -0
  223. {physion-1.2 → physion-1.2.1}/src/physion.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: physion
3
- Version: 1.2
3
+ Version: 1.2.1
4
4
  Summary: Vision Physiology Software
5
5
  Author-email: Yann Zerlaut <yann.zerlaut@gmail.com>
6
6
  Project-URL: Homepage, https://github.com/yzerlaut/physion
@@ -38,7 +38,7 @@ Requires-Dist: openpyxl
38
38
 
39
39
  # Vision Physiology Software
40
40
 
41
- > *An integrated software for cellular and network physiology of visual circuits in behaving mice*
41
+ > *An integrated software for cellular and circuit physiology of visual processing during behavior*
42
42
 
43
43
  --------------------
44
44
 
@@ -65,14 +65,9 @@ Then simply:
65
65
  pip install physion
66
66
  ```
67
67
 
68
- **For an installation on an acquisition setup, see the detailed steps in [docs/install/README.md](./docs/install/README.md)**
68
+ - For an installation on an acquisition setup, see the detailed steps in [./docs/install/acquisition.md](./docs/install/acquisition.md)
69
+ - For some installation issues, see [./docs/install/troubleshooting.md](./docs/install/troubleshooting.md)
69
70
 
70
- #### troubleshooting
71
-
72
- - the `PyQt` package can be broken after those steps, re-start from a fresh install with `pip uninstall PyQt5` and `pip install PyQt5`.
73
- - In linux, the `libqxcb.so` binding is making problems, this can be solved by deleting the following file: `rm ~/miniconda3/lib/python3.11/site-packages/cv2/qt/plugins/platforms/libqxcb.so`.
74
- - In linux, there can be a `krb5` version mismatch between Qt and Ubuntu packages. Download the latest on [the kerboeros website](https://web.mit.edu/kerberos/) and install it from source with: `tar xf krb5-1.18.2.tar.gz; cd krb5-1.18.2/src; ./configure --prefix=/opt/krb5/ ; make && sudo make install`. Then do the binding with: `export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/krb5/lib` (you can put this in your `~/.bashrc`).
75
-
76
71
  ## Usage
77
72
 
78
73
  Run:
@@ -7,7 +7,7 @@
7
7
 
8
8
  # Vision Physiology Software
9
9
 
10
- > *An integrated software for cellular and network physiology of visual circuits in behaving mice*
10
+ > *An integrated software for cellular and circuit physiology of visual processing during behavior*
11
11
 
12
12
  --------------------
13
13
 
@@ -34,14 +34,9 @@ Then simply:
34
34
  pip install physion
35
35
  ```
36
36
 
37
- **For an installation on an acquisition setup, see the detailed steps in [docs/install/README.md](./docs/install/README.md)**
37
+ - For an installation on an acquisition setup, see the detailed steps in [./docs/install/acquisition.md](./docs/install/acquisition.md)
38
+ - For some installation issues, see [./docs/install/troubleshooting.md](./docs/install/troubleshooting.md)
38
39
 
39
- #### troubleshooting
40
-
41
- - the `PyQt` package can be broken after those steps, re-start from a fresh install with `pip uninstall PyQt5` and `pip install PyQt5`.
42
- - In linux, the `libqxcb.so` binding is making problems, this can be solved by deleting the following file: `rm ~/miniconda3/lib/python3.11/site-packages/cv2/qt/plugins/platforms/libqxcb.so`.
43
- - In linux, there can be a `krb5` version mismatch between Qt and Ubuntu packages. Download the latest on [the kerboeros website](https://web.mit.edu/kerberos/) and install it from source with: `tar xf krb5-1.18.2.tar.gz; cd krb5-1.18.2/src; ./configure --prefix=/opt/krb5/ ; make && sudo make install`. Then do the binding with: `export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/krb5/lib` (you can put this in your `~/.bashrc`).
44
-
45
40
  ## Usage
46
41
 
47
42
  Run:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "physion"
3
- version = "1.2"
3
+ version = "1.2.1"
4
4
  authors = [
5
5
  { name="Yann Zerlaut", email="yann.zerlaut@gmail.com" },
6
6
  ]
@@ -41,7 +41,7 @@ def NWB_to_dataframe(nwbfile,
41
41
  if time_sampling_reference=='dFoF' and ('ophys' in data.nwbfile.processing):
42
42
  time = np.array(data.Fluorescence.timestamps[:])[::subsampling]
43
43
  else:
44
- print('taking running pseed by default')
44
+ print('taking running speed by default')
45
45
  time = data.t_running_speed[::subsampling]
46
46
 
47
47
  dataframe = pandas.DataFrame({'time':time})
@@ -57,9 +57,9 @@ def NWB_to_dataframe(nwbfile,
57
57
  interpolation='linear',
58
58
  verbose=verbose)
59
59
 
60
- dataframe.vNrois = data.vNrois
60
+ dataframe.nROIs = data.nROIs
61
61
 
62
- for i in range(data.vNrois):
62
+ for i in range(data.nROIs):
63
63
 
64
64
  if ('dFoF' in normalize) or (normalize=='all'):
65
65
  dataframe['dFoF-ROI%i'%i] = Normalize(data.dFoF[i,:])
@@ -258,8 +258,9 @@ def build_stim_specific_array(data, index_cond, time,
258
258
  if i<data.nwbfile.stimulus['time_start_realigned'].num_samples:
259
259
  tstart = data.nwbfile.stimulus['time_start_realigned'].data[i]
260
260
  tstop = data.nwbfile.stimulus['time_stop_realigned'].data[i]
261
+
261
262
 
262
- t_cond = (time>=tstart) & (time<tstop)
263
+ t_cond = (time>=float(tstart)) & (time<float(tstop))
263
264
  array[t_cond] = True
264
265
 
265
266
  # TO BE FIXED
@@ -17,6 +17,18 @@ class EpisodeData:
17
17
  the raw signal on a fixed time interval (surrounding the stim)
18
18
 
19
19
  - Using metadata to store stimulus informations per episode
20
+
21
+ quantities should be given as:
22
+ - Photodiode-Signal
23
+ - running_speed
24
+ - Deconvolved
25
+ - dFoF
26
+ - Zscore_dFoF
27
+ - neuropil
28
+ - rawFluo
29
+ - pupil_diameter
30
+ - gaze_movement
31
+ - facemotion
20
32
  """
21
33
 
22
34
  def __init__(self, full_data,
@@ -145,7 +157,7 @@ class EpisodeData:
145
157
  full_data.nwbfile.stimulus['time_start'].data[self.protocol_cond_in_full_data,0][0]
146
158
  idur = int(duration/dt_sampling/1e-3)
147
159
  # -> time array:
148
- self.t = np.arange(-ipre+1, idur+ipre-1)*dt_sampling*1e-3
160
+ self.t = np.arange(-ipre+2, idur+ipre)*dt_sampling*1e-3
149
161
 
150
162
 
151
163
  #############################################################################
@@ -26,15 +26,9 @@ ALL_MODALITIES = ['raw_CaImaging', 'processed_CaImaging',
26
26
  'VisualStim',
27
27
  'Locomotion']
28
28
 
29
-
30
- def build_NWB_func(args):
31
-
32
- if args.verbose:
33
- print('- Initializing NWB file for "%s" [...]' % args.datafolder)
34
-
35
- #################################################
36
- #### BASIC metadata #######
37
- #################################################
29
+ def read_metadata(args):
30
+ """
31
+ """
38
32
 
39
33
  if os.path.isfile(os.path.join(args.datafolder, 'metadata.json')):
40
34
  with open(os.path.join(args.datafolder, 'metadata.json'),
@@ -45,6 +39,16 @@ def build_NWB_func(args):
45
39
  metadata = np.load(os.path.join(args.datafolder, 'metadata.npy'),
46
40
  allow_pickle=True).item()
47
41
 
42
+ return metadata
43
+
44
+ def build_NWB_func(args):
45
+ """
46
+ """
47
+ if args.verbose:
48
+ print('- Initializing NWB file for "%s" [...]' % args.datafolder)
49
+
50
+ metadata = read_metadata(args)
51
+
48
52
  # add visual stimulation protocol parameters to the metadata:
49
53
  if os.path.isfile(os.path.join(args.datafolder, 'protocol.json')):
50
54
  with open(os.path.join(args.datafolder, 'protocol.json'),
@@ -84,7 +88,7 @@ def build_NWB_func(args):
84
88
  subject_file = [f for f in os.listdir(args.datafolder) if '.xlsx' in f][0]
85
89
  print('- Adding Subject data from the file: "%s" (TO BE DONE)' % subject_file)
86
90
  except BaseException:
87
- print('[!!] / ! \\ no Subject .xlsx file found / ! \\ ')
91
+ print(' [!!] no Subject .xlsx file found [!!] ')
88
92
 
89
93
  #################################
90
94
  # Implement READ from CSV here ##
@@ -319,19 +323,13 @@ def build_NWB_func(args):
319
323
 
320
324
  fcamData = CameraData('FaceCamera', folder=args.datafolder)
321
325
 
322
- if os.path.isfile(os.path.join(args.datafolder, 'FaceCamera-summary.npy')):
323
- FCS_data = np.load(os.path.join(args.datafolder, 'FaceCamera-summary.npy'),
324
- allow_pickle=True).item()
325
- FC_times = FCS_data['times'] # can be overwritten later
326
- else:
327
- FCS_data = None
328
-
326
+ FC_times = fcamData.times
329
327
  FC_times = check_times(FC_times, NIdaq_Tstart)
330
328
 
331
- if ('raw_FaceCamera' in args.modalities) and (fcamData is not None):
332
-
333
- FC_times = fcamData.times
334
- FC_times = check_times(FC_times, NIdaq_Tstart)
329
+ if ('raw_FaceCamera' in args.modalities) and (len(fcamData.times)>0):
330
+
331
+ FC_timesR = fcamData.times
332
+ FC_timesR = check_times(FC_timesR, NIdaq_Tstart)
335
333
 
336
334
  imgR = fcamData.get(0)
337
335
  FC_SUBSAMPLING = build_subsampling_from_freq(args.FaceCamera_frame_sampling,
@@ -352,30 +350,7 @@ def build_NWB_func(args):
352
350
  FaceCamera_frames = pynwb.image.ImageSeries(name='FaceCamera',
353
351
  data=FC_dataI,
354
352
  unit='NA',
355
- timestamps=FC_times[FC_SUBSAMPLING])
356
- nwbfile.add_acquisition(FaceCamera_frames)
357
-
358
- elif ('raw_FaceCamera' in args.modalities) and (FCS_data is not None):
359
-
360
- imgR = FCS_data['sample_frames'][0]
361
- def FaceCamera_frame_generator():
362
- for i in range(len(FCS_data['sample_frames'])):
363
- try:
364
- yield FCS_data['sample_frames'][i].astype(np.uint8).reshape(imgR.shape)
365
- except ValueError:
366
- print('Pb in FaceCamera with frame #', i)
367
- yield np.zeros(imgR.shape)[shape_cond]
368
-
369
- FC_dataI = DataChunkIterator(data=FaceCamera_frame_generator(),
370
- maxshape=(None, *imgR.shape),
371
- dtype=np.dtype(np.uint8))
372
- FaceCamera_frames = pynwb.image.ImageSeries(name='FaceCamera',
373
- data=FC_dataI,
374
- unit='NA',
375
- timestamps=FC_times[np.linspace(0, len(FC_times)-1,
376
- len(FCS_data['sample_frames']),
377
- dtype=int)])
378
- # timestamps=FC_times[FCS_data['sample_frames_index']]) # REPLACE THE ABOVE LINE AFTER SEPT 16th !!!
353
+ timestamps=FC_timesR[FC_SUBSAMPLING])
379
354
  nwbfile.add_acquisition(FaceCamera_frames)
380
355
 
381
356
  else:
@@ -396,6 +371,8 @@ def build_NWB_func(args):
396
371
 
397
372
  dataP = np.load(os.path.join(args.datafolder, 'pupil.npy'),
398
373
  allow_pickle=True).item()
374
+ print(len(FC_times))
375
+ print('pupil frames: ', len(dataP['frame']))
399
376
 
400
377
  if 'FaceCamera-1cm-in-pix' in metadata:
401
378
  pix_to_mm = 10./float(metadata['FaceCamera-1cm-in-pix']) # IN MILLIMETERS FROM HERE
@@ -418,7 +395,7 @@ def build_NWB_func(args):
418
395
  pupil_module.add(PupilProp)
419
396
 
420
397
  # then add the frames subsampled
421
- if fcamData is not None:
398
+ if len(fcamData.times)>0:
422
399
  imgP = fcamData.get(0)
423
400
  x, y = np.meshgrid(np.arange(0,imgP.shape[0]), np.arange(0,imgP.shape[1]), indexing='ij')
424
401
  cond = (x>=dataP['xmin']) & (x<=dataP['xmax']) & (y>=dataP['ymin']) & (y<=dataP['ymax'])
@@ -663,6 +640,12 @@ if __name__=='__main__':
663
640
  parser.add_argument('-sfs', "--FaceMotion_frame_sampling", default=0.005, type=float)
664
641
 
665
642
  parser.add_argument('-df', "--destination_folder", type=str, default='')
643
+ parser.add_argument('-op', "--only_protocol", type=str, default='',
644
+ help="""
645
+ In recursive mode,
646
+ if you want to build files for a given protocol only
647
+ e.g.: -oe drifting-gratings
648
+ """)
666
649
 
667
650
  parser.add_argument("--silent", action="store_true")
668
651
  parser.add_argument('-v', "--verbose", action="store_true")
@@ -687,7 +670,17 @@ if __name__=='__main__':
687
670
  print(' processing "%s" [...] ' % f)
688
671
  args.datafolder = f
689
672
  args.filename = ''
690
- build_NWB_func(args)
673
+ if args.only_protocol!='':
674
+ # we check that it matches the protocol
675
+ metadata = read_metadata(args)
676
+ if args.only_protocol in metadata['protocol']:
677
+ build_NWB_func(args)
678
+ else:
679
+ print('')
680
+ print(' [!!] ignoring:', f, ' of protocol', metadata['protocol'])
681
+ print('')
682
+ else:
683
+ build_NWB_func(args)
691
684
 
692
685
  elif os.path.isdir(args.datafolder) and (\
693
686
  ('metadata.npy' in os.listdir(args.datafolder)) or
@@ -158,8 +158,8 @@ def add_VisualStim(data, tlim, ax,
158
158
 
159
159
  for i in np.arange(data.nwbfile.stimulus['time_start_realigned'].num_samples)[cond]:
160
160
 
161
- tstart = data.nwbfile.stimulus['time_start_realigned'].data[i,0]
162
- tstop = data.nwbfile.stimulus['time_stop_realigned'].data[i,0]
161
+ tstart = max([tlim[0], data.nwbfile.stimulus['time_start_realigned'].data[i,0]])
162
+ tstop = min([tlim[1], data.nwbfile.stimulus['time_stop_realigned'].data[i,0]])
163
163
  # ax.plot([tstart, tstop], [ylevel, ylevel], color=color)
164
164
  ax.fill_between([tstart, tstop], [0,0], np.zeros(2)+ylevel,
165
165
  lw=0, alpha=0.05, color=color)
@@ -35,7 +35,8 @@ def plot_scaled_signal(data,
35
35
  tlim, scale_bar,
36
36
  scale_side='left',
37
37
  ax_fraction_extent=1, ax_fraction_start=0,
38
- color='#1f77b4', scale_unit_string='%.1f'):
38
+ color='#1f77b4', scale_unit_string='%.1f',
39
+ lw=0.5):
39
40
  """
40
41
  # generic function to add scaled signal
41
42
  """
@@ -49,7 +50,7 @@ def plot_scaled_signal(data,
49
50
 
50
51
  ax.plot(t,
51
52
  ax_fraction_start+(signal-min_signal)*ax_fraction_extent/scale_range,
52
- color=color, lw=1)
53
+ color=color, lw=lw)
53
54
 
54
55
  if scale_side=='left':
55
56
  tscale, side = shifted_start(tlim), 'right'
@@ -85,7 +85,8 @@ class MainWindow(QtWidgets.QMainWindow):
85
85
  from physion.intrinsic.analysis import open_intrinsic_folder,\
86
86
  moved_pixels, load_intrinsic_data, compute_phase_maps,\
87
87
  compute_retinotopic_maps, perform_area_segmentation,\
88
- update_img1, update_img2, save_intrinsic, pdf_intrinsic
88
+ update_img1, update_img2, save_intrinsic, pdf_intrinsic,\
89
+ reset_ROI
89
90
  else:
90
91
  from physion.gui.parts import inactivated as intrinsic
91
92
  # somatosensory
@@ -297,12 +298,11 @@ class MainWindow(QtWidgets.QMainWindow):
297
298
  # ---- DEBUG interface ---- #
298
299
  # self.SS_intrinsic()
299
300
  # self.facemotion()
300
- self.pupil()
301
+ # self.pupil()
301
302
  # self.transfer_gui()
302
303
  # self.suite2p_preprocessing_UI()
303
304
  # self.build_NWB_UI()
304
305
  # self.add_imaging()
305
- # self.intrinsic()
306
306
  # self.NWBs = ['/home/yann.zerlaut/DATA/JO-VIP-CB1/2022_11_16-15-17-59.nwb']
307
307
  # self.IMAGINGs = ['/home/yann.zerlaut/DATA/JO-VIP-CB1/Imaging-2Chan/TSeries-11162022-nomark-000']
308
308
  # self.runAddOphys()
@@ -314,6 +314,10 @@ class MainWindow(QtWidgets.QMainWindow):
314
314
  # self.trial_averaging()
315
315
  # self.FOV()
316
316
  # self.multimodal()
317
+ self.intrinsic()
318
+ self.lastBox.setChecked(False)
319
+ self.datafolder = '/Users/yann/UNPROCESSED/CIBELE/2024_06_28/14-35-30'
320
+ # self.load_intrinsic_data()
317
321
 
318
322
  def refresh(self):
319
323
  tab_id = self.tabWidget.currentIndex()
@@ -971,7 +971,11 @@ class RetinotopicMappingTrial(object):
971
971
  def __str__(self):
972
972
  return 'A retinotopic mapping trial: ' + self.getName()
973
973
 
974
- def _getSignMap(self, isReverse=False, isPlot=False, isFixedRange=True):
974
+ def _getSignMap(self,
975
+ isReverse=False,
976
+ onlySMplot=False,
977
+ isPlot=False,
978
+ isFixedRange=True):
975
979
 
976
980
  altPosMapf = ni.filters.gaussian_filter(self.altPosMap,
977
981
  self.params['phaseMapFilterSigma'])
@@ -997,7 +1001,7 @@ class RetinotopicMappingTrial(object):
997
1001
  signMapf = ni.filters.gaussian_filter(signMap,
998
1002
  self.params['signMapFilterSigma'])
999
1003
 
1000
- if isPlot:
1004
+ if isPlot or onlySMplot:
1001
1005
  f1 = plt.figure(figsize=(7, 3.4))
1002
1006
  f1_231 = f1.add_subplot(231)
1003
1007
  if isFixedRange:
@@ -1048,6 +1052,7 @@ class RetinotopicMappingTrial(object):
1048
1052
  plt.axis('off')
1049
1053
  f1_236.set_title('sign map filtered')
1050
1054
 
1055
+ if isPlot:
1051
1056
  f2 = plt.figure(figsize=(4, 1.4))
1052
1057
  f2_121 = f2.add_subplot(121)
1053
1058
  if altPowerMapf is not None:
@@ -1355,7 +1360,7 @@ class RetinotopicMappingTrial(object):
1355
1360
 
1356
1361
  return patches
1357
1362
 
1358
- def _mergePatches(self, isPlot=False):
1363
+ def _mergePatches(self, isPlot=False, onlyPplot=False):
1359
1364
 
1360
1365
  if not hasattr(self, 'patchesAfterSplit'):
1361
1366
  self._splitPatches()
@@ -1494,7 +1499,7 @@ class RetinotopicMappingTrial(object):
1494
1499
 
1495
1500
  finalPatches = sortPatches(patches)
1496
1501
 
1497
- if isPlot:
1502
+ if onlyPplot or isPlot:
1498
1503
  try:
1499
1504
  zoom = self.vasculatureMap.shape[0] / self.altPosMap.shape[0]
1500
1505
  except:
@@ -9,6 +9,7 @@ from physion.utils.files import last_datafolder_in_dayfolder, day_folder
9
9
  from physion.intrinsic.tools import default_segmentation_params
10
10
  from physion.intrinsic import tools as intrinsic_analysis
11
11
  from physion.intrinsic import RetinotopicMapping
12
+ from physion.pupil.roi import extract_ellipse_props, ellipse_props_to_ROI
12
13
 
13
14
  phase_color_map = pg.ColorMap(pos=np.linspace(0.0, 1.0, 3),
14
15
  color=[(255, 0, 0),
@@ -38,7 +39,6 @@ def gui(self,
38
39
  self.datafolder, self.IMAGES = '', {}
39
40
  self.subject, self.timestamps, self.data = '', '', None
40
41
 
41
-
42
42
  ##########################################################
43
43
  ####### GUI settings
44
44
  ##########################################################
@@ -85,7 +85,14 @@ def gui(self,
85
85
  self.add_side_widget(tab.layout,self.loadButton)
86
86
 
87
87
  # -------------------------------------------------------
88
- self.add_side_widget(tab.layout,QtWidgets.QLabel(''))
88
+ # self.add_side_widget(tab.layout,QtWidgets.QLabel(''))
89
+
90
+ self.roiBox = QtWidgets.QCheckBox("ROI")
91
+ self.roiBox.setStyleSheet("color: gray;")
92
+ self.add_side_widget(tab.layout,self.roiBox, spec='small-middle')
93
+ self.roiButton = QtWidgets.QPushButton("reset", self)
94
+ self.roiButton.clicked.connect(self.reset_ROI)
95
+ self.add_side_widget(tab.layout,self.roiButton, 'small-right')
89
96
 
90
97
  self.pmButton = QtWidgets.QPushButton(\
91
98
  " == compute phase/power maps == ", self)
@@ -207,13 +214,16 @@ def gui(self,
207
214
  self.nWidgetRow,
208
215
  self.nWidgetCol-self.side_wdgt_length)
209
216
 
210
- self.raw_trace = self.graphics_layout.addPlot(row=0, col=0, rowspan=1, colspan=23)
217
+ self.raw_trace = self.graphics_layout.addPlot(row=0, col=0,
218
+ rowspan=1, colspan=23)
211
219
 
212
- self.spectrum_power = self.graphics_layout.addPlot(row=1, col=0, rowspan=2, colspan=9)
220
+ self.spectrum_power = self.graphics_layout.addPlot(row=1, col=0,
221
+ rowspan=2, colspan=9)
213
222
  self.spDot = pg.ScatterPlotItem()
214
223
  self.spectrum_power.addItem(self.spDot)
215
224
 
216
- self.spectrum_phase = self.graphics_layout.addPlot(row=1, col=9, rowspan=2, colspan=9)
225
+ self.spectrum_phase = self.graphics_layout.addPlot(row=1, col=9,
226
+ rowspan=2, colspan=9)
217
227
  self.sphDot = pg.ScatterPlotItem()
218
228
  self.spectrum_phase.addItem(self.sphDot)
219
229
 
@@ -239,18 +249,45 @@ def gui(self,
239
249
  self.graphics_layout.ci.layout.setRowStretchFactor(3, 5)
240
250
 
241
251
  # -------------------------------------------------------
242
- self.pixROI = pg.ROI((0, 0), size=(10,10),
252
+ self.pixROI = pg.ROI((0, 0), size=(20,20),
243
253
  pen=pg.mkPen((255,0,0,255)),
244
254
  rotatable=False,resizable=False)
245
255
  self.pixROI.sigRegionChangeFinished.connect(self.moved_pixels)
246
256
  self.img1B.addItem(self.pixROI)
247
257
 
258
+ self.ROI = pg.EllipseROI([0, 0], [100, 100],
259
+ movable = True,
260
+ rotatable=False,
261
+ resizable=True,
262
+ pen= pg.mkPen((0, 0, 255), width=3,
263
+ style=QtCore.Qt.SolidLine),
264
+ removable=True)
265
+ self.img1B.addItem(self.ROI)
266
+
248
267
  self.refresh_tab(tab)
249
268
 
250
269
  self.data = None
251
270
 
252
271
  self.show()
253
-
272
+
273
+ def reset_ROI(self):
274
+
275
+ if hasattr(self, 'ROI'):
276
+ self.ROI.sigRemoveRequested.connect(lambda: self.remove(self))
277
+ self.img1B.removeItem(self.ROI)
278
+
279
+ if 'raw-img-start' in self.IMAGES:
280
+ Ly, Lx = self.IMAGES['raw-img-start'].shape
281
+ self.ROI = pg.EllipseROI([0.05*Lx, 0.05*Ly], [0.9*Lx, 0.9*Ly],
282
+ movable = True,
283
+ rotatable=False,
284
+ resizable=True,
285
+ pen= pg.mkPen((0, 0, 255), width=3,
286
+ style=QtCore.Qt.SolidLine),
287
+ removable=True)
288
+ self.img1B.addItem(self.ROI)
289
+
290
+
254
291
  def open_intrinsic_folder(self):
255
292
 
256
293
  self.datafolder = self.open_folder()
@@ -432,6 +469,11 @@ def show_raw_data(self):
432
469
  def compute_phase_maps(self):
433
470
 
434
471
  print('- computing phase maps [...]')
472
+ if self.roiBox.isChecked():
473
+ self.IMAGES['ROI'] = extract_ellipse_props(self.ROI)
474
+ else:
475
+ # a very large one
476
+ self.IMAGES['ROI'] = [-1000,-1000,20000,20000,0]
435
477
 
436
478
  intrinsic_analysis.compute_phase_power_maps(get_datafolder(self),
437
479
  self.protocolBox.currentText(),
@@ -533,12 +575,22 @@ def perform_area_segmentation(self):
533
575
  self.data['params'][key] = float(getattr(self, key+'Box').text())
534
576
 
535
577
  trial = RetinotopicMapping.RetinotopicMappingTrial(**self.data)
536
- trial.processTrial(isPlot=True)
578
+ _ = trial._getSignMap(onlySMplot=True)
579
+ _ = trial._getRawPatchMap()
580
+ _ = trial._getRawPatches()
581
+ _ = trial._getDeterminantMap()
582
+ _ = trial._getEccentricityMap()
583
+ _ = trial._splitPatches()
584
+ _ = trial._mergePatches(onlyPplot=True)
585
+ intrinsic_analysis.plt.show()
537
586
  print(' -> area segmentation done ! ')
538
587
 
539
588
 
540
589
  def save_intrinsic(self):
541
590
 
591
+ # add ROI props
592
+ self.IMAGES['ROI_coords'] = ellipse_props_to_ROI(self.ROI)
593
+
542
594
  intrinsic_analysis.save_maps(self.IMAGES,
543
595
  os.path.join(self.datafolder, 'raw-maps.npy'))
544
596
  print(' current maps saved as: ', \
@@ -9,6 +9,7 @@ from scipy.ndimage.filters import gaussian_filter1d, gaussian_filter
9
9
  from PIL import Image
10
10
 
11
11
  from physion.utils import plot_tools as pt
12
+ from physion.pupil.process import inside_ellipse_cond, roi
12
13
 
13
14
  # from datavyz import graph_env
14
15
  ge_screen = None
@@ -203,6 +204,11 @@ def perform_fft_analysis(data, nrepeat,
203
204
 
204
205
  return rel_power, phase
205
206
 
207
+ def find_ellipse_cond(maps, shape):
208
+ xc, yc, dx, dy, angle = maps['ROI']
209
+ x, y = np.meshgrid(np.arange(0, shape[0]),
210
+ np.arange(0, shape[1]), indexing='ij')
211
+ return inside_ellipse_cond(x, y, yc, xc, dy, dx, -angle)
206
212
 
207
213
  def compute_phase_power_maps(datafolder, direction,
208
214
  maps={},
@@ -214,13 +220,17 @@ def compute_phase_power_maps(datafolder, direction,
214
220
  if (p is None) or (t is None) or (data is None):
215
221
  p, (t, data) = load_raw_data(datafolder, direction, run_id=run_id)
216
222
 
217
-
218
223
  # FFT and write maps
219
224
  maps['%s-power' % direction],\
220
225
  maps['%s-phase' % direction] = perform_fft_analysis(data, p['Nrepeat'],
221
226
  phase_range=phase_range)
222
227
  maps['%s-phase-range' % direction] = phase_range
223
228
 
229
+ if 'ROI' in maps:
230
+ ellipse = find_ellipse_cond(maps, (data.shape[1], data.shape[2]))
231
+ maps['%s-power' % direction][~ellipse] = 0
232
+ maps['%s-phase' % direction][~ellipse] = 0
233
+
224
234
  return maps
225
235
 
226
236
  def get_phase_to_angle_func(datafolder, direction):
@@ -184,7 +184,7 @@ def extract_boundaries_from_ellipse(ellipse, Lx, Ly):
184
184
  else:
185
185
  cx, cy, sx, sy = ellipse
186
186
  angle=0
187
- x,y = np.meshgrid(np.arange(0,Lx), np.arange(0,Ly), indexing='ij')
187
+ x, y = np.meshgrid(np.arange(0,Lx), np.arange(0,Ly), indexing='ij')
188
188
  ellipse = inside_ellipse_cond(x, y, cx, cy, sx, sy, alpha=angle)
189
189
  xmin, xmax = np.min(x[ellipse]), np.max(x[ellipse])
190
190
  ymin, ymax = np.min(y[ellipse]), np.max(y[ellipse])