Tip

Binder to get interactivity

Attention

To run locally, the code for these interactive demos requires a Jupyter Notebook environment, and the Jupyter Widgets extension (ipywidgets).

Stimuli - Plaids#

stimupy.stimuli.plaids

Gabors#

stimupy.stimuli.plaids.gabors()

import ipywidgets as iw
from stimupy.utils import plot_stim
from stimupy.stimuli.plaids import gabors

# Define widgets
w_height = iw.IntSlider(value=10, min=1, max=20, description="height [deg]")
w_width = iw.IntSlider(value=10, min=1, max=20, description="width [deg]")
w_ppd = iw.IntSlider(value=20, min=1, max=40, description="ppd")

w_ori = iw.Dropdown(value="mean", options=['mean', 'corner', 'center'], description="origin")
w_period = iw.Dropdown(value="ignore", options=['ignore', 'even', 'odd', 'either'], description="period")
w_round = iw.ToggleButton(value=False, disabled=False, description="round phase")
w_mask = iw.Dropdown(value=False, options=[False, 'gaussian_mask', 'grating_mask', 'grating_mask2'], description="add mask")

w_sigma = iw.FloatSlider(value=2, min=0, max=4, description="sigma [deg]")
w_weight1 = iw.FloatSlider(value=1, min=0, max=1, description="weight1")
w_weight2 = iw.FloatSlider(value=1, min=0, max=1, description="weight2")

# Grating 1
w_freq1 = iw.FloatSlider(value=1, min=0, max=2, description="frequency1 [cpd]")
w_phase1 = iw.FloatSlider(value=0, min=0, max=360, description="phase shift1 [deg]")
w_rot1 = iw.FloatSlider(value=0, min=0, max=360, description="rotation1 [deg]")

w_int11 = iw.FloatSlider(value=1, min=0, max=1, description="int1-1")
w_int12 = iw.FloatSlider(value=0, min=0, max=1, description="int1_2")

# Grating 2
w_freq2 = iw.FloatSlider(value=1, min=0, max=2, description="frequency2 [cpd]")
w_phase2 = iw.FloatSlider(value=0, min=0, max=360, description="phase shift2 [deg]")
w_rot2 = iw.FloatSlider(value=90, min=0, max=360, description="rotation2 [deg]")

w_int21 = iw.FloatSlider(value=1, min=0, max=1, description="int2-1")
w_int22 = iw.FloatSlider(value=0, min=0, max=1, description="int2_2")


# Layout
b_im_size = iw.HBox([w_height, w_width, w_ppd])
b_weight = iw.HBox([w_sigma, w_weight1, w_weight2])
b_add = iw.HBox([w_ori, w_period, w_round, w_mask])

b_geometry1 = iw.HBox([w_freq1, w_phase1, w_rot1])
b_intensities1 = iw.HBox([w_int11, w_int12])

b_geometry2 = iw.HBox([w_freq2, w_phase2, w_rot2])
b_intensities2 = iw.HBox([w_int21, w_int22])

ui = iw.VBox([b_im_size, b_weight, b_add, b_geometry1, b_intensities1, b_geometry2, b_intensities2])

# Function for showing stim
def show_gabors(
    height=None,
    width=None,
    ppd=None,
    sigma=None,
    weight1=None,
    weight2=None,
    rotation1=None,
    frequency1=None,
    phase_shift1=None,
    int11=None,
    int12=None,
    rotation2=None,
    frequency2=None,
    phase_shift2=None,
    int21=None,
    int22=None,
    origin=None,
    round_phase_width=False,
    period=None,
    add_mask=False,
):
    try:
        p_common = {
            "visual_size": (height, width),
            "ppd": ppd,
            "origin": origin,
            "round_phase_width": round_phase_width,
            "period": period,
            "sigma": sigma,
        }
        
        p_grating1 = {
            "frequency": frequency1,
            "rotation": rotation1,
            "phase_shift": phase_shift1,
            "intensity_bars": (int11, int12),
        }
        
        p_grating2 = {
            "frequency": frequency2,
            "rotation": rotation2,
            "phase_shift": phase_shift2,
            "intensity_bars": (int21, int22),
        }

        stim = gabors(
            gabor_parameters1={**p_common, **p_grating1},
            gabor_parameters2={**p_common, **p_grating2},
            weight1=weight1,
            weight2=weight2,
        )
        plot_stim(stim, mask=add_mask)
    except Exception as e:
        raise ValueError(f"Invalid parameter combination: {e}") from None

# Set interactivity
out = iw.interactive_output(
    show_gabors,
    {
        "height": w_height,
        "width": w_width,
        "ppd": w_ppd,
        "sigma": w_sigma,
        "weight1": w_weight1,
        "weight2": w_weight2,
        "rotation1": w_rot1,
        "frequency1": w_freq1,
        "phase_shift1": w_phase1,
        "int11": w_int11,
        "int12": w_int12,
        "rotation2": w_rot2,
        "frequency2": w_freq2,
        "phase_shift2": w_phase2,
        "int21": w_int21,
        "int22": w_int22,
        "origin": w_ori,
        "round_phase_width": w_round,
        "period": w_period,
        "add_mask": w_mask,
    },
)

