# Random Dot Motion Task - Animation Problem

**URL:** <https://psychtoolbox.discourse.group/t/random-dot-motion-task-animation-problem/70>\
**Category:** Uncategorized\
**Created:** [November 23, 2017, 3:36pm UTC](https://psychtoolbox.discourse.group/t/random-dot-motion-task-animation-problem/70 "2017-11-23T15:36:42Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![hk283](https://avatars.discourse-cdn.com/v4/letter/h/dfb087/32.png) [@hk283](https://psychtoolbox.discourse.group/u/hk283)\
**Post date:** [November 23, 2017, 3:36pm UTC](https://psychtoolbox.discourse.group/t/random-dot-motion-task-animation-problem/70/1 "2017-11-23T15:36:42Z")

</div>

Hi All,

&nbsp;

I hope this finds you well. I was wondering of anyone could help me with the following problem. Using the script below (I tried to only post the necessary bits) on a Mac with Matlab 2017b and the latest Psychtoolbox, I am experiencing some problems creating a cloud of random dot motions: a) It seems that the cloud of dots flicker a lot and b) quite a few (more that 7%) of the flips are missed.

&nbsp;

Is there any way to improve the animation of the random dots? So far we tried different values for the speed of the dots and coherence levels with no effect on the animation of the dots. On my old MacBook Pro the problem seems to be less of a problem, e.g. the dots do not flicker as much and the number of missed flips is reduced (still around 9% misses though). I guess it might be a graphic card problem?&nbsp;

&nbsp;

Thanks for any help and all the best!

&nbsp;

Hans &nbsp;

&nbsp;

% -------------------------------------------------------------------------

% &nbsp; &nbsp; &nbsp; &nbsp; Psychtoolbox Setup & Stimulus and Response Parameters

% -------------------------------------------------------------------------

PsychDefaultSetup(2); % Setup PTB with some default values

&nbsp;

screens &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = Screen('Screens'); % obtain screen numbers

screenNumber&nbsp; &nbsp; &nbsp; = max(screens); % use main screen

&nbsp;[w, wrect]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= PsychImaging('OpenWindow', screenNumber,...

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0 , [], 32, 2,[], [],&nbsp; kPsychNeed32BPCFloat);

[x\_0, y\_0]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = RectCenter(wrect);

M &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= [-pi/2 pi/2]; % motion direction

P &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= &nbsp;[(x\_0-250) (x\_0+250)];

col &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= &nbsp;[0; &nbsp; 0;&nbsp; 255]&nbsp;;% dot color (blue at the moment)

waitframes&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 1; % number of frames to wait

stimdur &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = 2; % stimulus duration in seconds

iti &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 1; % intertrial interval; activate if this needs to be constant

fps &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 60; % framerate in frames per second

nfram &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;= stimdur\*fps; % stimulus&nbsp; duration in number of frames&nbsp;

mowi&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;= 30; % monitor width

viewdist&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;= 60; % viewing distance

dotspeed&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;= 5; % dot speed in visual degrees per second

ndots &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 200; % number of dots

max\_d &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 2; % maximum radius of aperture in degrees

coherence &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= [0.30 0.85]; % coherence level for all stimuli

white &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= [255; 255; 255]; % white color&nbsp;

ppd &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= pi\*(wrect(3)-wrect(1))/atan(mowi/viewdist/2)/360; % pixels per degree

pfs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;= dotspeed\*ppd/fps; % dot speed&nbsp; in pixels per frame

fix\_cord&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= [[x\_0, y\_0]-fix\_r\*ppd [x\_0, y\_0]+fix\_r\*ppd]; % fixation cross coordinates

rmax&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = max\_d\*ppd; % maximum radius of annulus (pixels from center)

s &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 2; % dot size in pixels

rkeys &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = [25 17]; % response keys rkeys(1) = v, rkeys(2) = n

ifi &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;= Screen('GetFlipInterval', w); % flip interval

vbl &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;= Screen('Flip', w); % flip

&nbsp;&nbsp;

&nbsp;% ---------------------------------------------------------------------

&nbsp;%&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Random Dot Kinematogram Creation

&nbsp;% ---------------------------------------------------------------------

&nbsp; &nbsp;

rdk &nbsp; &nbsp; &nbsp; &nbsp; = NaN(ndots,2,nfram); % dot Cartesian coordinates array&nbsp;

% stimulus parameters

nsdots&nbsp; &nbsp; &nbsp; = floor(coh\*ndots)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; % number of signal dots

nndots&nbsp; &nbsp; &nbsp; = ndots - nsdots&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; % number of noise&nbsp; dots

&nbsp;

% initialize dot positions

&nbsp; &nbsp;

for t = 1:3

&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;r = rmax\*sqrt(rand(ndots,1)); % radius&nbsp; polar coordinates

&nbsp; &nbsp; &nbsp; &nbsp; phi = 2\*pi\*rand(ndots,1); % phi polar coordinates

&nbsp; &nbsp; &nbsp; &nbsp; cs&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = [cos(phi) sin(phi)]; % transformation to Cartesian coordinates

&nbsp; &nbsp; &nbsp; &nbsp; xy&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = [r r].\*cs; % dot positions in Cartesian coordinates (pixels from center)

&nbsp; &nbsp; &nbsp; &nbsp; rdk(:,:,t)&nbsp; &nbsp; &nbsp; = xy;

&nbsp; &nbsp; end

&nbsp;

% cycle over remaining frames in triades

