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.
- {physion-1.2.2/src/physion.egg-info → physion-2.0}/PKG-INFO +21 -6
- {physion-1.2.2 → physion-2.0}/README.md +5 -0
- {physion-1.2.2 → physion-2.0}/pyproject.toml +23 -1
- physion-2.0/src/physion/acquisition/__init__.py +43 -0
- {physion-1.2.2 → physion-2.0}/src/physion/acquisition/gui.py +35 -31
- {physion-1.2.2 → physion-2.0}/src/physion/acquisition/run.py +25 -36
- {physion-1.2.2 → physion-2.0}/src/physion/acquisition/settings.py +26 -9
- {physion-1.2.2 → physion-2.0}/src/physion/acquisition/tools.py +12 -10
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/dataframe.py +14 -6
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/episodes/build.py +4 -3
- physion-2.0/src/physion/analysis/modalities/__init__.py +12 -0
- physion-2.0/src/physion/analysis/modalities/ephys.py +391 -0
- physion-2.0/src/physion/analysis/modalities/facecamera.py +127 -0
- physion-2.0/src/physion/analysis/modalities/locomotion.py +54 -0
- physion-2.0/src/physion/analysis/modalities/ophys.py +234 -0
- physion-2.0/src/physion/analysis/modalities/opto.py +36 -0
- physion-2.0/src/physion/analysis/modalities/visual_stim.py +156 -0
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/FFDG.py +3 -3
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/FFDG_with_blank.py +3 -3
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/Light_Levels.py +4 -4
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/orientation_tuning.py +22 -16
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/size_tuning.py +7 -7
- physion-2.0/src/physion/analysis/read_NWB.py +352 -0
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/stat_tools.py +1 -1
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/summary_pdf.py +2 -2
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/tools.py +2 -3
- physion-2.0/src/physion/assembling/FOV_coordinates.py +175 -0
- {physion-1.2.2 → physion-2.0}/src/physion/assembling/add_ephys.py +222 -89
- {physion-1.2.2 → physion-2.0}/src/physion/assembling/add_ophys.py +5 -28
- {physion-1.2.2 → physion-2.0}/src/physion/assembling/dataset.py +3 -2
- physion-2.0/src/physion/assembling/gui.py +357 -0
- {physion-1.2.2 → physion-2.0}/src/physion/assembling/nwb.py +354 -260
- {physion-1.2.2 → physion-2.0}/src/physion/assembling/realign_from_photodiode.py +17 -8
- {physion-1.2.2 → physion-2.0}/src/physion/assembling/update_metadata.py +3 -3
- physion-2.0/src/physion/behavior/convert_to_movie.py +124 -0
- physion-2.0/src/physion/dataviz/FOV.py +235 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/ephys.py +11 -5
- physion-2.0/src/physion/dataviz/episodes/gui.py +293 -0
- physion-2.0/src/physion/dataviz/gui.py +303 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/plots.py +37 -3
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/tools.py +3 -2
- physion-2.0/src/physion/ephys/location_gui.py +315 -0
- {physion-1.2.2 → physion-2.0}/src/physion/ephys/spike_sorting.py +6 -3
- physion-2.0/src/physion/ephys/spike_sorting_gui.py +207 -0
- physion-1.2.2/src/physion/acquisition/recordings/EphysSynch_IrregularXHz.py → physion-2.0/src/physion/ephys/synch.py +5 -5
- physion-2.0/src/physion/facemotion/gui.py +422 -0
- physion-2.0/src/physion/gui/calendar.py +344 -0
- {physion-1.2.2 → physion-2.0}/src/physion/gui/main.py +133 -158
- {physion-1.2.2 → physion-2.0}/src/physion/gui/menu.py +7 -1
- {physion-1.2.2 → physion-2.0}/src/physion/gui/parts.py +9 -7
- physion-2.0/src/physion/gui/window.py +121 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/FLIRcamera/main.py +12 -5
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/main.py +81 -40
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/usb.py +92 -28
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/Thorlabs/main.py +10 -2
- physion-2.0/src/physion/imaging/bot_spatial_maps.py +174 -0
- {physion-1.2.2 → physion-2.0}/src/physion/imaging/bruker/xml_parser.py +2 -2
- physion-2.0/src/physion/imaging/folders.py +93 -0
- physion-2.0/src/physion/imaging/h5_gui.py +407 -0
- physion-2.0/src/physion/imaging/matching_FOV_gui.py +469 -0
- physion-2.0/src/physion/imaging/red_label.py +318 -0
- {physion-1.2.2 → physion-2.0}/src/physion/imaging/suite2p/default_ops.py +1 -1
- physion-2.0/src/physion/imaging/suite2p/preprocessing.py +298 -0
- {physion-1.2.2 → physion-2.0}/src/physion/imaging/suite2p/presets.py +32 -5
- physion-2.0/src/physion/imaging/suite2p_gui.py +417 -0
- physion-2.0/src/physion/intrinsic/SS_analysis.py +407 -0
- physion-2.0/src/physion/intrinsic/analysis.py +616 -0
- {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/ocular_dominance.py +285 -283
- {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/tools.py +6 -2
- physion-2.0/src/physion/opto/stim.py +37 -0
- physion-2.0/src/physion/pupil/gui.py +743 -0
- {physion-1.2.2 → physion-2.0}/src/physion/pupil/process.py +8 -6
- {physion-1.2.2 → physion-2.0}/src/physion/pupil/roi.py +2 -3
- {physion-1.2.2 → physion-2.0}/src/physion/utils/camera.py +11 -8
- physion-2.0/src/physion/utils/compression/avi.py +75 -0
- physion-2.0/src/physion/utils/compression/binary.py +61 -0
- physion-2.0/src/physion/utils/compression/h5.py +274 -0
- physion-2.0/src/physion/utils/compression/mp4.py +120 -0
- physion-2.0/src/physion/utils/compression/nwb.py +202 -0
- physion-2.0/src/physion/utils/compression/twoP.py +294 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/files.py +29 -0
- physion-2.0/src/physion/utils/management/__init__.py +0 -0
- physion-2.0/src/physion/utils/management/delete.py +104 -0
- physion-2.0/src/physion/utils/misc.py +31 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/Notebook.py +2 -1
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/annotations.py +9 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/figure.py +6 -2
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/legend.py +0 -1
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/style-sheets/dark.py +2 -1
- physion-2.0/src/physion/utils/sharing/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/sharing/prepare_nwb_files.py +6 -4
- physion-2.0/src/physion/utils/transfer/__init__.py +0 -0
- physion-2.0/src/physion/utils/transfer/gui.py +115 -0
- physion-2.0/src/physion/visual_stim/NI_bank/1.jpg +0 -0
- physion-2.0/src/physion/visual_stim/NI_bank/2.jpg +0 -0
- physion-2.0/src/physion/visual_stim/NI_bank/3.jpg +0 -0
- physion-2.0/src/physion/visual_stim/NI_bank/4.jpg +0 -0
- physion-2.0/src/physion/visual_stim/NI_bank/5.jpg +0 -0
- physion-2.0/src/physion/visual_stim/NI_bank/6.jpg +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/build.py +12 -4
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/main.py +44 -5
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/preprocess_NI.py +1 -2
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/__init__.py +1 -1
- physion-2.0/src/physion/visual_stim/stimuli/flickering_grating.py +84 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/looming_stim.py +4 -4
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/natural_image.py +6 -4
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/natural_image_VSE.py +9 -4
- {physion-1.2.2 → physion-2.0/src/physion.egg-info}/PKG-INFO +21 -6
- {physion-1.2.2 → physion-2.0}/src/physion.egg-info/SOURCES.txt +55 -17
- {physion-1.2.2 → physion-2.0}/src/physion.egg-info/requires.txt +13 -0
- physion-2.0/tests/test_assembling.py +14 -0
- physion-2.0/tests/test_camera.py +28 -0
- physion-2.0/tests/test_channel_location.py +80 -0
- physion-2.0/tests/test_demo_nwb.py +62 -0
- physion-2.0/tests/test_electrode_table.py +82 -0
- physion-2.0/tests/test_ephys_chunks.py +56 -0
- physion-2.0/tests/test_ephys_units.py +187 -0
- physion-2.0/tests/test_gui_smoke.py +141 -0
- physion-2.0/tests/test_h5_compression.py +51 -0
- physion-2.0/tests/test_imaging_folders.py +105 -0
- physion-2.0/tests/test_matching_FOV.py +156 -0
- physion-2.0/tests/test_nidaq_acquisition.py +168 -0
- physion-2.0/tests/test_optional_dependencies.py +31 -0
- physion-2.0/tests/test_opto_display.py +62 -0
- physion-2.0/tests/test_pupil_facemotion.py +80 -0
- physion-2.0/tests/test_realignment.py +106 -0
- physion-2.0/tests/test_remove_raw_after_h5.py +65 -0
- physion-2.0/tests/test_source.py +17 -0
- physion-2.0/tests/test_suite2p_h5_options.py +84 -0
- physion-2.0/tests/test_trial_averaging.py +56 -0
- physion-1.2.2/src/physion/acquisition/__init__.py +0 -21
- physion-1.2.2/src/physion/acquisition/protocols/ff-gratings-2orientations-8contrasts-15repeats.json +0 -22
- physion-1.2.2/src/physion/acquisition/protocols/ff-gratings-8orientation-2contrasts-15repeats.json +0 -23
- physion-1.2.2/src/physion/acquisition/protocols/ffDG-4dir-2ctrst+1sPrePostOpto.json +0 -28
- physion-1.2.2/src/physion/acquisition/protocols/ffSG-8ori-2ctrst+1sPrePostOpto.json +0 -29
- physion-1.2.2/src/physion/acquisition/recordings/PhotoStim_Alternated_1sPrePost.py +0 -20
- physion-1.2.2/src/physion/acquisition/recordings/PhotoStim_Alternated_500msPrePost.py +0 -20
- physion-1.2.2/src/physion/acquisition/recordings/Scan1Plane_Screen342V.py +0 -14
- physion-1.2.2/src/physion/acquisition/recordings/Scan1Plane_Screen356VOffPeriodScan.py +0 -28
- physion-1.2.2/src/physion/acquisition/recordings/__init__.py +0 -4
- physion-1.2.2/src/physion/analysis/read_NWB.py +0 -1119
- physion-1.2.2/src/physion/analysis/trial_averaging.py +0 -300
- physion-1.2.2/src/physion/assembling/FOV_coordinates.py +0 -168
- physion-1.2.2/src/physion/assembling/gui.py +0 -307
- physion-1.2.2/src/physion/behavior/convert_to_movie.py +0 -114
- physion-1.2.2/src/physion/dataviz/FOV.py +0 -225
- physion-1.2.2/src/physion/dataviz/gui.py +0 -257
- physion-1.2.2/src/physion/ephys/LFP/build.py +0 -106
- physion-1.2.2/src/physion/ephys/gui.py +0 -199
- physion-1.2.2/src/physion/facemotion/gui.py +0 -410
- physion-1.2.2/src/physion/gui/calendar.py +0 -335
- physion-1.2.2/src/physion/imaging/bot_spatial_maps.py +0 -176
- physion-1.2.2/src/physion/imaging/gui.py +0 -393
- physion-1.2.2/src/physion/imaging/red_label.py +0 -311
- physion-1.2.2/src/physion/imaging/suite2p/preprocessing.py +0 -173
- physion-1.2.2/src/physion/intrinsic/SS_analysis.py +0 -400
- physion-1.2.2/src/physion/intrinsic/analysis.py +0 -625
- physion-1.2.2/src/physion/pupil/gui.py +0 -728
- physion-1.2.2/src/physion/utils/compression/twoP.py +0 -407
- physion-1.2.2/src/physion/utils/management/delete.py +0 -96
- physion-1.2.2/src/physion/utils/misc.py +0 -13
- physion-1.2.2/src/physion/utils/transfer/gui.py +0 -118
- {physion-1.2.2 → physion-2.0}/LICENSE +0 -0
- {physion-1.2.2 → physion-2.0}/setup.cfg +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/__main__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/acquisition/DataTable.xlsx +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/acquisition/configs/Bacci-2P.json +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/acquisition/configs/Bacci-Neuropix.json +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/acquisition/configs/Laptop+Lilliput.json +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/acquisition/configs/NIdaq-usage.json +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/acquisition/configs/Rebol-A1-2P.json +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/acquisition/configs/Rebol-Neuropix.json +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/behavior.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/episodes/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/episodes/trial_statistics.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/asahi.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/contrast_sensitivity.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/ff_gratings_2orientations_8contrasts.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/ff_gratings_8orientations_2contrasts.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/multiStim.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/analysis/protocols/spatial_mapping.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/assembling/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/assembling/subject.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/assembling/tools.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/behavior/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/behavior/locomotion.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/camera.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/dataframe/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/behavior.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/common.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/evoked_pattern.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/evoked_raster.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/temporal_dynamics.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/episodes/trial_average.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/imaging.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/movie.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/protocols/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/protocols/template.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/pupil.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/raw.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/dataviz/snapshot.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/ephys/NSI.py +0 -0
- {physion-1.2.2/src/physion/ephys/LFP → physion-2.0/src/physion/ephys}/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/ephys/alignement.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/ephys/tools.py +0 -0
- {physion-1.2.2/src/physion/ephys → physion-2.0/src/physion/facemotion}/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/facemotion/process.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/facemotion/roi.py +0 -0
- {physion-1.2.2/src/physion/facemotion → physion-2.0/src/physion/gui}/__init__.py +0 -0
- {physion-1.2.2/src/physion/gui → physion-2.0/src/physion/hardware/Dummy}/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/Dummy/camera.py +0 -0
- {physion-1.2.2/src/physion/hardware/Dummy → physion-2.0/src/physion/hardware/FLIRcamera}/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/FLIRcamera/export.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/FLIRcamera/launch.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/FLIRcamera/test.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/Igor/hdf5.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/Igor/igor.py +0 -0
- {physion-1.2.2/src/physion/hardware/FLIRcamera → physion-2.0/src/physion/hardware/LogitechWebcam}/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/LogitechWebcam/main.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/LogitechWebcam/test.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/LuigsNeumann/live_treadmill.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/config.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/inputs_for_screen.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/pulse.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/recording.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/steps.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/subprocess.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/test.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/NIdaq/zero_AO.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/QCamera/camera_core_test.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/QCamera/frame_rate_test.py +0 -0
- {physion-1.2.2/src/physion/hardware/LogitechWebcam → physion-2.0/src/physion/hardware/RaspberryPi}/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/RaspberryPi/main.py +0 -0
- {physion-1.2.2/src/physion/hardware/RaspberryPi → physion-2.0/src/physion/hardware/Thorlabs}/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/Thorlabs/cam_test.py +0 -0
- /physion-1.2.2/src/physion/hardware/Thorlabs/__init__.py → /physion-2.0/src/physion/hardware/Thorlabs/camera_dlls/_.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/Thorlabs/thorcam.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/Thorlabs/tkinter_camera_live_view.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/Thorlabs/usb_camera.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/toupcam/main.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/toupcam/qt5.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/toupcam/simplest.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/toupcam/toupcam.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/zaber_stage/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/hardware/zaber_stage/main.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/imaging/Calcium.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/imaging/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/imaging/bruker/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/imaging/dcnv.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/imaging/suite2p/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/imaging/suite2p/binary.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/imaging/suite2p/to_nwb.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/RetinotopicMapping.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/acquisition.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/build_protocols.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/load_camera.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/pdf.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/intrinsic/somatosensory.py +0 -0
- {physion-1.2.2/src/physion/pupil → physion-2.0/src/physion/notebook}/__init__.py +0 -0
- /physion-1.2.2/src/physion/utils/compression/__init__.py → /physion-2.0/src/physion/notebook/datafile.py +0 -0
- /physion-1.2.2/src/physion/utils/conversion/__init__.py → /physion-2.0/src/physion/notebook/dataset.py +0 -0
- {physion-1.2.2/src/physion/utils/management → physion-2.0/src/physion/pupil}/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/pupil/outliers.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/binary.py +0 -0
- {physion-1.2.2/src/physion/utils/sharing → physion-2.0/src/physion/utils/compression}/__init__.py +0 -0
- {physion-1.2.2/src/physion/utils/transfer → physion-2.0/src/physion/utils/conversion}/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/conversion/abf_to_nwb.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/files0.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/hdf5.py +0 -0
- /physion-1.2.2/src/physion/utils/matplotlib_style.py → /physion-2.0/src/physion/utils/matplotlib_style.mplstyle +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/npz.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/parallel.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/paths.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/setup.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/adjust_plots.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/bar.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/colors.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/export.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/images.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/inset.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/line.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/morphologies.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/pie.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/scatter.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/surface.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/time_freq.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/src/violin.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/plot_tools/style-sheets/manuscript.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/progressBar.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/transfer/__main__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/utils/transfer/types.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/__init__.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/geometry.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/screens.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/show.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/shuffling.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/dimming_circle.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/flickering_bar.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/gaussian_blob.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/grating.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/grating_VSE.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/grating_stripe.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/line_moving_dots.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/oddball.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/oscillDG.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/random_dots.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/scattered_moving_dots.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/set_of_images.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/sparse_noise.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/sweeping_circle.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/template.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/uniform_bg.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/stimuli/virtual_scene_exploration.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/tests/opencv.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/tests/psycho_py.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion/visual_stim/tests/qt.py +0 -0
- {physion-1.2.2 → physion-2.0}/src/physion.egg-info/dependency_links.txt +0 -0
- {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:
|
|
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:
|
|
33
|
-
Requires-Dist:
|
|
34
|
-
Requires-Dist:
|
|
35
|
-
Requires-Dist:
|
|
36
|
-
Requires-Dist:
|
|
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 = "
|
|
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
|
-
#
|
|
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*' '+'**
|
|
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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
10
|
-
from physion.
|
|
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(
|
|
46
|
-
|
|
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 =
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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(
|
|
74
|
-
|
|
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
|
|
342
|
-
tstop = data
|
|
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>=
|
|
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
|
|
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
|
|
398
|
-
tstop = data
|
|
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
|
|
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
|
|
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
|
|
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
|