# Show
display(ui, out)

Sine-waves#

stimupy.stimuli.plaids.sine_waves()

import ipywidgets as iw
from stimupy.utils import plot_stim
from stimupy.stimuli.plaids import sine_waves

# Define widgets
w_height = iw.IntSlider(value=10, min=1, max=20, description="height [deg]")
w_width = iw.IntSlider(value=10, min=1, max=20, description="width [deg]")
w_ppd = iw.IntSlider(value=20, min=1, max=40, description="ppd")

w_ori = iw.Dropdown(value="mean", options=['mean', 'corner', 'center'], description="origin")
w_period = iw.Dropdown(value="ignore", options=['ignore', 'even', 'odd', 'either'], description="period")
w_round = iw.ToggleButton(value=False, disabled=False, description="round phase")
w_mask = iw.Dropdown(value=False, options=[False, 'gaussian_mask', 'grating_mask', 'grating_mask2'], description="add mask")

w_weight1 = iw.FloatSlider(value=1, min=0, max=1, description="weight1")
w_weight2 = iw.FloatSlider(value=1, min=0, max=1, description="weight2")

# Grating 1
w_freq1 = iw.FloatSlider(value=1, min=0, max=2, description="frequency1 [cpd]")
w_phase1 = iw.FloatSlider(value=0, min=0, max=360, description="phase shift1 [deg]")
w_rot1 = iw.FloatSlider(value=0, min=0, max=360, description="rotation1 [deg]")

w_int11 = iw.FloatSlider(value=1, min=0, max=1, description="int1-1")
w_int12 = iw.FloatSlider(value=0, min=0, max=1, description="int1_2")

# Grating 2
w_freq2 = iw.FloatSlider(value=1, min=0, max=2, description="frequency2 [cpd]")
w_phase2 = iw.FloatSlider(value=0, min=0, max=360, description="phase shift2 [deg]")
w_rot2 = iw.FloatSlider(value=90, min=0, max=360, description="rotation2 [deg]")

w_int21 = iw.FloatSlider(value=1, min=0, max=1, description="int2-1")
w_int22 = iw.FloatSlider(value=0, min=0, max=1, description="int2_2")


# Layout
b_im_size = iw.HBox([w_height, w_width, w_ppd])
b_weight = iw.HBox([w_weight1, w_weight2])
b_add = iw.HBox([w_ori, w_period, w_round, w_mask])

b_geometry1 = iw.HBox([w_freq1, w_phase1, w_rot1])
b_intensities1 = iw.HBox([w_int11, w_int12])

b_geometry2 = iw.HBox([w_freq2, w_phase2, w_rot2])
b_intensities2 = iw.HBox([w_int21, w_int22])

ui = iw.VBox([b_im_size, b_weight, b_add, b_geometry1, b_intensities1, b_geometry2, b_intensities2])

# Function for showing stim
def show_sine_waves(
    height=None,
    width=None,
    ppd=None,
    sigma=None,
    weight1=None,
    weight2=None,
    rotation1=None,
    frequency1=None,
    phase_shift1=None,
    int11=None,
    int12=None,
    rotation2=None,
    frequency2=None,
    phase_shift2=None,
    int21=None,
    int22=None,
    origin=None,
    round_phase_width=False,
    period=None,
    add_mask=False,
):
    try:
        p_common = {
            "visual_size": (height, width),
            "ppd": ppd,
            "origin": origin,
            "round_phase_width": round_phase_width,
            "period": period,
        }
        
        p_grating1 = {
            "frequency": frequency1,
            "rotation": rotation1,
            "phase_shift": phase_shift1,
            "intensities": (int11, int12),
        }
        
        p_grating2 = {
            "frequency": frequency2,
            "rotation": rotation2,
            "phase_shift": phase_shift2,
            "intensities": (int21, int22),
        }

        stim = sine_waves(
            grating_parameters1={**p_common, **p_grating1},
            grating_parameters2={**p_common, **p_grating2},
            weight1=weight1,
            weight2=weight2,
        )
        plot_stim(stim, mask=add_mask)
    except Exception as e:
        raise ValueError(f"Invalid parameter combination: {e}") from None

# Set interactivity
out = iw.interactive_output(
    show_sine_waves,
    {
        "height": w_height,
        "width": w_width,
        "ppd": w_ppd,
        "sigma": w_sigma,
        "weight1": w_weight1,
        "weight2": w_weight2,
        "rotation1": w_rot1,
        "frequency1": w_freq1,
        "phase_shift1": w_phase1,
        "int11": w_int11,
        "int12": w_int12,
        "rotation2": w_rot2,
        "frequency2": w_freq2,
        "phase_shift2": w_phase2,
        "int21": w_int21,
        "int22": w_int22,
        "origin": w_ori,
        "round_phase_width": w_round,
        "period": w_period,
        "add_mask": w_mask,
    },
)

