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