twopy 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. twopy/__init__.py +168 -0
  2. twopy/_segments.py +53 -0
  3. twopy/analysis/__init__.py +101 -0
  4. twopy/analysis/background_subtraction.py +672 -0
  5. twopy/analysis/dff.py +524 -0
  6. twopy/analysis/epoch_mapping.py +223 -0
  7. twopy/analysis/motion.py +66 -0
  8. twopy/analysis/persistence.py +975 -0
  9. twopy/analysis/response_processing/__init__.py +55 -0
  10. twopy/analysis/response_processing/apply.py +298 -0
  11. twopy/analysis/response_processing/options.py +192 -0
  12. twopy/analysis/response_processing/qc.py +270 -0
  13. twopy/analysis/response_processing/signals.py +200 -0
  14. twopy/analysis/responses.py +345 -0
  15. twopy/analysis/trials.py +341 -0
  16. twopy/analysis/workflow.py +457 -0
  17. twopy/api.py +78 -0
  18. twopy/config.py +200 -0
  19. twopy/conversion/__init__.py +40 -0
  20. twopy/conversion/alignment_crop.py +329 -0
  21. twopy/conversion/api.py +113 -0
  22. twopy/conversion/frame_ranges.py +35 -0
  23. twopy/conversion/hdf5_writing.py +362 -0
  24. twopy/conversion/matlab_values.py +123 -0
  25. twopy/conversion/source_loading.py +403 -0
  26. twopy/conversion/stimulus_code.py +248 -0
  27. twopy/conversion/types.py +295 -0
  28. twopy/converted.py +681 -0
  29. twopy/database/__init__.py +33 -0
  30. twopy/database/cache.py +166 -0
  31. twopy/database/catalog.py +90 -0
  32. twopy/database/connection.py +27 -0
  33. twopy/database/generic.py +254 -0
  34. twopy/database/modeled.py +419 -0
  35. twopy/database/sql.py +46 -0
  36. twopy/database/types.py +116 -0
  37. twopy/inspection.py +492 -0
  38. twopy/matlab.py +398 -0
  39. twopy/napari/__init__.py +27 -0
  40. twopy/napari/__main__.py +10 -0
  41. twopy/napari/constants.py +13 -0
  42. twopy/napari/controls.py +739 -0
  43. twopy/napari/display.py +181 -0
  44. twopy/napari/display_paths.py +197 -0
  45. twopy/napari/interactive.py +310 -0
  46. twopy/napari/launcher.py +175 -0
  47. twopy/napari/layout.py +147 -0
  48. twopy/napari/loading.py +207 -0
  49. twopy/napari/movie.py +71 -0
  50. twopy/napari/paths.py +181 -0
  51. twopy/napari/plotting/__init__.py +21 -0
  52. twopy/napari/plotting/data.py +266 -0
  53. twopy/napari/plotting/docks.py +1052 -0
  54. twopy/napari/plotting/export.py +803 -0
  55. twopy/napari/plotting/export_controls.py +209 -0
  56. twopy/napari/plotting/label_visibility.py +260 -0
  57. twopy/napari/plotting/options.py +269 -0
  58. twopy/napari/plotting/panels.py +119 -0
  59. twopy/napari/plotting/widgets.py +767 -0
  60. twopy/napari/protocols.py +90 -0
  61. twopy/napari/responses.py +91 -0
  62. twopy/napari/roi.py +238 -0
  63. twopy/napari/session.py +381 -0
  64. twopy/napari/state.py +106 -0
  65. twopy/napari/text.py +26 -0
  66. twopy/napari/types.py +39 -0
  67. twopy/napari/viewer.py +405 -0
  68. twopy/parity/__init__.py +30 -0
  69. twopy/parity/dff.py +399 -0
  70. twopy/parity/roi.py +145 -0
  71. twopy/parity/saved_analysis.py +174 -0
  72. twopy/photodiode.py +375 -0
  73. twopy/photodiode_classification.py +484 -0
  74. twopy/roi.py +462 -0
  75. twopy/session.py +167 -0
  76. twopy/spatial.py +154 -0
  77. twopy/stimulus.py +233 -0
  78. twopy/synchronization.py +235 -0
  79. twopy/typing_guards.py +255 -0
  80. twopy-0.1.0.dist-info/METADATA +311 -0
  81. twopy-0.1.0.dist-info/RECORD +84 -0
  82. twopy-0.1.0.dist-info/WHEEL +5 -0
  83. twopy-0.1.0.dist-info/entry_points.txt +2 -0
  84. twopy-0.1.0.dist-info/top_level.txt +1 -0