for t = 4:3:nfram

&nbsp;

&nbsp; &nbsp;% cycle over dot streams

&nbsp; &nbsp; &nbsp;for f = 1:3

&nbsp;

&nbsp;% signal and noise dots

&nbsp;% -------------------------------------------------------------

dxdy&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = NaN(ndots,2); % initialize dot displacement&nbsp;

sidx&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = sort(randsample(ndots,nsdots)); % sample signal dot indices

dxdy(sidx,:)&nbsp; &nbsp; = repmat(pfs\*[cos(sdphi) sin(sdphi)],nsdots,1)&nbsp; ; % dot position change vector

ndphi &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = 2\*pi\*rand(nndots,1); % phi polar coordinates&nbsp; &nbsp;

nidx&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = setxor(sidx,1:ndots); % determine &nbsp; noise&nbsp; dot indices

dxdy(nidx,:)&nbsp; &nbsp; = pfs\*[cos(ndphi) sin(ndphi)]; % dot position change vector

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rdk(:,:,t+f-1)&nbsp; = rdk(:,:,t-4+f) + dxdy; % update RDK

&nbsp;

% circular aperture and dot relocation&nbsp;

% ---------------------------------------------------------

out = find(sqrt(rdk(:,1,t+f-1).^2 + rdk(:,2,t+f-1).^2) \> rmax);

&nbsp; &nbsp; &nbsp;if out

&nbsp;

&nbsp; &nbsp; nout = length(out); % number of dots to replace

&nbsp; &nbsp; % cycle over dots to replace

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for i = 1:nout

&nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p &nbsp; =&nbsp; rdk(out(i),:,t-4+f) + [pos y\_0]; % dot motion line support vector&nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; u &nbsp; =&nbsp; dxdy(out(i),:); % dot motion line direction vector

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a &nbsp; = -u(2); % dot motion line in coordinate form ax + by = c

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b &nbsp; =&nbsp; u(1); % dot motion line in coordinate form ax + by = c

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c &nbsp; =&nbsp; p(1)\*a + p(2)\*b; % dot motion line in coordinate form ax + by = c

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d &nbsp; = c - a\*pos - b\*y\_0; % re-centered system

&nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % check for two intersection points

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if rmax^2\*(a^2 + b^2) \>= d^2 &nbsp; &nbsp; &nbsp;

&nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % evaluate dot motion aperture intersection points

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isp = [pos+((a\*d+b\*sqrt(rmax^2\*(a^2 + b^2)-d^2))/(a^2+b^2)), ... &nbsp;

&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y\_0+((b\*d-a\*sqrt(rmax^2\*(a^2 + b^2)-d^2))/(a^2+b^2)); ...

&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pos+((a\*d-b\*sqrt(rmax^2\*(a^2 + b^2)-d^2))/(a^2+b^2)), ... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y\_0+((b\*d+a\*sqrt(rmax^2\*(a^2 + b^2)-d^2))/(a^2+b^2))];

&nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % intersection point - support point distances

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [mval,mi] = min([norm(isp(1,:) - p) norm(isp(2,:) - p)]);

&nbsp;

&nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;% relocate dot to opposite aperture side retaining identical motion&nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p\_new &nbsp; = isp(setxor(mi,[1 2]),:) + (rdk(out(i),:,t+f-1) + [pos y\_0]) - isp(mi,:);

&nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end

&nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % replace dot coordinates

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rdk(out(i),:,t+f-1) = p\_new - [pos y\_0];

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end

&nbsp; &nbsp; &nbsp; &nbsp; end

&nbsp; &nbsp; end

&nbsp;

% -----------------------------------------------------------------

% Observation : Random Dot Kinematogram

% -----------------------------------------------------------------

&nbsp;

&nbsp;&nbsp;

&nbsp; &nbsp; for i = 1:nfram

&nbsp; &nbsp; &nbsp; &nbsp; if (i\>1)

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Screen('FillOval', w, uint8(white), fix\_cord); % draw fixation dot (flip erases it)

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Screen('DrawDots', w, rdk(:,:,i)', s, col, [pos y\_0], 1); % determine dot color &nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Screen('DrawingFinished', w);

&nbsp; &nbsp; &nbsp; &nbsp; end

&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; vbl = Screen('Flip', w, vbl + (waitframes-0.5)\*ifi); % flip screen

&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; a\_t &nbsp; &nbsp; = NaN;&nbsp;% default action

&nbsp; &nbsp; &nbsp; &nbsp; RT&nbsp; &nbsp; &nbsp; = NaN;

&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; [keyIsDown, keySecs, keyCode]&nbsp; = KbCheck;

&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if keyIsDown

&nbsp;

&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % if the pressed key is a response key

&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if find(keyCode) == rkeys(1) || find(keyCode) == rkeys(2)

&nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % distinguish key presses

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if find(keyCode) == rkeys(1)

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a\_t = 1;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elseif find(keyCode) == rkeys(2)

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a\_t = 2;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end

&nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; % evaluate reaction time

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RT = keySecs - rstart;&nbsp;

&nbsp;

&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;

&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;

&nbsp;&nbsp; &nbsp; &nbsp; if a\_t == 1&nbsp; || a\_t == 2 % break out of stimuli animation if a response was given

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;

&nbsp; &nbsp;

&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;

&nbsp;&nbsp; &nbsp; &nbsp; end

&nbsp; &nbsp; &nbsp; &nbsp;

&nbsp; &nbsp; end

&nbsp;
