TwoPy 0.1.8__tar.gz → 0.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 (224) hide show
  1. {twopy-0.1.8 → twopy-0.2.0}/PKG-INFO +2 -1
  2. {twopy-0.1.8 → twopy-0.2.0}/README.md +1 -0
  3. {twopy-0.1.8 → twopy-0.2.0}/pyproject.toml +1 -1
  4. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/__init__.py +76 -9
  5. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/__init__.py +77 -9
  6. twopy-0.2.0/src/twopy/analysis/group_matching.py +612 -0
  7. twopy-0.2.0/src/twopy/analysis/kernels/__init__.py +352 -0
  8. twopy-0.2.0/src/twopy/analysis/kernels/_fitting.py +360 -0
  9. twopy-0.2.0/src/twopy/analysis/kernels/_stimulus.py +432 -0
  10. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/persistence.py +9 -18
  11. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/response_context.py +8 -11
  12. twopy-0.2.0/src/twopy/analysis/response_maps.py +728 -0
  13. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/response_processing/__init__.py +1 -1
  14. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/response_processing/options.py +7 -8
  15. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/response_processing/signals.py +7 -4
  16. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/response_window_options.py +1 -1
  17. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/responses.py +63 -19
  18. twopy-0.2.0/src/twopy/analysis/timing.py +315 -0
  19. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/trials.py +1 -84
  20. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/workflow.py +9 -9
  21. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis_cache.py +33 -6
  22. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/api.py +6 -4
  23. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/config.py +172 -36
  24. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/conversion/api.py +63 -6
  25. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/conversion/hdf5_writing.py +1 -1
  26. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/conversion/source_loading.py +26 -6
  27. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/conversion/stimulus_code.py +1 -1
  28. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/conversion/types.py +2 -2
  29. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/converted.py +60 -1
  30. twopy-0.2.0/src/twopy/custom/__init__.py +69 -0
  31. twopy-0.2.0/src/twopy/custom/discovery.py +303 -0
  32. twopy-0.2.0/src/twopy/custom/native.py +27 -0
  33. twopy-0.2.0/src/twopy/custom/native_workflows/__init__.py +5 -0
  34. twopy-0.2.0/src/twopy/custom/native_workflows/direction_selectivity.py +201 -0
  35. twopy-0.2.0/src/twopy/custom/native_workflows/response_kernels.py +502 -0
  36. twopy-0.2.0/src/twopy/custom/parameters.py +380 -0
  37. twopy-0.2.0/src/twopy/custom/provenance.py +385 -0
  38. twopy-0.2.0/src/twopy/custom/registry.py +78 -0
  39. twopy-0.2.0/src/twopy/custom/types.py +838 -0
  40. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/database/__init__.py +6 -2
  41. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/database/cache.py +1 -1
  42. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/database/catalog.py +1 -1
  43. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/database/generic.py +1 -1
  44. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/database/modeled.py +7 -4
  45. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/database/search.py +180 -6
  46. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/database/types.py +0 -3
  47. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/filenames.py +4 -0
  48. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/hdf5_utils.py +2 -2
  49. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/controls.py +328 -183
  50. twopy-0.2.0/src/twopy/napari/custom_tab.py +607 -0
  51. twopy-0.2.0/src/twopy/napari/database_favorites.py +416 -0
  52. twopy-0.2.0/src/twopy/napari/database_search.py +815 -0
  53. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/display_paths.py +15 -3
  54. twopy-0.2.0/src/twopy/napari/group_matching.py +596 -0
  55. twopy-0.2.0/src/twopy/napari/group_matching_images.py +283 -0
  56. twopy-0.2.0/src/twopy/napari/group_matching_roi.py +1211 -0
  57. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/interactive.py +17 -21
  58. twopy-0.2.0/src/twopy/napari/latest_worker.py +144 -0
  59. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/live_analysis.py +58 -98
  60. twopy-0.2.0/src/twopy/napari/load_workflow.py +409 -0
  61. twopy-0.2.0/src/twopy/napari/loaded_recordings_csv.py +110 -0
  62. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/loading.py +81 -13
  63. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/data.py +173 -38
  64. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/docks/api.py +2 -2
  65. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/docks/options_panel.py +24 -0
  66. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/docks/plot_area.py +46 -0
  67. twopy-0.2.0/src/twopy/napari/plotting/docks/response_map_area.py +463 -0
  68. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/docks/response_plot_widget.py +743 -24
  69. twopy-0.2.0/src/twopy/napari/plotting/docks/save_actions.py +129 -0
  70. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/export.py +170 -0
  71. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/export_controls.py +30 -4
  72. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/form_controls.py +5 -1
  73. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/normalization_options.py +6 -1
  74. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/processing_options.py +197 -93
  75. twopy-0.2.0/src/twopy/napari/plotting/response_map_colors.py +24 -0
  76. twopy-0.2.0/src/twopy/napari/plotting/response_map_display.py +131 -0
  77. twopy-0.2.0/src/twopy/napari/plotting/response_map_options.py +350 -0
  78. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/roi_generation/actions.py +2 -2
  79. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/widgets.py +67 -0
  80. twopy-0.2.0/src/twopy/napari/responses.py +245 -0
  81. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/session.py +42 -11
  82. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/sidebar.py +91 -4
  83. twopy-0.2.0/src/twopy/napari/text.py +64 -0
  84. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/trial_timeline.py +3 -3
  85. {twopy-0.1.8 → twopy-0.2.0}/src/twopy.egg-info/PKG-INFO +2 -1
  86. {twopy-0.1.8 → twopy-0.2.0}/src/twopy.egg-info/SOURCES.txt +52 -0
  87. {twopy-0.1.8 → twopy-0.2.0}/tests/test_api.py +15 -4
  88. {twopy-0.1.8 → twopy-0.2.0}/tests/test_background_subtraction.py +15 -17
  89. {twopy-0.1.8 → twopy-0.2.0}/tests/test_config.py +162 -32
  90. {twopy-0.1.8 → twopy-0.2.0}/tests/test_conversion.py +194 -15
  91. {twopy-0.1.8 → twopy-0.2.0}/tests/test_converted.py +73 -111
  92. twopy-0.2.0/tests/test_custom_workflows.py +926 -0
  93. {twopy-0.1.8 → twopy-0.2.0}/tests/test_database.py +94 -14
  94. {twopy-0.1.8 → twopy-0.2.0}/tests/test_epoch_mapping.py +5 -30
  95. {twopy-0.1.8 → twopy-0.2.0}/tests/test_filenames.py +2 -0
  96. twopy-0.2.0/tests/test_group_matching.py +384 -0
  97. {twopy-0.1.8 → twopy-0.2.0}/tests/test_hdf5_utils.py +3 -4
  98. {twopy-0.1.8 → twopy-0.2.0}/tests/test_inspection.py +3 -3
  99. twopy-0.2.0/tests/test_kernels.py +482 -0
  100. twopy-0.2.0/tests/test_load_workflow.py +617 -0
  101. {twopy-0.1.8 → twopy-0.2.0}/tests/test_matlab.py +5 -5
  102. {twopy-0.1.8 → twopy-0.2.0}/tests/test_motion.py +4 -33
  103. twopy-0.2.0/tests/test_napari.py +505 -0
  104. twopy-0.2.0/tests/test_napari_database_search.py +639 -0
  105. twopy-0.2.0/tests/test_napari_display.py +132 -0
  106. twopy-0.2.0/tests/test_napari_export.py +324 -0
  107. twopy-0.2.0/tests/test_napari_live_controller.py +574 -0
  108. twopy-0.2.0/tests/test_napari_load_tab.py +445 -0
  109. twopy-0.2.0/tests/test_napari_loaded_recordings.py +626 -0
  110. twopy-0.2.0/tests/test_napari_path_resolution.py +619 -0
  111. twopy-0.2.0/tests/test_napari_plot_controls.py +466 -0
  112. twopy-0.2.0/tests/test_napari_plot_data.py +366 -0
  113. twopy-0.2.0/tests/test_napari_plot_widgets.py +799 -0
  114. twopy-0.2.0/tests/test_napari_processing_controls.py +650 -0
  115. twopy-0.2.0/tests/test_napari_response_map_display.py +85 -0
  116. twopy-0.2.0/tests/test_napari_response_workflow.py +756 -0
  117. twopy-0.2.0/tests/test_napari_roi_generation.py +620 -0
  118. twopy-0.2.0/tests/test_napari_roi_visibility.py +314 -0
  119. twopy-0.2.0/tests/test_napari_text.py +49 -0
  120. twopy-0.2.0/tests/test_napari_timeline.py +251 -0
  121. {twopy-0.1.8 → twopy-0.2.0}/tests/test_packaging.py +15 -23
  122. {twopy-0.1.8 → twopy-0.2.0}/tests/test_parity.py +12 -34
  123. {twopy-0.1.8 → twopy-0.2.0}/tests/test_parity_psycho5.py +12 -67
  124. {twopy-0.1.8 → twopy-0.2.0}/tests/test_persistence.py +9 -9
  125. {twopy-0.1.8 → twopy-0.2.0}/tests/test_photodiode_classification.py +4 -31
  126. {twopy-0.1.8 → twopy-0.2.0}/tests/test_pixel_calibration.py +5 -4
  127. {twopy-0.1.8 → twopy-0.2.0}/tests/test_real_fixture.py +2 -2
  128. twopy-0.2.0/tests/test_recording_timing.py +200 -0
  129. twopy-0.2.0/tests/test_response_map_area.py +98 -0
  130. twopy-0.2.0/tests/test_response_maps.py +285 -0
  131. {twopy-0.1.8 → twopy-0.2.0}/tests/test_response_processing.py +45 -28
  132. {twopy-0.1.8 → twopy-0.2.0}/tests/test_response_roi_extraction.py +12 -38
  133. {twopy-0.1.8 → twopy-0.2.0}/tests/test_responses.py +21 -0
  134. {twopy-0.1.8 → twopy-0.2.0}/tests/test_roi.py +9 -13
  135. {twopy-0.1.8 → twopy-0.2.0}/tests/test_saved_analysis.py +2 -2
  136. {twopy-0.1.8 → twopy-0.2.0}/tests/test_session.py +7 -6
  137. {twopy-0.1.8 → twopy-0.2.0}/tests/test_stimulus.py +38 -73
  138. {twopy-0.1.8 → twopy-0.2.0}/tests/test_synchronization.py +25 -57
  139. twopy-0.2.0/tests/test_trials.py +182 -0
  140. {twopy-0.1.8 → twopy-0.2.0}/tests/test_workflow.py +16 -79
  141. twopy-0.1.8/src/twopy/napari/database_search.py +0 -491
  142. twopy-0.1.8/src/twopy/napari/plotting/docks/save_actions.py +0 -144
  143. twopy-0.1.8/src/twopy/napari/responses.py +0 -136
  144. twopy-0.1.8/src/twopy/napari/text.py +0 -26
  145. twopy-0.1.8/tests/test_napari.py +0 -5572
  146. twopy-0.1.8/tests/test_trials.py +0 -372
  147. {twopy-0.1.8 → twopy-0.2.0}/setup.cfg +0 -0
  148. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/_segments.py +0 -0
  149. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/_version.py +0 -0
  150. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/background_subtraction.py +0 -0
  151. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/dff.py +0 -0
  152. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/dff_options.py +0 -0
  153. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/epoch_mapping.py +0 -0
  154. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/motion.py +0 -0
  155. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/response_processing/apply.py +0 -0
  156. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/response_processing/persistence.py +0 -0
  157. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/analysis/response_processing/qc.py +0 -0
  158. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/calibrations/pixel_calibration_profiles.csv +0 -0
  159. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/calibrations/pixel_size.csv +0 -0
  160. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/conversion/__init__.py +0 -0
  161. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/conversion/alignment_crop.py +0 -0
  162. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/conversion/matlab_values.py +0 -0
  163. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/database/connection.py +0 -0
  164. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/database/sql.py +0 -0
  165. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/frame_ranges.py +0 -0
  166. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/inspection.py +0 -0
  167. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/matlab.py +0 -0
  168. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/__init__.py +0 -0
  169. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/__main__.py +0 -0
  170. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/dims.py +0 -0
  171. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/display.py +0 -0
  172. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/errors.py +0 -0
  173. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/launcher.py +0 -0
  174. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/movie.py +0 -0
  175. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/paths.py +0 -0
  176. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/__init__.py +0 -0
  177. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/dff_options.py +0 -0
  178. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/docks/__init__.py +0 -0
  179. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/docks/dynamic_options.py +0 -0
  180. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/docks/paths.py +0 -0
  181. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/docks/visibility_state.py +0 -0
  182. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/label_visibility.py +0 -0
  183. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/options.py +0 -0
  184. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/panels.py +0 -0
  185. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/response_window_options.py +0 -0
  186. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/roi_generation/__init__.py +0 -0
  187. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/roi_generation/controls.py +0 -0
  188. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/plotting/roi_generation/options.py +0 -0
  189. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/protocols.py +0 -0
  190. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/roi.py +0 -0
  191. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/state.py +0 -0
  192. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/types.py +0 -0
  193. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/napari/viewer.py +0 -0
  194. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/parity/__init__.py +0 -0
  195. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/parity/dff.py +0 -0
  196. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/parity/psycho5.py +0 -0
  197. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/parity/roi.py +0 -0
  198. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/parity/roi_extraction.py +0 -0
  199. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/parity/saved_analysis.py +0 -0
  200. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/photodiode.py +0 -0
  201. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/photodiode_classification.py +0 -0
  202. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/pixel_calibration.py +0 -0
  203. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/pixel_calibration_profiles.py +0 -0
  204. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/response_roi_extraction.py +0 -0
  205. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/roi.py +0 -0
  206. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/roi_extraction.py +0 -0
  207. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/roi_mask_cleanup.py +0 -0
  208. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/session.py +0 -0
  209. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/spatial.py +0 -0
  210. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/stimulus.py +0 -0
  211. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/synchronization.py +0 -0
  212. {twopy-0.1.8 → twopy-0.2.0}/src/twopy/typing_guards.py +0 -0
  213. {twopy-0.1.8 → twopy-0.2.0}/src/twopy.egg-info/dependency_links.txt +0 -0
  214. {twopy-0.1.8 → twopy-0.2.0}/src/twopy.egg-info/entry_points.txt +0 -0
  215. {twopy-0.1.8 → twopy-0.2.0}/src/twopy.egg-info/requires.txt +0 -0
  216. {twopy-0.1.8 → twopy-0.2.0}/src/twopy.egg-info/top_level.txt +0 -0
  217. {twopy-0.1.8 → twopy-0.2.0}/tests/test_dff.py +0 -0
  218. {twopy-0.1.8 → twopy-0.2.0}/tests/test_frame_ranges.py +0 -0
  219. {twopy-0.1.8 → twopy-0.2.0}/tests/test_import.py +0 -0
  220. {twopy-0.1.8 → twopy-0.2.0}/tests/test_parity_roi_extraction.py +0 -0
  221. {twopy-0.1.8 → twopy-0.2.0}/tests/test_pixel_calibration_profiles.py +0 -0
  222. {twopy-0.1.8 → twopy-0.2.0}/tests/test_response_window_options.py +0 -0
  223. {twopy-0.1.8 → twopy-0.2.0}/tests/test_roi_extraction.py +0 -0
  224. {twopy-0.1.8 → twopy-0.2.0}/tests/test_roi_mask_cleanup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: twopy