twopy/__init__.py ADDED
@@ -0,0 +1,168 @@
1
+ """Top-level package for the twopy two-photon imaging analysis tool.
2
+
3
+ The package exposes project metadata and script-friendly public APIs.
4
+ Inputs: none.
5
+ Outputs: package constants and helper functions imported by users and scripts.
6
+ """
7
+
8
+ from twopy.analysis import (
9
+ DEFAULT_RESPONSE_POST_WINDOW_SECONDS,
10
+ DEFAULT_RESPONSE_PRE_WINDOW_SECONDS,
11
+ AnalysisResponseComputation,
12
+ AnalysisResponseRun,
13
+ BackgroundCorrectedRoiTraces,
14
+ BackgroundCorrectionMethod,
15
+ DeltaFOverFFitMode,
16
+ EpochFrameWindow,
17
+ FrameWindow,
18
+ GroupedRoiResponses,
19
+ GroupedRoiResponseSummary,
20
+ InterpolatedEpochMapping,
21
+ LoadedAnalysisOutputs,
22
+ RoiDeltaFOverF,
23
+ RoiResponseSummary,
24
+ RoiResponseTrial,
25
+ WindowedRoiResponse,
26
+ analyze_recording_responses,
27
+ apply_motion_artifact_mask_to_delta_f_over_f,
28
+ compute_recording_responses,
29
+ compute_roi_delta_f_over_f,
30
+ extract_background_corrected_roi_traces,
31
+ frame_windows_from_photodiode_alignment,
32
+ group_delta_f_over_f_by_epoch,
33
+ interpolate_stimulus_epochs_to_frame_windows,
34
+ is_gray_epoch_name,
35
+ load_analysis_outputs,
36
+ make_frame_windows,
37
+ map_stimulus_epochs_to_frame_windows,
38
+ save_analysis_outputs,
39
+ select_epoch_frame_windows,
40
+ split_traces_by_frame_windows,
41
+ summarize_epoch_roi_responses,
42
+ summarize_grouped_responses,
43
+ write_response_summary_grouped_csv,
44
+ write_response_summary_trials_csv,
45
+ )
46
+ from twopy.api import find_recordings
47
+ from twopy.conversion import convert_recording_to_twopy, load_source_conversion_inputs
48
+ from twopy.converted import load_converted_recording
49
+ from twopy.napari import (
50
+ NapariControlDocks,
51
+ NapariRecordingView,
52
+ add_twopy_magicgui_controls,
53
+ launch_napari,
54
+ open_recording_in_napari,
55
+ roi_label_image_from_layer,
56
+ save_napari_label_rois,
57
+ )
58
+ from twopy.photodiode_classification import (
59
+ ClassifiedPhotodiodeEvent,
60
+ ClassifiedStimulusTiming,
61
+ ClassifiedStimulusWindow,
62
+ PhotodiodeDurationClass,
63
+ PhotodiodeEventType,
64
+ classify_recording_photodiode_events,
65
+ )
66
+ from twopy.roi import (
67
+ RoiSet,
68
+ RoiTraces,
69
+ extract_roi_traces,
70
+ load_roi_set,
71
+ make_roi_set,
72
+ make_roi_set_from_label_image,
73
+ roi_set_to_label_image,
74
+ save_roi_set,
75
+ )
76
+ from twopy.spatial import SpatialCrop, SpatialDomain, full_frame_crop
77
+ from twopy.stimulus import (
78
+ StimulusSpecificColumnMapping,
79
+ map_stimulus_specific_column,
80
+ )
81
+ from twopy.synchronization import (
82
+ AlignedPhotodiodeEvent,
83
+ PhotodiodeAlignment,
84
+ PhotodiodeEvent,
85
+ PhotodiodeEventSet,
86
+ detect_photodiode_events,
87
+ detect_recording_photodiode_events,
88
+ pair_photodiode_events_to_imaging_frames,
89
+ )
90
+
91
+ __all__ = [
92
+ "__version__",
93
+ "AlignedPhotodiodeEvent",
94
+ "AnalysisResponseRun",
95
+ "AnalysisResponseComputation",
96
+ "analyze_recording_responses",
97
+ "add_twopy_magicgui_controls",
98
+ "apply_motion_artifact_mask_to_delta_f_over_f",
99
+ "BackgroundCorrectedRoiTraces",
100
+ "BackgroundCorrectionMethod",
101
+ "ClassifiedPhotodiodeEvent",
102
+ "ClassifiedStimulusTiming",
103
+ "ClassifiedStimulusWindow",
104
+ "classify_recording_photodiode_events",
105
+ "compute_roi_delta_f_over_f",
106
+ "compute_recording_responses",
107
+ "convert_recording_to_twopy",
108
+ "DEFAULT_RESPONSE_POST_WINDOW_SECONDS",
109
+ "DEFAULT_RESPONSE_PRE_WINDOW_SECONDS",
110
+ "detect_photodiode_events",
111
+ "detect_recording_photodiode_events",
112
+ "DeltaFOverFFitMode",
113
+ "EpochFrameWindow",
114
+ "extract_background_corrected_roi_traces",
115
+ "extract_roi_traces",
116
+ "find_recordings",
117
+ "frame_windows_from_photodiode_alignment",
118
+ "FrameWindow",
119
+ "full_frame_crop",
120
+ "group_delta_f_over_f_by_epoch",
121
+ "GroupedRoiResponseSummary",
122
+ "GroupedRoiResponses",
123
+ "InterpolatedEpochMapping",
124
+ "interpolate_stimulus_epochs_to_frame_windows",
125
+ "is_gray_epoch_name",
126
+ "launch_napari",
127
+ "load_analysis_outputs",
128
+ "load_converted_recording",
129
+ "load_roi_set",
130
+ "load_source_conversion_inputs",
131
+ "LoadedAnalysisOutputs",
132
+ "make_roi_set_from_label_image",
133
+ "make_frame_windows",
134
+ "make_roi_set",
135
+ "map_stimulus_epochs_to_frame_windows",
136
+ "map_stimulus_specific_column",
137
+ "NapariControlDocks",
138
+ "NapariRecordingView",
139
+ "open_recording_in_napari",
140
+ "pair_photodiode_events_to_imaging_frames",
141
+ "PhotodiodeAlignment",
142
+ "PhotodiodeDurationClass",
143
+ "PhotodiodeEvent",
144
+ "PhotodiodeEventType",
145
+ "PhotodiodeEventSet",
146
+ "RoiDeltaFOverF",
147
+ "RoiResponseSummary",
148
+ "RoiResponseTrial",
149
+ "RoiSet",
150
+ "RoiTraces",
151
+ "roi_label_image_from_layer",
152
+ "roi_set_to_label_image",
153
+ "save_analysis_outputs",
154
+ "save_napari_label_rois",
155
+ "save_roi_set",
156
+ "select_epoch_frame_windows",
157
+ "split_traces_by_frame_windows",
158
+ "SpatialCrop",
159
+ "SpatialDomain",
160
+ "StimulusSpecificColumnMapping",
161
+ "summarize_epoch_roi_responses",
162
+ "summarize_grouped_responses",
163
+ "WindowedRoiResponse",
164
+ "write_response_summary_grouped_csv",
165
+ "write_response_summary_trials_csv",
166
+ ]
167
+
168
+ __version__ = "0.1.0"
twopy/_segments.py ADDED
@@ -0,0 +1,53 @@
1
+ """Small helpers for finding contiguous runs in one-dimensional arrays.
2
+
3
+ Inputs: boolean or integer NumPy vectors.
4
+ Outputs: inclusive-start, exclusive-stop index pairs for contiguous runs.
5
+
6
+ Timing code uses these helpers to turn threshold masks and epoch vectors into
7
+ auditable windows without duplicating low-level indexing logic.
8
+ """
9
+
10
+ import numpy as np
11
+ import numpy.typing as npt
12
+
13
+ __all__ = ["constant_segments", "true_segments"]
14
+
15
+
16
+ def true_segments(active: npt.NDArray[np.bool_]) -> tuple[tuple[int, int], ...]:
17
+ """Find contiguous true runs in a Boolean vector.
18
+
19
+ Args:
20
+ active: Boolean vector.
21
+
22
+ Returns:
23
+ Tuple of inclusive-start, exclusive-stop index pairs.
24
+ """
25
+ if active.size == 0:
26
+ return ()
27
+
28
+ padded = np.concatenate(([False], active, [False]))
29
+ changes = np.flatnonzero(padded[1:] != padded[:-1])
30
+ return tuple(
31
+ (int(changes[index]), int(changes[index + 1]))
32
+ for index in range(0, len(changes), 2)
33
+ )
34
+
35
+
36
+ def constant_segments(values: npt.NDArray[np.int64]) -> tuple[tuple[int, int], ...]:
37
+ """Find contiguous runs with the same integer value.
38
+
39
+ Args:
40
+ values: One-dimensional integer vector.
41
+
42
+ Returns:
43
+ Tuple of inclusive-start, exclusive-stop index pairs.
44
+ """
45
+ if values.size == 0:
46
+ return ()
47
+
48
+ changes = np.flatnonzero(values[1:] != values[:-1]) + 1
49
+ starts = np.r_[0, changes]
50
+ stops = np.r_[changes, values.size]
51
+ return tuple(
52
+ (int(start), int(stop)) for start, stop in zip(starts, stops, strict=True)
53
+ )
@@ -0,0 +1,101 @@
1
+ """Analysis helpers for converted two-photon recordings.
2
+
3
+ Inputs: converted twopy recordings, ROI traces, photodiode-aligned windows, and
4
+ analysis parameters.
5
+ Outputs: background-corrected traces and trial/frame-window response objects.
6
+
7
+ This package is GUI-independent and operates only on twopy-owned converted
8
+ files or in-memory objects derived from them.
9
+ """
10
+
11
+ from twopy.analysis.background_subtraction import (
12
+ BackgroundCorrectedRoiTraces,
13
+ BackgroundCorrectionMethod,
14
+ extract_background_corrected_roi_traces,
15
+ )
16
+ from twopy.analysis.dff import (
17
+ DeltaFOverFFitMode,
18
+ RoiDeltaFOverF,
19
+ compute_roi_delta_f_over_f,
20
+ )
21
+ from twopy.analysis.epoch_mapping import (
22
+ InterpolatedEpochMapping,
23
+ interpolate_stimulus_epochs_to_frame_windows,
24
+ )
25
+ from twopy.analysis.motion import apply_motion_artifact_mask_to_delta_f_over_f
26
+ from twopy.analysis.persistence import (
27
+ ANALYSIS_OUTPUT_FILE_FORMAT,
28
+ LoadedAnalysisOutputs,
29
+ load_analysis_outputs,
30
+ save_analysis_outputs,
31
+ write_response_summary_grouped_csv,
32
+ write_response_summary_trials_csv,
33
+ )
34
+ from twopy.analysis.responses import (
35
+ GroupedRoiResponses,
36
+ GroupedRoiResponseSummary,
37
+ RoiResponseSummary,
38
+ RoiResponseTrial,
39
+ group_delta_f_over_f_by_epoch,
40
+ is_gray_epoch_name,
41
+ summarize_epoch_roi_responses,
42
+ summarize_grouped_responses,
43
+ )
44
+ from twopy.analysis.trials import (
45
+ EpochFrameWindow,
46
+ FrameWindow,
47
+ WindowedRoiResponse,
48
+ frame_windows_from_photodiode_alignment,
49
+ make_frame_windows,
50
+ map_stimulus_epochs_to_frame_windows,
51
+ select_epoch_frame_windows,
52
+ split_traces_by_frame_windows,
53
+ )
54
+ from twopy.analysis.workflow import (
55
+ DEFAULT_RESPONSE_POST_WINDOW_SECONDS,
56
+ DEFAULT_RESPONSE_PRE_WINDOW_SECONDS,
57
+ AnalysisResponseComputation,
58
+ AnalysisResponseRun,
59
+ analyze_recording_responses,
60
+ compute_recording_responses,
61
+ )
62
+
63
+ __all__ = [
64
+ "analyze_recording_responses",
65
+ "AnalysisResponseComputation",
66
+ "AnalysisResponseRun",
67
+ "DEFAULT_RESPONSE_POST_WINDOW_SECONDS",
68
+ "DEFAULT_RESPONSE_PRE_WINDOW_SECONDS",
69
+ "apply_motion_artifact_mask_to_delta_f_over_f",
70
+ "ANALYSIS_OUTPUT_FILE_FORMAT",
71
+ "BackgroundCorrectedRoiTraces",
72
+ "BackgroundCorrectionMethod",
73
+ "compute_roi_delta_f_over_f",
74
+ "compute_recording_responses",
75
+ "DeltaFOverFFitMode",
76
+ "EpochFrameWindow",
77
+ "extract_background_corrected_roi_traces",
78
+ "frame_windows_from_photodiode_alignment",
79
+ "FrameWindow",
80
+ "group_delta_f_over_f_by_epoch",
81
+ "GroupedRoiResponseSummary",
82
+ "GroupedRoiResponses",
83
+ "InterpolatedEpochMapping",
84
+ "interpolate_stimulus_epochs_to_frame_windows",
85
+ "is_gray_epoch_name",
86
+ "load_analysis_outputs",
87
+ "LoadedAnalysisOutputs",
88
+ "make_frame_windows",
89
+ "map_stimulus_epochs_to_frame_windows",
90
+ "RoiDeltaFOverF",
91
+ "RoiResponseSummary",
92
+ "RoiResponseTrial",
93
+ "save_analysis_outputs",
94
+ "select_epoch_frame_windows",
95
+ "split_traces_by_frame_windows",
96
+ "summarize_epoch_roi_responses",
97
+ "summarize_grouped_responses",
98
+ "WindowedRoiResponse",
99
+ "write_response_summary_grouped_csv",
100
+ "write_response_summary_trials_csv",
101
+ ]