# Show
display(ui, out)

Square-waves#

stimupy.stimuli.plaids.square_waves()

import ipywidgets as iw
from stimupy.utils import plot_stim
from stimupy.stimuli.plaids import square_waves

# Define widgets
w_height = iw.IntSlider(value=10, min=1, max=20, description="height [deg]")
w_width = iw.IntSlider(value=10, min=1, max=20, description="width [deg]")
w_ppd = iw.IntSlider(value=20, min=1, max=40, description="ppd")

w_ori = iw.Dropdown(value="mean", options=['mean', 'corner', 'center'], description="origin")
w_period = iw.Dropdown(value="ignore", options=['ignore', 'even', 'odd', 'either'], description="period")
w_round = iw.ToggleButton(value=False, disabled=False, description="round phase")
w_mask = iw.Dropdown(value=False, options=[False, 'gaussian_mask', 'grating_mask', 'grating_mask2'], description="add mask")

w_weight1 = iw.FloatSlider(value=1, min=0, max=1, description="weight1")
w_weight2 = iw.FloatSlider(value=1, min=0, max=1, description="weight2")

# Grating 1
w_freq1 = iw.FloatSlider(value=1, min=0, max=2, description="frequency1 [cpd]")
w_phase1 = iw.FloatSlider(value=0, min=0, max=360, description="phase shift1 [deg]")
w_rot1 = iw.FloatSlider(value=0, min=0, max=360, description="rotation1 [deg]")

w_int11 = iw.FloatSlider(value=1, min=0, max=1, description="int1-1")
w_int12 = iw.FloatSlider(value=0, min=0, max=1, description="int1_2")

# Grating 2
w_freq2 = iw.FloatSlider(value=1, min=0, max=2, description="frequency2 [cpd]")
w_phase2 = iw.FloatSlider(value=0, min=0, max=360, description="phase shift2 [deg]")
w_rot2 = iw.FloatSlider(value=90, min=0, max=360, description="rotation2 [deg]")

w_int21 = iw.FloatSlider(value=1, min=0, max=1, description="int2-1")
w_int22 = iw.FloatSlider(value=0, min=0, max=1, description="int2_2")


# Layout
b_im_size = iw.HBox([w_height, w_width, w_ppd])
b_weight = iw.HBox([w_weight1, w_weight2])
b_add = iw.HBox([w_ori, w_period, w_round, w_mask])

b_geometry1 = iw.HBox([w_freq1, w_phase1, w_rot1])
b_intensities1 = iw.HBox([w_int11, w_int12])

b_geometry2 = iw.HBox([w_freq2, w_phase2, w_rot2])
b_intensities2 = iw.HBox([w_int21, w_int22])

ui = iw.VBox([b_im_size, b_weight, b_add, b_geometry1, b_intensities1, b_geometry2, b_intensities2])

# Function for showing stim
def show_square_waves(
    height=None,
    width=None,
    ppd=None,
    sigma=None,
    weight1=None,
    weight2=None,
    rotation1=None,
    frequency1=None,
    phase_shift1=None,
    int11=None,
    int12=None,
    rotation2=None,
    frequency2=None,
    phase_shift2=None,
    int21=None,
    int22=None,
    origin=None,
    round_phase_width=False,
    period=None,
    add_mask=False,
):
    try:
        p_common = {
            "visual_size": (height, width),
            "ppd": ppd,
            "origin": origin,
            "round_phase_width": round_phase_width,
            "period": period,
        }
        
        p_grating1 = {
            "frequency": frequency1,
            "rotation": rotation1,
            "phase_shift": phase_shift1,
            "intensity_bars": (int11, int12),
        }
        
        p_grating2 = {
            "frequency": frequency2,
            "rotation": rotation2,
            "phase_shift": phase_shift2,
            "intensity_bars": (int21, int22),
        }

        stim = square_waves(
            grating_parameters1={**p_common, **p_grating1},
            grating_parameters2={**p_common, **p_grating2},
            weight1=weight1,
            weight2=weight2,
        )
        plot_stim(stim, mask=add_mask)
    except Exception as e:
        raise ValueError(f"Invalid parameter combination: {e}") from None

# Set interactivity
out = iw.interactive_output(
    show_square_waves,
    {
        "height": w_height,
        "width": w_width,
        "ppd": w_ppd,
        "sigma": w_sigma,
        "weight1": w_weight1,
        "weight2": w_weight2,
        "rotation1": w_rot1,
        "frequency1": w_freq1,
        "phase_shift1": w_phase1,
        "int11": w_int11,
        "int12": w_int12,
        "rotation2": w_rot2,
        "frequency2": w_freq2,
        "phase_shift2": w_phase2,
        "int21": w_int21,
        "int22": w_int22,
        "origin": w_ori,
        "round_phase_width": w_round,
        "period": w_period,
        "add_mask": w_mask,
    },
)

# Show
display(ui, out)