def create_stimuli(self): #generate PRF stimulus self.prf_stim = PRFStim(session=self, squares_in_bar=self.settings['PRF stimulus settings']['Squares in bar'], bar_width_deg=self.settings['PRF stimulus settings']['Bar width in degrees'], flicker_frequency=self.settings['PRF stimulus settings']['Checkers motion speed'])#self.deg2pix(self.settings['prf_max_eccentricity'])) #currently unused #self.instruction_string = """Please fixate in the center of the screen. Your task is to respond whenever the dot changes color.""" #generate raised cosine alpha mask mask = filters.makeMask(matrixSize=self.win.size[0], shape='raisedCosine', radius=np.array([self.win.size[1]/self.win.size[0], 1.0]), center=(0.0, 0.0), range=[-1, 1], fringeWidth=0.02 ) self.mask_stim = visual.GratingStim(self.win, mask=-mask, tex=None, units='pix', size=[self.win.size[0],self.win.size[1]], pos = np.array((0.0,0.0)), color = [0,0,0]) #as current basic task, generate fixation circles of different colors, with black border fixation_radius_pixels=tools.monitorunittools.deg2pix(self.settings['PRF stimulus settings']['Size fixation dot in degrees'], self.monitor)/2 # self.fixation_circle = visual.Circle(self.win, # radius=fixation_radius_pixels, # units='pix', lineColor='black') #two colors of the fixation circle for the task self.fixation_disk_0 = visual.Circle(self.win, units='pix', radius=fixation_radius_pixels, fillColor=[1,-1,-1], lineColor=[1,-1,-1]) self.fixation_disk_1 = visual.Circle(self.win, units='pix', radius=fixation_radius_pixels, fillColor=[-1,1,-1], lineColor=[-1,1,-1])
def test_numpyFilterMask(self): """if the mask is passed in as a numpy array it goes through a different set of rules when turned into a texture. But the outcome should be as above """ win = self.win from psychopy.visual import filters gaussMask = filters.makeMask(128, 'gauss') size = numpy.array([2.0,2.0])*self.scaleFactor fileName = os.path.join(utils.TESTS_DATA_PATH, 'testimage.jpg') image = visual.ImageStim(win, image=fileName, mask=gaussMask, size=size, flipHoriz=True, flipVert=True) image.draw() utils.compareScreenshot('imageAndGauss_%s.png' %(self.contextName), win) win.flip()
def _get_array(self, mask='circle', upscale=None): """Return square `np.ndarray` of alternating ones and negative ones with shape `(self.side_len, self.side_len)`.""" board = np.ones((self.side_len, self.side_len), dtype=np.int32) board[::2, ::2] = -1 board[1::2, 1::2] = -1 if upscale is None: upscale = np.ceil(self.size / self.side_len) if upscale != 1: board = np.repeat(np.repeat(board, upscale, axis=0), upscale, axis=1) if mask is not None: mask = makeMask(board.shape[0], 'raisedCosine') board = board if not self.inverted else board * -1 return board, mask
This demo creates a radial array as a patch stimulus, using helper functions from psychopy.filters and then creates a second sub-stimulus created from a section of the original. Both are masked simply by circles. """ from psychopy import visual, event, core from psychopy.visual import filters import numpy as np win = visual.Window([800, 600], units='pix') # Generate the radial textures cycles = 6 res = 512 radius = filters.makeRadialMatrix(res) radialTexture = np.sin(radius * 2 * np.pi * cycles) mainMask = filters.makeMask(res) # Select the upper left quadrant of our radial stimulus radialTexture_sub = radialTexture[256:, 0:256] # and create an appropriate mask for it subMask = filters.makeMask(res, radius=0.5, center=[-0, 0]) bigStim = visual.GratingStim(win, tex=radialTexture, mask=mainMask, color='white', size=512, sf=1.0 / 512, interpolate=True) # draw the quadrant stimulus centered in the top left quadrant of the 'base' stimulus (so they're aligned) subStim = visual.GratingStim(win,
def __init__(self, win, pos, size, session, ori=0, side_len=12, checkerboard_type='square', hide=False): self.screen = win self.config = session.config self.session = session self.size = self.session.deg2pix(size) self.pos = [self.session.deg2pix(pos[0]), self.session.deg2pix(pos[1])] self.ori = ori self.hide = hide checkerboard_size = self.size / self.config.get( 'checker_cross', 'ratio_to_circle') if checkerboard_type == 'square': self.checkerboard = CheckerBoard(self.screen, size=checkerboard_size, side_len=side_len, pos=self.pos, ori=ori) elif checkerboard_type == 'radial': mask = makeMask(checkerboard_size, 'raisedCosine', range=(0, 1)) mask = mask[int(checkerboard_size / 2), int(checkerboard_size / 2):] self.checkerboard = RadialStim(self.screen, mask=mask, pos=self.pos, size=checkerboard_size, angularCycles=side_len, radialCycles=side_len / 4) elif checkerboard_type == 'none': self.checkerboard = GratingStim(self.screen, opacity=0) else: ValueError('{} is not a valid checkerboard type'.format( checkerboard_type)) rim_radius = self.size / 2 / self.config.get('checker_cross', 'ratio_to_circle') - 1 self.rim = Rim(self.screen, rim_radius, rim_radius * self.config.get('rim', 'rim_ratio'), self.config.get('rim', 'n_parts'), pos=self.pos, contrast=self.config.get('rim', 'contrast'), ori=ori) ratio_inner_circle = 1 / self.config.get('checker_cross', 'ratio_to_circle') /\ self.config.get('rim', 'rim_ratio') self.check_cross = CheckerBoardCross( self.screen, self.size, side_len=32, n_blocks=4, pos=self.pos, ratio_inner_circle=ratio_inner_circle, ori=ori) fixation_size = self.config.get('fixation', 'proportion') * self.size self.fixation = FixationPoint(self.screen, self.pos, fixation_size)
""" from __future__ import division from psychopy import visual, event, core from psychopy.visual import filters import numpy as np win = visual.Window([800, 600], units='pix') # Generate the radial textures cycles = 6 res = 512 radius = filters.makeRadialMatrix(res) radialTexture = np.sin(radius * 2 * np.pi * cycles) mainMask = filters.makeMask(res) # Select the upper left quadrant of our radial stimulus radialTexture_sub = radialTexture[256:, 0:256] # and create an appropriate mask for it subMask = filters.makeMask(res, radius=0.5, center=[-0, 0]) bigStim = visual.GratingStim(win, tex=radialTexture, mask=mainMask, color='white', size=512, sf=1.0 / 512, interpolate=True) # draw the quadrant stimulus centered in the top left quadrant of the 'base' stimulus (so they're aligned) subStim = visual.GratingStim(win, tex=radialTexture_sub, pos=(-128, 128), mask=subMask, color=[1, 1, 1], size=256, sf=1.0 / 256, interpolate=True, autoLog=False) bigStim.draw() subStim.draw() globalClock =core.Clock()
dotsY = numpy.random.uniform(low=-fieldSize, high=fieldSize, size=(dotsN,)) dotsTheta = numpy.random.rand(dotsN) * 360 # array with shape (500,) dotsRadius = numpy.random.rand(dotsN) * fieldSize randDotsX = numpy.random.uniform(low=-fieldSize, high=fieldSize,size=(dotsN,)) randDotsY = numpy.random.uniform(low=-fieldSize, high=fieldSize,size=(dotsN,)) alpha= numpy.random.uniform(low=0, high=2*pi,size=(dotsN,)) veloX = speed * cos(alpha) veloY = speed * sin(alpha) outfieldDotsY = numpy.logical_or((randDotsY >= deathBorder), (randDotsY <= -deathBorder)) outfieldDotsX = numpy.logical_or((randDotsX >= deathBorder), (randDotsX <= -deathBorder)) # initializing experiment stimuli invCircle = filters.makeMask(512,'circle')*-1 #-1 means black, 1: white maskStim1 = visual.GratingStim(win,tex=None,mask=invCircle, size=fieldSize*2+elemSize, contrast=-1, pos=(posX, posY)) #-1 contrast for blackness maskStim2 = visual.GratingStim(win,tex=None,mask=invCircle, size=fieldSize*2+elemSize, contrast=-1, pos=(-posX, -posY)) transDots = visual.ElementArrayStim(win, nElements=dotsN, units = 'deg', sizes=elemSize, elementTex=None, colors=(1.0, 1.0, 1.0), xys=random([dotsN, 2]) * fieldSize, colorSpace='rgb', elementMask='circle', fieldSize=fieldSize, fieldShape = 'sqr') #(fieldSize, fieldSize) rotDots = visual.ElementArrayStim(win, nElements=dotsN, units = 'deg', sizes=elemSize, elementTex=None, colors=(1.0, 1.0, 1.0), xys=random([dotsN, 2]), colorSpace='rgb', elementMask='circle', texRes=128, fieldSize=fieldSize, fieldShape = 'sqr')