From 9f9825eaab136a7701309d894d01d093843ba07e Mon Sep 17 00:00:00 2001 From: Joris Vincent Date: Wed, 22 Mar 2023 13:50:40 +0100 Subject: [PATCH 01/12] `distance_metric` to refer to `image_base` components and `rotation` to refer to other `orientations` Closes #8 --- docs/reference/demos/components/waves.md | 30 +++++----- docs/reference/demos/stimuli/plaids.md | 2 +- stimupy/components/__init__.py | 8 +-- stimupy/components/angulars.py | 4 +- stimupy/components/frames.py | 2 +- stimupy/components/gaussians.py | 4 +- stimupy/components/radials.py | 2 +- stimupy/components/shapes.py | 10 ++-- stimupy/components/waves.py | 72 ++++++++++++------------ stimupy/papers/white1981.py | 38 ++++++------- stimupy/papers/white1985.py | 2 +- stimupy/stimuli/checkerboards.py | 8 +-- stimupy/stimuli/gabors.py | 2 +- stimupy/stimuli/gratings.py | 16 +++--- stimupy/stimuli/plaids.py | 2 +- stimupy/stimuli/waves.py | 38 ++++++------- tests/test_waves.py | 2 +- 17 files changed, 121 insertions(+), 121 deletions(-) diff --git a/docs/reference/demos/components/waves.md b/docs/reference/demos/components/waves.md index 58994029..6976ec02 100644 --- a/docs/reference/demos/components/waves.md +++ b/docs/reference/demos/components/waves.md @@ -39,7 +39,7 @@ 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_base_type = iw.Dropdown(value="horizontal", options=['horizontal','vertical','rotated','radial','cityblock','angular'], description="base_type") +w_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','rotated','radial','cityblock','angular'], description="distance_metric") w_freq = iw.FloatSlider(value=1, min=0, max=2, description="frequency [cpd]") w_phase = iw.FloatSlider(value=0, min=0, max=360, description="phase shift [deg]") w_rot = iw.FloatSlider(value=0, min=0, max=360, description="rotation [deg]") @@ -54,7 +54,7 @@ w_mask = iw.ToggleButton(value=False, disabled=False, description="add mask") # Layout b_im_size = iw.HBox([w_height, w_width, w_ppd]) -b_geometry = iw.HBox([w_base_type, w_freq, w_phase, w_rot]) +b_geometry = iw.HBox([w_distance_metric, w_freq, w_phase, w_rot]) b_intensities = iw.HBox([w_int1, w_int2]) b_add = iw.HBox([w_ori, w_period, w_round, w_mask]) ui = iw.VBox([b_im_size, b_geometry, b_intensities, b_add]) @@ -64,7 +64,7 @@ def show_sine( height=None, width=None, ppd=None, - base_type=None, + distance_metric=None, rotation=None, frequency=None, phase_shift=None, @@ -78,7 +78,7 @@ def show_sine( stim = sine( visual_size=(height, width), ppd=ppd, - base_type=base_type, + distance_metric=distance_metric, rotation=rotation, frequency=frequency, phase_shift=phase_shift, @@ -96,7 +96,7 @@ out = iw.interactive_output( "height": w_height, "width": w_width, "ppd": w_ppd, - "base_type": w_base_type, + "distance_metric": w_distance_metric, "rotation": w_rot, "frequency": w_freq, "phase_shift": w_phase, @@ -124,7 +124,7 @@ 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_base_type = iw.Dropdown(value="horizontal", options=['horizontal','vertical','rotated','radial','cityblock','angular'], description="base_type") +w_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','rotated','radial','cityblock','angular'], description="distance_metric") w_freq = iw.FloatSlider(value=1, min=0, max=2, description="frequency [cpd]") w_phase = iw.FloatSlider(value=0, min=0, max=360, description="phase shift [deg]") w_rot = iw.FloatSlider(value=0, min=0, max=360, description="rotation [deg]") @@ -139,7 +139,7 @@ w_mask = iw.ToggleButton(value=False, disabled=False, description="add mask") # Layout b_im_size = iw.HBox([w_height, w_width, w_ppd]) -b_geometry = iw.HBox([w_base_type, w_freq, w_phase, w_rot]) +b_geometry = iw.HBox([w_distance_metric, w_freq, w_phase, w_rot]) b_intensities = iw.HBox([w_int1, w_int2]) b_add = iw.HBox([w_ori, w_period, w_round, w_mask]) ui = iw.VBox([b_im_size, b_geometry, b_intensities, b_add]) @@ -149,7 +149,7 @@ def show_square( height=None, width=None, ppd=None, - base_type=None, + distance_metric=None, rotation=None, frequency=None, phase_shift=None, @@ -163,7 +163,7 @@ def show_square( stim = square( visual_size=(height, width), ppd=ppd, - base_type=base_type, + distance_metric=distance_metric, rotation=rotation, frequency=frequency, phase_shift=phase_shift, @@ -181,7 +181,7 @@ out = iw.interactive_output( "height": w_height, "width": w_width, "ppd": w_ppd, - "base_type": w_base_type, + "distance_metric": w_distance_metric, "rotation": w_rot, "frequency": w_freq, "phase_shift": w_phase, @@ -209,7 +209,7 @@ 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_base_type = iw.Dropdown(value="horizontal", options=['horizontal','vertical','rotated','radial','cityblock','angular'], description="base_type") +w_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','rotated','radial','cityblock','angular'], description="distance_metric") w_freq = iw.FloatSlider(value=0.5, min=0, max=2, description="frequency [cpd]") w_rot = iw.FloatSlider(value=0, min=0, max=360, description="rotation [deg]") w_phase = iw.FloatSlider(value=0, min=0, max=360, description="phase shift [deg]") @@ -224,7 +224,7 @@ w_mask = iw.ToggleButton(value=False, disabled=False, description="add mask") # Layout b_im_size = iw.HBox([w_height, w_width, w_ppd]) -b_geometry = iw.HBox([w_base_type, w_freq, w_phase, w_rot]) +b_geometry = iw.HBox([w_distance_metric, w_freq, w_phase, w_rot]) b_intensities = iw.HBox([w_int1, w_int2]) b_add = iw.HBox([w_ori, w_period, w_round, w_mask]) ui = iw.VBox([b_im_size, b_geometry, b_intensities, b_add]) @@ -234,7 +234,7 @@ def show_staircase( height=None, width=None, ppd=None, - base_type=None, + distance_metric=None, rotation=None, frequency=None, phase_shift=None, @@ -248,7 +248,7 @@ def show_staircase( stim = staircase( visual_size=(height, width), ppd=ppd, - base_type=base_type, + distance_metric=distance_metric, rotation=rotation, frequency=frequency, phase_shift=phase_shift, @@ -266,7 +266,7 @@ out = iw.interactive_output( "height": w_height, "width": w_width, "ppd": w_ppd, - "base_type": w_base_type, + "distance_metric": w_distance_metric, "rotation": w_rot, "frequency": w_freq, "int1": w_int1, diff --git a/docs/reference/demos/stimuli/plaids.md b/docs/reference/demos/stimuli/plaids.md index ffddf352..1b91f872 100644 --- a/docs/reference/demos/stimuli/plaids.md +++ b/docs/reference/demos/stimuli/plaids.md @@ -107,7 +107,7 @@ def show_plaid( "origin": origin, "round_phase_width": round_phase_width, "period": period, - "base_type": "rotated", + "distance_metric": "rotated", } p_grating1 = { diff --git a/stimupy/components/__init__.py b/stimupy/components/__init__.py index 3773973c..b58923ec 100644 --- a/stimupy/components/__init__.py +++ b/stimupy/components/__init__.py @@ -112,7 +112,7 @@ def image_base(visual_size=None, shape=None, ppd=None, rotation=0.0, origin="mea def mask_elements( - orientation, + distance_metric, edges, shape=None, visual_size=None, @@ -124,7 +124,7 @@ def mask_elements( Parameters ---------- - orientation : any of keys in stimupy.components.image_base() + distance_metric : any of keys in stimupy.components.image_base() which dimension to mask over edges : Sequence[Number] upper-limit of each consecutive elements @@ -152,7 +152,7 @@ def mask_elements( base = image_base( shape=shape, visual_size=visual_size, ppd=ppd, rotation=rotation, origin=origin ) - distances = base[orientation] + distances = base[distance_metric] distances = np.round(distances, 8) # Mark elements with integer idx-value @@ -164,7 +164,7 @@ def mask_elements( return { "mask": mask, "edges": edges, - "orientation": orientation, + "distance_metric": distance_metric, "rotation": base["rotation"], "shape": base["shape"], "visual_size": base["visual_size"], diff --git a/stimupy/components/angulars.py b/stimupy/components/angulars.py index e4b1355d..8f37d31e 100644 --- a/stimupy/components/angulars.py +++ b/stimupy/components/angulars.py @@ -46,7 +46,7 @@ def mask_angle( """ stim = mask_elements( edges=np.deg2rad(angles), - orientation="angular", + distance_metric="angular", rotation=rotation, shape=shape, visual_size=visual_size, @@ -178,7 +178,7 @@ def mask_segments( and additional keys containing stimulus parameters """ stim = mask_elements( - orientation="angular", + distance_metric="angular", edges=np.deg2rad(edges), rotation=rotation, shape=shape, diff --git a/stimupy/components/frames.py b/stimupy/components/frames.py index c5bca028..9401f032 100644 --- a/stimupy/components/frames.py +++ b/stimupy/components/frames.py @@ -38,7 +38,7 @@ def mask_frames( and additional keys containing stimulus parameters """ stim = mask_elements( - orientation="cityblock", + distance_metric="cityblock", edges=edges, rotation=0.0, shape=shape, diff --git a/stimupy/components/gaussians.py b/stimupy/components/gaussians.py index 6e977960..8d199bc1 100644 --- a/stimupy/components/gaussians.py +++ b/stimupy/components/gaussians.py @@ -30,7 +30,7 @@ def gaussian( sigma : float or (float, float) Sigma auf Gaussian in degree visual angle (y, x) rotation : float - Orientation of Gaussian in degree (default 0) + Rotation of Gaussian in degree (default 0) intensity_max : float Maximal intensity value of Gaussian origin : "corner", "mean" or "center" @@ -61,7 +61,7 @@ def gaussian( xx = base["horizontal"] yy = base["vertical"] - # convert orientation parameter to radians + # convert rotation parameter to radians theta = np.deg2rad(-rotation) # determine a, b, c coefficients diff --git a/stimupy/components/radials.py b/stimupy/components/radials.py index 302c8a8f..0b96b841 100644 --- a/stimupy/components/radials.py +++ b/stimupy/components/radials.py @@ -58,7 +58,7 @@ def mask_rings( # Mark elements with integer idx-value stim = mask_elements( - orientation="radial", + distance_metric="radial", edges=radii, rotation=0.0, shape=shape, diff --git a/stimupy/components/shapes.py b/stimupy/components/shapes.py index f3e67100..ccf074ff 100644 --- a/stimupy/components/shapes.py +++ b/stimupy/components/shapes.py @@ -49,7 +49,7 @@ def rectangle( intensity_background : float, optional intensity value of background, by default 0.0 rotation : float - orientation of rectangle in degrees visual angle (default 0) + rotation of rectangle in degrees visual angle (default 0) Returns ------- @@ -164,7 +164,7 @@ def triangle( intensity_background : float, optional intensity value of background, by default 0.0 rotation : float - orientation of triangle in degrees visual angle (default 0) + rotation of triangle in degrees visual angle (default 0) Returns ------- @@ -256,7 +256,7 @@ def cross( intensity_background : float, optional intensity value of background, by default 0.0 rotation : float - orientation of triangle in degrees visual angle (default 0) + rotation of triangle in degrees visual angle (default 0) Returns ------- @@ -358,7 +358,7 @@ def parallelogram( intensity_background : float, optional intensity value of background, by default 0.0 rotation : float - orientation of triangle in degrees visual angle (default 0) + rotation of triangle in degrees visual angle (default 0) Returns ------- @@ -472,7 +472,7 @@ def ellipse( intensity_background : float, optional intensity value of background, by default 0.0 rotation : float - orientation of triangle in degrees visual angle (default 0) + rotation of triangle in degrees visual angle (default 0) origin : "corner", "mean" or "center" if "corner": set origin to upper left corner if "mean": set origin to hypothetical image center (default) diff --git a/stimupy/components/waves.py b/stimupy/components/waves.py index 7d0ef408..aafecc1f 100644 --- a/stimupy/components/waves.py +++ b/stimupy/components/waves.py @@ -256,10 +256,10 @@ def sine( phase_shift=None, intensities=(0.0, 1.0), origin=None, - base_type=None, + distance_metric=None, round_phase_width=None, ): - """Draw a sine-wave grating given a certain base_type + """Draw a sine-wave grating given a certain distance_metric Parameters ---------- @@ -289,7 +289,7 @@ def sine( if "corner": set origin to upper left corner if "mean": set origin to hypothetical image center if "center": set origin to real center (closest existing value to mean) - base_type : str or None + distance_metric : str or None if "horizontal", use distance from origin in x-direction, if "vertical", use distance from origin in x-direction; if "rotated", use combined and rotated distance from origin in x-y; @@ -317,9 +317,9 @@ def sine( if period is None: period = "ignore" - base_types = ["horizontal", "vertical", "rotated", "radial", "angular", "cityblock"] - if base_type not in base_types: - raise ValueError(f"base_type needs to be one of {base_types}") + distance_metrics = ["horizontal", "vertical", "rotated", "radial", "angular", "cityblock"] + if distance_metric not in distance_metrics: + raise ValueError(f"distance_metric needs to be one of {distance_metrics}") lst = [visual_size, ppd, shape, frequency, n_phases, phase_width] if len([x for x in lst if x is not None]) < 3: @@ -401,7 +401,7 @@ def sine( base = image_base( shape=shape, visual_size=visual_size, ppd=ppd, rotation=rotation, origin=origin ) - distances = base[base_type] + distances = base[distance_metric] distances = np.round(distances, 6) # Shift distances minimally to ensure proper behavior @@ -418,7 +418,7 @@ def sine( # Create mask dmax = max(distances.max(), -distances.min()) + (phase_width / 2) - if origin == "corner" or base_type == "radial" or base_type == "cityblock": + if origin == "corner" or distance_metric == "radial" or distance_metric == "cityblock": edges = np.arange(distances.min() + (phase_width / 2), dmax, phase_width) if origin == "mean": @@ -451,7 +451,7 @@ def sine( "phase_shift": phase_shift, "round_phase_width": round_phase_width, "origin": origin, - "base_type": base_type, + "distance_metric": distance_metric, "intensities": intensities, } return stim @@ -469,10 +469,10 @@ def square( phase_shift=None, intensities=(0.0, 1.0), origin=None, - base_type=None, + distance_metric=None, round_phase_width=None, ): - """Draw a square-wave grating given a certain base_type + """Draw a square-wave grating given a certain distance_metric Parameters ---------- @@ -502,7 +502,7 @@ def square( if "corner": set origin to upper left corner if "mean": set origin to hypothetical image center if "center": set origin to real center (closest existing value to mean) - base_type : str or None + distance_metric : str or None if "horizontal", use distance from origin in x-direction, if "vertical", use distance from origin in x-direction; if "rotated", use combined and rotated distance from origin in x-y; @@ -533,7 +533,7 @@ def square( intensities=intensities, origin=origin, round_phase_width=round_phase_width, - base_type=base_type, + distance_metric=distance_metric, ) # Round sine-wave to create square wave @@ -552,7 +552,7 @@ def staircase( rotation=0.0, phase_shift=None, origin=None, - base_type=None, + distance_metric=None, round_phase_width=None, intensities=(0.0, 1.0), ): @@ -584,7 +584,7 @@ def staircase( if "corner": set origin to upper left corner if "mean": set origin to hypothetical image center if "center": set origin to real center (closest existing value to mean) - base_type : str or None + distance_metric : str or None if "horizontal", use distance from origin in x-direction, if "vertical", use distance from origin in x-direction; if "rotated", use combined and rotated distance from origin in x-y; @@ -619,7 +619,7 @@ def staircase( phase_shift=phase_shift, origin=origin, round_phase_width=round_phase_width, - base_type=base_type, + distance_metric=distance_metric, ) if len(intensities) == 2: @@ -717,26 +717,26 @@ def overview(**kwargs): # fmt: off stimuli = { - "sine wave - horizontal": sine(**default_params, **grating_params, base_type="horizontal"), - "sine wave - vertical": sine(**default_params, **grating_params, base_type="vertical"), - "sine wave - oblique": sine(**default_params, **grating_params, base_type="rotated", rotation=30), - "sine wave - radial": sine(**default_params, **grating_params, base_type="radial"), - "sine wave - angular": sine(**default_params, **grating_params, base_type="angular"), - "sine wave - cityblock": sine(**default_params, **grating_params, base_type="cityblock"), - - "square wave - horizontal": square(**default_params, **grating_params, base_type="horizontal"), - "square wave - vertical": square(**default_params, **grating_params, base_type="vertical"), - "square wave - oblique": square(**default_params, **grating_params, base_type="rotated", rotation=30), - "square wave - radial": square(**default_params, **grating_params, base_type="radial"), - "square wave - angular": square(**default_params, **grating_params, base_type="angular"), - "square wave - cityblock": square(**default_params, **grating_params, base_type="cityblock"), - - "staircase - horizontal": staircase(**default_params, **grating_params, base_type="horizontal"), - "staircase - vertical": staircase(**default_params, **grating_params, base_type="vertical"), - "staircase - oblique": staircase(**default_params, **grating_params, base_type="rotated", rotation=30), - "staircase - radial": staircase(**default_params, **grating_params, base_type="radial"), - "staircase - angular": staircase(**default_params, **grating_params, base_type="angular"), - "staircase - cityblock": staircase(**default_params, **grating_params, base_type="cityblock"), + "sine wave - horizontal": sine(**default_params, **grating_params, distance_metric="horizontal"), + "sine wave - vertical": sine(**default_params, **grating_params, distance_metric="vertical"), + "sine wave - oblique": sine(**default_params, **grating_params, distance_metric="rotated", rotation=30), + "sine wave - radial": sine(**default_params, **grating_params, distance_metric="radial"), + "sine wave - angular": sine(**default_params, **grating_params, distance_metric="angular"), + "sine wave - cityblock": sine(**default_params, **grating_params, distance_metric="cityblock"), + + "square wave - horizontal": square(**default_params, **grating_params, distance_metric="horizontal"), + "square wave - vertical": square(**default_params, **grating_params, distance_metric="vertical"), + "square wave - oblique": square(**default_params, **grating_params, distance_metric="rotated", rotation=30), + "square wave - radial": square(**default_params, **grating_params, distance_metric="radial"), + "square wave - angular": square(**default_params, **grating_params, distance_metric="angular"), + "square wave - cityblock": square(**default_params, **grating_params, distance_metric="cityblock"), + + "staircase - horizontal": staircase(**default_params, **grating_params, distance_metric="horizontal"), + "staircase - vertical": staircase(**default_params, **grating_params, distance_metric="vertical"), + "staircase - oblique": staircase(**default_params, **grating_params, distance_metric="rotated", rotation=30), + "staircase - radial": staircase(**default_params, **grating_params, distance_metric="radial"), + "staircase - angular": staircase(**default_params, **grating_params, distance_metric="angular"), + "staircase - cityblock": staircase(**default_params, **grating_params, distance_metric="cityblock"), "bessel": bessel(**default_params, frequency=0.5), } diff --git a/stimupy/papers/white1981.py b/stimupy/papers/white1981.py index 571517d2..34fc877d 100644 --- a/stimupy/papers/white1981.py +++ b/stimupy/papers/white1981.py @@ -56,7 +56,7 @@ BAR_WIDTH = 0.08 # originally 0.0855 deg PPD = 50 -ORIENTATION = 90 +ROTATION = 90 v1, v2, v3 = 0.0, 0.5, 1.0 @@ -200,7 +200,7 @@ def grating_white_white(ppd=PPD): "ppd": ppd, "n_bars": 9, "bar_width": bar_width, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_background": v3, "intensity_bars": (v3, v2), "intensity_target": v2, @@ -243,7 +243,7 @@ def grating_white_black(ppd=PPD): "ppd": ppd, "grating_size": bar_width * 9, "bar_width": bar_width, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_background": v1, "intensity_bars": (v3, v2), "intensity_target": v2, @@ -286,7 +286,7 @@ def grating_black_white(ppd=PPD): "ppd": ppd, "grating_size": bar_width * 9, "bar_width": bar_width, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_background": v3, "intensity_bars": (v1, v2), "intensity_target": v2, @@ -329,7 +329,7 @@ def grating_black_black(ppd=PPD): "ppd": ppd, "grating_size": bar_width * 9, "bar_width": bar_width, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_background": v1, "intensity_bars": (v1, v2), "intensity_target": v2, @@ -371,7 +371,7 @@ def grating_white_in(ppd=PPD): "bar_width": bar_width, "n_bars": 9, "ppd": ppd, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_bars": (v3, v1), "intensity_target": v2, "target_indices": (1, 3, 5, 7), @@ -380,7 +380,7 @@ def grating_white_in(ppd=PPD): "bar_width": bar_width, "visual_size": 51 * bar_width, "ppd": ppd, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_bars": (v1, v3), } stim = stimupy.gratings.on_grating( @@ -423,7 +423,7 @@ def grating_black_in(ppd=PPD): "bar_width": bar_width, "n_bars": 9, "ppd": ppd, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_bars": (v1, v3), "intensity_target": v2, "target_indices": (1, 3, 5, 7), @@ -432,7 +432,7 @@ def grating_black_in(ppd=PPD): "bar_width": bar_width, "visual_size": 51 * bar_width, "ppd": ppd, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_bars": (v3, v1), } stim = stimupy.gratings.on_grating( @@ -475,7 +475,7 @@ def grating_white_out(ppd=PPD): "bar_width": bar_width, "visual_size": (50 * bar_width, 9 * bar_width), "ppd": ppd, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_bars": (v3, v1), "intensity_target": v2, "target_indices": (23, 25, 27, 29), @@ -484,7 +484,7 @@ def grating_white_out(ppd=PPD): "bar_width": bar_width, "visual_size": 50 * bar_width, "ppd": ppd, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_bars": (v1, v3), } stim = stimupy.gratings.on_grating( @@ -527,7 +527,7 @@ def grating_black_out(ppd=PPD): "bar_width": bar_width, "visual_size": (50 * bar_width, 9 * bar_width), "ppd": ppd, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_bars": (v1, v3), "intensity_target": v2, "target_indices": (23, 25, 27, 29), @@ -536,7 +536,7 @@ def grating_black_out(ppd=PPD): "bar_width": bar_width, "visual_size": 50 * bar_width, "ppd": ppd, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_bars": (v3, v1), } stim = stimupy.gratings.on_grating( @@ -579,7 +579,7 @@ def grating_white_orthogonal(ppd=PPD): "visual_size": (17 * bar_width, 9 * bar_width), "bar_width": bar_width, "ppd": ppd, - "rotation": ORIENTATION + 90, + "rotation": ROTATION + 90, "intensity_bars": (v3, v2), "intensity_target": v2, "target_indices": (1, 3, 5, 7), @@ -588,14 +588,14 @@ def grating_white_orthogonal(ppd=PPD): "bar_width": bar_width, "visual_size": 51 * bar_width, "ppd": ppd, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_bars": (v1, v3), } stim = stimupy.gratings.on_grating_masked( small_grating_params=small_params, large_grating_params=large_params, mask_size=(9 * bar_width, 9 * bar_width, 8 * bar_width), - mask_rotation=ORIENTATION, + mask_rotation=ROTATION, ) stim["target_mask"] = np.where(stim["target_mask"] != 0, 1, 0) @@ -633,7 +633,7 @@ def grating_black_orthogonal(ppd=PPD): "visual_size": (17 * bar_width, 9 * bar_width), "bar_width": bar_width, "ppd": ppd, - "rotation": ORIENTATION + 90, + "rotation": ROTATION + 90, "intensity_bars": (v1, v3), "intensity_target": v2, "target_indices": (1, 3, 5, 7), @@ -642,14 +642,14 @@ def grating_black_orthogonal(ppd=PPD): "bar_width": bar_width, "visual_size": 51 * bar_width, "ppd": ppd, - "rotation": ORIENTATION, + "rotation": ROTATION, "intensity_bars": (v3, v1), } stim = stimupy.gratings.on_grating_masked( small_grating_params=small_params, large_grating_params=large_params, mask_size=(9 * bar_width, 9 * bar_width, 8 * bar_width), - mask_rotation=ORIENTATION, + mask_rotation=ROTATION, ) stim["target_mask"] = np.where(stim["target_mask"] != 0, 1, 0) diff --git a/stimupy/papers/white1985.py b/stimupy/papers/white1985.py index 8481313d..51cbae7b 100644 --- a/stimupy/papers/white1985.py +++ b/stimupy/papers/white1985.py @@ -59,7 +59,7 @@ COMMON_PARAMS = { "intensity_bars": (v1, v3), "intensity_target": v2, - "orientation": "vertical", + "distance_metric": "vertical", } diff --git a/stimupy/stimuli/checkerboards.py b/stimupy/stimuli/checkerboards.py index 2ff72b5c..c281f35b 100644 --- a/stimupy/stimuli/checkerboards.py +++ b/stimupy/stimuli/checkerboards.py @@ -209,7 +209,7 @@ def checkerboard( intensities=intensity_checks, origin="corner", round_phase_width=round_phase_width, - base_type="rotated", + distance_metric="rotated", ) sw2 = waves.square( @@ -225,7 +225,7 @@ def checkerboard( intensities=intensity_checks, origin="corner", round_phase_width=round_phase_width, - base_type="rotated", + distance_metric="rotated", ) # If neither a visual_size nor a shape was given, each square wave @@ -246,7 +246,7 @@ def checkerboard( intensities=intensity_checks, origin="corner", round_phase_width=round_phase_width, - base_type="rotated", + distance_metric="rotated", ) sw2 = waves.square( @@ -262,7 +262,7 @@ def checkerboard( intensities=intensity_checks, origin="corner", round_phase_width=round_phase_width, - base_type="rotated", + distance_metric="rotated", ) warnings.filterwarnings("default") diff --git a/stimupy/stimuli/gabors.py b/stimupy/stimuli/gabors.py index fc3cf198..06d595f8 100644 --- a/stimupy/stimuli/gabors.py +++ b/stimupy/stimuli/gabors.py @@ -72,7 +72,7 @@ def gabor( phase_shift=phase_shift, intensities=intensities, origin=origin, - base_type="rotated", + distance_metric="rotated", round_phase_width=round_phase_width, ) diff --git a/stimupy/stimuli/gratings.py b/stimupy/stimuli/gratings.py index 6f3d922c..3c0f8ff5 100644 --- a/stimupy/stimuli/gratings.py +++ b/stimupy/stimuli/gratings.py @@ -249,7 +249,7 @@ def phase_shifted( n_bars=None, bar_width=None, period="ignore", - orientation="horizontal", + distance_metric="horizontal", phase_shift=0, intensity_bars=(1.0, 0.0), target_size=None, @@ -261,12 +261,12 @@ def phase_shifted( raise ValueError( "counterphase_induction() missing argument 'target_size' which is not 'None'" ) - if orientation == "horizontal": + if distance_metric == "horizontal": rotation = 0 - elif orientation == "vertical": + elif distance_metric == "vertical": rotation = 90 else: - raise ValueError("orientation must be horizontal or vertical") + raise ValueError("distance_metric must be horizontal or vertical") # Spatial square-wave grating stim = squarewave( @@ -313,23 +313,23 @@ def phase_shifted( # Shift targets by specified phase cy, cx = stim["shape"] if target_phase_shift < 0: - if orientation == "horizontal": + if distance_metric == "horizontal": stim_target["img"][:, 0 : cx - target_shifti] = stim_target["img"][:, target_shifti::] stim_target["grating_mask"][:, 0 : cx - target_shifti] = stim_target["grating_mask"][ :, target_shifti:: ] - elif orientation == "vertical": + elif distance_metric == "vertical": stim_target["img"][0 : cx - target_shifti, :] = stim_target["img"][target_shifti::, :] stim_target["grating_mask"][0 : cx - target_shifti, :] = stim_target["grating_mask"][ target_shifti::, : ] else: - if orientation == "horizontal": + if distance_metric == "horizontal": stim_target["img"][:, target_shifti::] = stim_target["img"][:, 0 : cx - target_shifti] stim_target["grating_mask"][:, target_shifti::] = stim_target["grating_mask"][ :, 0 : cx - target_shifti ] - elif orientation == "vertical": + elif distance_metric == "vertical": stim_target["img"][target_shifti::, :] = stim_target["img"][0 : cx - target_shifti, :] stim_target["grating_mask"][target_shifti::, :] = stim_target["grating_mask"][ 0 : cx - target_shifti, : diff --git a/stimupy/stimuli/plaids.py b/stimupy/stimuli/plaids.py index a9c6ecdb..39449a7b 100644 --- a/stimupy/stimuli/plaids.py +++ b/stimupy/stimuli/plaids.py @@ -84,7 +84,7 @@ def overview(**kwargs): "ppd": 10, "origin": "center", "phase_shift": 30, - "base_type": "rotated", + "distance_metric": "rotated", } default_params.update(kwargs) diff --git a/stimupy/stimuli/waves.py b/stimupy/stimuli/waves.py index 1affd7ab..2dc690dd 100644 --- a/stimupy/stimuli/waves.py +++ b/stimupy/stimuli/waves.py @@ -114,11 +114,11 @@ def sine_linear( ) if rotation % 180 == 0.0: - base_type = "horizontal" + distance_metric = "horizontal" elif rotation % 180 == 90.0: - base_type = "vertical" + distance_metric = "vertical" else: - base_type = "rotated" + distance_metric = "rotated" # Spatial square-wave grating stim = waves.sine( @@ -134,13 +134,13 @@ def sine_linear( intensities=intensities, origin=origin, round_phase_width=round_phase_width, - base_type=base_type, + distance_metric=distance_metric, ) # Repackage output stim["n_bars"] = stim.pop("n_phases") stim["bar_width"] = stim.pop("phase_width") - stim.pop("base_type") + stim.pop("distance_metric") # Add targets(?) if target_indices is not None and target_indices != (): @@ -233,7 +233,7 @@ def square_linear( phase_shift=phase_shift, origin=origin, round_phase_width=round_phase_width, - base_type="rotated", + distance_metric="rotated", ) # Adjust intensities to passed-in values @@ -243,7 +243,7 @@ def square_linear( stim["n_bars"] = stim.pop("n_phases") stim["bar_width"] = stim.pop("phase_width") stim["intensity_bars"] = stim.pop("intensities") - stim.pop("base_type") + stim.pop("distance_metric") # Add targets(?) if target_indices is not None and target_indices != (): @@ -344,13 +344,13 @@ def sine_radial( intensities=intensities, origin=origin, round_phase_width=round_phase_width, - base_type="radial", + distance_metric="radial", ) # Repackage output stim["n_rings"] = stim.pop("n_phases") stim["ring_width"] = stim.pop("phase_width") - stim.pop("base_type") + stim.pop("distance_metric") # Clip? if clip: @@ -461,7 +461,7 @@ def square_radial( phase_shift=phase_shift, origin=origin, round_phase_width=round_phase_width, - base_type="radial", + distance_metric="radial", ) # Adjust intensities to passed-in values @@ -471,7 +471,7 @@ def square_radial( stim["n_rings"] = stim.pop("n_phases") stim["ring_width"] = stim.pop("phase_width") stim["intensity_rings"] = stim.pop("intensities") - stim.pop("base_type") + stim.pop("distance_metric") # Clip? if clip: @@ -584,13 +584,13 @@ def sine_cityblock( intensities=intensities, origin=origin, round_phase_width=round_phase_width, - base_type="cityblock", + distance_metric="cityblock", ) # Repackage output stim["n_frames"] = stim.pop("n_phases") stim["frame_width"] = stim.pop("phase_width") - stim.pop("base_type") + stim.pop("distance_metric") # Clip? if clip: @@ -709,7 +709,7 @@ def square_cityblock( phase_shift=phase_shift, origin=origin, round_phase_width=round_phase_width, - base_type="cityblock", + distance_metric="cityblock", ) # Adjust intensities to passed-in values @@ -719,7 +719,7 @@ def square_cityblock( stim["n_frames"] = stim.pop("n_phases") stim["frame_width"] = stim.pop("phase_width") stim["intensity_frames"] = stim.pop("intensities") - stim.pop("base_type") + stim.pop("distance_metric") # Clip? if clip: @@ -834,13 +834,13 @@ def sine_angular( intensities=intensities, origin=origin, round_phase_width=round_phase_width, - base_type="angular", + distance_metric="angular", ) # Repackage output stim["n_segments"] = stim.pop("n_phases") stim["segment_width"] = stim.pop("phase_width") - stim.pop("base_type") + stim.pop("distance_metric") # Resolve target parameters if target_indices is not None and target_indices != (): @@ -952,7 +952,7 @@ def square_angular( phase_shift=phase_shift, origin=origin, round_phase_width=round_phase_width, - base_type="angular", + distance_metric="angular", ) # Adjust intensities to passed-in values @@ -962,7 +962,7 @@ def square_angular( stim["n_segments"] = stim.pop("n_phases") stim["segment_width"] = stim.pop("phase_width") stim["intensity_segments"] = stim.pop("intensities") - stim.pop("base_type") + stim.pop("distance_metric") # Resolve target parameters if target_indices is not None and target_indices != (): diff --git a/tests/test_waves.py b/tests/test_waves.py index 4a834549..255a9d0d 100644 --- a/tests/test_waves.py +++ b/tests/test_waves.py @@ -37,7 +37,7 @@ def test_rounding(): visual_size=visual_size, frequency=frequency, period="either", - base_type="horizontal", + distance_metric="horizontal", phase_shift=0, origin="corner", round_phase_width=True, From a8c8e02a942289244123359f94fde8280d97c944 Mon Sep 17 00:00:00 2001 From: Joris Vincent Date: Wed, 22 Mar 2023 14:04:43 +0100 Subject: [PATCH 02/12] Docfix: path to demos for `noises` --- docs/_templates/autosummary/noises.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_templates/autosummary/noises.rst b/docs/_templates/autosummary/noises.rst index 5efa1a5b..3f5ae31b 100644 --- a/docs/_templates/autosummary/noises.rst +++ b/docs/_templates/autosummary/noises.rst @@ -60,7 +60,7 @@ {% if functions %} Demos ----- - :doc:`reference/demos/components/{{name}}` + :doc:`../../demos/noises/{{name}}` Functions --------- From 4eec2de9b15797e94930709370b8078a32ecaffb Mon Sep 17 00:00:00 2001 From: Joris Vincent Date: Wed, 22 Mar 2023 14:08:10 +0100 Subject: [PATCH 03/12] Rename `rotated` distance metric to `oblique` Closes #10 --- docs/reference/demos/components/waves.md | 6 +++--- docs/reference/demos/stimuli/plaids.md | 2 +- stimupy/components/__init__.py | 10 +++++----- stimupy/components/edges.py | 7 ++++--- stimupy/components/waves.py | 14 +++++++------- stimupy/stimuli/checkerboards.py | 8 ++++---- stimupy/stimuli/gabors.py | 2 +- stimupy/stimuli/plaids.py | 2 +- stimupy/stimuli/waves.py | 4 ++-- 9 files changed, 28 insertions(+), 27 deletions(-) diff --git a/docs/reference/demos/components/waves.md b/docs/reference/demos/components/waves.md index 6976ec02..bd407910 100644 --- a/docs/reference/demos/components/waves.md +++ b/docs/reference/demos/components/waves.md @@ -39,7 +39,7 @@ 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_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','rotated','radial','cityblock','angular'], description="distance_metric") +w_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','oblique','radial','cityblock','angular'], description="distance_metric") w_freq = iw.FloatSlider(value=1, min=0, max=2, description="frequency [cpd]") w_phase = iw.FloatSlider(value=0, min=0, max=360, description="phase shift [deg]") w_rot = iw.FloatSlider(value=0, min=0, max=360, description="rotation [deg]") @@ -124,7 +124,7 @@ 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_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','rotated','radial','cityblock','angular'], description="distance_metric") +w_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','oblique','radial','cityblock','angular'], description="distance_metric") w_freq = iw.FloatSlider(value=1, min=0, max=2, description="frequency [cpd]") w_phase = iw.FloatSlider(value=0, min=0, max=360, description="phase shift [deg]") w_rot = iw.FloatSlider(value=0, min=0, max=360, description="rotation [deg]") @@ -209,7 +209,7 @@ 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_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','rotated','radial','cityblock','angular'], description="distance_metric") +w_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','oblique','radial','cityblock','angular'], description="distance_metric") w_freq = iw.FloatSlider(value=0.5, min=0, max=2, description="frequency [cpd]") w_rot = iw.FloatSlider(value=0, min=0, max=360, description="rotation [deg]") w_phase = iw.FloatSlider(value=0, min=0, max=360, description="phase shift [deg]") diff --git a/docs/reference/demos/stimuli/plaids.md b/docs/reference/demos/stimuli/plaids.md index 1b91f872..e4eea584 100644 --- a/docs/reference/demos/stimuli/plaids.md +++ b/docs/reference/demos/stimuli/plaids.md @@ -107,7 +107,7 @@ def show_plaid( "origin": origin, "round_phase_width": round_phase_width, "period": period, - "distance_metric": "rotated", + "distance_metric": "oblique", } p_grating1 = { diff --git a/stimupy/components/__init__.py b/stimupy/components/__init__.py index b58923ec..0341bb8b 100644 --- a/stimupy/components/__init__.py +++ b/stimupy/components/__init__.py @@ -46,7 +46,7 @@ def image_base(visual_size=None, shape=None, ppd=None, rotation=0.0, origin="mea "x", "y" : single axes "horizontal", "vertical" : numpy.ndarray of shape, with distance from origin, in deg. visual angle, at each pixel - "rotated" : numpy.ndarray of shape, with rotated distance from origin, + "oblique" : numpy.ndarray of shape, with oblique distance from origin, in deg. visual angle, at each pixel "radial" : numpyn.ndarray of shape, with radius from origin, in deg. visual angle, at each pixel @@ -88,12 +88,12 @@ def image_base(visual_size=None, shape=None, ppd=None, rotation=0.0, origin="mea angular -= np.deg2rad(rotation + 90) angular %= 2 * np.pi - # Rotated + # Oblique alpha = [np.cos(np.deg2rad(rotation)), np.sin(np.deg2rad(rotation))] - rotated = alpha[0] * xx + alpha[1] * yy + oblique = alpha[0] * xx + alpha[1] * yy if origin == "corner": - rotated = rotated - rotated.min() + oblique = oblique - oblique.min() return { "visual_size": visual_size, @@ -104,7 +104,7 @@ def image_base(visual_size=None, shape=None, ppd=None, rotation=0.0, origin="mea "y": y, "horizontal": xx, "vertical": yy, - "rotated": rotated, + "oblique": oblique, "cityblock": cityblock, "radial": radial, "angular": angular, diff --git a/stimupy/components/edges.py b/stimupy/components/edges.py index 3978ef11..f614325a 100644 --- a/stimupy/components/edges.py +++ b/stimupy/components/edges.py @@ -1,4 +1,5 @@ import copy + import numpy as np from stimupy.components import gaussians, image_base @@ -49,9 +50,9 @@ def step_edge( ) img = np.ones(shape) * intensity_edges[0] - img = np.where(base["rotated"] < base["rotated"].mean(), img, intensity_edges[1]) + img = np.where(base["oblique"] < base["oblique"].mean(), img, intensity_edges[1]) mask = np.ones(shape) - mask = np.where(base["rotated"] < base["rotated"].mean(), mask, 2) + mask = np.where(base["oblique"] < base["oblique"].mean(), mask, 2) stim = { "img": img, @@ -198,7 +199,7 @@ def cornsweet_edge( if ramp_width > max(base["visual_size"]) / 2: raise ValueError("ramp_width is too large") - dist = np.round(base["rotated"] / ramp_width, 6) + dist = np.round(base["oblique"] / ramp_width, 6) d1 = copy.deepcopy(dist) d2 = copy.deepcopy(dist) * (-1) d1[d1 < 0] = -1 diff --git a/stimupy/components/waves.py b/stimupy/components/waves.py index aafecc1f..78d50ea0 100644 --- a/stimupy/components/waves.py +++ b/stimupy/components/waves.py @@ -292,7 +292,7 @@ def sine( distance_metric : str or None if "horizontal", use distance from origin in x-direction, if "vertical", use distance from origin in x-direction; - if "rotated", use combined and rotated distance from origin in x-y; + if "oblique", use combined and rotated distance from origin in x-y; if "radial", use radial distance from origin, if "angular", use angular distance from origin, if "cityblock", use cityblock distance from origin @@ -317,7 +317,7 @@ def sine( if period is None: period = "ignore" - distance_metrics = ["horizontal", "vertical", "rotated", "radial", "angular", "cityblock"] + distance_metrics = ["horizontal", "vertical", "oblique", "radial", "angular", "cityblock"] if distance_metric not in distance_metrics: raise ValueError(f"distance_metric needs to be one of {distance_metrics}") @@ -505,7 +505,7 @@ def square( distance_metric : str or None if "horizontal", use distance from origin in x-direction, if "vertical", use distance from origin in x-direction; - if "rotated", use combined and rotated distance from origin in x-y; + if "oblique", use combined and rotated distance from origin in x-y; if "radial", use radial distance from origin, if "angular", use angular distance from origin, if "cityblock", use cityblock distance from origin @@ -587,7 +587,7 @@ def staircase( distance_metric : str or None if "horizontal", use distance from origin in x-direction, if "vertical", use distance from origin in x-direction; - if "rotated", use combined and rotated distance from origin in x-y; + if "oblique", use combined and rotated distance from origin in x-y; if "radial", use radial distance from origin, if "angular", use angular distance from origin, if "cityblock", use cityblock distance from origin @@ -719,21 +719,21 @@ def overview(**kwargs): stimuli = { "sine wave - horizontal": sine(**default_params, **grating_params, distance_metric="horizontal"), "sine wave - vertical": sine(**default_params, **grating_params, distance_metric="vertical"), - "sine wave - oblique": sine(**default_params, **grating_params, distance_metric="rotated", rotation=30), + "sine wave - oblique": sine(**default_params, **grating_params, distance_metric="oblique", rotation=30), "sine wave - radial": sine(**default_params, **grating_params, distance_metric="radial"), "sine wave - angular": sine(**default_params, **grating_params, distance_metric="angular"), "sine wave - cityblock": sine(**default_params, **grating_params, distance_metric="cityblock"), "square wave - horizontal": square(**default_params, **grating_params, distance_metric="horizontal"), "square wave - vertical": square(**default_params, **grating_params, distance_metric="vertical"), - "square wave - oblique": square(**default_params, **grating_params, distance_metric="rotated", rotation=30), + "square wave - oblique": square(**default_params, **grating_params, distance_metric="oblique", rotation=30), "square wave - radial": square(**default_params, **grating_params, distance_metric="radial"), "square wave - angular": square(**default_params, **grating_params, distance_metric="angular"), "square wave - cityblock": square(**default_params, **grating_params, distance_metric="cityblock"), "staircase - horizontal": staircase(**default_params, **grating_params, distance_metric="horizontal"), "staircase - vertical": staircase(**default_params, **grating_params, distance_metric="vertical"), - "staircase - oblique": staircase(**default_params, **grating_params, distance_metric="rotated", rotation=30), + "staircase - oblique": staircase(**default_params, **grating_params, distance_metric="oblique", rotation=30), "staircase - radial": staircase(**default_params, **grating_params, distance_metric="radial"), "staircase - angular": staircase(**default_params, **grating_params, distance_metric="angular"), "staircase - cityblock": staircase(**default_params, **grating_params, distance_metric="cityblock"), diff --git a/stimupy/stimuli/checkerboards.py b/stimupy/stimuli/checkerboards.py index c281f35b..97834038 100644 --- a/stimupy/stimuli/checkerboards.py +++ b/stimupy/stimuli/checkerboards.py @@ -209,7 +209,7 @@ def checkerboard( intensities=intensity_checks, origin="corner", round_phase_width=round_phase_width, - distance_metric="rotated", + distance_metric="oblique", ) sw2 = waves.square( @@ -225,7 +225,7 @@ def checkerboard( intensities=intensity_checks, origin="corner", round_phase_width=round_phase_width, - distance_metric="rotated", + distance_metric="oblique", ) # If neither a visual_size nor a shape was given, each square wave @@ -246,7 +246,7 @@ def checkerboard( intensities=intensity_checks, origin="corner", round_phase_width=round_phase_width, - distance_metric="rotated", + distance_metric="oblique", ) sw2 = waves.square( @@ -262,7 +262,7 @@ def checkerboard( intensities=intensity_checks, origin="corner", round_phase_width=round_phase_width, - distance_metric="rotated", + distance_metric="oblique", ) warnings.filterwarnings("default") diff --git a/stimupy/stimuli/gabors.py b/stimupy/stimuli/gabors.py index 06d595f8..22c5b6a6 100644 --- a/stimupy/stimuli/gabors.py +++ b/stimupy/stimuli/gabors.py @@ -72,7 +72,7 @@ def gabor( phase_shift=phase_shift, intensities=intensities, origin=origin, - distance_metric="rotated", + distance_metric="oblique", round_phase_width=round_phase_width, ) diff --git a/stimupy/stimuli/plaids.py b/stimupy/stimuli/plaids.py index 39449a7b..59977974 100644 --- a/stimupy/stimuli/plaids.py +++ b/stimupy/stimuli/plaids.py @@ -84,7 +84,7 @@ def overview(**kwargs): "ppd": 10, "origin": "center", "phase_shift": 30, - "distance_metric": "rotated", + "distance_metric": "oblique", } default_params.update(kwargs) diff --git a/stimupy/stimuli/waves.py b/stimupy/stimuli/waves.py index 2dc690dd..475ad14e 100644 --- a/stimupy/stimuli/waves.py +++ b/stimupy/stimuli/waves.py @@ -118,7 +118,7 @@ def sine_linear( elif rotation % 180 == 90.0: distance_metric = "vertical" else: - distance_metric = "rotated" + distance_metric = "oblique" # Spatial square-wave grating stim = waves.sine( @@ -233,7 +233,7 @@ def square_linear( phase_shift=phase_shift, origin=origin, round_phase_width=round_phase_width, - distance_metric="rotated", + distance_metric="oblique", ) # Adjust intensities to passed-in values From 52b57de00d67b959508eedfb162314cdce7902dc Mon Sep 17 00:00:00 2001 From: Joris Vincent Date: Wed, 22 Mar 2023 14:23:23 +0100 Subject: [PATCH 04/12] Bugfix: output visual_size, ppd in `gratings.on_grating` Closes #18 --- stimupy/stimuli/gratings.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stimupy/stimuli/gratings.py b/stimupy/stimuli/gratings.py index 3c0f8ff5..9be695c4 100644 --- a/stimupy/stimuli/gratings.py +++ b/stimupy/stimuli/gratings.py @@ -198,7 +198,11 @@ def on_grating_masked( stim = { "img": img, + "visual_size": large_grating["visual_size"], + "ppd": large_grating["ppd"], "target_mask": mask.astype(int), + "small_grating_mask": small_grating["grating_mask"], + "large_grating_mask": large_grating["grating_mask"], "bar_width_small": small_grating["bar_width"], "bar_width_large": large_grating["bar_width"], } From 86020c93bd4cf98c19c779fa62fc738eb059e467 Mon Sep 17 00:00:00 2001 From: lynnschmittwilken Date: Wed, 22 Mar 2023 09:36:51 -0400 Subject: [PATCH 05/12] closes #16; bessel raises error if frequency=None --- stimupy/components/waves.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/stimupy/components/waves.py b/stimupy/components/waves.py index 78d50ea0..60a5979d 100644 --- a/stimupy/components/waves.py +++ b/stimupy/components/waves.py @@ -669,6 +669,8 @@ def bessel( empty mask (key: "ring_mask"), and additional keys containing stimulus parameters """ + if frequency is None: + raise ValueError("bessel() missing argument 'frequency' which is not 'None'") base = image_base( visual_size=visual_size, From c1bbf8d617a63e0c400dc709f88db7842ee66074 Mon Sep 17 00:00:00 2001 From: lynnschmittwilken Date: Wed, 22 Mar 2023 09:42:36 -0400 Subject: [PATCH 06/12] closes #15; fixed bug --- stimupy/stimuli/whites.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stimupy/stimuli/whites.py b/stimupy/stimuli/whites.py index 3ca7f994..d963a713 100644 --- a/stimupy/stimuli/whites.py +++ b/stimupy/stimuli/whites.py @@ -710,7 +710,7 @@ def yazdanbakhsh( ) tsize_px = resolution.lengths_from_visual_angles_ppd(target_height, np.unique(ppd)[0]) cycle_width_px = ( - resolution.lengths_from_visual_angles_ppd(1.0 / (frequency * 2), np.unique(ppd)[0]) * 2 + resolution.lengths_from_visual_angles_ppd(1.0 / (stim["frequency"] * 2), np.unique(ppd)[0]) * 2 ) phase_width_px = cycle_width_px // 2 height, width = img.shape From 0fd8b4ef55cdf862a78b9dcc7c280068e2eb7873 Mon Sep 17 00:00:00 2001 From: lynnschmittwilken Date: Wed, 22 Mar 2023 09:54:12 -0400 Subject: [PATCH 07/12] closes #14; contrast_contrast new defaults for target_shape and alpha are None --- stimupy/stimuli/checkerboards.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/stimupy/stimuli/checkerboards.py b/stimupy/stimuli/checkerboards.py index 97834038..8d6c4587 100644 --- a/stimupy/stimuli/checkerboards.py +++ b/stimupy/stimuli/checkerboards.py @@ -314,12 +314,12 @@ def contrast_contrast( frequency=None, board_shape=None, check_visual_size=None, - target_shape=(2, 3), + target_shape=None, period="ignore", rotation=0, intensity_checks=(0.0, 1.0), tau=0.5, - alpha=0.2, + alpha=None, round_phase_width=True, ): """Contrast-contrast effect on checkerboard with square transparency layer @@ -339,7 +339,7 @@ def contrast_contrast( number of checks in [height, width] of checkerboard check_visual_size : Sequence[Number, Number], Number, or None (default) visual size of a single check [height, width] in degrees - targets_shape : (int, int) + targets_shape : Sequence[Number, Number], Number, or None (default) number of checks with transparency in y, x direction intensity_low : float, optional intensity value of the dark checks, by default 0.0 @@ -347,8 +347,8 @@ def contrast_contrast( intensity value of the light checks, by default 1.0 tau : Number tau of transparency (i.e. value of transparent medium), default 0.5 - alpha : Number - alpha of transparency (i.e. how transparant the medium is), default 0.2 + alpha : Number or None (default) + alpha of transparency (i.e. how transparant the medium is) round_phase_width : Bool if True, round width of bars given resolution (default: True) @@ -371,6 +371,12 @@ def contrast_contrast( Frontiers in Human Neuroscience, 9(February), 1-16. https://doi.org/10/gh62x2 """ + if target_shape is None: + raise ValueError("contrast_contrast() missing argument 'target_shape' which is not 'None'") + if alpha is None: + raise ValueError("contrast_contrast() missing argument 'alpha' which is not 'None'") + if isinstance(target_shape, (int, float)): + target_shape = (target_shape, target_shape) # Set up basic checkerboard stim = checkerboard( @@ -422,10 +428,6 @@ def overview(**kwargs): default_params = {"visual_size": (10, 10), "ppd": 30} default_params.update(kwargs) - # p = { - # "board_shape": (10, 10), - # } - # fmt: off stimuli = { "checkerboard": checkerboard(**default_params, check_visual_size=(1, 1)), @@ -433,7 +435,7 @@ def overview(**kwargs): "checkerboard from frequency": checkerboard(**default_params, frequency=1), "checkerboard from frequency, rotated": checkerboard(**default_params, frequency=1, rotation=45), "checkerboard with targets": checkerboard(**default_params, check_visual_size=(1, 1), target_indices=[(3, 2), (5, 5)]), - "Checkerboard Contrast-Contrast illusion": contrast_contrast(**default_params, check_visual_size=(1, 1), target_shape=(4, 4)), + "Checkerboard Contrast-Contrast illusion": contrast_contrast(**default_params, check_visual_size=(1, 1), target_shape=4, alpha=0.2), } # fmt: on From 523f4d1ebf2d001947e04b96a139dd66ecd29cd5 Mon Sep 17 00:00:00 2001 From: lynnschmittwilken Date: Wed, 22 Mar 2023 10:18:33 -0400 Subject: [PATCH 08/12] closes #27; renamed cityblock to rectilinear --- stimupy/components/__init__.py | 10 +++++----- stimupy/components/frames.py | 2 +- stimupy/components/waves.py | 16 ++++++++-------- stimupy/stimuli/rings.py | 2 +- stimupy/stimuli/waves.py | 16 ++++++++-------- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/stimupy/components/__init__.py b/stimupy/components/__init__.py index 0341bb8b..ea2913fd 100644 --- a/stimupy/components/__init__.py +++ b/stimupy/components/__init__.py @@ -52,8 +52,8 @@ def image_base(visual_size=None, shape=None, ppd=None, rotation=0.0, origin="mea in deg. visual angle, at each pixel "angular" : numpy.ndarray of shape, with angle relative to 3 o'clock, in rad, at each pixel - "cityblock" : numpy.ndarray of shape, with cityblock distance from origin, - in deg. visual angle ,at each pixel + "rectilinear" : numpy.ndarray of shape, with rectilinear/cityblock/Manhattan distance from origin, + in deg. visual angle, at each pixel """ # Resolve resolution @@ -77,8 +77,8 @@ def image_base(visual_size=None, shape=None, ppd=None, rotation=0.0, origin="mea # Linear distance image bases xx, yy = np.meshgrid(x, y) - # City-block distance (frames) - cityblock = np.maximum(np.abs(xx), np.abs(yy)) + # Rectilinear distance (frames) + rectilinear = np.maximum(np.abs(xx), np.abs(yy)) # Radial distance radial = np.sqrt(xx**2 + yy**2) @@ -105,7 +105,7 @@ def image_base(visual_size=None, shape=None, ppd=None, rotation=0.0, origin="mea "horizontal": xx, "vertical": yy, "oblique": oblique, - "cityblock": cityblock, + "rectilinear": rectilinear, "radial": radial, "angular": angular, } diff --git a/stimupy/components/frames.py b/stimupy/components/frames.py index 9401f032..8b00a5b6 100644 --- a/stimupy/components/frames.py +++ b/stimupy/components/frames.py @@ -38,7 +38,7 @@ def mask_frames( and additional keys containing stimulus parameters """ stim = mask_elements( - distance_metric="cityblock", + distance_metric="rectilinear", edges=edges, rotation=0.0, shape=shape, diff --git a/stimupy/components/waves.py b/stimupy/components/waves.py index 60a5979d..4a32f78a 100644 --- a/stimupy/components/waves.py +++ b/stimupy/components/waves.py @@ -295,7 +295,7 @@ def sine( if "oblique", use combined and rotated distance from origin in x-y; if "radial", use radial distance from origin, if "angular", use angular distance from origin, - if "cityblock", use cityblock distance from origin + if "rectilinear", use rectilinear/cityblock/Manhattan distance from origin round_phase_width : Bool or None (default) if True, round width of bars given resolution @@ -317,7 +317,7 @@ def sine( if period is None: period = "ignore" - distance_metrics = ["horizontal", "vertical", "oblique", "radial", "angular", "cityblock"] + distance_metrics = ["horizontal", "vertical", "oblique", "radial", "angular", "rectilinear"] if distance_metric not in distance_metrics: raise ValueError(f"distance_metric needs to be one of {distance_metrics}") @@ -418,7 +418,7 @@ def sine( # Create mask dmax = max(distances.max(), -distances.min()) + (phase_width / 2) - if origin == "corner" or distance_metric == "radial" or distance_metric == "cityblock": + if origin == "corner" or distance_metric == "radial" or distance_metric == "rectilinear": edges = np.arange(distances.min() + (phase_width / 2), dmax, phase_width) if origin == "mean": @@ -508,7 +508,7 @@ def square( if "oblique", use combined and rotated distance from origin in x-y; if "radial", use radial distance from origin, if "angular", use angular distance from origin, - if "cityblock", use cityblock distance from origin + if "rectilinear", use rectilinear/cityblock/Manhattan distance from origin round_phase_width : Bool or None (default) if True, round width of bars given resolution @@ -590,7 +590,7 @@ def staircase( if "oblique", use combined and rotated distance from origin in x-y; if "radial", use radial distance from origin, if "angular", use angular distance from origin, - if "cityblock", use cityblock distance from origin + if "rectilinear", use rectilinear/cityblock/Manhattan distance from origin round_phase_width : Bool or None (default) if True, round width of bars given resolution intensities : Sequence[float, ...] @@ -724,21 +724,21 @@ def overview(**kwargs): "sine wave - oblique": sine(**default_params, **grating_params, distance_metric="oblique", rotation=30), "sine wave - radial": sine(**default_params, **grating_params, distance_metric="radial"), "sine wave - angular": sine(**default_params, **grating_params, distance_metric="angular"), - "sine wave - cityblock": sine(**default_params, **grating_params, distance_metric="cityblock"), + "sine wave - rectilinear": sine(**default_params, **grating_params, distance_metric="rectilinear"), "square wave - horizontal": square(**default_params, **grating_params, distance_metric="horizontal"), "square wave - vertical": square(**default_params, **grating_params, distance_metric="vertical"), "square wave - oblique": square(**default_params, **grating_params, distance_metric="oblique", rotation=30), "square wave - radial": square(**default_params, **grating_params, distance_metric="radial"), "square wave - angular": square(**default_params, **grating_params, distance_metric="angular"), - "square wave - cityblock": square(**default_params, **grating_params, distance_metric="cityblock"), + "square wave - rectilinear": square(**default_params, **grating_params, distance_metric="rectilinear"), "staircase - horizontal": staircase(**default_params, **grating_params, distance_metric="horizontal"), "staircase - vertical": staircase(**default_params, **grating_params, distance_metric="vertical"), "staircase - oblique": staircase(**default_params, **grating_params, distance_metric="oblique", rotation=30), "staircase - radial": staircase(**default_params, **grating_params, distance_metric="radial"), "staircase - angular": staircase(**default_params, **grating_params, distance_metric="angular"), - "staircase - cityblock": staircase(**default_params, **grating_params, distance_metric="cityblock"), + "staircase - rectilinear": staircase(**default_params, **grating_params, distance_metric="rectilinear"), "bessel": bessel(**default_params, frequency=0.5), } diff --git a/stimupy/stimuli/rings.py b/stimupy/stimuli/rings.py index 15afd39d..72c75196 100644 --- a/stimupy/stimuli/rings.py +++ b/stimupy/stimuli/rings.py @@ -3,7 +3,7 @@ import numpy as np from stimupy.components.frames import frames -from stimupy.stimuli.waves import square_cityblock as rectangular +from stimupy.stimuli.waves import square_rectilinear as rectangular from stimupy.stimuli.waves import square_radial as circular from stimupy.utils import resolution, stack_dicts diff --git a/stimupy/stimuli/waves.py b/stimupy/stimuli/waves.py index 475ad14e..fc8aa8de 100644 --- a/stimupy/stimuli/waves.py +++ b/stimupy/stimuli/waves.py @@ -11,8 +11,8 @@ # "staircase_linear", "sine_radial", "square_radial", - "sine_cityblock", - "square_cityblock", + "sine_rectilinear", + "square_rectilinear", "sine_angular", "square_angular", ] @@ -492,7 +492,7 @@ def square_radial( return stim -def sine_cityblock( +def sine_rectilinear( visual_size=None, ppd=None, shape=None, @@ -584,7 +584,7 @@ def sine_cityblock( intensities=intensities, origin=origin, round_phase_width=round_phase_width, - distance_metric="cityblock", + distance_metric="rectilinear", ) # Repackage output @@ -619,7 +619,7 @@ def sine_cityblock( return stim -def square_cityblock( +def square_rectilinear( visual_size=None, ppd=None, shape=None, @@ -709,7 +709,7 @@ def square_cityblock( phase_shift=phase_shift, origin=origin, round_phase_width=round_phase_width, - distance_metric="cityblock", + distance_metric="rectilinear", ) # Adjust intensities to passed-in values @@ -1014,7 +1014,7 @@ def overview(**kwargs): "sine wave - vertical": sine_linear(**default_params, **grating_params, bar_width=1, rotation=90), "sine wave - oblique": sine_linear(**default_params, **grating_params, bar_width=1, rotation=45), "sine wave - radial": sine_radial(**default_params, **grating_params, ring_width=1, clip=True), - "sine wave - cityblock": sine_cityblock(**default_params, **grating_params, frame_width=1, clip=True), + "sine wave - rectilinear": sine_rectilinear(**default_params, **grating_params, frame_width=1, clip=True), "sine wave - angular": sine_angular(**default_params, **grating_params, segment_width=10), @@ -1022,7 +1022,7 @@ def overview(**kwargs): "square wave - vertical": square_linear(**default_params, **grating_params, bar_width=1, rotation=90), "square wave - oblique": square_linear(**default_params, **grating_params, bar_width=1, rotation=45), "square wave - radial": square_radial(**default_params, **grating_params, ring_width=1, clip=True), - "square wave - cityblock": square_cityblock(**default_params, **grating_params, frame_width=1, clip=True), + "square wave - rectilinear": square_rectilinear(**default_params, **grating_params, frame_width=1, clip=True), "square wave - angular": square_angular(**default_params, **grating_params, segment_width=10), From 937c8326365f986bb9cd32557b978b93c31d9b18 Mon Sep 17 00:00:00 2001 From: lynnschmittwilken Date: Wed, 22 Mar 2023 10:33:42 -0400 Subject: [PATCH 09/12] autoformatting --- stimupy/stimuli/whites.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stimupy/stimuli/whites.py b/stimupy/stimuli/whites.py index d963a713..3a782337 100644 --- a/stimupy/stimuli/whites.py +++ b/stimupy/stimuli/whites.py @@ -710,7 +710,8 @@ def yazdanbakhsh( ) tsize_px = resolution.lengths_from_visual_angles_ppd(target_height, np.unique(ppd)[0]) cycle_width_px = ( - resolution.lengths_from_visual_angles_ppd(1.0 / (stim["frequency"] * 2), np.unique(ppd)[0]) * 2 + resolution.lengths_from_visual_angles_ppd(1.0 / (stim["frequency"] * 2), np.unique(ppd)[0]) + * 2 ) phase_width_px = cycle_width_px // 2 height, width = img.shape From f6b115a3828fdf8aa8170435a2b27ee9c23274b8 Mon Sep 17 00:00:00 2001 From: Joris Vincent Date: Wed, 22 Mar 2023 15:41:00 +0100 Subject: [PATCH 10/12] Unify structure for `overview`s For each module, `overview()` generates a dict of stim_dicts, with some example stimuli. For "parent"-modules, they run the `overview()` for each of their submodules, and concatenate. `plot_overview()` simply passes this to `plot_stimuli`, as a nice shorthand. --- stimupy/components/__init__.py | 50 ++++++++++++++++++++--------- stimupy/noises/__init__.py | 57 ++++++++++++++++++++++------------ stimupy/stimuli/__init__.py | 30 +++++++++++++++--- 3 files changed, 100 insertions(+), 37 deletions(-) diff --git a/stimupy/components/__init__.py b/stimupy/components/__init__.py index ea2913fd..f526fef8 100644 --- a/stimupy/components/__init__.py +++ b/stimupy/components/__init__.py @@ -5,6 +5,8 @@ from stimupy.utils import resolution __all__ = [ + "overview", + "plot_overview", "image_base", "draw_regions", "mask_elements", @@ -208,17 +210,16 @@ def draw_regions(mask, intensities, intensity_background=0.5): return img -from . import angulars, edges, frames, gaussians, lines, radials, shapes, waves +from stimupy.components import angulars, edges, frames, gaussians, lines, radials, shapes, waves -def create_overview(): - """ - Create dictionary with examples from all stimulus-components +def overview(skip=False): + """Generate example stimuli from this module Returns ------- - stims : dict - dict with all stimuli containing individual stimulus dicts. + dict[str, dict] + Dict mapping names to individual stimulus dicts """ p = { @@ -227,7 +228,7 @@ def create_overview(): } # fmt: off - stims = { + stimuli = { # angulars "wedge": angulars.wedge(**p, width=30, radius=3), "angular_grating": angulars.grating(**p, n_segments=8), @@ -262,12 +263,31 @@ def create_overview(): } # fmt: on - return stims + # stimuli = {} + # for stimmodule_name in __all__: + # if stimmodule_name in ["overview", "plot_overview"]: + # pass + # print(f"Generating stimuli from {stimmodule_name}") + # # Get a reference to the actual module + # stimmodule = globals()[stimmodule_name] + # try: + # stims = stimmodule.overview() -def overview(mask=False, save=None, extent_key="shape"): - """ - Plot overview with examples from all stimulus-components + # # Accumulate + # stimuli.update(stims) + # except NotImplementedError as e: + # if not skip: + # raise e + # # Skip stimuli that aren't implemented + # print("-- not implemented") + # pass + + return stimuli + + +def plot_overview(mask=False, save=None, extent_key="shape"): + """Plot overview of examples in this module (and submodules) Parameters ---------- @@ -284,7 +304,9 @@ def overview(mask=False, save=None, extent_key="shape"): """ from stimupy.utils import plot_stimuli - stims = create_overview() + stims = overview(skip=True) + plot_stimuli(stims, mask=mask, extent_key=extent_key, save=save) + - # Plotting - plot_stimuli(stims, mask=mask, save=save, extent_key=extent_key) +if __name__ == "__main__": + plot_overview() diff --git a/stimupy/noises/__init__.py b/stimupy/noises/__init__.py index 0b3c220a..808dfc06 100644 --- a/stimupy/noises/__init__.py +++ b/stimupy/noises/__init__.py @@ -1,20 +1,18 @@ -from .binaries import * -from .narrowbands import * -from .naturals import * -from .utils import * -from .whites import * +from stimupy.noises.binaries import * +from stimupy.noises.narrowbands import * +from stimupy.noises.naturals import * +from stimupy.noises.utils import * +from stimupy.noises.whites import * -def create_overview(): - """ - Create dictionary with examples from all stimulus-noises +def overview(skip=False): + """Generate example stimuli from this module Returns ------- - stims : dict - dict with all stimuli containing individual stimulus dicts. + dict[str, dict] + Dict mapping names to individual stimulus dicts """ - params = { "visual_size": 10, "ppd": 10, @@ -22,7 +20,7 @@ def create_overview(): } # fmt: off - stims = { + stimuli = { # Binary "binary_noise": binary(visual_size=10, ppd=10), # White @@ -37,12 +35,31 @@ def create_overview(): } # fmt: on - return stims + # stimuli = {} + # for stimmodule_name in __all__: + # if stimmodule_name in ["overview", "plot_overview"]: + # pass + # print(f"Generating stimuli from {stimmodule_name}") + # # Get a reference to the actual module + # stimmodule = globals()[stimmodule_name] + # try: + # stims = stimmodule.overview() -def overview(mask=False, save=None, extent_key="shape"): - """ - Plot overview with examples from all stimulus-noises + # # Accumulate + # stimuli.update(stims) + # except NotImplementedError as e: + # if not skip: + # raise e + # # Skip stimuli that aren't implemented + # print("-- not implemented") + # pass + + return stimuli + + +def plot_overview(mask=False, save=None, extent_key="shape"): + """Plot overview of examples in this module (and submodules) Parameters ---------- @@ -59,7 +76,9 @@ def overview(mask=False, save=None, extent_key="shape"): """ from stimupy.utils import plot_stimuli - stims = create_overview() + stims = overview(skip=True) + plot_stimuli(stims, mask=mask, extent_key=extent_key, save=save) + - # Plotting - plot_stimuli(stims, mask=mask, save=save, extent_key=extent_key) +if __name__ == "__main__": + plot_overview() diff --git a/stimupy/stimuli/__init__.py b/stimupy/stimuli/__init__.py index 28a82134..0bc1e859 100644 --- a/stimupy/stimuli/__init__.py +++ b/stimupy/stimuli/__init__.py @@ -2,6 +2,7 @@ __all__ = [ "overview", + "plot_overview", "benarys", "bullseyes", "checkerboards", @@ -33,9 +34,11 @@ def overview(skip=False): dict[str, dict] Dict mapping names to individual stimulus dicts """ - stimuli = {} for stimmodule_name in __all__: + if stimmodule_name in ["overview", "plot_overview"]: + continue + print(f"Generating stimuli from {stimmodule_name}") # Get a reference to the actual module stimmodule = globals()[stimmodule_name] @@ -54,8 +57,27 @@ def overview(skip=False): return stimuli -if __name__ == "__main__": +def plot_overview(mask=False, save=None, extent_key="shape"): + """Plot overview of examples in this module (and submodules) + + Parameters + ---------- + mask : bool or str, optional + If True, plot mask on top of stimulus image (default: False). + If string is provided, plot this key from stimulus dictionary as mask + save : None or str, optional + If None (default), do not save the plot. + If string is provided, save plot under this name. + extent_key : str, optional + Key to extent which will be used for plotting. + Default is "shape", using the image size in pixels as extent. + + """ from stimupy.utils import plot_stimuli - stims = overview() - plot_stimuli(stims, mask=False, save=None) + stims = overview(skip=True) + plot_stimuli(stims, mask=mask, extent_key=extent_key, save=save) + + +if __name__ == "__main__": + plot_overview() From 9e3a25e291fd33233ce4d6594bae856b4b0595b0 Mon Sep 17 00:00:00 2001 From: Joris Vincent Date: Wed, 22 Mar 2023 15:51:13 +0100 Subject: [PATCH 11/12] Also update tests... --- tests/test_overviews.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/test_overviews.py b/tests/test_overviews.py index 94201837..b8e6e064 100644 --- a/tests/test_overviews.py +++ b/tests/test_overviews.py @@ -1,9 +1,13 @@ -from stimupy import components, noises +from stimupy import components, noises, stimuli def test_components(): - components.create_overview() + components.overview() def test_noises(): - noises.create_overview() + noises.overview() + + +def test_stimuli(): + stimuli.overview() From a26defc27195116635fcf8ba395bc4d5e6a079bf Mon Sep 17 00:00:00 2001 From: Joris Vincent Date: Wed, 22 Mar 2023 15:54:39 +0100 Subject: [PATCH 12/12] Also rename `rectilinear` (from `cityblock`) in demos --- docs/reference/demos/components/waves.md | 6 +++--- docs/reference/demos/stimuli/waves.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/reference/demos/components/waves.md b/docs/reference/demos/components/waves.md index bd407910..22683f3b 100644 --- a/docs/reference/demos/components/waves.md +++ b/docs/reference/demos/components/waves.md @@ -39,7 +39,7 @@ 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_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','oblique','radial','cityblock','angular'], description="distance_metric") +w_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','oblique','radial','rectilinear','angular'], description="distance_metric") w_freq = iw.FloatSlider(value=1, min=0, max=2, description="frequency [cpd]") w_phase = iw.FloatSlider(value=0, min=0, max=360, description="phase shift [deg]") w_rot = iw.FloatSlider(value=0, min=0, max=360, description="rotation [deg]") @@ -124,7 +124,7 @@ 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_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','oblique','radial','cityblock','angular'], description="distance_metric") +w_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','oblique','radial','rectilinear','angular'], description="distance_metric") w_freq = iw.FloatSlider(value=1, min=0, max=2, description="frequency [cpd]") w_phase = iw.FloatSlider(value=0, min=0, max=360, description="phase shift [deg]") w_rot = iw.FloatSlider(value=0, min=0, max=360, description="rotation [deg]") @@ -209,7 +209,7 @@ 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_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','oblique','radial','cityblock','angular'], description="distance_metric") +w_distance_metric = iw.Dropdown(value="horizontal", options=['horizontal','vertical','oblique','radial','rectilinear','angular'], description="distance_metric") w_freq = iw.FloatSlider(value=0.5, min=0, max=2, description="frequency [cpd]") w_rot = iw.FloatSlider(value=0, min=0, max=360, description="rotation [deg]") w_phase = iw.FloatSlider(value=0, min=0, max=360, description="phase shift [deg]") diff --git a/docs/reference/demos/stimuli/waves.md b/docs/reference/demos/stimuli/waves.md index 6b5b7e9d..493bbbf1 100644 --- a/docs/reference/demos/stimuli/waves.md +++ b/docs/reference/demos/stimuli/waves.md @@ -126,9 +126,9 @@ display(ui, out) ## Square, radial -## Sine, cityblock +## Sine, rectilinear -## Square, cityblock +## Square, rectilinear ## Sine, angular