Hi all,
I’m relatively new to psychopy (doing my first experiment for my bachelor’s thesis) and have come across a problem controlling stimulus presentation:
In my experiment’s procedure, I do present an image for 2 frames on a 75 hz CRT-monitor. This is directly followed by a set of three masks, that are also presented for 2 frames each. Next, there is a blank intervall randomly ranging between 90 and 120 frames.
Having seen the image, subjects should as quickly as possible decide whether they have seen an indoor- or an outdoor-scene by lifting a finger of one of the ctrl-keys, that are required to be held down.
Now here’s my problem (Code below): I set the win.recordFrameIntervals to True to obtain info about dropped frames. In order to see for every trial if frames were dropped, I set the recording to zero directly before starting with the presentation procedure, and save the number of dropped frames in a variable that is appended to my output. I alway get one dropped frame per trial, also with a second CRT-monitor I tested my experiment on. The computer has an external graphics card with drivers that are fully updated.
Code:
#Preload Images
images = [] # need to start with an empty list
filenames = expFile["filename"]
filenames_path = path_images + expFile["filename"]
for file in filenames_path: #create an image stimulus from each file, and store it in the list
images.append(visual.ImageStim(win=win, image=file))
#function to present image and masks and capture RT of releasing a key
def presentImage(win,stimulus, maskPic1, maskPic2, maskPic3, fillerPic):
image = stimulus
mask1 = maskPic1
mask2 = maskPic2
mask3 = maskPic3
filler = fillerPic
c = 0
io.clearEvents()
for frameN in xrange(2):
image.draw()
win.flip()
if frameN == 0:
t1 = core.getTime() #time at stimulus onset
win.flip()
for frameN in xrange(2):
mask1.draw()
win.flip()
win.flip()
for frameN in xrange2):
mask2.draw()
win.flip()
win.flip()
for frameN in xrange(2):
mask3.draw()
win.flip()
win.flip()
waitTime = random.randint(90, 120)
for frameN in xrange(waitTime):
filler.draw()
win.flip()
win.flip()
a = 0 #to only capture first release/reaction
for event in keyboard_io.getReleases(keys=[target_key, distractor_key]):
if a==0:
c = event.time - t1 #difference in time between stimulus onset and key-release
a += 1
if c != 0:
return (event.key, c)
else:
return (99, c)
#frame recording
win.recordFrameIntervals = True
win.refreshThreshold = 1/monitor_hz + 0.004
#do trials
for i in range(nTrials): #loop over all images
#here, some stuff is done i don't want to bother you with, so I will just describe what is done
#calling some functions: check if keys are held down, draw fixation cross
#decide which masks are going to be used
#now, the relevant part begins
win.nDroppedFrames = 0
resp, RT = presentImage(win,dict2[stimList[i]], mask1, mask2, mask3, fillerPic) #save response and reaction time
droppedFrames = win.nDroppedFrames
As mentioned before, my problem is that for every trial, one frame is recorded as dropped in the variable “droppedFrames”. I have no idea why that is and would naturally like to have no frames dropped.
Is there anybody with an idea what i could improve to controll the stimulus presentation in a way that no frames will be dropped?
Thank you in advance,
Mathis