Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Supported by

[solved] How to ignore incorrect mouse responses?

edited July 2014 in OpenSesame

Hi,

I have a very simple program where you touch a red dot that appears randomly on the screen. If you click the dot that is a correct response. However, if you click somewhere not on the dot, I want nothing to happen. Currently, when you make an incorrect response the program advances to the next trial. I basically want participants to stay on a trial until they click the dot.

Here is my mouse inline script, where I think I should be controlling this. I'm guessing something is wrong with my loop.

from openexp.mouse import mouse
from math import sqrt
my_mouse = mouse(exp, visible = False)

# Use Pythagoras to determine the click error 

xc = self.get('width') / 2
yc = self.get('height') / 2
# Determine x and y error
dx = self.get('cursor_x')- xc - self.get('xRed')
dy = self.get('cursor_y')- yc - self.get('yRed')

target_positions = [(dx, dy)]

# The maximum error from the target center
maxClickErr = 100
clickErr = sqrt(dx**2 + dy**2)

hit = False

for target_x, target_y in target_positions:
    if clickErr <= maxClickErr:
        exp.set('correct', 1)
        hit = True
    if not hit:
        pass

Comments

  • edited 3:46PM

    Hi,

    Your script is a bit funky in a number of ways. First off, you define a mouse object, but never use it, apparently because you use a mouse_response item to collect mouse clicks. Second, you define target_positions list, which is walked through, but is functionally ignored. (And at any rate does not contain a list of target positions, as you would expect!)

    Below you see a modified version of your script, which should do more-or-less what you want. The idea is to use a mouse object to collect clicks in an endless loop that is broken only when a click is close enough to the target (defined by the xRed and yRed experimental variables). Does that make sense? This script is instead of a mouse_response item, so you can remove that from your trial sequence.

    It might also be a good idea to walk through a basic Python tutorial, to get a grip on using while-loops, etc.

    Cheers!
    Sebastiaan

    from openexp.mouse import mouse
    from math import sqrt
    
    # Create a mouse object
    my_mouse = mouse(exp, visible=False)
    
    # The maximum error from the target center
    maxClickErr = 100
    
    # Get the coordinates of the display center, which are necessary to convert
    # from top-left to center-based coordinates.
    xc = self.get('width') / 2
    yc = self.get('height') / 2
    
    # Loop until we get a hit (i.e. a correct mouse click)
    while True:
        button, pos, timestamp = my_mouse.get_click()
        cursor_x, cursor_y = pos
        # Determine x and y error
        dx = cursor_x - xc - self.get('xRed')
        dy = cursor_y - yc - self.get('yRed')
        # Break the loop if there is a hit (use Pythagoras for click error)
        clickErr = sqrt(dx**2 + dy**2)
        if clickErr <= maxClickErr:
            break
    
  • edited 3:46PM

    Thanks Sebastiaan! This works perfectly. I will definitely have a look at the python training.

Sign In or Register to comment.