How QDSpy works
Contents
How QDSpy works¶
In QDSpy, stimuli are represented by Python scripts (.py). It is important to understand, that such a Python stimulus script describes how a stimulus is rendered, but does not present it directly.
When running a Python stimulus script (e.g. from a shell as
python .\scriptname.py
), it generates a compiled version of the stimulus
and saves this as a pickle file (.pickle). This .pickle file will be “played”
to present the stimulus. When running a Python stimulus script as described
above and a current .pickle file of the same name exists, the stimulus is
presented.
Therefore, one needs to distinguish between the execution of the Python
stimulus script (compile-time) and the presentation of its “pickled”
version (presentation-time). One important consequence is that Python code
which does not use the QDS
module commands to render the stimulus will
not effect on the presentation of the stimulus.
For example, QDSpy commands that address a lightcrafter (QDS.LC_xxx()
)
will affect the lightcrafter at presentation-time but not at compile-time,
whereas the commands from the lightcrafter API
(Devices.lightcrafter
module) affect a lightcrafter at compile-time
but not at presentation time.
Screen overlay mode¶
Normal objects
The colour commands (e.g. QDS.SetObjColorEx()
) now accept up to 6 values.
Missing values are automatically added and set to 0. For example, the following
command sets the colour of object #1 to (r,g,b)
the first of the two display
devices; the object will be automatically also shown of the second display device
but with colours (u,0,0)
, that is the “red” channel on that display is set
to u
while the “green” and “blue” channels are set to 0
.
...
r = 255
b = 128
g = 0
u = 64
color = (r,g,b,u)
QDS.SetObjColorEx([1], [color], [255])
...
Here, (r,g,b,u)
is equivalent to (r,g,b,u,0,0)
. When a such a
polychromatic stimulus is presented in the standard (non-overlay) mode, colour
values beyond the first 3 are ignored.
Movies and videos
Since movies and videos cannot have more than 3 colours, polychromatic stimuli require two movies/videos, each with the colour information for the respective display device.
To direct a movie/video to the respective device,
the commands QDS.Start_Movie()
and QDS.Start_Video()
now feature the
additional parameter _screen
, which can be set to the index of the display
device, 0 or 1 (0 is the default). Note that this index is not related to the
screen index under Windows; this index just addresses the left (0) or right (1)
half of the dual-screen presentation area.
Gamma correction¶
The colour lookup table (LUT) that (very roughly) translates pixel colors into displayed colors can now be changed, for example, to account for non-linearities in the intensity range of the display device.
For details on gamma correction under Windows, see
here.
QDSpy currently uses Windows’ SetDeviceGammaRamp
function to change gamma.
The advantage is that it is very simple to use, however, a side effect is that
all connected screens are affected.
To use gamma correction, see also section Getting ready. Also, a flag in
the configuration file (QDSpy.ini
) needs to be set:
[Display]
bool_allowGammaLUT = True
There are two ways to adjust the LUT:
Have a text file (
.txt
) that defines the whole LUT in the main QDSpy folder. This file is then automatically loaded when QDSpy is started (only GUI version). The name of the file has to be the same as the following entry in theQDSpy.ini
file:
[Display]
str_userGammaLUTFileName = defaultGammaLUT
Using the function
QDS.setColorMode()
in a stimulus script to re-define individual entries of the LUT. This option is not yet fully implemented.
When the program ends, a linear gamma LUT will be automatically restored.
Log file¶
The log file contains “machine-readable” entries with information
about the stimuli that are presented. These entries alway start with DATA
and are string representations of Python dictionaries.
User-defined entries:
Using the function
QDS.LogUserParameters()
in a stimulus script, the user log information important for the data analysis.20151220_135948 DATA {'nTrials': 1, 'dxStim_um': 1000}
The QDSpy GUI allows the user to enter comments at any timepoint.
20151220_135951 DATA {'userComment': 'Cell #3 responds well'}
Automatically written entries:
Start of stimulus presentation (stimulus file name with relative path, state of presentation, md5 hash of stimulus pickle file).
20151220_135948 DATA {'stimState': 'STARTED', 'stimFileName': '.\\Stimuli\\RGC_Chirp_2', 'stimMD5': 'c81ec82f926eadbd3a649f861f30b5e7'}
End of stimulus presentation (stimulus file name with relative path, state of presentation).
20151220_135951 DATA {'stimState': 'ABORTED', 'stimFileName': '.\\Stimuli\\RGC_Chirp_2'}
Information about presentation after the end of a stimulus.
20151220_135951 DATA {'nFrames': 180, 'avgFreq_Hz': 60.001000732110455, 'nDroppedFrames': 1}