PsychoPy - Psychology software for Python, Release 1.84.0
Your first stimulus
Building stimuli is extremely easy. All you need to do is create aWindow, then some stimuli. Draw those stimuli,
then update the window. PsychoPy has various other useful commands to help with timing too. Here’s an example.
Type it into a coderwindow, save it somewhere and press run.
1
from psychopy import visual, core
# import some libraries from PsychoPy
2
3
#create a window
4
mywin = visual.Window([800,600], monitor="testMonitor", units="deg")
5
6
#create some stimuli
7
grating = visual.GratingStim(win=mywin, mask="circle", size=3, pos=[-4,0], sf=3)
8
fixation = visual.GratingStim(win=mywin, size=0.5, pos=[0,0], sf=0, rgb=-1)
9
10
#draw the stimuli and update the window
11
grating.draw()
12
fixation.draw()
13
mywin.update()
14
15
#pause, so you get a chance to see it!
16
core.wait(5.0)
Note: For those new to Python. Did you notice that the grating and the fixation stimuli both callGratingStim
but have different arguments? One of the nice features about python is that you can select which arguments to set.
GratingStim has over 15 arguments that can be set, but the others just take on default values if they aren’t needed.
That’s a bit easy though. Let’s make the stimulus move, atleast! To do that we need to create a loop where we change
the phase (or orientation, or position...) of the stimulus and then redraw. Add this code in place of the drawing code
above:
for frameN in range(200):
grating.setPhase(0.05'+')
# advance phase by 0.05 of a cycle
grating.draw()
fixation.draw()
mywin.update()
That ran for 200 frames (and then waited 5 seconds as well). Maybe it would be nicer to keep updating until the user
hits a key instead. That’s easyto add too. In the first line add event to the listofmodules you’ll import. Then replace
the line:
for frameN in range(200):
with the line:
while True: #this creates a never-ending loop
Then, within the loop (make sure it has the same indentation as the other lines) add the lines:
if len(event.getKeys())>0: break
event.clearEvents()
the first line counts how many keys have been pressed since the last frame. If more thanzero are foundthen we break
out of the never-ending loop. Thesecondline clears the event bufferandshould always becalledafteryou’ve collected
the events you want (otherwise it gets full of events that we don’t care about like the mouse moving around etc...).
Your finished script should look something like this:
7.2. PsychoPy Tutorials
75
Pdf search and replace text - search text inside PDF file in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Learn how to search text in PDF document and obtain text content and location information
pdf text search; search pdf files for text
Pdf search and replace text - VB.NET PDF Text Search Library: search text inside PDF file in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Learn How to Search Text in PDF Document and Obtain Text Content and Location Information in VB.NET application
search pdf files for text programmatically; pdf editor with search and replace text
PsychoPy - Psychology software for Python, Release 1.84.0
1
from psychopy import visual, core, event #import some libraries from PsychoPy
2
3
#create a window
4
mywin = visual.Window([800,600],monitor="testMonitor", units="deg")
5
6
#create some stimuli
7
grating = visual.GratingStim(win=mywin, mask='circle', size=3, pos=[-4,0], sf=3)
8
fixation = visual.GratingStim(win=mywin, size=0.2, pos=[0,0], sf=0, rgb=-1)
9
10
#draw the stimuli and update the window
11
while True#this creates s a a never-ending loop
12
grating.setPhase(0.05'+')#advance phase by 0.05 of a cycle
13
grating.draw()
14
fixation.draw()
15
mywin.flip()
16
17
if len(event.getKeys())>0: break
18
event.clearEvents()
19
20
#cleanup
21
mywin.close()
22
core.quit()
There are several more simple scripts like this in the demos menu of the Coder and Builder views and many more to
download. If you’re feeling like something bigger then gotoTutorial2:MeasuringaJNDusingastaircaseprocedure
which will show you how to build an actual experiment.
7.2.2 Tutorial 2: Measuring a JND using a staircase procedure
This tutorial builds an experiment to test your just-noticeable-difference (JND) to orientation, that is it determines
the smallest angular deviation that is needed for you to detect that a gabor stimulus isn’t vertical (or at some other
reference orientation). The method presents a pair of stimuli at once with the observer having to report with a key
press whether the left or the right stimulus was at the reference orientation (e.g. vertical).
You can download the full code here. Note that the entire experiment is constructed of less than 100 lines of
code, including the initial presentation of a dialogue for parameters, generation and presentation of stimuli, running
the trials, saving data and outputting a simple summary analysis for feedback. Not bad, eh?
There are a great many modifications that can be made to this code,however this example is designed to demonstrate
how much can be achieved with very simple code. Modifying existing is an excellent way to begin writing your own
scripts,for example you may want to try changingthe appearance ofthe text orthe stimuli.
Get info from the user
The first lines of code import the necessary libraries. We need lots of the psychopy components for a full experiment,
as well as python’s time library (to get the current date) and numpy (which handles various numerical/mathematical
functions):
from psychopy import core, visual, , gui, data, event
from psychopy.tools.filetools import fromFile, toFile
The try:...except:... lines allow us to try and load a parameter file froma previous run of the experiment. If
that fails (e.g. because the experiment has never been run) then create a default set of parameters. These are easy to
store in a python dictionary that we’ll call expInfo:
76
Chapter 7. Coder
C# PDF replace text Library: replace text in PDF content in C#.net
public void Replace(String oldString, String newString, RESearchOption option specified string text that match the search option from specified PDF page.
select text in pdf; search pdf documents for text
VB.NET PDF replace text library: replace text in PDF content in vb
NET: Replace Text in PDF File. The following coding example illustrates how to perform PDF text replacing function in your VB.NET project, according to search
converting pdf to searchable text format; search pdf for text in multiple files
PsychoPy - Psychology software for Python, Release 1.84.0
try:#try to o get t a a previous s parameters file
expInfo = fromFile('lastParams.pickle')
except:#if not t there then use e a a default t set
expInfo = {'observer':'jwp''refOrientation':0}
The last line adds the current date to whichevermethod was used.
So having loaded those parameters, let’s allow the userto change themin a dialogue box (which we’ll call dlg). This
is thesimplestformof dialogue,createddirectly fromthedictionary above. thedialoguewill be presented immediately
to the user and the script will wait until they hit OK or Cancel.
If they hit OK then dlg.OK=True, in which case we’ll use the updated values and save them straight to a parameters
file (the one we try to load above).
If they hit Cancel then we’ll simply quit the script and not save the values.
#present a dialogue to change params
dlg = gui.DlgFromDict(expInfo, title='simple JND Exp', fixed=['dateStr'])
if dlg.OK:
toFile('lastParams.pickle', expInfo)#save params to file for next time
else:
Setup the information for trials
We’ll create a file to which we can output some data as text during each trial (as well asoutputtingabinaryfile at
the end of the experiment). We’ll create a filename from the subject+date+”.csv” (note how easy it is to concatenate
strings in python just by ‘adding’ them).csv files can be opened in most spreadsheet packages. Having opened a text
file for writing, the last line shows how easy it is to send text to this target document.
#make a text file to save data
fileName = expInfo['observer'+ expInfo['dateStr']
dataFile open(fileName+'.csv''w')#a simple text file with h 'comma-separated-values'
PsychoPy allows us to set up an object to handle the presentation of stimuli in a staircase procedure, the
StairHandler. Thiswilldefinetheincrementoftheorientation(i.e. howfaritisfromthereferenceorienta-
tion). The staircase can be configured in many ways, but we’ll set it up to begin with an increment of 20deg (very
detectable) and home in on the 80% threshold value. We’ll step up our increment every time the subject gets a wrong
answer and step down ifthey get three right answers in a row. The step size will also decrease after every 2 reversals,
starting with an 8dB step (large) and going down to 1dB steps (smallish). We’ll finish after 50 trials.
#create the staircase handler
staircase = data.StairHandler(startVal = 20.0,
stepType = 'db', stepSizes=[8,4,4,2,2,1,1],
nUp=1, nDown=3,
#will home in on the 80% threshold
Build your stimuli
Now we need to create a window,some stimuli and timers. We need a ~psychopy.visual.Window inwhich to draw our
stimuli, a fixation point and two ~psychopy.visual.GratingStim stimuli (one for the target probe and one as the foil).
We can have as many timers as we like and reset them at any time during the experiment, but I generally use one to
measure the time since the experiment started and another that I reset at the beginning of each trial.
#create window and stimuli
win = visual.Window([800,600],allowGUI=True, monitor='testMonitor', units='deg')
foil = visual.GratingStim(win, sf=1, size=4, mask='gauss', ori=expInfo['refOrientation'])
7.2. PsychoPy Tutorials
77
C# PDF delete text Library: delete, remove text from PDF file in
option). Description: Delete specified string text that match the search option from PDF file. Parameters: Name, Description, Valid Value.
pdf searchable text converter; text searchable pdf
VB.NET PDF- View PDF Online with VB.NET HTML5 PDF Viewer
Text from PDF. Text: Search Text in PDF. Image: Extract Image from PDF. PDF Write. Text: Insert Text to PDF. Text: Delete Text from PDF. Text: Replace Text in PDF
search a pdf file for text; pdf text search tool
PsychoPy - Psychology software for Python, Release 1.84.0
target = visual.GratingStim(win, sf=1, size=4, mask='gauss', ori=expInfo['refOrientation'])
fixation = visual.GratingStim(win, color=-1, colorSpace='rgb', tex=None, mask='circle',size=0.2)
#and some handy clocks to keep track of time
globalClock = core.Clock()
Once the stimuli are created we should give the subject a message asking ifthey’re ready. The next two lines create a
pair of messages, then draw them into the screen and then update the screen to show what we’ve drawn. Finally we
issue the command event.waitKeys()which will wait for a keypress before continuing.
#display instructions and wait
message1 = visual.TextStim(win, pos=[0,+3],text='Hit a a key y when ready.')
message2 = visual.TextStim(win, pos=[0,-3],
text="Then press left or r right to o identify y the %.1f deg probe." %expInfo['refOrientation'])
message1.draw()
message2.draw()
fixation.draw()
win.flip()#to show our newly drawn 'stimuli'
#pause until there's a keypress
Control the presentation of the stimuli
OK, so we have everything that we need to run the experiment. The following uses a for-loop that will iterate over
trials in the experiment. With each pass through the loop the staircase object will provide the new value for the
intensity (which we will call thisIncrement). We will randomly choose a side topresent the target stimulus using
numpy.random.random(), setting the position of the target to be there and the foil to be on the other side of the
fixation point.
for thisIncrement in staircase: #will step p through h the staircase
#set location of stimuli
targetSide= random.choice([-1,1]) #will be e either +1(right) or r -1(left)
foil.setPos([-5
*
targetSide, 0])
Then set the orientation of the foil to be the reference orientation plus thisIncrement, draw all the stimuli (in-
cluding the fixation point) and update the window.
#set orientation of probe
foil.setOri(expInfo['refOrientation'+ thisIncrement)
#draw all stimuli
foil.draw()
target.draw()
fixation.draw()
Wait for presentation time of 500ms and then blank the screen (by updating the screen after drawing just the fixation
point).
core.wait(0.5#wait 500ms; ; but t use a loop of f x x frames for more e accurate e timing g in n fullscreen
# eg, to get 30 frames: for f in xrange(30): win.flip()
#blank screen
fixation.draw()
Get input from the subject
Still within the for-loop (note the level of indentation is the same) we need to get the response from the subject. The
method works by starting off assuming that there hasn’t yet been a response and then waiting for a key press. For
78
Chapter 7. Coder
VB.NET PDF Page Replace Library: replace PDF pages in C#.net, ASP.
Text from PDF. Text: Search Text in PDF. Image: Extract Image from PDF. PDF Write. Text: Insert Text to PDF. Text: Delete Text from PDF. Text: Replace Text in PDF
text searchable pdf file; how to select all text in pdf file
C# PDF Page Replace Library: replace PDF pages in C#.net, ASP.NET
You can replace an entire PDF page with another PDF page from another PDF file. All information, data on the original page are removed, including text, images
how to make a pdf file text searchable; how to select text in pdf
PsychoPy - Psychology software for Python, Release 1.84.0
each key pressed we check if the answer was correct or incorrect and assign the response appropriately, which ends
the trial. We always have to clear the event buffer ifwe’re checking forkey presses like this
#get response
thisResp=None
while thisResp==None:
allKeys=event.waitKeys()
for thisKey in allKeys:
if thisKey=='left':
if targetSide==-1: thisResp 1#correct
else: thisResp = -1
#incorrect
elif thisKey=='right':
if targetSide== 1: thisResp 1#correct
else: thisResp = -1
#incorrect
elif thisKey in ['q''escape']:
core.quit() #abort experiment
Now we must tell the staircase the result of this trial with itsaddData() method. Then it can work out whether the
next trial is an increment or decrement. Also, on each trial (so still within the for-loop) we may as well save the data
as a line of text in that .csv file we created earlier.
#add the data to the staircase so it can calculate the next level
staircase.addData(thisResp)
dataFile.write('%i,%.3f,%i\n' %(targetSide, thisIncrement, thisResp))
Output your data and clean up
OK! We’re basically done! We’ve reached the end of the for-loop (which occurred because the staircase terminated)
which means the trials are over. The next step is to close the text data file and also save the staircase as a binary file
(by ‘pickling’ the file in Python speak) which maintains a lot more info than we were saving in the text file.
#staircase has ended
dataFile.close()
Whilewe’re here,it’s quite nice togive some immediate feedback to the user. Let’s tellthem the intensity values at the
all the reversals and give them the mean of the last 6. This is an easy way to get an estimate of the threshold, but we
might be able to do a betterjob by trying to reconstruct the psychometric function. To give that a try see the staircase
analysis script ofTutorial3.
Having saved the data you can give your participant some feedback and quit!
staircase.saveAsPickle(fileName) #special python binary y file to o save all l the e info
#give some output to user in the command line in the output window
print 'reversals:'
print staircase.reversalIntensities
print 'mean of f final 6 6 reversals s = %.3f%(numpy.average(staircase.reversalIntensities[-6:]))
#give some on screen feedback
feedback1 = visual.TextStim(win, pos=[0,+3],
text='mean of f final 6 6 reversals s = %.3f%
(numpy.average(staircase.reversalIntensities[-6:])))
feedback1.draw()
fixation.draw()
win.flip()
event.waitKeys() #wait for r participant to o respond
win.close()
7.2. PsychoPy Tutorials
79
C# HTML5 PDF Viewer SDK to view PDF document online in C#.NET
Text from PDF. Text: Search Text in PDF. Image: Extract Image from PDF. PDF Write. Text: Insert Text to PDF. Text: Delete Text from PDF. Text: Replace Text in PDF
how to select text in pdf and copy; how to select all text in pdf
C# PDF Text Highlight Library: add, delete, update PDF text
Description: Highlight specified string text that match the search option from PDF file. Parameters: Name, Description, Valid Value.
how to select text in pdf image; find and replace text in pdf
PsychoPy - Psychology software for Python, Release 1.84.0
7.2.3 Tutorial 3: Analysing data in Python
You could simply output your data as tab- or comma-separated text files and analyse the data in some spreadsheet
package. But thematplotliblibrary in Python also allows for very neat and simple creation of publication-quality
plots.
This script shows you how to use a couple of functions from PsychoPy to open some data files
(psychopy.gui.fileOpenDlg()) and create a psychometric function out of some staircase data
(psychopy.data.functionFromStaircase()).
Matplotlibisthenusedtoplotthedata.
Note: Matplotliband pylab. Matplotlib is a python library that has similarcommand syntax to most of the plotting
functions in Matlab(tm). In canbe imported in different ways; the import pylab line at the beginning ofthescript
is the way to import matploblib as well as a variety of other scientific tools (that aren’t strictly to do with plotting per
se).
1
2
#This analysis script takes one or more staircase datafiles as input
3
#from a GUI. It then plots the staircases on top of each other on
4
#the left and a combined psychometric function from the same data
5
#on the right
6
7
from psychopy import data, gui, core
8
from psychopy.tools.filetools import fromFile
9
import pylab
10
11
#Open a dialog box to select files from
12
files = gui.fileOpenDlg('.')
13
if not files:
14
core.quit()
15
16
#get the data from all the files
17
allIntensities, allResponses = [],[]
18
for thisFileName in files:
19
thisDat = fromFile(thisFileName)
20
allIntensities.append( thisDat.intensities )
21
allResponses.append( thisDat.data )
22
23
#plot each staircase
24
pylab.subplot(121)
25
colors 'brgkcmbrgkcm'
26
lines, names = [],[]
27
for fileN, thisStair in enumerate(allIntensities):
28
#lines.extend(pylab.plot(thisStair))
29
#names = files[fileN]
30
pylab.plot(thisStair, label=files[fileN])
31
#pylab.legend()
32
33
#get combined data
34
combinedInten, combinedResp, combinedN = \
35
data.functionFromStaircase(allIntensities, allResponses, 5)
36
#fit curve - in this case using a Weibull function
37
fit = data.FitFunction('weibullTAFC',combinedInten, combinedResp, \
38
guess=[0.20.5])
39
smoothInt = pylab.arange(min(combinedInten), max(combinedInten), 0.001)
40
smoothResp = fit.eval(smoothInt)
41
thresh = fit.inverse(0.8)
80
Chapter 7. Coder
PsychoPy - Psychology software for Python, Release 1.84.0
42
print thresh
43
44
#plot curve
45
pylab.subplot(122)
46
pylab.plot(smoothInt, smoothResp, '-')
47
pylab.plot([thresh, thresh],[0,0.8],'--'); pylab.plot([0, thresh],\
48
[0.8,0.8],'--')
49
pylab.title('threshold = %0.3f%(thresh))
50
#plot points
51
pylab.plot(combinedInten, combinedResp, 'o')
52
pylab.ylim([0,1])
53
54
pylab.show()
7.2. PsychoPy Tutorials
81
PsychoPy - Psychology software for Python, Release 1.84.0
82
Chapter 7. Coder
CHAPTER
EIGHT
REFERENCE MANUAL (API)
Contents:
8.1 psychopy.core - basic functions (clocks etc.)
Basic functions, including timing, rush (imported),quit
psychopy.core.getTime()
Get the current time since psychopy.core was loaded.
VersionNotes: NotethatpriortoPsychoPy1.77.00the behaviourofgetTime()wasplatformdependent(onOSX
andlinuxit was equivalent topsychopy.core.getAbsTime() whereas onwindows itreturnedtime since
loading of the module, as now)
psychopy.core.getAbsTime()
Return unix time (i.e., whole seconds elapsed since Jan 1, 1970).
This uses the same clock-base as the other timing features, like getTime(). The time (in seconds) ignores the
time-zone (like time.time() on linux). To take the timezone into account, use int(time.mktime(time.gmtime())).
Absolute times in seconds are especially useful to add to generated file names for being unique, informative (=
ameaningful time stamp), and because the resulting files will always sort as expected when sorted in chrono-
logical, alphabetical, or numerical order, regardless of locale and so on.
Version Notes: This method was added in PsychoPy 1.77.00
psychopy.core.wait(secs,hogCPUperiod=0.2)
Wait for a given time period.
If secs=10 and hogCPU=0.2 then for 9.8s python’s time.sleep function will be used, which is not especially
precise, but allows the cpu to perform housekeeping. In the final hogCPUperiod the more precise method of
constantly polling the clock is used forgreater precision.
If you want to obtain key-presses during the wait, be sure to use pyglet and to hogCPU for the entire time, and
then callpsychopy.event.getKeys() after callingwait()
Ifyou want to suppress checking forpyglet events during the wait, do this once:
core.checkPygletDuringWait False
and from thenon youcan do:: core.wait(sec)
This will preserve terminal-window focus during command line usage.
83
PsychoPy - Psychology software for Python, Release 1.84.0
class psychopy.core.Clock
Aconvenient class to keep track oftime in your experiments. Youcan have as many independent clocks as you
like (e.g. one to time responses,one to keep track of stimuli...)
This clock is identical to theMonotonicClock except that it can also be reset to 0 or another value at any
point.
add(t)
Add more time to the clock’s ‘start’time (t0).
Note that,by adding time to t0, you make the current time appear less. Can have the effect that getTime()
returns a negative numberthat will gradually count back up to zero.
e.g.:
timer = core.Clock()
timer.add(5)
while timer.getTime()<0:
# do something
reset(newT=0.0)
Reset the time on the clock. With noargs time will be set to zero. If a float is received this will be the new
time on the clock
class psychopy.core.CountdownTimer(start=0)
Similar to aClock except that time counts down from the time of last reset
Typical usage:
timer = core.CountdownTimer(5)
while timer.getTime() > 0:
# after 5s will become negative
# do stuff
getTime()
Returns the current time left on this timer in secs (sub-ms precision)
class psychopy.core.MonotonicClock(start_time=None)
Aconvenient class to keep track oftime in your experiments using a sub-millisecond timer.
Unlike theClock this cannot be reset to arbitrary times. For this clock t=0 always represents the time that the
clock was created.
Don’t confuse this class with core.monotonicClock which is an instance of it that got created when Psy-
choPy.core was imported. That clock instance is deliberately designed always to return the time since the
start of the study.
Version Notes: This class was added in PsychoPy 1.77.00
getLastResetTime()
Returns the current offset being applied to the high resolution timebase used byClock.
getTime()
Returns the current time on this clock in secs (sub-ms precision)
class psychopy.core.StaticPeriod(screenHz=None, win=None, name=’StaticPeriod’)
Aclass to help insert a timing period that includes code to be run.
Typical usage:
fixation.draw()
win.flip()
ISI = StaticPeriod(screenHz=60)
ISI.start(0.5)
# start a period of 0.5s
84
Chapter 8. Reference Manual (API)
Documents you may be interested
Documents you may be interested