3
- Version: 0.1.8
3
+ Version: 0.2.0
4
4
  Summary: Two-photon imaging analysis tool with a napari interface.
5
5
  Author-email: Gustavo Madeira Santana <fromweb1@gumadeiras.com>
6
6
  License-Expression: MIT
@@ -75,6 +75,7 @@ When a source recording has not been converted yet, twopy converts it first. Con
75
75
 
76
76
  - [GUI guide](docs/gui.md): napari loading, ROI editing, plotting, and saved outputs.
77
77
  - [Python API guide](docs/python_api.md): find recordings, convert data, run analysis, and open napari from scripts.
78
+ - [Custom workflow guide](docs/custom_workflows.md): add versioned local analyses to the napari Custom tab.
78
79
  - [Development guide](docs/development.md): source setup and local checks.
79
80
  - [Input data spec](docs/input_data_spec.md): short recording folder contract.
80
81
  - [Recording file reference](docs/recording_file_schema.md): detailed source and converted file schema.
@@ -55,6 +55,7 @@ When a source recording has not been converted yet, twopy converts it first. Con
55
55
 
56
56
  - [GUI guide](docs/gui.md): napari loading, ROI editing, plotting, and saved outputs.
57
57
  - [Python API guide](docs/python_api.md): find recordings, convert data, run analysis, and open napari from scripts.
