physion 1.2.2__tar.gz → 2.0__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 (328) hide show
  1. {physion-1.2.2/src/physion.egg-info → physion-2.0}/PKG-INFO +21 -6
  2. {physion-1.2.2 → physion-2.0}/README.md +5 -0
  3. {physion-1.2.2 → physion-2.0}/pyproject.toml +23 -1
  4. physion-2.0/src/physion/acquisition/__init__.py +43 -0
  5. {physion-1.2.2 → physion-2.0}/src/physion/acquisition/gui.py +35 -31
  6. {physion-1.2.2 → physion-2.0}/src/physion/acquisition/run.py +25 -36
  7. {physion-1.2.2 → physion-2.0}/src/physion/acquisition/settings.py +26 -9
  8. {physion-1.2.2 → physion-2.0}/src/physion/acquisition/tools.py +12 -10
  9. {physion-1.2.2 → physion-2.0}/src/physion/analysis/dataframe.py +14 -6
  10. {physion-1.2.2 → physion-2.0}/src/physion/analysis/episodes/build.py +4 -3
  11. physion-2.0/src/physion/analysis/modalities/__init__.py +12 -0
  12. physion-2.0/src/physion/analysis/modalities/ephys.py +391 -0
  13. physion-2.0/src/physion/analysis/modalities/facecamera.py +127 -0
  14. physion-2.0/src/physion/analysis/modalities/locomotion.py +54 -0
  15. physion-2.0/src/physion/analysis/modalities/ophys.py +234 -0
  16. physion-2.0/src/physion/analysis/modalities/opto.py +36 -0
  17. physion-2.0/src/physion/analysis/modalities/visual_stim.py +156 -0
  18. {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/FFDG.py +3 -3
  19. {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/FFDG_with_blank.py +3 -3
  20. {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/Light_Levels.py +4 -4
  21. {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/orientation_tuning.py +22 -16
  22. {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/size_tuning.py +7 -7
  23. physion-2.0/src/physion/analysis/read_NWB.py +352 -0
  24. {physion-1.2.2 → physion-2.0}/src/physion/analysis/stat_tools.py +1 -1
  25. {physion-1.2.2 → physion-2.0}/src/physion/analysis/summary_pdf.py +2 -2
  26. {physion-1.2.2 → physion-2.0}/src/physion/analysis/tools.py +2 -3
  27. physion-2.0/src/physion/assembling/FOV_coordinates.py +175 -0
  28. {physion-1.2.2 → physion-2.0}/src/physion/assembling/add_ephys.py +222 -89
  29. {physion-1.2.2 → physion-2.0}/src/physion/assembling/add_ophys.py +5 -28
  30. {physion-1.2.2 → physion-2.0}/src/physion/assembling/dataset.py +3 -2
  31. physion-2.0/src/physion/assembling/gui.py +357 -0
  32. {physion-1.2.2 → physion-2.0}/src/physion/assembling/nwb.py +354 -260
  33. {physion-1.2.2 → physion-2.0}/src/physion/assembling/realign_from_photodiode.py +17 -8
  34. {physion-1.2.2 → physion-2.0}/src/physion/assembling/update_metadata.py +3 -3
  35. physion-2.0/src/physion/behavior/convert_to_movie.py +124 -0
  36. physion-2.0/src/physion/dataviz/FOV.py +235 -0
  37. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/ephys.py +11 -5
  38. physion-2.0/src/physion/dataviz/episodes/gui.py +293 -0
  39. physion-2.0/src/physion/dataviz/gui.py +303 -0
  40. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/plots.py +37 -3
  41. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/tools.py +3 -2
  42. physion-2.0/src/physion/ephys/location_gui.py +315 -0
  43. {physion-1.2.2 → physion-2.0}/src/physion/ephys/spike_sorting.py +6 -3
  44. physion-2.0/src/physion/ephys/spike_sorting_gui.py +207 -0
  45. physion-1.2.2/src/physion/acquisition/recordings/EphysSynch_IrregularXHz.py → physion-2.0/src/physion/ephys/synch.py +5 -5
  46. physion-2.0/src/physion/facemotion/gui.py +422 -0
  47. physion-2.0/src/physion/gui/calendar.py +344 -0
  48. {physion-1.2.2 → physion-2.0}/src/physion/gui/main.py +133 -158
  49. {physion-1.2.2 → physion-2.0}/src/physion/gui/menu.py +7 -1
  50. {physion-1.2.2 → physion-2.0}/src/physion/gui/parts.py +9 -7
  51. physion-2.0/src/physion/gui/window.py +121 -0
  52. {physion-1.2.2 → physion-2.0}/src/physion/hardware/FLIRcamera/main.py +12 -5
  53. {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/main.py +81 -40
  54. {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/usb.py +92 -28
  55. {physion-1.2.2 → physion-2.0}/src/physion/hardware/Thorlabs/main.py +10 -2
  56. physion-2.0/src/physion/imaging/bot_spatial_maps.py +174 -0
  57. {physion-1.2.2 → physion-2.0}/src/physion/imaging/bruker/xml_parser.py +2 -2
  58. physion-2.0/src/physion/imaging/folders.py +93 -0
  59. physion-2.0/src/physion/imaging/h5_gui.py +407 -0
  60. physion-2.0/src/physion/imaging/matching_FOV_gui.py +469 -0
  61. physion-2.0/src/physion/imaging/red_label.py +318 -0
  62. {physion-1.2.2 → physion-2.0}/src/physion/imaging/suite2p/default_ops.py +1 -1
  63. physion-2.0/src/physion/imaging/suite2p/preprocessing.py +298 -0
  64. {physion-1.2.2 → physion-2.0}/src/physion/imaging/suite2p/presets.py +32 -5
  65. physion-2.0/src/physion/imaging/suite2p_gui.py +417 -0
  66. physion-2.0/src/physion/intrinsic/SS_analysis.py +407 -0
  67. physion-2.0/src/physion/intrinsic/analysis.py +616 -0
  68. {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/ocular_dominance.py +285 -283
  69. {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/tools.py +6 -2
  70. physion-2.0/src/physion/opto/stim.py +37 -0
  71. physion-2.0/src/physion/pupil/gui.py +743 -0
  72. {physion-1.2.2 → physion-2.0}/src/physion/pupil/process.py +8 -6
  73. {physion-1.2.2 → physion-2.0}/src/physion/pupil/roi.py +2 -3
  74. {physion-1.2.2 → physion-2.0}/src/physion/utils/camera.py +11 -8
  75. physion-2.0/src/physion/utils/compression/avi.py +75 -0
  76. physion-2.0/src/physion/utils/compression/binary.py +61 -0
  77. physion-2.0/src/physion/utils/compression/h5.py +274 -0
  78. physion-2.0/src/physion/utils/compression/mp4.py +120 -0
  79. physion-2.0/src/physion/utils/compression/nwb.py +202 -0
  80. physion-2.0/src/physion/utils/compression/twoP.py +294 -0
  81. {physion-1.2.2 → physion-2.0}/src/physion/utils/files.py +29 -0
  82. physion-2.0/src/physion/utils/management/__init__.py +0 -0
  83. physion-2.0/src/physion/utils/management/delete.py +104 -0
  84. physion-2.0/src/physion/utils/misc.py +31 -0
  85. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/Notebook.py +2 -1
  86. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/annotations.py +9 -0
  87. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/figure.py +6 -2
  88. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/legend.py +0 -1
  89. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/style-sheets/dark.py +2 -1
  90. physion-2.0/src/physion/utils/sharing/__init__.py +0 -0
  91. {physion-1.2.2 → physion-2.0}/src/physion/utils/sharing/prepare_nwb_files.py +6 -4
  92. physion-2.0/src/physion/utils/transfer/__init__.py +0 -0
  93. physion-2.0/src/physion/utils/transfer/gui.py +115 -0
  94. physion-2.0/src/physion/visual_stim/NI_bank/1.jpg +0 -0
  95. physion-2.0/src/physion/visual_stim/NI_bank/2.jpg +0 -0
  96. physion-2.0/src/physion/visual_stim/NI_bank/3.jpg +0 -0
  97. physion-2.0/src/physion/visual_stim/NI_bank/4.jpg +0 -0
  98. physion-2.0/src/physion/visual_stim/NI_bank/5.jpg +0 -0
  99. physion-2.0/src/physion/visual_stim/NI_bank/6.jpg +0 -0
  100. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/build.py +12 -4
  101. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/main.py +44 -5
  102. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/preprocess_NI.py +1 -2
  103. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/__init__.py +1 -1
  104. physion-2.0/src/physion/visual_stim/stimuli/flickering_grating.py +84 -0
  105. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/looming_stim.py +4 -4
  106. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/natural_image.py +6 -4
  107. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/natural_image_VSE.py +9 -4
  108. {physion-1.2.2 → physion-2.0/src/physion.egg-info}/PKG-INFO +21 -6
  109. {physion-1.2.2 → physion-2.0}/src/physion.egg-info/SOURCES.txt +55 -17
  110. {physion-1.2.2 → physion-2.0}/src/physion.egg-info/requires.txt +13 -0
  111. physion-2.0/tests/test_assembling.py +14 -0
  112. physion-2.0/tests/test_camera.py +28 -0
  113. physion-2.0/tests/test_channel_location.py +80 -0
  114. physion-2.0/tests/test_demo_nwb.py +62 -0
  115. physion-2.0/tests/test_electrode_table.py +82 -0
  116. physion-2.0/tests/test_ephys_chunks.py +56 -0
  117. physion-2.0/tests/test_ephys_units.py +187 -0
  118. physion-2.0/tests/test_gui_smoke.py +141 -0
  119. physion-2.0/tests/test_h5_compression.py +51 -0
  120. physion-2.0/tests/test_imaging_folders.py +105 -0
  121. physion-2.0/tests/test_matching_FOV.py +156 -0
  122. physion-2.0/tests/test_nidaq_acquisition.py +168 -0
  123. physion-2.0/tests/test_optional_dependencies.py +31 -0
  124. physion-2.0/tests/test_opto_display.py +62 -0
  125. physion-2.0/tests/test_pupil_facemotion.py +80 -0
  126. physion-2.0/tests/test_realignment.py +106 -0
  127. physion-2.0/tests/test_remove_raw_after_h5.py +65 -0
  128. physion-2.0/tests/test_source.py +17 -0
  129. physion-2.0/tests/test_suite2p_h5_options.py +84 -0
  130. physion-2.0/tests/test_trial_averaging.py +56 -0
  131. physion-1.2.2/src/physion/acquisition/__init__.py +0 -21
  132. physion-1.2.2/src/physion/acquisition/protocols/ff-gratings-2orientations-8contrasts-15repeats.json +0 -22
  133. physion-1.2.2/src/physion/acquisition/protocols/ff-gratings-8orientation-2contrasts-15repeats.json +0 -23
  134. physion-1.2.2/src/physion/acquisition/protocols/ffDG-4dir-2ctrst+1sPrePostOpto.json +0 -28
  135. physion-1.2.2/src/physion/acquisition/protocols/ffSG-8ori-2ctrst+1sPrePostOpto.json +0 -29
  136. physion-1.2.2/src/physion/acquisition/recordings/PhotoStim_Alternated_1sPrePost.py +0 -20
  137. physion-1.2.2/src/physion/acquisition/recordings/PhotoStim_Alternated_500msPrePost.py +0 -20
  138. physion-1.2.2/src/physion/acquisition/recordings/Scan1Plane_Screen342V.py +0 -14
  139. physion-1.2.2/src/physion/acquisition/recordings/Scan1Plane_Screen356VOffPeriodScan.py +0 -28
  140. physion-1.2.2/src/physion/acquisition/recordings/__init__.py +0 -4
  141. physion-1.2.2/src/physion/analysis/read_NWB.py +0 -1119
  142. physion-1.2.2/src/physion/analysis/trial_averaging.py +0 -300
  143. physion-1.2.2/src/physion/assembling/FOV_coordinates.py +0 -168
  144. physion-1.2.2/src/physion/assembling/gui.py +0 -307
  145. physion-1.2.2/src/physion/behavior/convert_to_movie.py +0 -114
  146. physion-1.2.2/src/physion/dataviz/FOV.py +0 -225
  147. physion-1.2.2/src/physion/dataviz/gui.py +0 -257
  148. physion-1.2.2/src/physion/ephys/LFP/build.py +0 -106
  149. physion-1.2.2/src/physion/ephys/gui.py +0 -199
  150. physion-1.2.2/src/physion/facemotion/gui.py +0 -410
  151. physion-1.2.2/src/physion/gui/calendar.py +0 -335
  152. physion-1.2.2/src/physion/imaging/bot_spatial_maps.py +0 -176
  153. physion-1.2.2/src/physion/imaging/gui.py +0 -393
  154. physion-1.2.2/src/physion/imaging/red_label.py +0 -311
  155. physion-1.2.2/src/physion/imaging/suite2p/preprocessing.py +0 -173
  156. physion-1.2.2/src/physion/intrinsic/SS_analysis.py +0 -400
  157. physion-1.2.2/src/physion/intrinsic/analysis.py +0 -625
  158. physion-1.2.2/src/physion/pupil/gui.py +0 -728
  159. physion-1.2.2/src/physion/utils/compression/twoP.py +0 -407
  160. physion-1.2.2/src/physion/utils/management/delete.py +0 -96
  161. physion-1.2.2/src/physion/utils/misc.py +0 -13
  162. physion-1.2.2/src/physion/utils/transfer/gui.py +0 -118
  163. {physion-1.2.2 → physion-2.0}/LICENSE +0 -0
  164. {physion-1.2.2 → physion-2.0}/setup.cfg +0 -0
  165. {physion-1.2.2 → physion-2.0}/src/physion/__init__.py +0 -0
  166. {physion-1.2.2 → physion-2.0}/src/physion/__main__.py +0 -0
  167. {physion-1.2.2 → physion-2.0}/src/physion/acquisition/DataTable.xlsx +0 -0
  168. {physion-1.2.2 → physion-2.0}/src/physion/acquisition/configs/Bacci-2P.json +0 -0
  169. {physion-1.2.2 → physion-2.0}/src/physion/acquisition/configs/Bacci-Neuropix.json +0 -0
  170. {physion-1.2.2 → physion-2.0}/src/physion/acquisition/configs/Laptop+Lilliput.json +0 -0
  171. {physion-1.2.2 → physion-2.0}/src/physion/acquisition/configs/NIdaq-usage.json +0 -0
  172. {physion-1.2.2 → physion-2.0}/src/physion/acquisition/configs/Rebol-A1-2P.json +0 -0
  173. {physion-1.2.2 → physion-2.0}/src/physion/acquisition/configs/Rebol-Neuropix.json +0 -0
  174. {physion-1.2.2 → physion-2.0}/src/physion/analysis/__init__.py +0 -0
  175. {physion-1.2.2 → physion-2.0}/src/physion/analysis/behavior.py +0 -0
  176. {physion-1.2.2 → physion-2.0}/src/physion/analysis/episodes/__init__.py +0 -0
  177. {physion-1.2.2 → physion-2.0}/src/physion/analysis/episodes/trial_statistics.py +0 -0
  178. {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/__init__.py +0 -0
  179. {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/asahi.py +0 -0
  180. {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/contrast_sensitivity.py +0 -0
  181. {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/ff_gratings_2orientations_8contrasts.py +0 -0
  182. {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/ff_gratings_8orientations_2contrasts.py +0 -0
  183. {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/multiStim.py +0 -0
  184. {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/spatial_mapping.py +0 -0
  185. {physion-1.2.2 → physion-2.0}/src/physion/assembling/__init__.py +0 -0
  186. {physion-1.2.2 → physion-2.0}/src/physion/assembling/subject.py +0 -0
  187. {physion-1.2.2 → physion-2.0}/src/physion/assembling/tools.py +0 -0
  188. {physion-1.2.2 → physion-2.0}/src/physion/behavior/__init__.py +0 -0
  189. {physion-1.2.2 → physion-2.0}/src/physion/behavior/locomotion.py +0 -0
  190. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/__init__.py +0 -0
  191. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/camera.py +0 -0
  192. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/dataframe/__init__.py +0 -0
  193. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/__init__.py +0 -0
  194. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/behavior.py +0 -0
  195. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/common.py +0 -0
  196. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/evoked_pattern.py +0 -0
  197. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/evoked_raster.py +0 -0
  198. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/temporal_dynamics.py +0 -0
  199. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/trial_average.py +0 -0
  200. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/imaging.py +0 -0
  201. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/movie.py +0 -0
  202. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/protocols/__init__.py +0 -0
  203. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/protocols/template.py +0 -0
  204. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/pupil.py +0 -0
  205. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/raw.py +0 -0
  206. {physion-1.2.2 → physion-2.0}/src/physion/dataviz/snapshot.py +0 -0
  207. {physion-1.2.2 → physion-2.0}/src/physion/ephys/NSI.py +0 -0
  208. {physion-1.2.2/src/physion/ephys/LFP → physion-2.0/src/physion/ephys}/__init__.py +0 -0
  209. {physion-1.2.2 → physion-2.0}/src/physion/ephys/alignement.py +0 -0
  210. {physion-1.2.2 → physion-2.0}/src/physion/ephys/tools.py +0 -0
  211. {physion-1.2.2/src/physion/ephys → physion-2.0/src/physion/facemotion}/__init__.py +0 -0
  212. {physion-1.2.2 → physion-2.0}/src/physion/facemotion/process.py +0 -0
  213. {physion-1.2.2 → physion-2.0}/src/physion/facemotion/roi.py +0 -0
  214. {physion-1.2.2/src/physion/facemotion → physion-2.0/src/physion/gui}/__init__.py +0 -0
  215. {physion-1.2.2/src/physion/gui → physion-2.0/src/physion/hardware/Dummy}/__init__.py +0 -0
  216. {physion-1.2.2 → physion-2.0}/src/physion/hardware/Dummy/camera.py +0 -0
  217. {physion-1.2.2/src/physion/hardware/Dummy → physion-2.0/src/physion/hardware/FLIRcamera}/__init__.py +0 -0
  218. {physion-1.2.2 → physion-2.0}/src/physion/hardware/FLIRcamera/export.py +0 -0
  219. {physion-1.2.2 → physion-2.0}/src/physion/hardware/FLIRcamera/launch.py +0 -0
  220. {physion-1.2.2 → physion-2.0}/src/physion/hardware/FLIRcamera/test.py +0 -0
  221. {physion-1.2.2 → physion-2.0}/src/physion/hardware/Igor/hdf5.py +0 -0
  222. {physion-1.2.2 → physion-2.0}/src/physion/hardware/Igor/igor.py +0 -0
  223. {physion-1.2.2/src/physion/hardware/FLIRcamera → physion-2.0/src/physion/hardware/LogitechWebcam}/__init__.py +0 -0
  224. {physion-1.2.2 → physion-2.0}/src/physion/hardware/LogitechWebcam/main.py +0 -0
  225. {physion-1.2.2 → physion-2.0}/src/physion/hardware/LogitechWebcam/test.py +0 -0
  226. {physion-1.2.2 → physion-2.0}/src/physion/hardware/LuigsNeumann/live_treadmill.py +0 -0
  227. {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/__init__.py +0 -0
  228. {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/config.py +0 -0
  229. {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/inputs_for_screen.py +0 -0
  230. {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/pulse.py +0 -0
  231. {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/recording.py +0 -0
  232. {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/steps.py +0 -0
  233. {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/subprocess.py +0 -0
  234. {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/test.py +0 -0
  235. {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/zero_AO.py +0 -0
  236. {physion-1.2.2 → physion-2.0}/src/physion/hardware/QCamera/camera_core_test.py +0 -0
  237. {physion-1.2.2 → physion-2.0}/src/physion/hardware/QCamera/frame_rate_test.py +0 -0
  238. {physion-1.2.2/src/physion/hardware/LogitechWebcam → physion-2.0/src/physion/hardware/RaspberryPi}/__init__.py +0 -0
  239. {physion-1.2.2 → physion-2.0}/src/physion/hardware/RaspberryPi/main.py +0 -0
  240. {physion-1.2.2/src/physion/hardware/RaspberryPi → physion-2.0/src/physion/hardware/Thorlabs}/__init__.py +0 -0
  241. {physion-1.2.2 → physion-2.0}/src/physion/hardware/Thorlabs/cam_test.py +0 -0
  242. /physion-1.2.2/src/physion/hardware/Thorlabs/__init__.py → /physion-2.0/src/physion/hardware/Thorlabs/camera_dlls/_.py +0 -0
  243. {physion-1.2.2 → physion-2.0}/src/physion/hardware/Thorlabs/thorcam.py +0 -0
  244. {physion-1.2.2 → physion-2.0}/src/physion/hardware/Thorlabs/tkinter_camera_live_view.py +0 -0
  245. {physion-1.2.2 → physion-2.0}/src/physion/hardware/Thorlabs/usb_camera.py +0 -0
  246. {physion-1.2.2 → physion-2.0}/src/physion/hardware/__init__.py +0 -0
  247. {physion-1.2.2 → physion-2.0}/src/physion/hardware/toupcam/main.py +0 -0
  248. {physion-1.2.2 → physion-2.0}/src/physion/hardware/toupcam/qt5.py +0 -0
  249. {physion-1.2.2 → physion-2.0}/src/physion/hardware/toupcam/simplest.py +0 -0
  250. {physion-1.2.2 → physion-2.0}/src/physion/hardware/toupcam/toupcam.py +0 -0
  251. {physion-1.2.2 → physion-2.0}/src/physion/hardware/zaber_stage/__init__.py +0 -0
  252. {physion-1.2.2 → physion-2.0}/src/physion/hardware/zaber_stage/main.py +0 -0
  253. {physion-1.2.2 → physion-2.0}/src/physion/imaging/Calcium.py +0 -0
  254. {physion-1.2.2 → physion-2.0}/src/physion/imaging/__init__.py +0 -0
  255. {physion-1.2.2 → physion-2.0}/src/physion/imaging/bruker/__init__.py +0 -0
  256. {physion-1.2.2 → physion-2.0}/src/physion/imaging/dcnv.py +0 -0
  257. {physion-1.2.2 → physion-2.0}/src/physion/imaging/suite2p/__init__.py +0 -0
  258. {physion-1.2.2 → physion-2.0}/src/physion/imaging/suite2p/binary.py +0 -0
  259. {physion-1.2.2 → physion-2.0}/src/physion/imaging/suite2p/to_nwb.py +0 -0
  260. {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/RetinotopicMapping.py +0 -0
  261. {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/__init__.py +0 -0
  262. {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/acquisition.py +0 -0
  263. {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/build_protocols.py +0 -0
  264. {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/load_camera.py +0 -0
  265. {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/pdf.py +0 -0
  266. {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/somatosensory.py +0 -0
  267. {physion-1.2.2/src/physion/pupil → physion-2.0/src/physion/notebook}/__init__.py +0 -0
  268. /physion-1.2.2/src/physion/utils/compression/__init__.py → /physion-2.0/src/physion/notebook/datafile.py +0 -0
  269. /physion-1.2.2/src/physion/utils/conversion/__init__.py → /physion-2.0/src/physion/notebook/dataset.py +0 -0
  270. {physion-1.2.2/src/physion/utils/management → physion-2.0/src/physion/pupil}/__init__.py +0 -0
  271. {physion-1.2.2 → physion-2.0}/src/physion/pupil/outliers.py +0 -0
  272. {physion-1.2.2 → physion-2.0}/src/physion/utils/__init__.py +0 -0
  273. {physion-1.2.2 → physion-2.0}/src/physion/utils/binary.py +0 -0
  274. {physion-1.2.2/src/physion/utils/sharing → physion-2.0/src/physion/utils/compression}/__init__.py +0 -0
  275. {physion-1.2.2/src/physion/utils/transfer → physion-2.0/src/physion/utils/conversion}/__init__.py +0 -0
  276. {physion-1.2.2 → physion-2.0}/src/physion/utils/conversion/abf_to_nwb.py +0 -0
  277. {physion-1.2.2 → physion-2.0}/src/physion/utils/files0.py +0 -0
  278. {physion-1.2.2 → physion-2.0}/src/physion/utils/hdf5.py +0 -0
  279. /physion-1.2.2/src/physion/utils/matplotlib_style.py → /physion-2.0/src/physion/utils/matplotlib_style.mplstyle +0 -0
  280. {physion-1.2.2 → physion-2.0}/src/physion/utils/npz.py +0 -0
  281. {physion-1.2.2 → physion-2.0}/src/physion/utils/parallel.py +0 -0
  282. {physion-1.2.2 → physion-2.0}/src/physion/utils/paths.py +0 -0
  283. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/__init__.py +0 -0
  284. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/setup.py +0 -0
  285. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/adjust_plots.py +0 -0
  286. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/bar.py +0 -0
  287. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/colors.py +0 -0
  288. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/export.py +0 -0
  289. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/images.py +0 -0
  290. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/inset.py +0 -0
  291. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/line.py +0 -0
  292. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/morphologies.py +0 -0
  293. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/pie.py +0 -0
  294. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/scatter.py +0 -0
  295. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/surface.py +0 -0
  296. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/time_freq.py +0 -0
  297. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/violin.py +0 -0
  298. {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/style-sheets/manuscript.py +0 -0
  299. {physion-1.2.2 → physion-2.0}/src/physion/utils/progressBar.py +0 -0
  300. {physion-1.2.2 → physion-2.0}/src/physion/utils/transfer/__main__.py +0 -0
  301. {physion-1.2.2 → physion-2.0}/src/physion/utils/transfer/types.py +0 -0
  302. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/__init__.py +0 -0
  303. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/geometry.py +0 -0
  304. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/screens.py +0 -0
  305. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/show.py +0 -0
  306. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/shuffling.py +0 -0
  307. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/dimming_circle.py +0 -0
  308. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/flickering_bar.py +0 -0
  309. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/gaussian_blob.py +0 -0
  310. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/grating.py +0 -0
  311. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/grating_VSE.py +0 -0
  312. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/grating_stripe.py +0 -0
  313. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/line_moving_dots.py +0 -0
  314. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/oddball.py +0 -0
  315. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/oscillDG.py +0 -0
  316. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/random_dots.py +0 -0
  317. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/scattered_moving_dots.py +0 -0
  318. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/set_of_images.py +0 -0
  319. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/sparse_noise.py +0 -0
  320. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/sweeping_circle.py +0 -0
  321. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/template.py +0 -0
  322. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/uniform_bg.py +0 -0
  323. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/virtual_scene_exploration.py +0 -0
  324. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/tests/opencv.py +0 -0
  325. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/tests/psycho_py.py +0 -0
  326. {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/tests/qt.py +0 -0
  327. {physion-1.2.2 → physion-2.0}/src/physion.egg-info/dependency_links.txt +0 -0
  328. {physion-1.2.2 → physion-2.0}/src/physion.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: physion
3
- Version: 1.2.2
3
+ Version: 2.0
4
4
  Summary: Vision Physiology Software
5
5
  Author-email: Yann Zerlaut <yann.zerlaut@icm-institute.org>, Mai-An Nguyen <mai-an.nguyen@icm-institute.org>, Laura Sofia Gonzalez <laura.gonzalez@icm-institute.org>
6
6
  Project-URL: Homepage, https://github.com/yzerlaut/physion
@@ -29,11 +29,21 @@ Requires-Dist: opencv-contrib-python-headless
29
29
  Requires-Dist: ffmpeg-python
30
30
  Requires-Dist: pyqt5
31
31
  Requires-Dist: openpyxl
32
- Requires-Dist: open-ephys-python-tools>=1.0
33
- Requires-Dist: spikeinterface[full]
34
- Requires-Dist: probeinterface
35
- Requires-Dist: elephant==1.0.0
36
- Requires-Dist: neo==0.14.4
32
+ Requires-Dist: h5py
33
+ Requires-Dist: hdmf
34
+ Requires-Dist: pillow
35
+ Requires-Dist: python-dateutil
36
+ Requires-Dist: requests
37
+ Provides-Extra: ephys
38
+ Requires-Dist: open-ephys-python-tools>=1.0; extra == "ephys"
39
+ Requires-Dist: spikeinterface[full]; extra == "ephys"
40
+ Requires-Dist: probeinterface; extra == "ephys"
41
+ Requires-Dist: elephant==1.0.0; extra == "ephys"
42
+ Requires-Dist: neo==0.14.4; extra == "ephys"
43
+ Provides-Extra: acquisition
44
+ Requires-Dist: nidaqmx; extra == "acquisition"
45
+ Provides-Extra: test
46
+ Requires-Dist: pytest; extra == "test"
37
47
  Dynamic: license-file
38
48
 
39
49
  <!-- ** Build Instructions ** -->
@@ -71,6 +81,11 @@ Then either install:
71
81
  - the [Pypi build](https://pypi.org/project/physion/) with:
72
82
  ```
73
83
  pip install physion
84
+ ```
85
+ with optional dependencies for electrophysiology (spike sorting, LFP, ephys notebooks) and/or for acquisition setups:
86
+ ```
87
+ pip install "physion[ephys]"
88
+ pip install "physion[ephys,acquisition]"
74
89
  ```
75
90
  - from source with:
76
91
  ```
@@ -33,6 +33,11 @@ Then either install:
33
33
  - the [Pypi build](https://pypi.org/project/physion/) with:
34
34
  ```
35
35
  pip install physion
36
+ ```
37
+ with optional dependencies for electrophysiology (spike sorting, LFP, ephys notebooks) and/or for acquisition setups:
38
+ ```
39
+ pip install "physion[ephys]"
40
+ pip install "physion[ephys,acquisition]"
36
41
  ```
37
42
  - from source with:
38
43
  ```
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "physion"
3
- version = "1.2.2"
3
+ version = "2.0"
4
4
  authors = [
5
5
  { name="Yann Zerlaut", email="yann.zerlaut@icm-institute.org" },
6
6
  { name="Mai-An Nguyen", email="mai-an.nguyen@icm-institute.org" },
@@ -32,12 +32,32 @@ dependencies = [
32
32
  "ffmpeg-python",
33
33
  "pyqt5",
34
34
  "openpyxl",
35
+ # imported directly (previously only installed through other packages)
36
+ "h5py",
37
+ "hdmf",
38
+ "pillow",
39
+ "python-dateutil",
40
+ "requests",
41
+ ]
42
+
43
+ [project.optional-dependencies]
44
+ # electrophysiology: spike sorting, LFP, "Ephys-Analysis" and "CSD-Analysis" notebooks
45
+ ephys = [
35
46
  "open-ephys-python-tools>=1.0",
36
47
  "spikeinterface[full]",
37
48
  "probeinterface",
38
49
  "elephant==1.0.0",
39
50
  "neo==0.14.4",
40
51
  ]
52
+ # acquisition setups (camera SDKs: see docs/install/acquisition.md)
53
+ acquisition = [
54
+ "nidaqmx",
55
+ ]
56
+ test = ["pytest"]
57
+
58
+ [tool.pytest.ini_options]
59
+ testpaths = ["tests"]
60
+ python_files = ["test_*.py"] # the other scripts of tests/ are not collected
41
61
 
42
62
  [tool.setuptools.packages.find]
43
63
  where = ["src"]
@@ -45,6 +65,8 @@ where = ["src"]
45
65
  "physion.acquisition.protocols" = ["*.json"]
46
66
  "physion.acquisition.configs" = ["*.json"]
47
67
  "physion.acquisition" = ["DataTable.xlsx"]
68
+ "physion.utils" = ["*.mplstyle"]
69
+ "physion.visual_stim" = ["NI_bank/*.jpg"]
48
70
 
49
71
  [project.urls]
50
72
  "Homepage" = "https://github.com/yzerlaut/physion"
@@ -0,0 +1,43 @@
1
+ from . import settings, tools, run
2
+
3
+ MODALITIES = ['NIDAQ',
4
+ 'FaceCamera',
5
+ 'RigCamera',
6
+ 'ImagingCamera',
7
+ 'Neuropixels',
8
+ 'CaImaging',
9
+ 'onlyDemo']
10
+
11
+ EXPERIMENTERS = {
12
+ '':{'folder':''},
13
+ 'Adrianna Nozownik':{
14
+ 'folder':'Adrianna'
15
+ },
16
+ 'Cibele Martins Pinho':{
17
+ 'folder':'Cibele'
18
+ },
19
+ 'Dhanasak Dhanasobhon':{
20
+ 'folder':'Taddy'
21
+ },
22
+ 'Joana Lourenco':{
23
+ 'folder':'Joana'
24
+ },
25
+ 'Laura Sofia Gonzalez':{
26
+ 'folder':'Sofia'
27
+ },
28
+ 'Nathan Mallet':{
29
+ 'folder':'Nathan'
30
+ },
31
+ 'Pan Sally Zhang':{
32
+ 'folder':'Sally'
33
+ },
34
+ 'Nelson Rebola':{
35
+ 'folder':'Nelson'
36
+ },
37
+ 'Valentin Ritou':{
38
+ 'folder':'Valentin'
39
+ },
40
+ 'Yann Zerlaut':{
41
+ 'folder':'Yann'
42
+ },
43
+ }
@@ -25,6 +25,7 @@ def multimodal(self,
25
25
  self.config = None
26
26
  self.subject, self.protocol = None, {}
27
27
  self.MODALITIES = MODALITIES
28
+ self.EXPERIMENTERS = EXPERIMENTERS
28
29
 
29
30
  ##########################################
30
31
  ######## Multiprocessing quantities #####
@@ -55,13 +56,7 @@ def multimodal(self,
55
56
 
56
57
  # ========================================================
57
58
  #------------------- SIDE PANELS FIRST -------------------
58
- # folder box
59
- self.add_side_widget(tab.layout,
60
- QtWidgets.QLabel('data folder:'))
61
- self.folderBox = QtWidgets.QComboBox(self)
62
- self.folderBox.addItems(FOLDERS.keys())
63
- self.add_side_widget(tab.layout, self.folderBox)
64
- self.add_side_widget(tab.layout, QtWidgets.QLabel(' '))
59
+ # -------------------------------------------------------
65
60
  self.add_side_widget(tab.layout, QtWidgets.QLabel(' '))
66
61
  # -------------------------------------------------------
67
62
  self.add_side_widget(tab.layout,
@@ -100,7 +95,7 @@ def multimodal(self,
100
95
  # self.add_side_widget(tab.layout, self.saveSetB)
101
96
 
102
97
  self.buildNWB = QtWidgets.QPushButton('plot NIdaq of last', self)
103
- self.buildNWB.clicked.connect(plot_NIdaq_of_last)
98
+ self.buildNWB.clicked.connect(lambda: plot_NIdaq_of_last(self))
104
99
  self.add_side_widget(tab.layout, self.buildNWB)
105
100
 
106
101
  # ========================================================
@@ -124,10 +119,11 @@ def multimodal(self,
124
119
  ip, self.side_wdgt_length+1,
125
120
  1, int(width/2))
126
121
  self.experimenterBox = QtWidgets.QComboBox(self)
127
- self.experimenterBox.addItems(EXPERIMENTERS)
122
+ self.experimenterBox.addItems(self.EXPERIMENTERS.keys())
128
123
  tab.layout.addWidget(self.experimenterBox,\
129
124
  ip, self.side_wdgt_length+int(width/2)+1,
130
125
  1, int(width/2))
126
+ self.experimenterBox.activated.connect(self.update_config)
131
127
  ip+=1
132
128
  # -
133
129
  tab.layout.addWidget(\
@@ -144,7 +140,7 @@ def multimodal(self,
144
140
  ip+=1
145
141
  # -
146
142
  tab.layout.addWidget(\
147
- QtWidgets.QLabel(40*' '+'** Visual Protocol **'+40*' ', self),
143
+ QtWidgets.QLabel(40*' '+'** Stimulation Protocol **'+40*' ', self),
148
144
  ip, self.side_wdgt_length,
149
145
  1, width)
150
146
  ip+=1
@@ -155,18 +151,6 @@ def multimodal(self,
155
151
  ip, self.side_wdgt_length+1,
156
152
  1, width)
157
153
  ip+=1
158
- # -
159
- # tab.layout.addWidget(\
160
- # QtWidgets.QLabel(40*' '+'** Rec. Settings **'+40*' ', self),
161
- # ip, self.side_wdgt_length,
162
- # 1, width)
163
- # ip+=1
164
- # # -
165
- # self.recordingBox = QtWidgets.QComboBox(self)
166
- # tab.layout.addWidget(self.recordingBox,\
167
- # ip, self.side_wdgt_length+1,
168
- # 1, width)
169
- # ip+=1
170
154
 
171
155
  # image panels layout:
172
156
  self.winImg = pg.GraphicsLayoutWidget()
@@ -175,12 +159,31 @@ def multimodal(self,
175
159
  self.nWidgetRow-ip,
176
160
  self.nWidgetCol-self.side_wdgt_length)
177
161
  # image choice box
178
- self.imgButton = QtWidgets.QComboBox()
179
- self.imgButton.addItems([' *pick camera* ', 'FaceCamera', 'RigCamera', 'ImagingCamera'])
180
- tab.layout.addWidget(self.imgButton,
162
+ tab.layout.addWidget(\
163
+ QtWidgets.QLabel(' => live : ', self),
164
+ ip, self.nWidgetCol-2,
165
+ 1, 2)
166
+ ip+=1
167
+ self.liveFaceButton = QtWidgets.QPushButton('Face')
168
+ self.liveFaceButton.setCheckable(True)
169
+ tab.layout.addWidget(self.liveFaceButton,\
181
170
  ip, self.nWidgetCol-2,
182
171
  1, 2)
183
- # FaceCamera panel
172
+ ip+=1
173
+ self.liveRigButton = QtWidgets.QPushButton('Rig')
174
+ self.liveRigButton.setCheckable(True)
175
+ tab.layout.addWidget(self.liveRigButton,\
176
+ ip, self.nWidgetCol-2,
177
+ 1, 2)
178
+ ip+=1
179
+ self.liveImagingButton = QtWidgets.QPushButton('Imaging')
180
+ self.liveImagingButton.setCheckable(True)
181
+ tab.layout.addWidget(self.liveImagingButton,\
182
+ ip, self.nWidgetCol-2,
183
+ 1, 2)
184
+ ip+=1
185
+
186
+ # FaceCamera/RigCamera/Imaging panel
184
187
  self.pFace = self.winImg.addViewBox(lockAspect=True,
185
188
  invertY=True, border=[1, 1, 1])
186
189
  self.pCamImg = pg.ImageItem(np.ones((10,12))*50)
@@ -220,12 +223,13 @@ def multimodal(self,
220
223
  self.runButton.setEnabled(False)
221
224
  self.stopButton.setEnabled(False)
222
225
 
223
- def plot_NIdaq_of_last():
224
- # last folder
226
+ def plot_NIdaq_of_last(self):
227
+ # last folder (in the experimenter subfolder)
228
+ root_data_folder = os.path.join(\
229
+ os.path.expanduser('~'), 'DATA',
230
+ self.EXPERIMENTERS[self.experimenterBox.currentText()]['folder'])
225
231
  folder = last_datafolder_in_dayfolder(\
226
- # day_folder(FOLDERS[list(FOLDERS.keys())[0]]))
227
- # day_folder(FOLDERS[self.folderBox.currentText()])
228
- day_folder(os.path.expanduser('~/DATA')))
232
+ day_folder(root_data_folder))
229
233
  print()
230
234
  print('[ ] loading NIdaq data of recording: ', folder)
231
235
  print()
@@ -6,9 +6,9 @@ from PyQt5 import QtCore
6
6
 
7
7
  from physion.utils.files import get_latest_file
8
8
  from physion.acquisition.tools import find_line_props,\
9
- check_gui_to_init_metadata, set_filename_and_folder, stimulus_movies_folder
10
- from physion.acquisition import recordings
11
-
9
+ check_gui_to_init_metadata, set_filename_and_folder
10
+ from physion.opto import stim as opto_stim
11
+ from physion.ephys.synch import sequence as ephysSynch
12
12
  from physion.visual_stim.main import build_stim as build_VisualStim
13
13
  from physion.visual_stim.show import init_stimWindows
14
14
 
@@ -42,8 +42,12 @@ except ModuleNotFoundError:
42
42
  def init_VisualStim(self):
43
43
 
44
44
  movie_folder = \
45
- os.path.join(stimulus_movies_folder,
46
- self.protocolBox.currentText())
45
+ os.path.join(
46
+ os.path.expanduser('~'),
47
+ 'visualStim-protocols', self.EXPERIMENTERS[\
48
+ self.experimenterBox.currentText()\
49
+ ]['folder'],
50
+ self.protocolBox.currentText())
47
51
 
48
52
  with open(\
49
53
  os.path.join(movie_folder,
@@ -160,7 +164,7 @@ def run(self):
160
164
  # -- find channel
161
165
  props = find_line_props(digital_line_labels,
162
166
  'ephys-synch-signal')
163
- sequence = recordings.ephysSynch(self.max_time, freq=props['freq'])
167
+ sequence = ephysSynch(self.max_time, freq=props['freq'])
164
168
  digital_output_steps += [{'channel':props['chan'], 'onset':e, 'duration':0.1}\
165
169
  for e in sequence[:-1]]
166
170
 
@@ -168,27 +172,22 @@ def run(self):
168
172
  props = find_line_props(digital_line_labels,
169
173
  '2P-start-stop-trigger')
170
174
 
171
- ###### EXTRACT THE DELAY FROM THE METADATA: "2P-start-stop-trigger-with-0.1s-delay"
172
-
173
175
  digital_output_steps += [\
174
176
  {'channel':props['chan'], 'onset':self.metadata['2P']['onset-delay'], 'duration':0.1},
175
177
  {'channel':props['chan'], 'onset':self.max_time - self.metadata['2P']['offset-advance'], 'duration':0.1}]
176
178
 
177
- ## --- old code using analog outputs ---
178
- # def trigger2P(t):
179
- # array = np.zeros(len(t), dtype=float)
180
- # array[(t>=TwoP_trigger_delay) & (t<(TwoP_trigger_delay+TwoP_pulse_length))] = 1.
181
- # return 5.*array
182
- # analog_output_funcs.append(recordings.trigger2P)
183
179
 
184
180
  if self.stim is not None:
185
- # means WITH VisualStim -- find channel
181
+ # means WITH VisualStim -- find channel --> TTL for stim onsets
186
182
  props = find_line_props(digital_line_labels,
187
183
  'visual-stim-episode-start')
188
184
  digital_output_steps += [{'channel':props['chan'], 'onset':e, 'duration':0.05}\
189
185
  for e in self.stim.experiment['time_start']]
190
186
 
187
+ ################################################################################
188
+ ##### ---> from here: WHAT IS THIS ?
191
189
  if (len(analog_output_labels)>0) and ('trigger-delay' in analog_output_labels[0]):
190
+ print('analog output trigger delay ... ')
192
191
  trigger_delay = float(analog_output_labels[0].split('trigger-delay-')[1].split('s')[0])
193
192
  def delayedTrigger(t):
194
193
  array = np.zeros(len(t), dtype=float)
@@ -197,6 +196,7 @@ def run(self):
197
196
  analog_output_funcs.append(delayedTrigger)
198
197
 
199
198
  if (len(analog_output_labels)>1) and ('square-wave-TTL' in analog_output_labels[1]):
199
+ print('analog output square wave TTL ...')
200
200
  period = 1./2./float(analog_output_labels[1].split('square-wave-TTL-')[1].split('Hz')[0])
201
201
  def squareTTL(t):
202
202
  array = np.zeros(len(t), dtype=float)
@@ -206,25 +206,14 @@ def run(self):
206
206
  tt+=2*period
207
207
  return 5.*array
208
208
  analog_output_funcs.append(squareTTL)
209
+ ##### ---> end: WHAT IS THIS ? TO BE REMOVED IF NOT USED...
210
+ ################################################################################
211
+
212
+ if 'Opto-stim' in self.protocol:
209
213
 
210
- if 'Opto' in self.protocolBox.currentText():
211
- ## -------------------------------------------------- ##
212
- ## --------- OPTOGENETIC STEP STIMULATION !!! ------- ##
213
- ## the protocol name should have the suffix ##
214
- ## of the form +1sPrePost, +0.5sPrePost, ... ##
215
- ## -------------------------------------------------- ##
216
- prepost_duration = float(self.protocolBox.currentText().split('+')[1].split('sPrePost')[0])
217
- # means WITH VisualStim -- find channel
218
- props = find_line_props(\
219
- self.metadata['NIdaq']['digital-outputs']['line-labels'],
220
- 'LED-optogenetics-activation')
221
- digital_output_steps += [{'channel':props['chan'],
222
- 'onset':e-prepost_duration,
223
- 'duration':d+2*prepost_duration}\
224
- for e, d, r in zip(\
225
- self.stim.experiment['time_start'],
226
- self.stim.experiment['time_duration'],
227
- self.stim.experiment['repeat']) if (r%2==1)]
214
+ digital_output_steps += opto_stim.TTL_signal(self.stim,
215
+ self.metadata,
216
+ self.protocol['Opto-stim'])
228
217
 
229
218
  if self.metadata['NIDAQ']:
230
219
 
@@ -437,19 +426,19 @@ def run_update(self):
437
426
 
438
427
  # ----- online visualization here -----
439
428
  if (self.FaceCamera_process is not None) and\
440
- (self.imgButton.currentText()=='FaceCamera'):
429
+ (self.liveFaceButton.isChecked()):
441
430
  image = np.load(get_latest_file(\
442
431
  os.path.join(str(self.datafolder.get()), 'FaceCamera-imgs')))
443
432
  self.pCamImg.setImage(image.T)
444
433
 
445
434
  elif (self.RigCamera_process is not None) and\
446
- (self.imgButton.currentText()=='RigCamera'):
435
+ (self.liveRigButton.isChecked()):
447
436
  image = np.load(get_latest_file(\
448
437
  os.path.join(str(self.datafolder.get()), 'RigCamera-imgs')))
449
438
  self.pCamImg.setImage(image.T)
450
439
 
451
440
  elif (self.ImagingCamera_process is not None) and\
452
- (self.imgButton.currentText()=='ImagingCamera'):
441
+ (self.liveImagingButton.isChecked()):
453
442
  image = np.load(get_latest_file(\
454
443
  os.path.join(str(self.datafolder.get()), 'ImagingCamera-imgs')))
455
444
  self.pCamImg.setImage(image.T)
@@ -24,7 +24,20 @@ def get_config_list(self):
24
24
 
25
25
  def update_config(self):
26
26
 
27
- if self.configBox.currentText()!='':
27
+ if hasattr(self, 'experimenterBox'):
28
+ experimenter = self.experimenterBox.currentText()
29
+ else:
30
+ experimenter = ''
31
+
32
+ config = self.configBox.currentText()
33
+ if hasattr(self, 'EXPERIMENTERS'):
34
+ protocol_folder = os.path.join(os.path.expanduser('~'),
35
+ 'visualStim-protocols',
36
+ self.EXPERIMENTERS[experimenter]['folder'])
37
+ else:
38
+ protocol_folder = ''
39
+
40
+ if config!='':
28
41
 
29
42
  # first read the new config
30
43
  fn = os.path.join(base_path, 'configs',
@@ -32,14 +45,21 @@ def update_config(self):
32
45
  with open(fn) as f:
33
46
  self.config = json.load(f)
34
47
 
48
+
35
49
  if hasattr(self, 'protocolBox'):
36
50
  # now update protocols
37
- if self.config['protocols']=='all':
38
- self.protocol_list = [f for f in os.listdir(os.path.join(base_path,
39
- 'protocols', 'movies')) if\
40
- ((f!='_') and not ('DS' in f) and not ('._' in f))]
51
+
52
+ if os.path.isdir(protocol_folder):
53
+
54
+ self.protocol_list = [f for f in os.listdir(protocol_folder)\
55
+ if ((f!='_') and not ('DS' in f) and not ('._' in f))]
56
+
41
57
  else:
42
- self.protocol_list = self.config['protocols']
58
+ print()
59
+ print(' no "visualStim-protocols" found in ~/visualStim-protocol/%s' % experimenter)
60
+ print()
61
+ self.protocol_list = []
62
+
43
63
  self.protocolBox.clear()
44
64
  self.protocolBox.addItems(['None']+self.protocol_list)
45
65
 
@@ -52,9 +72,6 @@ def update_config(self):
52
72
  and not self.stopButton.isEnabled():
53
73
  self.runButton.setEnabled(True)
54
74
 
55
- # now update screen
56
- # if 'Screen' in self.config:
57
- # self.screenBox.setCurrentText(self.config['Screen'])
58
75
 
59
76
  def save_settings(self):
60
77
 
@@ -6,17 +6,13 @@ base_path = str(pathlib.Path(__file__).resolve().parents[0])
6
6
  from physion.utils.files0 import generate_datafolders, get_date, get_time
7
7
  from physion.utils.paths import FOLDERS
8
8
 
9
- stimulus_movies_folder = os.path.join(base_path,
10
- 'protocols', 'movies')
11
-
12
9
  def set_filename_and_folder(self):
13
10
 
14
11
  self.date, self.time = get_date(), get_time()
15
- if hasattr(self, 'folderBox'):
16
- self.root_data_folder = FOLDERS[self.folderBox.currentText()]
17
- else:
18
- self.root_data_folder = os.path.join(\
19
- os.path.expanduser('~'), 'DATA')
12
+
13
+ self.root_data_folder = os.path.join(\
14
+ os.path.expanduser('~'), 'DATA',
15
+ self.EXPERIMENTERS[self.experimenterBox.currentText()]['folder'])
20
16
 
21
17
  self.date_time_folder = generate_datafolders(\
22
18
  self.root_data_folder,
@@ -70,9 +66,15 @@ def check_gui_to_init_metadata(self):
70
66
  'subject_ID':self.subjectBox.text()}
71
67
 
72
68
  if self.protocolBox.currentText()!='None':
73
- fn = os.path.join(stimulus_movies_folder,
74
- self.protocolBox.currentText(),
69
+ fn = os.path.join(
70
+ os.path.expanduser('~'),
71
+ 'visualStim-protocols',
72
+ self.EXPERIMENTERS[\
73
+ self.experimenterBox.currentText()\
74
+ ]['folder'],
75
+ self.protocolBox.currentText(),
75
76
  'protocol.json')
77
+
76
78
  with open(fn) as f:
77
79
  self.protocol = json.load(f)
78
80
  else:
@@ -329,6 +329,14 @@ def NWB_to_dataframe(nwbfile,
329
329
 
330
330
  ############################################################################
331
331
 
332
+ def episode_value(data, key, i):
333
+ """
334
+ value of the stimulus quantity "key" for episode "i" as a scalar
335
+ (older files store the episode quantities with shape (episodes, 1))
336
+ """
337
+ return float(np.ravel(data.nwbfile.stimulus[key].data[i])[0])
338
+
339
+
332
340
  def build_stim_specific_array(data, index_cond, time,
333
341
  normalize=False):
334
342
 
@@ -338,11 +346,11 @@ def build_stim_specific_array(data, index_cond, time,
338
346
  for i in np.flatnonzero(index_cond):
339
347
 
340
348
  if i<data.nwbfile.stimulus['time_start_realigned'].num_samples:
341
- tstart = data.nwbfile.stimulus['time_start_realigned'].data[i]
342
- tstop = data.nwbfile.stimulus['time_stop_realigned'].data[i]
349
+ tstart = episode_value(data, 'time_start_realigned', i)
350
+ tstop = episode_value(data, 'time_stop_realigned', i)
343
351
 
344
352
 
345
- t_cond = (time>=float(tstart)) & (time<float(tstop))
353
+ t_cond = (time>=tstart) & (time<tstop)
346
354
  array[t_cond] = True
347
355
 
348
356
  # TO BE FIXED
@@ -382,7 +390,7 @@ def build_timelag_set_of_stim_specific_arrays(data, DF, index_cond,
382
390
 
383
391
  Nframe_pre = max([1, int(pre_interval/DF.dt)]) # at least one frame
384
392
  Nframe_post = int(post_interval/DF.dt)
385
- Nframe_stim = int(np.min([data.nwbfile.stimulus['time_duration'].data[i]\
393
+ Nframe_stim = int(np.min([episode_value(data, 'time_duration', i)\
386
394
  for i in np.flatnonzero(index_cond)])/DF.dt)
387
395
 
388
396
 
@@ -394,8 +402,8 @@ def build_timelag_set_of_stim_specific_arrays(data, DF, index_cond,
394
402
  for i in np.flatnonzero(index_cond):
395
403
 
396
404
  if i<data.nwbfile.stimulus['time_start_realigned'].num_samples:
397
- tstart = data.nwbfile.stimulus['time_start_realigned'].data[i]
398
- tstop = data.nwbfile.stimulus['time_stop_realigned'].data[i]
405
+ tstart = episode_value(data, 'time_start_realigned', i)
406
+ tstop = episode_value(data, 'time_stop_realigned', i)
399
407
 
400
408
  iT0 = np.argmin((DF['time']-tstart)**2)
401
409
 
@@ -32,6 +32,7 @@ class EpisodeData:
32
32
  'neuropil',
33
33
  'dFoF',
34
34
  'spikes',
35
+ 'firing',
35
36
  'LFP',
36
37
  'MUA'
37
38
  """
@@ -205,7 +206,7 @@ class EpisodeData:
205
206
  QUANTITY_VALUES.append(getattr(full_data, quantity))
206
207
  QUANTITY_TIMES.append(getattr(full_data, 't_%s' % quantity))
207
208
  QUANTITIES.append(quantity)
208
- except BaseException as be:
209
+ except Exception as be:
209
210
  print()
210
211
  print(be)
211
212
  print()
@@ -250,7 +251,7 @@ class EpisodeData:
250
251
  kind=interpolation)
251
252
  RESPS.append(func(self.t))
252
253
 
253
- except BaseException as be:
254
+ except (ValueError, IndexError) as be:
254
255
 
255
256
  success=False # we switch this off to remove the episode in all modalities
256
257
  if self.verbose:
@@ -269,7 +270,7 @@ class EpisodeData:
269
270
  for key in full_data.nwbfile.stimulus.keys():
270
271
  try:
271
272
  getattr(self, key).append(full_data.nwbfile.stimulus[key].data[iEp,0])
272
- except BaseException as be:
273
+ except (IndexError, ValueError, TypeError) as be:
273
274
  pass # we skip thise variable
274
275
 
275
276
  # transform stim params to np.array
@@ -0,0 +1,12 @@
1
+ """
2
+ the modalities of the NWB files, read by physion.analysis.read_NWB.Data
3
+
4
+ one module per modality, each one defining the methods (has_X, build_X, ...)
5
+ of a "mixin" class inherited by the Data class
6
+ """
7
+ from .visual_stim import VisualStimMixin
8
+ from .locomotion import LocomotionMixin
9
+ from .facecamera import FaceCameraMixin
10
+ from .opto import OptoMixin
11
+ from .ophys import OphysMixin
12
+ from .ephys import EphysMixin