Quick Start Guide¶
This page explains how to use the above code to extract visual feature preferences from 2p neural datas
Setting up the parameters**
import waven.WaveletGenerator as wg
import waven.Analysis_Utils as au
import waven.LoadPinkNoise as lpn
import waven.zebraGUI as ui
import numpy as np
import gc
import os
# List of default parameters for the Gabor Library
gabor_param={
"N_thetas":"8",
"Sigmas": "[2, 3, 4, 5, 6, 8]",
"Frequencies": "[0.015, 0.04, 0.07, 0.1]",
"Phases": "[0, 90]",
"NX": "135",
"NY": "54",
"Save Path":"/path/to/your/ressources/folder/gabors_library.npy"
}
# List of default parameters
param_defaults = {
"Path Directory": "/path/to/your/folder/videos",
"Dirs": "/path/to/your/dataset",
"Experiment Info": "('SS002', '2024-07-23', 3)",
"Number of Planes": "1",
"Block End": "0",
"screen_x":"4096",
"screen_y":"1536",
"NX": "135",
"NY": "54",
"Resolution":"1.3671",
"Sigmas": "[2, 3, 4, 5, 6, 8]",
"Frequencies": "[0.015, 0.04, 0.07, 0.1]",
"Visual Coverage":"[-135, 45, 34, -34]",
"Analysis Coverage": "[-135, 0, 34, -34]",
"Number of Frames": "18000",
"Number of Trials to Keep": "3",
"Movie Path": "/path/to/your/folder/perlin_stimulus_10min.mp4",
"Library Path": "/path/to/your/folder/gabors_library.npy",
"Spks Path": "None"
}
Here is a quick explanation of each parameter:
"""
Parameters Gabor Library:
N_thetas (int): number of orientatuion equally spaced between 0 and 180 degree.
Sigmas (list): standart deviation of theb gabor filters expressed in pixels (radius of the gaussian half peak wigth).
Frequencies (list): spatial frequencies expressed in pixels per cycles.
Phases (list): 0 and pi/2.
NX (int): number of azimuth positions (pix) (x shape of the downsampled stimuli).
NY (int): number of elevation positions (pix) (y shape of the downsampled stimuli).
Save Path (string): where to save the gabor library
Parameters alignement:
Dirs (string): where the raw data are.
Experiment Info: (mouse name, data, experiment number)
Number of Planes (int): number of acquisition planes.
Block End (int): timeframe where the experiment starts.
Number of Frames (int): number of frames stim 30 Hz -> 1800 frame/min.
Number of Trials to Keep(int): Number of Trials to Keep.
Parameters analysis:
screen_x: stimulus screen x size inn pixels.
screen_y: stimulus screen y size inn pixels.
NX (int): number of azimuth positions (pix) (x shape of the downsampled stimuli).
NY (int): number of elevation positions (pix) (y shape of the downsampled stimuli).
Resolution (float): microscope resolution (um per pixels)
Sigmas (list): standart deviation of theb gabor filters expressed in pixels (radius of the gaussian half peak wigth).
Visual Coverage (list): [azimuth left, azimuth right, elevation top , elevation bottom] in visual degree.
Analysis Coverage (list): [azimuth left, azimuth right, elevation top , elevation bottom] in visual degree.
Movie Path: path to the stimulus (.mp4)
Library Path: path to Gabor library (same as save path if ran)
Spks Path (opt): path to the spks.npy file to skip the alignement procedure, if set ignores Parameter alignment
"""
further documentation can be found here <https://github.com/skriabineSop/waven/tree/main/pydocs>
2. To run the UI: .. code-block:: python
ui.run(param_defaults,gabor_param)
GUI documentation can be found here <https://docs.google.com/presentation/d/1nEv07CzCwYUoozucwwqi6qgS_t0jBy7KwqHKKoh2f2U/edit?usp=sharing>
To create a new Gabor library
if f!=0:
freq=True
else:
freq=False
L = wg.makeFilterLibrary(xs, ys, thetas, sigmas, offsets, f, freq=freq)
np.save(path_save, L)
lib_path=path_save
An already made Gabor Library well suited for mice can be found here <>
Downsampling and adjusting the range of visual coverage to your analysis:
if (visual_coverage!=analysis_coverage):
visual_coverage=np.array(visual_coverage)
analysis_coverage=np.array(analysis_coverage)
ratio_x=1-((visual_coverage[0]-visual_coverage[1])-(analysis_coverage[0]-analysis_coverage[1]))/(visual_coverage[0]-visual_coverage[1])
ratio_y=1-((visual_coverage[2]-visual_coverage[3])-(analysis_coverage[2]-analysis_coverage[3]))/(visual_coverage[2]-visual_coverage[3])
else:
ratio_x=1
ratio_y=1
## downsamples and wavelet transforms the stimulus
wg.downsample_video_binary(movpath,visual_coverage, analysis_coverage, shape=(ny, nx), chunk_size=1000, ratios=(ratio_x, ratio_y))
path=os.path.dirname(movpath)
videodata=np.load(movpath[:-4]+'_downsampled.npy')
wg.waveletDecomposition(videodata, 0, sigmas, path, lib_path)
wg.waveletDecomposition(videodata, 1, sigmas, path, lib_path)
Loading you neural activity and neuron positions :
spks=np.load(spks_path)
parent_dir = os.path.dirname(spks_path)
neuron_pos=np.load(os.join(parent_dir, 'pos.npy'))
## converts neuron position in microns
neuron_pos=lpn.correctNeuronPos(neuron_pos, resolution)
Running the Analysis:
## the spikes data have to be time registered to the stimulus frames
respcorr_zebra = au.repetability_trial3(spks, neuron_pos, plotting=True)
wavelets0, wavelets1, wavelet_c = lpn.coarseWavelet(path,False, nx, ny, 27, 11, n_theta, ns)
## runs correlation analysis
rfs_zebra = au.PearsonCorrelationPinkNoise(wavelet_c.reshape(18000, -1), np.mean(spks[:, :18000], axis=0),
neuron_pos, 27, 11, ns, analysis_coverage, screen_ratio, sigmas_deg,
plotting=True)
## plot neuron receptive field
idx=2441
au.Plot_RF(rfs_zebra[0][idx],4, title=np.max(rfs_zebra[0][idx]))
## plots neuron tuning curves
tuning_curve=au.PlotTuningCurve(rfs_zebra, 2441, analysis_coverage, sigmas_deg, screen_ratio)