58
+ - [Custom workflow guide](docs/custom_workflows.md): add versioned local analyses to the napari Custom tab.
58
59
  - [Development guide](docs/development.md): source setup and local checks.
59
60
  - [Input data spec](docs/input_data_spec.md): short recording folder contract.
60
61
  - [Recording file reference](docs/recording_file_schema.md): detailed source and converted file schema.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "twopy"
7
- version = "0.1.8"
7
+ version = "0.2.0"
8
8
  description = "Two-photon imaging analysis tool with a napari interface."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.14"
@@ -18,36 +18,67 @@ from twopy.analysis import (
18
18
  DeltaFOverFFitMode,
19
19
  DeltaFOverFOptions,
20
20
  EpochFrameWindow,
21
+ EpochResponseMap,
21
22
  FrameWindow,
22
23
  GroupedRoiResponses,
23
24
  GroupedRoiResponseSummary,
24
- InterpolatedEpochMapping,
25
+ Hemisphere,
26
+ KernelFitMethod,
27
+ KernelStimulusModality,
25
28
  LoadedAnalysisOutputs,
26
29
  LowPassFilterOptions,
30
+ ManualFovGroupRow,
31
+ ManualRoiMatchGroup,
32
+ ManualRoiMatchRow,
33
+ ManualRoiMatchStatus,
34
+ RecordingKernelFit,
35
+ RecordingTiming,
36
+ ResponseMapData,
37
+ ResponseMapMode,
38
+ ResponseMapOptions,
27
39
  ResponseProcessingOptions,
28
40
  RoiCorrelationScores,
29
41
  RoiDeltaFOverF,
30
42
  RoiResponseSummary,
31
43
  RoiResponseTrial,
32
44
  SmoothingOptions,
45
+ StimulusKernelOptions,
46
+ TimingSource,
33
47
  WindowedRoiResponse,
48
+ add_manual_roi_match_group,
34
49
  analyze_recording_responses,
50
+ append_manual_roi_match_rows,
35
51
  apply_motion_artifact_mask_to_delta_f_over_f,
52
+ compute_recording_response_maps,
36
53
  compute_recording_responses,
37
54
  compute_roi_delta_f_over_f,
38
55
  default_baseline_epoch_number,
56
+ default_kernel_stimulus_column,
39
57
  default_recording_baseline_epoch_number,
40
58
  extract_background_corrected_roi_traces,
41
- frame_windows_from_photodiode_alignment,
59
+ finite_mean_and_sem,
60
+ fit_recording_stimulus_kernels,
61
+ fit_stimulus_kernel,
42
62
  group_delta_f_over_f_by_epoch,
43
- interpolate_stimulus_epochs_to_frame_windows,
44
63
  is_baseline_epoch_name,
45
64
  load_analysis_outputs,
65
+ load_manual_fov_group_rows,
66
+ load_manual_roi_match_rows,
67
+ load_response_map_data,
46
68
  make_frame_windows,
47
- map_stimulus_epochs_to_frame_windows,
69
+ make_manual_fov_group_rows,
70
+ make_manual_roi_match_rows,
71
+ matched_manual_roi_groups,
72
+ next_group_cell_id,
48
73
  no_baseline_epoch_frame_windows,
74
+ remove_manual_roi_match_group,
75
+ replace_manual_roi_match_group,
49
76
  resolve_baseline_frame_windows,
77
+ resolve_recording_timing,
50
78
  save_analysis_outputs,
79
+ save_manual_fov_group_rows,
80
+ save_manual_roi_match_rows,
81
+ save_response_map_data,
51
82
  select_baseline_frame_windows,
52
83
  split_traces_by_frame_windows,
53
84
  summarize_epoch_roi_responses,
@@ -58,7 +89,11 @@ from twopy.analysis import (
58
89
  )
59
90
  from twopy.api import find_recordings
60
91
  from twopy.conversion import convert_recording_to_twopy, load_source_conversion_inputs
61
- from twopy.converted import load_converted_recording, recording_frame_rate_hz
92
+ from twopy.converted import (
93
+ load_converted_recording,
94
+ recording_frame_rate_hz,
95
+ recording_hemisphere,
96
+ )
62
97
  from twopy.napari import (
63
98
  NapariRecordingView,
64
99
  NapariSidebarWidgets,
@@ -143,8 +178,10 @@ __all__ = [
143
178
  "AlignedPhotodiodeEvent",
144
179
  "AnalysisResponseRun",
145
180
  "AnalysisResponseComputation",
181
+ "add_manual_roi_match_group",
146
182
  "analyze_recording_responses",
147
183
  "add_twopy_magicgui_controls",
184
+ "append_manual_roi_match_rows",
148
185
  "apply_motion_artifact_mask_to_delta_f_over_f",
149
186
  "BackgroundCorrectedRoiTraces",
150
187
  "BackgroundCorrectionMethod",
@@ -153,6 +190,7 @@ __all__ = [
153
190
  "ClassifiedStimulusWindow",
154
191
  "classify_recording_photodiode_events",
155
192
  "compute_roi_delta_f_over_f",
193
+ "compute_recording_response_maps",
156
194
  "compute_recording_responses",
157
195
  "CorrelationFilterOptions",
158
196
  "convert_recording_to_twopy",
@@ -161,32 +199,39 @@ __all__ = [
161
199
  "DEFAULT_PIXEL_CALIBRATION_PATH",
162
200
  "DEFAULT_PIXEL_CALIBRATION_PROFILE_PATH",
163
201
  "default_baseline_epoch_number",
202
+ "default_kernel_stimulus_column",
164
203
  "default_recording_baseline_epoch_number",
165
204
  "detect_photodiode_events",
166
205
  "detect_recording_photodiode_events",
167
206
  "DeltaFOverFBaselineMode",
168
207
  "DeltaFOverFFitMode",
169
208
  "DeltaFOverFOptions",
209
+ "EpochResponseMap",
170
210
  "EpochFrameWindow",
171
211
  "extract_background_corrected_roi_traces",
172
212
  "extract_response_watershed_rois",
173
213
  "extract_rois_from_image",
174
214
  "extract_roi_traces",
175
215
  "find_recordings",
176
- "frame_windows_from_photodiode_alignment",
216
+ "fit_recording_stimulus_kernels",
217
+ "fit_stimulus_kernel",
177
218
  "FrameWindow",
178
219
  "full_frame_crop",
179
220
  "group_delta_f_over_f_by_epoch",
180
221
  "GroupedRoiResponseSummary",
181
222
  "GroupedRoiResponses",
223
+ "Hemisphere",
182
224
  "grid_roi_set",
183
225
  "grid_roi_set_microns",
184
226
  "grid_size_pixels_from_microns",
185
- "InterpolatedEpochMapping",
186
- "interpolate_stimulus_epochs_to_frame_windows",
187
227
  "is_baseline_epoch_name",
228
+ "KernelFitMethod",
229
+ "KernelStimulusModality",
188
230
  "launch_napari",
189
231
  "load_analysis_outputs",
232
+ "load_response_map_data",
233
+ "load_manual_fov_group_rows",
234
+ "load_manual_roi_match_rows",
190
235
  "load_converted_recording",
191
236
  "load_pixel_calibrations",
192
237
  "load_pixel_calibration_profile_mappings",
@@ -194,11 +239,20 @@ __all__ = [
194
239
  "load_source_conversion_inputs",
195
240
  "LoadedAnalysisOutputs",
196
241
  "LowPassFilterOptions",
242
+ "ManualFovGroupRow",
243
+ "ManualRoiMatchGroup",
244
+ "ManualRoiMatchRow",
245
+ "ManualRoiMatchStatus",
246
+ "matched_manual_roi_groups",
197
247
  "make_roi_set_from_label_image",
198
248
  "make_frame_windows",
249
+ "make_manual_fov_group_rows",
250
+ "make_manual_roi_match_rows",
199
251
  "make_roi_set",
200
- "map_stimulus_epochs_to_frame_windows",
252
+ "next_group_cell_id",
201
253
  "no_baseline_epoch_frame_windows",
254
+ "remove_manual_roi_match_group",
255
+ "replace_manual_roi_match_group",
202
256
  "map_stimulus_specific_column",
203
257
  "NapariRecordingView",
204
258
  "NapariSidebarWidgets",
@@ -218,14 +272,21 @@ __all__ = [
218
272
  "PixelCalibrationRow",
219
273
  "ResponseNormalization",
220
274
  "ResponsePolarity",
275
+ "ResponseMapData",
276
+ "ResponseMapMode",
277
+ "ResponseMapOptions",
221
278
  "ResponseProcessingOptions",
222
279
  "ResponseStatistic",
223
280
  "ResponseWatershedExtraction",
224
281
  "ResponseWatershedScoreImages",
282
+ "RecordingKernelFit",
283
+ "RecordingTiming",
225
284
  "recording_frame_rate_hz",
285
+ "recording_hemisphere",
226
286
  "resolve_pixel_size_um",
227
287
  "resolve_pixel_calibration_profile",
228
288
  "resolve_baseline_frame_windows",
289
+ "resolve_recording_timing",
229
290
  "response_watershed_roi_set",
230
291
  "RoiExtractionConfig",
231
292
  "RoiExtractionMethod",
@@ -238,6 +299,9 @@ __all__ = [
238
299
  "roi_label_image_from_layer",
239
300
  "roi_set_to_label_image",
240
301
  "save_analysis_outputs",
302
+ "save_response_map_data",
303
+ "save_manual_fov_group_rows",
304
+ "save_manual_roi_match_rows",
241
305
  "save_napari_label_rois",
242
306
  "save_roi_set",
243
307
  "select_baseline_frame_windows",
@@ -246,10 +310,13 @@ __all__ = [
246
310
  "SmoothingOptions",
247
311
  "SpatialCrop",
248
312
  "SpatialDomain",
313
+ "StimulusKernelOptions",
249
314
  "StimulusSpecificColumnMapping",
250
315
  "stimulus_epoch_names_by_number",
316
+ "finite_mean_and_sem",
251
317
  "summarize_epoch_roi_responses",
252
318
  "summarize_grouped_responses",
319
+ "TimingSource",
253
320
  "validate_grouped_roi_responses",
254
321
  "watershed_roi_set",
255
322
  "WindowedRoiResponse",
@@ -19,9 +19,33 @@ from twopy.analysis.dff import (
19
19
  compute_roi_delta_f_over_f,
20
20
  )
21
21
  from twopy.analysis.dff_options import DeltaFOverFBaselineMode, DeltaFOverFOptions
22
- from twopy.analysis.epoch_mapping import (
23
- InterpolatedEpochMapping,
24
- interpolate_stimulus_epochs_to_frame_windows,
22
+ from twopy.analysis.group_matching import (
23
+ ManualFovGroupRow,
24
+ ManualRoiMatchGroup,
25
+ ManualRoiMatchRow,
26
+ ManualRoiMatchStatus,
27
+ add_manual_roi_match_group,
28
+ append_manual_roi_match_rows,
29
+ load_manual_fov_group_rows,
30
+ load_manual_roi_match_rows,
31
+ make_manual_fov_group_rows,
32
+ make_manual_roi_match_rows,
33
+ matched_manual_roi_groups,
34
+ next_group_cell_id,
35
+ remove_manual_roi_match_group,
36
+ replace_manual_roi_match_group,
37
+ save_manual_fov_group_rows,
38
+ save_manual_roi_match_rows,
39
+ )
40
+ from twopy.analysis.kernels import (
41
+ Hemisphere,
42
+ KernelFitMethod,
43
+ KernelStimulusModality,
44
+ RecordingKernelFit,
45
+ StimulusKernelOptions,
46
+ default_kernel_stimulus_column,
47
+ fit_recording_stimulus_kernels,
48
+ fit_stimulus_kernel,
25
49
  )
26
50
  from twopy.analysis.motion import apply_motion_artifact_mask_to_delta_f_over_f
27
51
  from twopy.analysis.persistence import (
@@ -33,6 +57,15 @@ from twopy.analysis.persistence import (
33
57
  write_response_summary_trials_csv,
34
58
  )
35
59
  from twopy.analysis.response_context import default_recording_baseline_epoch_number
60
+ from twopy.analysis.response_maps import (
61
+ EpochResponseMap,
62
+ ResponseMapData,
63
+ ResponseMapMode,
64
+ ResponseMapOptions,
65
+ compute_recording_response_maps,
66
+ load_response_map_data,
67
+ save_response_map_data,
68
+ )
36
69
  from twopy.analysis.response_processing import (
37
70
  CorrelationFilterOptions,
38
71
  LowPassFilterOptions,
@@ -45,20 +78,24 @@ from twopy.analysis.responses import (
45
78
  GroupedRoiResponseSummary,
46
79
  RoiResponseSummary,
47
80
  RoiResponseTrial,
81
+ finite_mean_and_sem,
48
82
  group_delta_f_over_f_by_epoch,
49
83
  summarize_epoch_roi_responses,
50
84
  summarize_grouped_responses,
51
85
  validate_grouped_roi_responses,
52
86
  )
87
+ from twopy.analysis.timing import (
88
+ RecordingTiming,
89
+ TimingSource,
90
+ resolve_recording_timing,
91
+ )
53
92
  from twopy.analysis.trials import (
54
93
  EpochFrameWindow,
55
94
  FrameWindow,
56
95
  WindowedRoiResponse,
57
96
  default_baseline_epoch_number,
58
- frame_windows_from_photodiode_alignment,
59
97
  is_baseline_epoch_name,
60
98
  make_frame_windows,
61
- map_stimulus_epochs_to_frame_windows,
62
99
  no_baseline_epoch_frame_windows,
63
100
  resolve_baseline_frame_windows,
64
101
  select_baseline_frame_windows,
@@ -85,40 +122,71 @@ __all__ = [
85
122
  "BackgroundCorrectionMethod",
86
123
  "compute_roi_delta_f_over_f",
87
124
  "compute_recording_responses",
125
+ "compute_recording_response_maps",
88
126
  "CorrelationFilterOptions",
89
127
  "default_baseline_epoch_number",
90
128
  "default_recording_baseline_epoch_number",
91
129
  "DeltaFOverFBaselineMode",
92
130
  "DeltaFOverFOptions",
93
131
  "DeltaFOverFFitMode",
132
+ "EpochResponseMap",
94
133
  "EpochFrameWindow",
95
134
  "extract_background_corrected_roi_traces",
96
- "frame_windows_from_photodiode_alignment",
135
+ "fit_recording_stimulus_kernels",
136
+ "fit_stimulus_kernel",
137
+ "default_kernel_stimulus_column",
138
+ "Hemisphere",
97
139
  "FrameWindow",
98
140
  "group_delta_f_over_f_by_epoch",
99
141
  "GroupedRoiResponseSummary",
100
142
  "GroupedRoiResponses",
101
- "InterpolatedEpochMapping",
102
- "interpolate_stimulus_epochs_to_frame_windows",
103
143
  "is_baseline_epoch_name",
144
+ "KernelFitMethod",
145
+ "KernelStimulusModality",
104
146
  "load_analysis_outputs",
147
+ "load_response_map_data",
105
148
  "LoadedAnalysisOutputs",
106
149
  "LowPassFilterOptions",
150
+ "ManualFovGroupRow",
151
+ "ManualRoiMatchGroup",
152
+ "ManualRoiMatchRow",
153
+ "ManualRoiMatchStatus",
154
+ "matched_manual_roi_groups",
107
155
  "make_frame_windows",
108
- "map_stimulus_epochs_to_frame_windows",
156
+ "make_manual_fov_group_rows",
157
+ "make_manual_roi_match_rows",
109
158
  "no_baseline_epoch_frame_windows",
159
+ "next_group_cell_id",
160
+ "RecordingKernelFit",
161
+ "RecordingTiming",
110
162
  "RoiDeltaFOverF",
163
+ "ResponseMapData",
164
+ "ResponseMapMode",
165
+ "ResponseMapOptions",
111
166
  "ResponseProcessingOptions",
112
167
  "RoiCorrelationScores",
113
168
  "RoiResponseSummary",
114
169
  "RoiResponseTrial",
115
170
  "resolve_baseline_frame_windows",
171
+ "resolve_recording_timing",
172
+ "add_manual_roi_match_group",
173
+ "append_manual_roi_match_rows",
174
+ "load_manual_fov_group_rows",
175
+ "load_manual_roi_match_rows",
176
+ "remove_manual_roi_match_group",
177
+ "replace_manual_roi_match_group",
116
178
  "save_analysis_outputs",
179
+ "save_response_map_data",
180
+ "save_manual_fov_group_rows",
181
+ "save_manual_roi_match_rows",
117
182
  "select_baseline_frame_windows",
183
+ "finite_mean_and_sem",
118
184
  "split_traces_by_frame_windows",
185
+ "StimulusKernelOptions",
119
186
  "SmoothingOptions",
120
187
  "summarize_epoch_roi_responses",
121
188
  "summarize_grouped_responses",
189
+ "TimingSource",
122
190
  "validate_grouped_roi_responses",
123
191
  "WindowedRoiResponse",
124
192
  "write_response_summary_grouped_csv",