-
Notifications
You must be signed in to change notification settings - Fork 0
jsdpag/met
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
Matlab Electrophysiology Toolbox (MET)
This is a set of programs that synchronise the activity of multiple
processes (in a Unix sense) that run Matlab. Each one controls a
specific job, but the coordinated action is to run an
electrophysiological experiment in real time.
Setup
Place met directory someplace like ~/Documents
To make MET executables visible, modify the user account
~/.profile file to include:
# set PATH so it includes Matlab Electrophysiology Toolbox
if [ -d "$HOME/Documents/met" ] ; then
PATH="$PATH:$HOME/Documents/met"
fi
Open matlab in super-user mode and save the met/m and
met/stim/met.stim.class folders to the Matlab path.
Run sudo matlab , or sudo ptb3-matlab. If your system has the
memory to spare, then also increase the amount of Java heap
memory in Matlab's Preferences>General>Java Heap Memory
Exit Matlab as soon as the path has been updated.
Make sure that the home directory contains sub-directories:
~/subject
~/subject/S000.Test
If using PsychToolbox to generate visual stimuli on a monitor
separate from the operator's, it may be necessary to set the
screentohead preference, if there is a problem with beam-position
queries. See metscrnpar.m and metscrnpar.csv.
If using cbmex then it may be necessary to set the socket read
buffer sizes. This can be done permanently in Ubuntu by adding
lines to /etc/sysctl.conf, including:
net.core.rmem_max=16777216
net.core.rmem_default=8388608
And reboot. To see if it worked, run:
cat /proc/sys/net/core/rmem_max
cat /proc/sys/net/core/rmem_default
Should multi-channel analogue input via the USB-1208fs be
required, say for collecting gaze positions, then it is
necessary to replace the PsychToolbox DaqAInScan.m function
with MET's custom version. A zipped copy is found in met/m.
To install, find out where the local PsychToolbox
installation resides by running >> which Screen from the
Matlab command line. You may get something like this:
/usr/share/matlab/site/m/psychtoolbox-3/PsychBasic/
Screen.mexa64
In a system command terminal, navigate to the
psychtoolbox-3 directory, and thence to the
PsychHardware/Daq subdirectory. First, back up the default
function, then unzip the met version:
sudo mv DaqAInScan.m DaqAInScan.m.bak
sudo unzip <parent dir>/met/m/DaqAInScan.m.met.zip
Where <parent dir> is the path to the directory that contains
met.
Main directory
~/Documents/met - The main directory where the programs metgo
, metserver, and metbasic are found. These are the core
programs of MET. default.cmet is a link to the default.cmet
file in ./cmet.
Sub-directories
./c - C language source code. The MET header file met.h is kept
here, along with the files that are compiled into metserver.
MEX files are not kept here.
./c.mex - C language source code for MEX functions is kept here.
met.h from ./c is linked. Compiled binaries made with mex are
not kept here.
./c.util - C language source code for extra utilities that MET
requires. Each utility will have its own sub-directory
c.util/ivxudp - The MEX program that mediates UDP
communication between the local system and iViewX on a SMI
eye-tracking computer. Compiled MEX files should be moved
to the m/ directory.
./cmet - MET .cmet text files are kept here. These tell metgo
and metserver how many Matlab processes to run, and which
child controller functions to use.
./m - Binary executable functions made with mex are kept here,
along with child controler m-file functions. metcontroller.m
and metparse.m are kept here. The user must have write
permissions on this directory and the .csv files therein.
./m/mgui - Specifically for metgui, the MET GUI controller.
Contains metgui.txt listing which MET GUIs to load. The user
must have write permissions on this directory.
./tasklogic - All original .txt files describing MET task logic
are kept here. These are copied to each session directory that
uses them.
./stim - All MET stimulus definition m-file functions are kept
here. These are also originals, and copies are made for each
session directory that uses them. Sub-directory is:
stim/resources - Any special resources required by stimulus
definitions are kept here. For example, image or movie
files can exist here.
Working directory
~/.met - Information is written and read from here to coordinate
the activity of all child controllers.
Programs
metgo - BASH - The user runs this program to start up MET. If
there is no input argument, then it uses ./default.cmet ;
otherwise it requires one argument that names the .cmet file to
use. Its job is to arrange the instructions in the .cmet file
into command line argument strings for metserver, which it then
runs. It also prepares and removes ~/.met.
metserver - C binary - Runs each Matlab controller process, then
acts as a server for them to communicate MET signals. It
receives broadcast requests from each controller, and
then broadcasts signals to all controllers. As the parent
process, it must also monitor the life of each Matlab controller
and ensure that they all exit.
metbasic - BASH / m-file - This is a no-frills program with a
single Matlab -nodesktop session running in the system
terminal. It uses MET utilities and MET PTB stimulus
definitions to provide a simple environment for running a
basic experiment.
metcontroller - m-file - Each Matlab-based MET child controller
runs this function to initialise itself and run the controller
function. It will catch errors that originate in the controller
function, and ensure that the child controller exits.
metparse - m-file - Reads in the task logics and schedule.txt of
the current session directory, and converts this to a Matlab
data structure that can be used by a MET controller.
met - mex binary , mexa64 - Matlab interface for MET inter-process
communication. Uses a PsychToolbox-like syntax where the first
argument specifies a MET function. This is used to receive and
send MET signals, and to read or write to shared memory, and
to obtain lists of MET constants.
Files
./c/met.h - C language header file with all MET constants, types,
and so forth.
./version.txt - One line ASCII text file with the current version
number string.
./readme.txt - This document. Contains overview of MET, and
refers to itself in the 3rd person.
./default.cmet - Symbolic link onto ./cmet/default.cmet
./cmet/default.cmet - .cmet file with default MET controller
options.
Written by Jackson Smith - DPAG, University of Oxford
Version plan - Describes development steps at each stage.
00.00.00 to 00.00.31 - MET server controller
00.01.00 to 00.01.32 - met.c and metcontroller.m
00.02.00 to 00.02.15 - task logic and stimulus support
00.03.00 to 00.03.?? - standard MET controllers , finalise
metcontroller.m
00.04.00 to 00.04.?? - BETA testing
01.00.00 - Version 1 - First complete version of MET that is
capable of running an experiment.
Further sub-versions 01.XX.YY are numbered as such. YY increments
with each bug fix. XX increments with each enhancement that
doesn't change the core of MET e.g. MET startup, IPC, MET server.
02.00.00 - Version 2 - Allow any number of POSIX shared memory
objects, with names and sizes defined in controller options.
Any required expansion of MET signalling protocol. Any new
standard MET controllers. Modularise special resources.
Pass POSIX shared memory name as argument to metcontroller,
along with opening flag, number of readers, and event fds. Then
shared memory can be defined in the cmet file, as long as the
writer is supplied with a name and size, and the reader supplied
with the name.
History
23/06/2016 - 00.00.00 - First files and directories set up.
25/06/2016 - 00.00.01 - Increased metgo error checking.
27/06/2016 - 00.00.02 - metgo .cmet parsing and arg passing to
metserver. metserver placeholder function added. metcontroller
placeholder added. metgo does not make ~/.met or set socket
buffer sizes for system.
28/06/2016 - 00.00.03 - metgo checks for shared memory writer-
reader balance. metserver handles UNIX signals, starting
input argument checking of metserver.
28/06/2016 - 00.00.04 - Finished basic input argument checking
defined MET signal data types and structure.
29/06/2016 - 00.00.05 - Adding support for MET errors. Request
and close unnamed IPC. metserver resource flags.
29/06/2016 - 00.00.06 - Improved metserver error handling. And
laid down program framework ; the steps of initialisation and
shut-down.
30/06/2016 - 00.00.07 - Improved UNIX signal handling. Expands
set of handled signals. Does not restart system calls. Blocks
other signals while handling. Catches SIGALRM for timeouts.
06/07/2016 - 00.00.08 - Initialise file descriptors to FDINIT,
and improve internal error checking. POSIX shared memory
creation ; not tested, needs unlinking function first.
07/07/2016 - 00.00.09 - POSIX shared memory unliking. First
successful test added and removed shm from /dev/shm.
07/07/2016 - 00.00.10 - metsmunln now handles case where there are
no readers and shm doesn't exist. Creates eventfd for
synchronising POSIX shared memory. Added const modifier to
applicable input arguments in supporting functions.
08/07/2016 - 00.00.11 - Adding epoll support. Fixed bug in
metpipe.c where n was limited to SHMARG rather than MAXCHLD.
11/07/2016 - 00.00.12 - Gets atomic read/write size for pipes.
First version of MET signal broadcasting function.
11/07/2016 - 00.00.13 - Broadcast initialisation mwait and final
mquit. First version of MET signal request receiver function.
12/07/2016 - 00.00.14 - Better error handling in metgetreq.c
12/07/2016 - 00.00.15 - Tested metgetreq.c
13/07/2016 - 00.00.16 - New MET error codes for signal source and
time protocol breach, and timeout while waiting. Added MET
signal source and identifier checks to metgetreq.c
13/07/2016 - 00.00.17 - Tested new metgetreq.c checks. mready
reply waiting by MET server controller during initialisation.
14/07/2016 - 00.00.18 - UNIX signal checking on EINTR. Waits for
child processes.
14/07/2016 - 00.00.19 - Added concept of met.mexa64, which metgo
now looks for in ./m. Begin laying framework for fork-exec
MET child controllers.
15/07/2016 - 00.00.20 - Added metforx parent process code. Child
process error handling and test code in place.
25/07/2016 - 00.00.21 - Adapting for use of met ( ... ) interface.
No longer require metmatpnt_t typedef in met.h. Introducing MET
shared memory header byte coding format. Prepares argument
vector for MET child exec to Matlab ; now includes char flag
for shared mem. Initialises child controller standard output
redirected to /dev/null.
25/07/2016 - 00.00.22 - First tests of MET child controller exec to
Psych Toolbox Matlab. Test code put in met.c, prints to stderr.
26/07/2016 - 00.00.23 - Building MET server controller server
function. Not tested, lacks MET signal checking.
26/07/2016 - 00.00.24 - Adding MET signal checking.
27/07/2016 - 00.00.25 - First complete version of metsigsrv.c
27/07/2016 - 00.00.26 - metgo creates and removes MET root dir
~/.met. First compilable version of metsigsrv.c. Remove FDINIT
check on event fd's in metforx, because these will be
uninitialised if there are no readers on the corresponding shm.
First successful pilot test of complete MET server controller.
28/07/2016 - 00.00.27 - Added more error checking to start of
metsigsrv.c. Standard output no longer closed by MET child
controllers ; a duplicate file descriptor is passed to
metcontroller , which is re-duplicated back to STDOUT_FILENO.
29/07/2016 - 00.00.28 - [ All child processes forked from the MET
server controller are placed into their own distinct process
group ] But this causes Matlab to throw a phantom SIGCHLD during
startup ; until this issue is resolved, all forked processes
stay in the same process group as metserver, which it sends
SIGKILL as a last resort measure. Signal handling improved to
use sa_sigaction on caught signals rather than sa_handler.
29/07/2016 - 00.00.29 - Attempt placing child process group in
foreground. Matlab seems to rely on this. Consequently, a call
to tcsetpgrp must be made. As this can trigger a SIGTTOU, the
MET server controller must first block it, SIGTTIN, and SIGTSTP.
First successful direct cycle of MET signalling protocol states;
need to check mwait in trial init and wait-for-mstart.
30/07/2016 - 00.00.30 - metserver gets terminal attributes before
forking child MET controllers, then attempts to restore these
during shutdown, in case Matlab left the terminal in a strange
state. [ MAJOR PROBLEM!!! metgetreq seems to read in more bytes
than there should be, and reports checking more pipes than it
should have ] Resolved: due to faulty testing messages that
reported the amount of free space in the buffer rather than the
number of bytes returned.
31/07/2016 - 00.00.31 - Moved MET signal cargo and time range
checks from metsigsrv.c to metgetreq.c, so that metsigsrv.c
only checks for breaches related to MET signalling protocol
states. Did more checks on metsigsrv.c
31/07/2016 - 00.01.00 - First complete version of MET server
controller. Now move through development of met.c and
metcontroller.m
31/07/2016 - 00.01.01 - First versions of metcontroller.m and
met.c. Making first MET MEX function print.c.
01/08/2016 - 00.01.02 - print.c can now write to stdout or stderr,
and also to the MET controller's logfile. The met_t structure
now accommodates a logfile stream, and a pointer to the HOME
environment variable.
02/08/2016 - 00.01.03 - met function const written, and open begun.
02/08/2016 - 00.01.04 - Added MET files to const output.
02/08/2016 - 00.01.05 - met functions open and close written.
03/08/2016 - 00.01.06 - met close now writes mquit to req. pipe.
met logopn, logcls, and print now written and tested.
03/08/2016 - 00.01.07 - Added ME_MATLB MET error code for Matlab
errors encountered in MEX programs. Existing met functions now
assign MET error codes to the controller's mquit signal when
error is encountered.
04/08/2016 - 00.01.08 - Add non-blocking check on pipes in met
open. struct met_t now uses field 'p', 2 element int array
rather than .br and .qw ; instead, elements are accessed with
macros BCASTR and REQSTW for broadcast read and request write
e.g. .p[ BCASTR ] retrieves broadcast read file descriptor.
met const returns atomic write size of pipes.
04/08/2016 - 00.01.09 - met send for writing MET signals to the
request pipe.
05/08/2016 - 00.01.10 - met recv for receiving MET signals from
the broadcast pipe. First compilable version , untested.
05/08/2016 - 00.01.11 - Tested and refined met recv.
07/08/2016 - 00.01.12 - Event fd checking in met open.
07/08/2016 - 00.01.13 - MAJOR FLAW! This time it is real. Cannot
have one wefd shared by all readers, because readers don't know
whether they have already read from shared memory. Each reader
needs its own wefd to monitor
08/08/2016 - 00.01.14 - Will make and deliver separate writer's efd
for each reader. metcontroller input will have variable number of
efd's depending on access mode. metserver.c modified up to
metforx.c
08/08/2016 - 00.01.15 - Continuing writer's efd fix. metforx.c
modified up to building line of Matlab for -r argument.
09/08/2016 - 00.01.16 - All MET server controller functions
upgraded. Now metcontroller and met need servicing.
09/08/2016 - 00.01.17 - Started modifying metcontroller.m
09/08/2016 - 00.01.18 - metcontroller.m upgraded.
09/08/2016 - 00.01.19 - met 'open' and 'closed' functions adapted
for writer's efd lists. Ready to resume 'read' and 'write'
development.
10/08/2016 - 00.01.20 - Function to switch blocking mode on fd's
deployed to met 'send' , 'recv' , 'read' , and 'write'. 'read'
and 'write' check access permissions and don't allow a
controller to do a blocked read/write on shared memory if it can
also write/read the same memory ; thus avoiding a jam.
10/08/2016 - 00.01.21 - metxefdpost.c deployed to met 'read' and
'write'.
10/08/2016 - 00.01.22 - Event fd sync testing of met 'read' and
'write'.
11/08/2016 - 00.01.23 - Found a bug in metserver.c where wefd
is defined ; made 2D array by advancing along 1D array by
steps of SHMARG rather than number of child controllers.
Another problem produces an infinite loop in a child controller.
This may be related to met 'read' as all initialisation steps
seem to be correct.
11/08/2016 - 00.01.24 - Found another bug. The event fd reading
function metxefdread.c failed to catch read() system call errors
other than EINTR, EGAIN, or EWOULDBLOCK. Rather, it increased
the byte count and reversed the pointer because read() had
returned -1, thus causing an infinite loop.
11/08/2016 - 00.01.25 - Fixed pointer passing to metxsetfl. Was
passing int ** when doing wefdv + si, when int * was required.
Fixed by advancing pointer and dereferencing i.e. wefdv[ si ].
New and exciting problem. One process changes blocking mode of
event fd, the same efd's blocking mode changes for another
process. The reason, it turns out, is that they share the same
file description, as opposed to file descriptors! If they use
fcntl F_SETFL then the same description is affected, and the
actions of one process will have unexpected consequences for the
other. The solution is to reserve a separate event fd for each
controller ; only that controller will change the blocking mode
of its efd file description. Shared memory writers will only
change blocking on the readers' efd (so that the writer can wait
for readers) and only the readers will change blocking on the
writer's efd (so that readers can wait for the writer).
12/08/2016 - 00.01.26 - Foundation laid for met 'select'. 'write'
and 'read' still don't touch shared mem.
12/08/2016 - 00.01.27 - First complete and compilable version of
met 'select'.
12/08/2016 - 00.01.28 - met 'select' seems to be running properly.
13/08/2016 - 00.01.29 - metxconst.c now returns the set of shared
memory actions that are legal, given the permissions provided
during met 'open'.
13/08/2016 - 00.01.30 - Write and read headers from shared mem.
14/08/2016 - 00.01.31 - Write and read struct header. Read now
uses specified functions for making struct, cell array, and
basic matrices.
14/08/2016 - 00.01.32 - Writes and reads structs, cells, and matrix
values.
14/08/2016 - 00.02.00 - First complete version of the met()
function. First functional, but incomplete, version of
metcontroller.m ; this does not open/close special resources, as
testing this requires access to specialised hardware. This will
be implemented in version 00.03.XX.
19/08/2016 - 00.02.01 - Tweaked met 'send' and 'const'. For 'send',
the tim argument can be an empty matrix [], causing 'send' to
take a time measurement and apply it to all sent signals. 'const'
now has an optional input argument that flags whether or not to
return run-time constants.
21/08/2016 - 00.02.02 - Planned out the interface of metparse.m,
now implement it.
22/08/2016 - 00.02.03 - metsdpath.m added to read ~/.met/session
and verify current session directory. Started task logic file
parsing.
23/08/2016 - 00.02.04 - Writing task state list parser.
25/08/2016 - 00.02.05 - Parses state list. On to edges.
30/08/2016 - 00.02.06 - State edge parser written , tested to line
730.
31/08/2016 - 00.02.07 - Edge parser runs with simple example. Need
to test error-checking.
01/09/2016 - 00.02.08 - Made metparse.m part of the mandatory set
of MET files. First complete version of task logic parser.
02/09/2016 - 00.02.09 - schedule.txt task declaration parser runs,
but not thoroughly tested. Started var declaration parser.
02/09/2016 - 00.02.10 - Task var parsing mostly written , except
for distribution term checking. Also needs testing.
14/09/2016 - 00.02.11 - Started distribution checking on task
variables. Still needs testing.
14/09/2016 - 00.02.12 - Task variable and block declaration parsing
written. Working on eval. Need to check for unused stim defs, and
do testing.
15/09/2016 - 00.02.13 - Parser written. schedule.txt parsing needs
testing , so does unused logic/stim-def check. Nope , is missing
schedule.txt check for task or vars that aren't used by any
block.
15/09/2016 - 00.02.14 - Added check for unused task or var.
15/09/2016 - 00.02.15 - Checks form and content of stimulus
definition variable parameter output argument vpar. Tested.
16/09/2016 - 00.03.00 - metparser written. The essential pieces are
now available to develop MET controllers.
19/09/2016 - 00.03.01 - Added ./m/mgui directory for metgui
controller. Started GUI building. MET Remote.
20/09/2016 - 00.03.02 - Added more button behaviour to MET Remote.
Writing metgui API functions.
21/09/2016 - 00.03.03 - MET remote ready. Started making MET GUI
Central.
22/09/2016 - 00.03.04 - metparse returns vpar output argument of
stim definition variable parameters. It also does basic error
checking on input args. Can now return only task logic or var
pars. These changes are needed to write a session builder for
metgui. Generates metsubjdlg for getting session directory.
22/09/2016 - 00.03.05 - MET GUI Central session menu callback
starting to take shape for generation of a session descriptor.
23/09/2016 - 00.03.06 - Adjustment to MET GUI API. GUI descriptor
should be a field in figure's UserData. Thus, metgui only uses
the figure handle, and passes that to the update, refresh, and
close functions. Added event loop to metgui which reads new IPC
and sends MET signals on behalf of MET Remote and MET GUI
Central. test.m uses PTB and responds to signals from metgui.
27/09/2016 - 00.03.07 - metgui now uses metremote button values to
trigger new trial generation. metremote has zero-value place
holders for start and lock button MET signals. Trial outcome
buffer.
28/09/2016 - 00.03.08 - Many more metctrlconst.m constants added.
MET Subject Selector GUI mostly functional. Still needs the up
and down buttons , and Done must return a new session descriptor.
29/09/2016 - 00.03.09 - metparse logic.<tlogN> struct has fields
.file and .dir recording file name and directory of parsed file.
Added metgetfields for convenient access to metparse output.
MET Subject Dialogue is functional and returns its part of sess
descriptor. Started schedule builder dialogue.
30/09/2016 - 00.03.10 - Finished layout of schedule builder. Give
uicontrols and uitables normalised units so that dialogues can
resize , and components will keep relative size and position.
Added evar controls to schedule builder. Some functionality.
Adding tool tips.
03/10/2016 - 00.03.11 - Added more basic callbacks to schedule
builder.
04/10/2016 - 00.03.12 - First use of table popups and table
UIContextMenu for selecting controlled lists.
04/10/2016 - 00.03.13 - Tested task var selection callback. Added
task table selection callback, needs testing.
05/10/2016 - 00.03.14 - Cell edit callback written for tables.
Next step , have task and var controls edit session descriptor.
05/10/2016 - 00.03.15 - Schedule builder initialised by populated
session descriptor. Task and block list box selection changes
control contents to show selected item's properties.
06/10/2016 - 00.03.16 - Various fixes. Next, add evar callback,
min button check before delete , var list button callbacks ,
add-remove from session descriptor.
06/10/2016 - 00.03.17 - Table add and remove buttons affect the
figure's session descriptor. Now do the same for task/block add
and remove buttons, and var popup menu buttons.
06/10/2016 - 00.03.18 - Saw weird bug where block list value was
[]. Don't know where this happened. Wrote metsd2str to convert
session descriptor into schedule.txt string. All session builder
controls now affect figure's session descriptor. Final validation
functions in place. Requires viewing window. Also requires
pruning down of task logic and variable parameter sets to only
what will be used.
07/10/2016 - 00.03.19 - metcontroller now opens and closes cbmex
on request. First version of metdaqout.m written. This controller
function waits for MET signals, then transmits each one to the
NSP via its DAQ's digital output.
08/10/2016 - 00.03.20 - metcbmex written but not run. This
interfaces with the NSP, but still lacks use of trial
descriptors.
10/10/2016 - 00.03.21 - MET signal buffering and writing out as
comment footer in metcbmex. Various bug fixes. Shocking discovery
that met 'read' and 'write' don't know how to handle an empty
matrix ; the reason is that it never checks that an array has 0
elements, while mxGetElementSize returns 0 on error ;
multiplying the two indicates an error, but only if the array is
not empty ; the fix is simply an if else statement that checks
for an empty array first, and jumps to the finished escape point
if it is. There is another problem , cell arrays generated by
cell () will cause a crash, as their elements are all unset,
although you are shielded from this by normal Matlab code. It
seems to be impossible to tell the difference between an un-
populated cell array and insufficient heap space. A workaround
IS to explicitly initialise cell array elements with empties.
For this reason, metcell is now written and used by MET
controller functions. This is now a stable-ish demo.
10/10/2016 - 00.03.22 - metcbmex must keep calibration time points.
New ones are written each trial. Problems with matching clock
calibration time points , will need to test out sub-functions
in specially set up environments. For now, don't bother
converting clock values, but do convert NSP samples to
seconds. Yes, do, it was an indexing error. Backup now.
Mystery is what happens to spike time stamps at shm write.
10/10/2016 - 00.03.23 - metraster fixed. metcbmex seems stable.
All's good, now cbmex is gone to buggery. Trying to use different
'colour' for each comment, meaning max of 127 * 255 chars.
10/10/2016 - 00.03.24 - metcbmex now fixed to start file recording
before starting cbmex buffering. Crucially, about a 20ms pause
is placed between the two calls. This seems to resolve time-stamp
jumping, and crawling backwards in time.
12/10/2016 - 00.03.25 - Schedule builder now allows user to view
the schedule.txt file that results, and to accept or reject it.
13/10/2016 - 00.03.26 - Started metmkdir for creating session
directories.
14/10/2016 - 00.03.27 - Added more environment checks in metmkdir
29/11/2016 - 00.03.28 - First operational version of metmkdir.m
15/12/2016 - 00.03.29 - Started writing metdaqeye.m for reading
analogue eye positions and writing them to shared memory.
15/12/2016 - 00.03.30 - metdaqeye.m written but not tested.
metscrnpar.csv added to the met/m directory as a way of providing
screen information to all controllers, such as the width and
height in millimeters, and the subject's distance to the screen.
16/12/2016 - 00.03.31 - Minor bug fix to metdaqeye.m due to copying
code from another function, renaming variables. Wrote
metscrnpar.m convenience function to access metscrnpar.csv
values. Wrote metpixperdeg.m to compute pixels per degree of
visual angle.
16/12/2016 - 00.03.32 - meteyeplot.m written but not tested.
17/12/2016 - 00.03.33 - mready reply added to metdaqeye, and
meteyeplot tested offline. Reward pump control added to
metdaqout. met/m has a zipped copy of DaqAInScan that was
modified for streaming binoccular eye positions.
18/12/2016 - 00.03.34 - Retrofitting legacy taskcontroller.m and
go.m to run using MET. To run them, metlegctl was made.
mettimerobj made to clear MET IPC when controller is otherwise
blocked for Matlab reasons. Started metlegeye to show eye
position, but it's figures aren't showing, but -nojvm is not
provided.
18/12/2016 - 00.03.35 - metlegeye fixed by adding drawnow. 'stim'
now passes hit boxes from metlegctl to metlegeye and the eye
plot changes dynamically during the trial. Next, get a legacy
indev.m function to read eye positions from 'eye' shm.
19/12/2016 - 00.03.36 - Made dedicated legacy copy of meteyeplot,
and removed response position plot from runtimeplot. Wrote
metlegtrg, which also reads from 'stim' and generates mtarget
signals when the eye position enters a new hit box. As such,
the format of writes to 'stim' delivers hit box coordinates that
are separated by task stimulus, and corresponding concrete
stimulus indeces. metlegtrg does not yet use eye signals.
19/12/2016 - 00.03.37 - indev.m no longer required in session
directory. metlegtrg now has eye input device descriptor.
19/12/2016 - 00.03.38 - metlegtrg now written. It runs, but need
a pair of eyes to tell if it's working.
19/12/2016 - 00.03.39 - Tweak to mtarget interpretation in
taskcontroller.m so that variable 'targeted' can hold 0 when
nothing is targeted. The null target -1 can no longer be used
during the trial, as it doesn't make sense to change the value
of targeted if no new input arrives from the user. Conversely,
assume that the same stimulus is being targeted. Added some
templates to legacy directory, including a new fixation task.
20/12/2016 - 00.03.40 - Bundled mancal_indev.m and indev.m with the
met/m/legacy folder for manual calibration of the eye tracker.
The system has now been tested with human eyes in a fixation
task. This runs nicely. Trying to have metlegctl open a master
PTB window that can be re-used between calls to taskcontroller.
20/12/2016 - 00.03.41 - Finished launching master PTB window from
metlegctl. Added touch column to metscrpar.csv to say whether
the stimulus appears on a touchscreen.
22/12/2016 - 00.03.42 - Legacy retrofit taskcontroller.m can now
generate mreward MET signals when the user hits a reward button,
currently 'r'. This allows manual rewards during trials. There
is also a menu option to send a reward. meteyeplot_legacy.m now
ignores mrewards because they flood the timeline when a manual
reward is given.
28/12/2016 - 00.03.43 - Added trial and block descriptor
initialisers to MET controller constants, see metctrlconst.
The metgui controller shuffles its Matlab random number
generator during initialisation. metblock written but not tested.
This is for generating and maintaining a trial block descriptor.
29/12/2016 - 00.03.44 - Block descriptor has new fields 'varnam'
and 'var' , containing string names of variables and a struct
with each variable attribute ; varnam{ i } is the name of the
variable with attributes var( i ). Some testing of metblock.
Need to test out different dependent variables, especially
outcome-dependent.
30/12/2016 - 00.03.45 - metblock tested. Trial descriptor
attributes changed to .block_name and .block_id. metcontroller
attempts to delete any visible Matlab timer objects on closing.
metnewtrial written to generate new trial descriptors and update
session descriptor's trial identifier. Part tested, need to
check with different names for all parts of schedule.txt and
check with task variables for all components.
03/01/2017 - 00.03.46 - Further testing of metnewtrial. Added
optional input argument to create a new trial directory and
write the param_i.* files to it. Added optional output arg
that returns the string written to param_i.txt.
03/01/2017 - 00.03.47 - Start incorporating new functions into
metguicentral and metgui in order to create new session
directories, create new blocks of trials, and create new
trials. metmkdir now requires a fourth argument 'sched' which
is the string to write to the new session directory's
schedule.txt. metguicentral finalise and session_cb functions
now written but not tested.
04/01/2017 - 00.03.48 - metguicentral updates ~/.met/session with
new session directory name. Added SDFNAM to MET controller
constants, the session descriptor file name, where the session
descriptor is saved in the session directory. metgui improved
with a re-organised event loop. MET controller constants added
for stim and nsp shared memory data structures. Starting to add
trial buffer support for metgui.
05/01/2017 - 00.03.49 - By convention , 'stim' shm will now be
used to transfer hit regions rather than variable parameters.
metctrlconst touched up , includes cbmex 'trialdata' sampling
rate. Recovery added to metgui.
05/01/2017 - 00.03.50 - First complete version of metgui written.
Not yet tested. metsdpath now returns optional second argument
containing the trial identifier in ~/.met/trial.
06/01/2017 - 00.03.51 - metsubjdlg was missing access to MCC in one
function , and hadn't initialised a list of subject directories
when selecting the Clone option. metsessdlg did not make
uicontextmenu's parent the same as the table being made.
metguicentral , some small fixes ; proper variable names ,
make unique list of stimulus definitions , MET constants access.
metmkdir does not account for there being no date directory ;
now makes date directory if it is not there. metgui set first
element of outcome buffer to IGNORED , thus no first trial was
generated. Still need to test shm transfer to metgui, trial
buffering, aborting trial, opening new session or existing.
09/01/2017 - 00.03.52 - metnewtrial did not set ~/.met/trial
when input arg w was non-zero , now it does. Tested eye and
nsp shm transfer and trial buffering to metgui ; not extensively
but it looks good by eye, so far.
09/01/2017 - 00.03.53 - Added new MET controller constants for the
hit-region column indeces , and for param_<i>.mat formatting
strings. Minor error in metsd2str indexing while making block
string , confused counted for loop with cell array for loop and
always returned the first element instead of the ith one ; also
forgot to add 'evar' keyword for environment variables.
metguicentral did not check validity of session directory
given the Open or Clone command ; while metsdpath fails to
check for .finalise , but not any more.
10/01/2017 - 00.03.54 - Need to add mettimer to metguicentral for
when modal dialogues are displayed. Then shared memory will be
cleared by metgui and writes will go through. Need to fix
metsubjdlg and metsessdlg ; former to prevent duplicate
subject ids, and latter to stop task variable addition before
a task is available. metsessdlg Done button validation does
not fist look for a lack of things, assuming they must be there,
it overwrites return variable i as a for loop interator, and it
does not even validate blocks ; it does not validate blocks since
this is done by adding a new block and hitting 'OK' , but we must
at least check that it's there. metsd2str could not handle
lack of sub-declarations in task declaration. metsessdlg had
to check dependency of block variables by task , but also had
to prevent addition of dependent variables before the dependent
variable was added, notwithstanding outcome-dependent variables.
11/01/2017 - 00.03.55 - metguicentral did not refresh variable
parameter list following the use of metsessdlg. Was able to make
a new session from scratch using MET GUIs. New MET controller
constant for MET root directory file ; this will be written to
by each child controller , and contain a line with the
controller function name and shared memory attributes.
11/01/2017 - 00.03.56 - Add header and footer file writing to
metguicentral. metscrnpar now returns a struct that includes
fields hmirror and vmirror that say whether the monitor is
mirrored in the horizontal or vertical direction. metsavtxt
now written for saving a string to a text file. Needs testing.
12/01/2017 - 00.03.57 - MET and Matlab version information added
to session header. Can't use metsavtxt to write cntlattrib
because Matlab doesn't know how to write to a file that's open
in another Matlab ; the solution is to use system commands with
the >> redirection operator, which appends to an existing file
and queue's writes with those from other processes. Header and
footer writing now tested.
13/01/2017 - 00.03.58 - Abbridged trial information printed before
each trial runs, and outcome printed at the end. Change
metgui.txt to metgui.csv so that each MET GUI is treated as
either a real-time GUI or it is only updated at the end of each
trial.
14/01/2017 - 00.03.59 - Met remote now enables/disables MET
Session Info block controls. metgui refreshes MET Session Info
GUI when there is a newly opened session and when there is a new
trial. Added 'flush' command to met function set, which will
flush the standard output stream. metgui runs GUIs' recovery
functions after Opening a session and at the end of each trial.
metgui added a block buffer that remembers which blocks of trials
were deemed useful for later analysis. metsessdlg was unable to
update session descriptor after edits to existing objects. It
also let slip empty block variable list.
18/01/2017 - 00.03.60 - Fixed problem with metlegtrg when assigning
fewer eye samples than spaces available in the buffer. Removed
the line header that was formerly appended in met 'print'.
metgui now maintains a log file, and metcontroller will attempt
to print error messages to both terminal and log file, if it
exists. If there is no open log file then met 'logcls' silently
returns without doing anything.
19/01/2017 - 00.03.61 - Made metgui's MET signal request buffer a
global variable that special MET GUIs can add values to ; use
metguiqsig to queue signals. Not tested.
20/01/2017 - 00.03.62 - metguiqsig tested, now ready to finish
implementing MET Session Info GUI, which will have manual
reward control that queues mrdtype and mreward. Evar origin is
now given in degrees of visual field from the centre of the
screen where up and right are positive, down and left are
negative ; changed metparse and metsessdlg for that.
21/01/2017 - 00.03.63 - MET Session Info GUI largely written , but
MET API functions not tested.
23/01/2017 - 00.03.64 - Tweaked MET GUI API so that recovery and
reset functions accept a cell array as second input arg, where
first value is a string saying what to do, and the second is
context dependent. Tested MET Session Info's MET GUI API
functions. metgui was only advancing outcome buffer index if
last trial was ignored, the difference between == and ~=. There
was also a mis-understanding about how to use outc.i, where
a value of 0 was being considered the last outcome when no
outcome has a value less than 1. Had to update metblock to
account for the first trial when outcome input arg is [].
Have now re-tooled so that outc.i indexes the outcome of the
last trial to run. MET Sess Info GUI seems to be running
properly.
24/01/2017 - 00.03.65 - Added MET controller constants that
provide the form of an input struct for MET PTB stimulus
trial initialiser and stimulation functions, and also hitregion
column indeces. Started writing mettestptbstim for testing
ptb stimuli in a single-threaded environment, but it is necessary
to add more information to metscrnpar, including default
background, screen id, and screen-to-head mappings. This is now
added.
25/01/2017 - 00.03.66 - metlegtrg now checks targets in the reverse
order to which they were drawn i.e. the one that is drawn on top.
Removed 'mirror' field from the input struct for MET ptb stimulus
trial initialiser functions. Added much error checking to
mettestptbstim, need to finish checking input and output argument
from stim def function handles, and need to add more information
about stim def functions in the help.
26/01/2017 - 00.03.67 - Require MET ptb stimulus stim function to
accept both trial constant and trial variable structs as the
second and third arguments. Removed redundant fields from the
trial variable struct. mettestptbstim now reads in the stimulus
definition file and looks for Screen 'flip'. This is not
foolproof, as the stimulus definition could return function
handles to functions located in other files ; by convention,
all handles from a stimulus definition function should point
to functions defined in the same text file. The rest of the
function is written but untested.
27/01/2017 - 00.03.68 - Caught a small problem in metsubjdlg where
cell array was concatenated in the wrong dimension when making
a new subject.
30/01/2017 - 00.03.69 - Fixed the stimulus definition documentation
and verification to correct the init trial initialiser function
prototype.
06/02/2017 - 00.03.70 - Updated stimulus definition so that close
returns a stimulus descriptor that is fed to init the next time
that the stimulus link is used. This will allow for information
to carry over from past trials, and is intended mainly for
manually controlled stimuli. Made a start at the first stimulus
definition, 'dot'. Half way through.
07/02/2017 - 00.03.71 - Extra screen parameters from metscrpar are
now added to session headers , and also PsychToolbox version.
Extra trial constants for MET ptb visual stimuli containing PTB
window dimensions and centre point. MET ptb stimulus definition
dot.m is written but untested. mettestptbstim needs to be
updated to incorporate changes to MET specification.
08/02/2017 - 00.03.72 - Correcting mettestptbstim error messaging.
Updating mettestptbstim MET ptb stim interface, fixed problem
where variable parameter change list was not cleared after use.
MET ptb visual stimulus definition dot.m written.
08/02/2017 - 00.03.73 - Started writing MET ptb stimulus definition
for random dot kinetogram similar to that in Britten et al 1992.
09/02/2017 - 00.03.74 - rdk_Britten92 part of stimulus descriptor
in trial initialiser.
10/02/2017 - 00.03.75 - More additions to rdk_Britten92 trial
initialiser.
12/02/2017 - 00.03.76 - rdk_Britten92 largely written , but not
tested , and variable parameter change requests are not yet
handled by the stimulation function.
13/02/2017 - 00.03.77 - Added constant horizontal disparity
displacement to rdk_Britten92 dot positions , to speed up
function and to reduce time spent copying. Still need to add
variable changes during trial then test.
13/02/2017 - 00.03.78 - rdk_Britten92 now runs in mettestptbstim
and generates dots. Need to implement variable parameter changes
and to further test stim def. mettestptbstim puts crosshairs
at origin.
14/02/2017 - 00.03.79 - mettestptbstim now accepts an optional
input argument with a variable parameter initialisation struct.
Added fyoke variable parameter to rdk_Britten92 which , following
rotation of formation circle , applies a translation so that
the patch with index fyoke is centred on the origin defined by
fcentre_x and fcentre_y. Disparity and binocular correlation
settings tested. Still need to add variable parameter changes
during trial.
15/02/2017 - 00.03.80 - Added calgrid.m as a standalone utility
for calibrating screens/stereoscopes. rdk_Britten92 variable
parameter changes during trial implemented but not tested.
16/02/2017 - 00.03.81 - First complete version of rdk_Britten92
stimulus definition.
16/02/2017 - 00.03.82 - calibgrid stimulus definition mostly
written. Need to add/test variable parameter changes during a
trial.
17/02/2017 - 00.03.83 - calibgrid supports variable parameter
changes during a trial. metteststim now works if it is bundled
in the same directory with the named stimulus definition.
metctrlconst.m will not crash if met is not visible.
17/02/2017 - 00.03.84 - Added parameters to dot stimulus definition
allowing it to orbit around its x and y coordinate. Useful for
providing choice targets in a 2AFC task. Updated 2afc.txt in the
master met/tasklogic directory by adding a reaction time state
where the test stimulus and choice targets are visible. By
changing the timeout durations, a single task logic is
configurable between classic forced presentation 2AFC or a
reaction time version. Also, allows loss and recapture of gaze
fixation prior to test stimulus presentation. Added the idea of
a general purpose MET .csv file format for passing parameter to
MET controllers. Helper function metreadcsv.m written, and MET
controller constant added with column headers. Modified
metscrnpar.m, metdaqeye.m, and metdaqout.m to use metreadcsv.
Began writing MET controller function mettarget.m, an update of
metlegtrg.m that is compatible with the MET specification.
18/02/2017 - 00.03.85 - Added MCC.SDEF.none = 1 so that there is
a symbolic way of referring to the 'none' task stimulus, when
no task stimulus is being selected by the subject. mettarget.m
written but untested.
19/02/2017 - 00.03.86 - metctrlconst now accepts optional input
argument MC so that a MET controller can pass in its run-time
constants, allowing the standardised creation of certain data
structures. For instance metctrlconst also now defines the
current buffer , used to grab the latest MET signals or shared
memory contents and relies on information about available
shared memory. Added some checks to mettarget to verify that
sd and td were loaded , and stimdeftype no longer permanently
changes the current directory. mettarget's stimdeftype and
trialinit functions have been turned into their own helper
functions for use by other controllers, called metstimdeftype.m
and metptblink.m. Added field to session descriptor called .type,
which contains the type string for each MET stimulus definition
in use by that session ; this field directly receives the output
from metstimdeftype. Field .type of the session descriptor is now
set by metguicentral when it creates a new session directory,
using metstimdeftyp ; hence this is no longer done in mettarget,
and metptblink no longer requires a 'type' input argument, as it
comes with the session descriptor. metptblink now looks for
global copies of MET constants and controller constants MC & MCC,
which mettarget now declares. metdaqeye now streams eye positions
through 'eye' shared memory in degrees of visual field from the
centre of the screen, where up and right are in the positive
direction.
20/02/2017 - 00.03.87 - metrealtimeplot.m written to support a
single MET GUI that updates in real time, to remove burden from
metgui plus lessens the risk of creating a reader-writer
bottleneck. Added path to MET GUI definitions in metctrlconst.
metgui now refers to that, and so do real-time MET GUI wrapper
functions. metptblink now does a better job of checking the
session descriptor field set. metrteyes.m is a wrapper function
that uses metrealtimeplot and meteyeplot to show the current
position of the eyes versus the hit regions of visible stimuli.
Changed metptblink to accept different input argument sets that
bypass loading the trial descriptor or reading shared memory.
metrealtimeplot implements a kind of home-made drawnow limitrate
by only executing drawnow if at least 16ms have passed, for
a refresh of about 60Hz. MET GUI definition changed so that
the update( ) function returns a scalar logical saying whether
the appearance of the GUI has changed, has been incorporated
into metgui, metsessinfo, meteyeplot, metremote, metraster.
meteyeplot updated for BETA version of MET, expects eye positions
and hit regions to be in degrees of visual field, and only
shows trial events on the time plot. Everything needs testing,
but write the PTB visual stimulus controller, first.
22/02/2017 - 00.03.88 - Use of the -ivxudp, -ptbdaq, and -cbmex
flags in .cmet files will be deprecated. metcontroller attempts
to clear PsychToolbox as part of its shut-down procedure. All the
same, good MET controller function design will explicitly clear
PTB when it is used. Somehow, metscrnpar.m was not returning a
stereo mode for Psych Toolbox ; now it does. metwaitfortrial
written as a general purpose helper function for controllers
to block until the next trial starts ; now replaces the
await_new_trial subroutine of metcbmex. Defined MET controller
constant MCC.DAT.VNAM containing a list of standard variable
names for session, block, and trial descriptors ; this is
important for loading and saving. metdload is a general purpose
helper function for loading the latest session or trial
descriptor ; applied to metptb, mettarget, and metrealtimeplot.
Trial descriptor now includes stimulus definition type in the
list of stimulus links, metnewtrial now provides this. Added
checks in metctrlconst so that it runs when met/m is not on the
Matlab path. metsavtxt didn't use the permission it's given , now
it does. The metptb MET controller function for tracking the
state of the trial and generating ptb-type MET stimuli is written
but untested.
23/02/2017 - 00.03.89 - Added variable parameter checking to
metptb. metptb sevents function looped past the end of SEV, and
compared ptb vector with something of different size. There is no
need for MEV to be a cell array when it can be a struct array.
stiminit forgot cellfun UniformOutput false. metptb logical
vector h should be a column vector, according to 'stim' shm
convention. metptb some comments clarified. State timeout was
incorrectly computed. Added endflg to signal an end state was
encountered. Incorrect index vector of unsent MET signals.
Loop binary to ASCII data conversion. Updated line 209 try-
catch statement syntax, then again at 270. mkbuf tried to
allocate to an index field while creating buffer fields.
MET GUIs not appearing for some reason.
24/02/2017 - 00.03.90 - It seems that MET GUIs can take so long to
load that metserver times out while waiting for the initial
mready reply. The first thing to try is to extend the timeout
duration from 30s to 60s, in metsrv.h, and recompile metserver.
metgui now reports loading progress. All controllers now report
when initialisation is complete. The bad/good news is that the
MET GUIs appear in the last stable version 00.03.69. Something
has changed since then that is interfering with graphics.
metcontroller removes more unused variables before calling the
MET controller function. The reason the MET GUIs wouldn't show
up is that drawnow had not been executed. metsessinfo needs to
check that it has not popped off the edge of the screen.
metgui will not execute drawnow during a trial unless it has
been requested by a MET GUI. The check for whether a MET GUI
has fallen off the screen is moved from metsessinfo to metgui,
metguicentral, and metrealtimeplot so that no figure ever puts
its title bar off the edge of the screen where the user can't
grab it to move it back ; metcheckgui is a helper function that
does this. Error in metparse! It was comparing a stimulus link
name against the set of task stimulus names. metstimdeftype
was looking for task variable names (var) rather than stimulus
definition names (vpar) when initialising tye type field of the
session descriptor ; and it was missing MCC input argument.
25/02/2017 - 00.03.91 - metsessdlg newblock was assigning the
number of repetitions as the number of attempts. tabedit_cb did
not skip accessing the session descriptor sub-struct when editing
a task table while the task was still being declared. Environment
variable table was checking wrong column when validating new
reward value input. metstimdeftype executed one step too soon
in metguicentral>session_cb, as it relies on the session
descriptor .vpar field being set, which it is a step later.
metguicentral failed to set session descriptor .type field when
opening an existing session directory. metguicentral's
parsdirnam and metsubjdlg assign different types to
sd.experiment_id and sd.session_id ; the former sets string
copies of the numbers, while the latter sets the numerical
values. We will make parsdirnam conform to the metsubjdlg
convention. metguicentral will load session descriptor from
disk if it is there. Problem persists with appending to an
existing log file, getting error message:
met:logopn:fopen: No such file or directory
MET:print:fopen
MET ctrl 1:met:logopn: error opening log file
~/subject/M100.Nerd/20170225/M100.4.1.2acf_pres.rdk/logs/
master_log.txt
Error in metgui (line 625)
On further thought, this might be because POSIX system calls
seem unable to interpret command line shorthand, such as ~ for
the home directory. Changed metctrlconst so that absolute paths
are provided ; ~ is no longer used to indicate home directory.
This seems to have been the problem. First attempt to run a trial
got as far as creating new trial directory and descriptor.
27/02/2017 - 00.03.92 - metptblink>chkfrm used var name sd rather
than simply d. metptb missing UniformOutput false from cellfun
that converts stimulus definition function names to function
handles. metptblink does not watch for mquit when waiting for
'stim' shared memory. metptb sdl (stimulus descriptor list) was
initialised as a column vector, but by convention, most other
data structures inside of metptb are row vectors ; this is
confusing to certain Matlab functions, so sdl is now a row
vector. metptb sent initial hit region list but did not clear
flags. However the animation loop call to met 'write' did not
give the name of shared memory to use. metptb variable l (lower
case L) is not initialised at the start of the trial. metptb
did not perform unit conversion from seconds to microseconds
before casting doubles to uint32. mettarget now returns empty
[] matrices in x and y when querying mouse position if no button
is down, this is in line with the eye position input device which
may have no valid sample to report ; we do not want to change
target in these cases. mettarget reversed order of istim twice,
once while refreshing contents, twice at every check loop ;
removed reversal at loop, it only needs to be done once during
refresh. metptb was not converting checksums to strings properly.
metremote needed to properly report changes to its appearance.
MET stimulus definition dot.m failed to match its hit region
to the drawn stimulus because it did not account for the
formation circle properties. metgui only creates a new trial
if the MET GUI signal buffer is empty. metgui, reorder tasks in
the event loop: drawnow execution > make new trial > MET signals
sent ; the idea is that drawnow might flush the callback event
queue, which may in turn cause MET signals to appear in the MET
GUI signal queue, which must halt the creation of a new trial
until they are sent in case there is an mwait signal that goes
out. metptb left the old frame on screen when trial finished,
now it starts an asynchronous flip, completes trial closure, and
completes the flip. Unless some means can be found of executing
queued GUI callbacks without running drawnow, it will be
necessary for metgui to run drawnow while a trial is running.
Otherwise, metremote will not work. Therefore, lower the
execution rate during a trial, to ease the burden. metptb was
treating MAXBUF as a scalar double when checking for buffer
overflow vs tbuf.ib. metnewtrial was assigning sevent index to
istimlink. This is the first version that can run a series of
trials. But it crashes when the trial-block controls are used
in the MET Session Info GUI.
28/02/2017 - 00.03.93 - metptb state loop sets tout to 1 if the new
state timeout is zero, but does not add 1 to turn this into an
index that selects the correct lookup table. metgui was only
reporting the mreward cargo without applying reward slope and
baseline. metgui used ~= instead of == operator to check the
MET Session Info GUI's .guiflg character. Skipping to next block
by killing the deck in the current block descriptor caused
confusion in metblock, which tried to access the empty deck; it
now checks whether the deck is empty and responds appropriately.
Wrote oddoneout.txt task logic. metptblink timeout warning
message should not be presented when met 'select' returns due to
incoming MET signals, rather than a timeout. Added the null MET
stimulus definition. metsessdlg tried to get variable parameter
info from the current session descriptor instead of the master
copy held in the figure's UserData.C.VARPAR struct. Upgrade
meteyeplot and metrteye to handle touchscreen/mouse input.
metcontroller attenuates PsychToolbox printed messages. metrteyes
is able to show hit regions and mouse/touchscreen position but
seemingly only in 2D plot, while latency is bad.
01/03/2017 - 00.03.94 - metgui creates ASCII .txt version of MET
signal data. metguicentral not clearing cloned session
descriptor, causing trial identifier to initialise higher than 1.
metrteye latency improved by preserving drawnow request from MET
GUI ; danger was that request came before drawnow deadline,
allowing another call to GUI update function that returned
false. meteyeplot now shows mouse position in 2D plot and on time
course plots. metcontroller now writes controller descriptor to
the cntlattrib file.
01/03/2017 - 00.03.95 - metptb fails to prepare screen-to-head
mapping. metctrlconst session descriptor prototype requires that
.tags field is initialised with an empty cell array {}.
metsubjdlg now checks if .tags string is empty. metctrlconst
must initialise current buffer field .shm to empty cell with 2
columns. meteyeplot accessing cbuf.shm, even when it is empty.
metsessinfo checks if .tags field of session descriptor is
empty. metptb tried to use empty .tags field. meteyeplot
mismanaged converting hit region circle into matlab rectangle.
metrealtimeplot prevents the MET GUI from ever being closed, it
also deletes the figure handle, in case the MET GUI close
function fails. metgui no longer applies reward slope & baseline
when reporting reward size ; this is done by metptb before
sending mreward. As a bonus, metptb now checks that all mevent
cargos are capped at the maximum allowable cargo size. metserver
error! It has tried to execute:
metclose ( SHMARG * n , wefd_array )
where SHMARG is the number of shared memory objects, and n is
the number of child controllers. metclose returns an error if
the first argument exceeds MAXCHLD (15) the maximum allowable
number of MET child controllers. The way around this is to use a
for loop and close the set of writer's event file descriptors
made for each shared memory. Added constants to metctrlconst for
file naming on the Blackrock Micro. Host PC. This version of MET
was able to support a fixation task driven by fake analogue eye
signals that were provided by the NSP ; over 2000 trials were
'performed' by the system.
02/03/2017 - 00.03.96 - Added more NSP related constants to
metctrlconst. NSP shared memory .data field will now contain
type double row vectors. Improved metptb ASCII text files so
that there is no danger of a tailing comma in lists of
timestamps with a single number. metcontroller flushes standard
output after opening
cbmex. metcbmex brought up to date ; it appears to be functional
and has been able to buffer and store data. Need to test whether
the whole trial is saved, and whether data is being written to
nsp shared memory. It is possible that metgui recovery is not
working properly, including metsessinfo.
03/03/2017 - 00.03.97 - metspkplot written to display scrolling
spike raster in time with trial events. Performance so far is
erratic and buggy ; may be that Matlab is incapable of creating/
destroying a large number of line objects in real time ... may
be forced to use animated line objects ... or even just one ...
04/03/2017 - 00.03.98 - Reverse order of channel labels in
metspkplot when first obtained from current buffer. tmax now
always set to a new GetSecs time measurement. Alas, Matlab can
not manage the tens of thousands of line objects that are
required by a full raster plot - we must use an animated line
object. metcbmex raises a flag if mready trigger obtained in the
same call to 'recv' that returns an mstop signal ; this way, the
trial loop proceeds and the controller is not stuck waiting for
a trigger that arrived. Well, it seems that cbmex
( 'trialconfig' , ... , 'absolute' ) does not always produce
increasing NSP event time stamps ; in fact, it seems that the
NSP clock is reset to zero every time a new file is opened.
metcbmex sending illegal mready signals that metserver rejects.
Something is taking a loooong time during trial initialisation ,
but not always.
06/03/2017 - 00.03.99 - It turns out that cbmex 'fileconfig' does
intentionally reset the NSP clock, and 'trialconfig' absolute
provides time since file recording began. Try a simpler approach
Continue to estimate the NSP-to-PTB timestamp regression. But
look in the output from cbmex 'trialdata' for event times. The
question is then what 'nsp' shared memory should contain ; rather
than PTB time stamps, have it convert NSP event times from number
of NSP samples to number of seconds in type double vectors.
metctrlconst has new constants about cbmex 'trialdata' output
that says which columns contain digital input time stamps and
values. metspkplot being re-worked to show only data from 'nsp'
shared mem and to reset with each new trial , not a continuously
scrolling plot. To keep from violating the MET signalling
protocol, metgui will only send mwait signals during the trial-
running state.
07/03/2017 - 00.03.100 - metgui now searches for the .blockcntl
field in each listed MET GUI and then concatenates all together
to pass to metremote's .blockcntl field, thus providing a way to
enable/disable all controlls that must not be accessed when
trials are running. metgui now performs reset on all MET GUIs
when a new session is opened and when a new trial is created, to
provide session, block, and trial descriptors.
08/03/2017 - 00.03.101 - It is clear that if the touchscreen
flag is raised in metscrnpar.csv then mouse positions should be
treated like eye positions i.e. they must be time stamped,
buffered and provided to all listening controllers. metdaqeye
will have the job of collecting and transmitting mouse positions
through 'eye' shared memory, mettarget will use mouse positions
to assess the subject's target selection, metgui will collect
mouse positions in a trial buffer, and metrteyes will plot them.
This is important so that a record can be kept of when/where
touches occurred. It is also important so that the subjects
exact responses can be analysed, for instance when computing
psychometric curves. Implemented but still buggy.
09/03/2017 - 00.03.102 - metgui now saves trial-buffered eye/mouse
positions as well as stimulus hit regions. metnewtrial unable
to handle a lack of sevents or mevents. Hit region changes during
a trial are not being communicated because metptb was only
detecting changes, but not saving and sending them. Change to
metgui reset policy required change to metremote, which had a
reset function written before the MET GUI interface started to
take concrete form. metperformance being written to show
psychometric curves and reaction times.
10/03/2017 - 00.03.103 - metperformance now has all graphics
objects and internal data structures. Responds to user input.
Now requires update and recovery functions.
13/03/2017 - 00.03.104 - metperformance is largely written. Note
that no MET GUI yet has a reset function that clears a
previous session's data. This might be added into metguicentral's
menu. metperformance is now performing on line, but not yet
sure how accurately.
14/03/2017 - 00.03.105 - Added negative coherences to rdk_Britten92
and polarity to dot MET ptb stimulus definitions. Caught a bug
where rdk_Britten92 could increase coherence without properly
handling old noise dots, causing new signal dot locations to be
sampled from noise dots in the wrong patch. Added fflip param
to dot.m which adds 180 degrees to value in fangle before placing
dot, if fflip is negative. metperformance tested in basic task.
Rectangular hit region definition now changed to allow rotated
stimuli ; metctrlconst and meteyeplot updated , but not
mettarget.
15/03/2017 - 00.03.106 - mettarget updated. How to test updates?
Need a new MET stimulus definition. Begin creating a receptive
field mapping tool with a bar. PTB type MET stimulus definition
closing function takes a second input argument saying whether
the trial or session is closing. So far so good. rfmaptool
written to show mouse-controlled bar. Its hit region shows up
in meteyeplot, but some 3.5 degrees below where the mouse is.
16/03/2017 - 00.03.107 - 3.5 degree error because subtracting
tconst.wincentx from vertical position instead of .wincenty.
rfmaptool can now drop stimulus so that it stays in one place,
and grab again later. mettestptbstim now suppresses keyboard
presses being mirrored on Matlab command line. mettestptbstim
accepts a debug input argument that flags whether keyboard to
Matlab command line is blocked. rfmaptool now produces a gabor!
17/03/2017 - 00.03.108 - Gabor supports motion of sinusoid. Bar
supports greyscale change. Dot patch stimulus now supported.
rfmaptool prints stimulus status if user hits 'h' key. However
not sure that parameter values make sense e.g. speed values
seem an order of magnitute too low.
21/03/2017 - 00.03.109 - Starting to add on-line analysis of neural
activity. Began with extra nsp shared memory constants in
metctrlconst. Started writing metrftuning , the GUI is now
created but has no functionality.
22/03/2017 - 00.03.110 - Session descriptor reset and callbacks
written for metrftuning. Now require update function.
23/03/2017 - 00.03.111 - metperformance did not check whether the
block descriptor deck value is NaN for the selected task
variable. metrftuning is written but untested. Starting to write
custom metanova1 for improved speed.
24/03/2017 - 00.03.112 - Got titles to appear , and user can now
control which channel/unit tuning curve is displayed.
metrftuning runs a bit slow. Try using a spike-rate buffer
instead of accumulating rates on each trial. Also, retool
metanova1 to act upon a multi-dimensional numerical array +
group sizes rather than cell arrays of vectors. On further
reflection, the best solution is to maintain a set of sums for
each spike-rate group/channel/unit that can be used to compute
F-values ; this should reduce memory load and increase speed by
an order of magnitude ; variance will be estimated by subtracting
the current estimate of the mean from the latest spike rate ; if
there is only one trial then assume poisson random variable.
This also means that there is no need for metanova1, so it will
be removed. Some final refinements will include pre-allocating
graphics objects during reset, then update their parameters
without creating whole new objects.
27/03/2017 - 00.03.113 - Started writing metpsth from a copy of
metrftuning.
30/03/2017 - 00.03.114 - Further work on metpsth. Now has all
controls. uicontrol callbacks written but not tested. Recovery
function written but not tested. Need to finish update function,
population axes button down callback, plotting functions.
31/03/2017 - 00.03.115 - metpsth written but not tested fully.
A functional version is now made. Need to bring down some of the
run time. Use a line buffer for error bars and mean rate line,
then set y-axis data for each.
03/04/2017 - 00.03.116 - Found bug in metpsth where ind2sub used
wrong number of channels. Channel/unit selector seems to work,
and selected psth plotter appears to perform the correct
averaging. Default bin width set at 50ms instead of 20. update
function now checks state and bin flags. Execution time of
metpsth update now under 200ms, on the old development pc.
Fixed problem with bin sample counting, comparing milliseconds
and seconds ... really should have stuck to one internal unit.
Done button automatically 'pressed' by channel/unit selector
if the bin flag is up. PSTH binning appears to be functioning
properly, in alignment with events. Added labels and made the
population axis show the selected units. But popaxe_cb seems to
be selecting the wrong unit ... or selpsthplot is wrong ... or
the image forward and reverse index mapping is out.
04/04/2017 - 00.03.117 - metpsth popaxe_cb now sorted, because
selpsthplot used reverse mapping instead of forward mapping to
translate figure's .spk row index into image's CData row index.
Added optional third input argument to metwaitfortrial that
gives a timeout in seconds ; drawnow is run after each timeout
until mstart or mquit is finally received. metptb will makes use
of this to support a very simple GUI control that will provide
a way for the user to switch timeout screens on and off.
metptbgui returns this GUI, but hasn't yet got working callbacks.
05/04/2017 - 00.03.118 - Added contrast parameter to timeout
screen control. Callbacks now written and tested. Next, need to
integrate into metptb.
06/04/2017 - 00.03.119 - metptbgui worked into metptb.
metwaitfortrial was checking for durations less than the timout,
the reverse of what it should be doing. metperformance.m tried
to use index vector i rather than ivar to access element of the
block.deck. Timeout screens and GUI controls now tested and
working. Removing bad hack from metsessdlg, that leaves num2str
to decide the number of significant figures on its own ; in
practice it should be recommended that inputs do not exceed
five significant figures. Added blank greyscale screen to set of
metptbgui timeout types. rfmaptool now compensates for mirroring
of the Psych Toolbox window via PsychImaging FlipHorizontal and
Vertical , but only in position and not in rotation ; this
relies on proper setting of metscrnpar.csv. rfmaptool now
supports RF border line drawing.
07/04/2017 - 00.03.120 - Added magnification control to meteyeplot
that adjusts 2D plot axes down to lower limits, centred on
current trial origin. metrftuning recovery data fields out of
date. metpsth recovery used wrong variable names. Bug
detected: clicking Abort button while a trial is closing freezes
the MET remote GUI. This appears to come about because the mwait
signals that were added to metgui's buffer by metremote were
stored at the head of the buffer, waiting for a trial that never
came. Since that was done solely to prevent MET signalling
protocol breaches during trial initialisation, mwait signals are
now requested if metgui is in a state other than trial
initialisation. metptb savedat crashes if a trial is aborted
before any frames are shown.
10/04/2017 - 00.03.121 - metptb makes a record of the type and
duration of the timeout screen after each trial. The metping
set of functions written to support controllers that measure
the amount of time required to transmit MET signals from one
controller to another through the MET server controller.
11/04/2017 - 00.03.122 - metpsth spk2bin would check if input
spike times were empty, but not for case where none of them
were binnable. metperformance custom response table is covered
by a slider. metcbmex takes a long time to transmit a text
version of the trial descriptor ; this is happening when
metping is running because a large number of MET signals must
be transferred as comments ; transfer outcome, only, under the
pretence that all signals are saved in NSP binary input events
and by metgui. metpsth tries to access PSTH bins that it does
not have ; the reason is that it did not zero event times on
the start of the analysis window. metpsth and metrftuning do
not seem to be getting spike times , but spike data is arriving
from metgui , though its quality is now in question.
13/04/2017 - 00.03.123 - Make a streamlined version of DaqDOut to
minimise latency, called metDaqDOut. Use PshychHID directly in
metdaqout controller function to reduce some overhead.
19/04/2017 - 00.03.124 - Fixed metdaqeye buffer indexing error
where b.i_eye was updated BEFORE new data was added i.e. data
was skipping its proper position in the buffer and zeros were
streaming in the eye position. metptb compensates for
mirroring and guarantees that the photodiode stimulus is
always in the upper left-hand corner of the screen.
metptb guarantees that photodiode stimulus is full white on
the first frame of every trial.
19/04/2017 - 00.04.00 - BETA version.
20/04/2017 - 00.04.01 - Tweaking the photodiode square in metptb
to increase size and switch between 1.00 and 0.75 greyscale
fill values.
25/04/2017 - 00.04.02 - Added ability to pause mettestptbstim
during execution.
26/04/2017 - 00.04.03 - Add circle and cross choice target MET
ptb stimuli to met/stim directory.
27/04/2017 - 00.04.04 - calibgrid.m updated for seven column
square hit region. blank MET ptb stimulus definition added but
needs thorough testing. mettarget does not seem to be checking
hit regions in reverse order that stimulus links are listed.
Actually, mettarget reverse checks task stimuli i.e. the
abstract labels, not the reverse list of stim links. The
solution is to change the order of task stimuli in the task
logic, listing ctarg last. The order matters in the list of
task stimuli for each state. Appears to have a problem with
mettarget.m. metctrlconst.m obsolete comments about the
square hit region column order. mettarget.m was confusing the
top and bottom of the square hit regions.
02/05/2017 - 00.04.05 - MET Performance GUI update function was
treating the custom response field as if it were relative to
the centre of the screen ; it is now relative to the trial
origin, as intended. A simple, if somewhat memory inefficient
solution has been implemented to solve this problem with
metblock:
metblock's use of ismember is a problem when repeated
values are used in scheduled task variables. Dependent
scheduled task variables will vary only with the first
listed instance of each scheduled value of the
independent variable.
The solution used is to build a copy of the trial deck that
has the value indices for each scheduled independent variable.
08/05/2017 - 00.04.06 - Eye blink filter added to mettarget.
metctrlconst now checks OS type before calling met.
22/05/2017 - 00.04.07 - metctrlconst still doesn't run outside
of Linux environment. Added ismac and ispc checks. Had to
update MCC.SDEF.ptb.hitregion.ncols = [ 5 , 7 ].
01/06/2017 - 00.04.08 - metptb error setting screentohead
preferences, accidentally passes -1 as argument to Screen(...).
The timeout screens cause a convoluted block in the eye shared
memory ; metptb waits while showing the timeout screen ; in the
meantime, a new trial is being prepared and mettarget waits for
the new list of hit regions in stim shared memory ; however,
metptb can't do this because it's showing a timeout screen ;
this means that mettarget never clears eye shared memory ; thus
metrteyes can't get new eye positions while the timeout screen
is on. Fix this by clearing eye shared memory in metptblink.
15/06/2017 - 00.04.09 - Added mets2i, a custom subscript to linear
index function ; as opposed to sub2ind, this will allow the use
of the same kind of subscript indexing as a 2D array. Added MC.mat
to the met/m directory for use in cross-platform data analysis.
New MET PTB stimulus definition rdk_Cumming99.m for random dot
stereograms. mettestptbstim only drew crosshairs in the right-
eye frame buffer. metpixperdeg.m changed so that pixels per
degree is calculated from the point of fixation rather than
spanning the whole field ; there is a non-linear relationship
due to the slight change in distance from viewer to the edges of
the screen. Fix to mettestptbstim error message formatting.
Added Maria Ruesseler's cylinder MET PTB stimulus definition.
27/06/2017 - 00.04.10 - Various bug fixes to new stimulus
definitions. mettestptbstim makes sure that varpar parameters and
values are legal.
26/07/2017 - 00.04.11 - Comment out 'Nothing received' message in
MET's DaqAInScan.m. Adding receptive/response field definitions
to session descriptor ; requires MET stimulus definitions of type
'ptb' to alter default variable parameters accordingly ; this
requires updates to metctrlconst.m, mettestptbstim.m,
metguicentral.m, metptb.m, metparse.m, metstimdeftype.m, and all
ptb-type MET stimulus def'n functions, and required a new MET
GUI metrfmanager.m. Altered metsdpath to allow an optional
.finalise check during session directory verification, and
header comments improved. rds_Cumming99 ptb stim def's hitregion
field was relative to trial origin, not centre of screen.
metscrnpar.m now allows .touch to be 0, 1, or 2 for no mouse
input, and mouse input without or with the mouse cursor visible
in the PTB window. metptb.m now draws defined RFs using the blue
colour channel, so that red/green anaglyph does not show them.
meteyeplot.m displays defined RFs as well. rds_Cumming99 has new
variable parameters fposition and disp_deltasig. mettestptbstim
hides mouse cursor if metscrnpar.csv requests it. rfmaptool no
longer calls Hide- or ShowCursor ; it draws a small dot where
the mouse is located when no stimulus is showing, or when the
stimulus is dropped and showing. Added regular expressions to
metctrlconst to check edits in MET session dialogue's task-
variable Value fields ; added colon-separated list expansion
to MET session dialogue task-variable Value field. metsimspk
is a new controller function that generates a spike train
through audio output with a dynamic spike rate. mettarget
should check for qflag before using hitregion. Add highlights
to selected task stimulus in MET real time eye plot. mettarget
had sudden unexpected error accessing shared memory output
following advice of met 'select' ; adding error check on the
output of 'read' to see if empty. Tweaking rfmaptool so that
bar rotation better reflects how bar looks ; gabor help gives
sensible orientation and speed ; dot patch gives better speed.
metguicentral has Reset menu, and metgui watches for and calls
MET GUI resets ; here, reset means making the MET GUI look as
though it were freshly loaded, while maintaining any particular
session, block, or trial data that it has. metsessinfo,
metperformance (error in tvar_cb), metrftuning, and metpsth
all now implement reset. metptblink clears readable eye shm if
waiting for hit-regions, which causes an error in mettarget
such that shm output of met 'select' is obsolete information
that might trigger met 'read' on empty shm. metptblink now
clears 'eye' and 'nsp' shm while waiting for 'stim'.
27/07/2017 - 00.04.12 - Last version made it difficult to clone
old sessions. For better backwards compatability, metdload now
has an optional input saying whether to copy a session
descriptor directly, or field by field. Similarly, metparse
will now check MET stimulus definition function for the number
of inputs before using. meteyeplot failed to load list of
task stimuli if there were no rf definitions.
19/09/2017 - 00.04.13 - rds_Cumming99 MET stim had monocular
crescent artefacts when disp_deltasig changed during trial,
and could not handle situation where signal_fraction < 1 but
disp_signal not zero, and could not handle very small signal
disparities and signal fractions less than one because not
all RDSs had covered background dots to make visible while
balancing the dot count, error computing first row index of
noise dots following disp_deltasig change when signal
fraction less than 1 and disp_signal non-zero. Added
uncorrelated background and noise dots to rds_Cumming99,
independent binary on/off flicker for the two monocular
images, tweak dot lifetime to round to nearest frame. Also
added hminrad variable parameter to rds_Cumming99. corr_sig
and corr_noise parameters renamed to more intuitive
anticor_sig and anticor_noise, while new anticor_back added
for variable number of anticorrelated background dots, all
in rds_Cumming99. rds_Cumming99 only correlated noise dots
(by position, not contrast) sample random disparities, but
that sample is taken once during initialisation i.e. the
same noise disparities are used for a whole trial. Order
that dots drawn is randomly permuted in rds_Cumming99.
Gave task logic oddoneout.txt reactim state a 1 second
timeout. metptblink.m now waits up to 10s when waiting for
hit regions before issuing a warning message ; also, error
in code corrected for checking shm list when it has more
than one row. MET ptb stimulus definition dot.m now use
default variable parameter values of shade=1.0, frate=5.0,
and radius=0.15 ; stimulation function now disables alpha
blending before draw. New metscrnpar.csv parameters defining
the photodiode square and PTB priority levels, implemented by
metptb. metptb saves random number generator state following
stimulus descriptor initialisation but prior to running
trial. metptb ASCII data file has field name for Matlab
version string. MET GUIs keep their position between uses of
MET, includes changes to MET controller functions metgui,
metrealtimeplot, and metptb. metptb disables alpha blending
prior to drawing RF ovals and photodiode square. Improved
installation instructions at top of the readme.txt file.
metsessdlg text labels no longer cropped, and Add All button
added. Added the singrating MET PTB stim definition. Larger
linewidth for RF rectangles in meteyeplot. Added rds_bisect,
a random-dot stereogram with two halves at different
disparities. metnewtrial does not crash when task has no
default parameter overrides. Added the c.util directory ;
added ivxudp utility for UDP-based eye-position streaming
from iViewX into Matlab. Adding support for pupil diameter
streaming and storage ; includes changes to MET controller
constants, metgui, and big internal overhall to metdaqeye and
metdaqeye.csv. Added MOUSEPOLL sampling rate variable ;
affects metdaqeye and meteyeplot. Trial descriptors now have
a field containing a struct whose fields are named after the
task variables and contain the value of each task variable on
that given trial.
rds_Cumming99 gets rid of distinction between central signal
and noise dots ; rather all central dots get the signal
disparity , then some fraction receives noisy disparity ; as
such the disp_noise parameter has been removed ; noise dots
are required to exist within RDS centre , after signal disp
shift , in both monocular images otherwise they are discoed.
metctrlconst MCC.SHM.NSP.SPKLAB is now '^(chan|elec)\d+$' to
accomodate alternative naming of front-end channels ; added
CRASHF and CRASHS constants with the name of a crash file
that is written to a trial directory following recovery from
a crash, and a format string that is written to it.
XYSWAP added to metdaqeye.csv
metgui now saves environment variables in recovery data.
metguicentral updated header to support new metscrnpar
parameters.
MET controllers flush standard output at end of
initialisation.
metguicentral fails to update date in sd when sd loaded from
file , solution is to parse sd from scratch then load old sd
if it's there and copy over only the essentials , the .rfdef
and .evar fields ;
metcbmex now makes sure that Central File Storage application
is open before completing initialisation ; incorrectly
created trial number string for cbmex comment ; comment
header now only lists task variable values ; rsbuf was in
danger of resizing the tbuf.coef field ; added tbuf.timer
field to help check for clock calibration timeout during
trial initialisation ; File Storage crashed if the file name
became 10.* , so added prefix trial_<id>.* ;
metgui finalises NSP data with only data from the trial that
just ran ; previously, lagging data would be buffered. Also
tries to wait for lagging data before finalising trial
buffer, but will time out and carry on to next trial ;
handles recovery by writing crash message file to crashed
trial directory rather than removing that directory, then
increments trial identifier by one to skip to next trial.
metpsth indexing error comparing digin signal value index
to value + cargo index of the raw data ; imgpop.CData
indexing got out of register when updating from
h.UserData.spk ; forward mapping used where reverse mapping
required in plotting function and button down callback ;
all bins' trial count incremented on all trials, otherwise
trailing bins can appear to have gigantic mean firing
rate ; suppressed annoying caxis output ; checks for lack
of digin signals , time and value mismatch , or too many
mstart signals ; recovery data has all required info and
recovery replots data , causes next 'sd' reset to be
skipped ; can handle elec1-23 style NSP labels
metrftuning did not check whether previously selected task
variable still existed in task var set of a new session ;
had same digin signal value indexing error as metpsth ;
strange error that is difficult to reproduce when setting
position of red rectangle , an error check has been added
in attempt to avoid this in future ; dd not recover the
properties uicontrols from a crash ; same digin error
checking as metpsth ; recovery data has all required info
and recovery replots data , causes next 'sd' reset to be
skipped ; can now handle when independent scheduled var
has only one unique value ; can handle elec1-23 style
NSP labels
metspkplot now has readable y-axis tick labels. Added
checks for too many mstart or mstop events. Suspected
CereLink cbmex bug causes some digin signals to come
without their cargo and causing a crash. Testing seems
to show that this only happens with mstop signals. It
probably breaks down when trial events change very
quickly, faster than a real subject can respond,
unless the eye position is hovering on the edge of a
hit region. Handling of digin signals cleaned up ; this
should be much more robust than before.
met/stim/resources directory added for stim def special
files, like images and movies. Removed met/m/legacy and
met/m/calgrid.m but not met/stim/calibgrid.m.
Added meterror to help MET GUIs to properly bring down
the calling MET controller.
Added hit region flag saying whether or not to ignore the
stimulus ; affects metctrlconst, mettarget, meteyeplot,
and all MET PTB stimulus definitions
metcbmex sends shorter comments, because v6.04 of
Blackrock software drops anything longer.
metptb draws black photodiode square on synchronising
flip. RF outlines commented out because they could be
seen.
Added delta_orient parameter to singrating MET PTB
stim def on 28/09/2017, such a minor addition will not be
cause for a new version.
Added sca to initialisation of metptb in attempt to clear
residue following a crash ; added .monovis to singrating,
rds_Cumming99, rds_edge, and dot stimuli that flags which
monocular images are visible ; added disparity and
delta_disp properties to singrating ; additions made on
02/10/2017 to version 4.13b.
Extra metptb message regarding current process priority.
singrating uses an eighth of the support "texels" that it
used to, in attempt to speed up drawing. Added 04/10/2017
to version 4.13c.
09/10/2017 - 00.04.14 - metdaqeye.m now has a maximum rate of
writes to eye shared memory, in attempt to reduce the load
on kernel latency, attempt to reduce skipped frames. New
task logic delayedsaccade.txt for a delayed saccade task.
Added rfmapbar MET PTB stimulus definition 10/10/2017.
11/10/2017 - 00.04.15 - metxflush.c now flushes the log file
stream, if it exists. rfmapbar prints messages that are
captured by metptb's log file, and metptb creates a log
file for each session. rdk_Britten92 now adapts to the
rfdef input. metxflush takes optional argument saying
which streams to flush. cylinder_rotation.m now adapts to
more rfdef fields.
16/10/2017 - 00.04.16 - Added met.stim.class sub-directory
to met/stim and added MET controller constant
MCC.CLASSDIR to locate it. rds_Cumming99_handle.m class
file added and used in rds_Cumming99. metcontroller
disables JxBrowser, which may cause spikes in Matlab's
cpu consumption ; but this does not prevent really bad
skipped frames. singrating MET PTB stim now uses the
minimum necessary texture support size and ignores
sevents that change width ; disparity was double that
specified. Added chpa( ) utility to check the memory
address of an array's real data. Minor change to
rds_Cumming99 rnddot sub-function that *should* help to
reduce memory usage. metptb java.lang.System.gc( ) in
an attempt to force garbage collection by background
Java memory management between trials. oddoneout.txt
task logic now places fix at the end of the task stim
list of each state, so that associated hit regions are
checked first.
11/11/2017 - 00.04.17 - Added rfmaprdk MET ptb stimulus
definition for mouse-controlled random dot patch.
metguicentral copies RF definition data into the header
files. Tweaked metsubjdlg so that session id can be 1
when experiment id is manually changed. Added
rds_simple MET ptb stimulus definition , which reduces
the memory and processing load for larger RDS patches.
4.17a changes rds_simple so that the dot-buffer column
permutation is sampled only during initialisation or
sevents.
29/11/2017 - 00.04.18 - Expanded list of Matlab Linux
command line options to include -desktop,
-noFigureWindows, -nodisplay, -debug, -singleCompThread,
-nouserjavapath, -softwareopengl, -nosoftwareopengl.
rds_simple MET ptb stim def updates colour lookup table
buffer only during initialisation and sevents rather
than on each frame when there are anti-correlated dots.
Added robustness to metcontroller close_resources sub-
function so that -nojvm flag can be used without a
crash when Java-dependent resources are not available.
Added targ to edge from delay to broken state in the
delayedsaccade task logic to prevent looking at sacc.
target before saccade state. rds_simple tapers
disparity noise towards zero as the dot nears the
edge of its region, rather than rejecting the dot if
one monocular image falls off the edge.
00.04.18a - rfmaprdk has new variable parameters
visible and click_enable for event-driven control
of stimulus visibility. Its position is un-mirrored
when stimulus screen mirroring is enabled.
00.04.18b - metpsth added try-catch statement to stop
line 659 from crashing until this can be properly
fixed. metreadcsv now checks read-in values before
feeding them to str2double , in case they already
are doubles. mettarget now reads velocity and
acceleration thresholds from mettarget.csv, along
with a threshold scaling term and the blink filter
duration.
01/04/2018 - 00.04.19 - mettestptbstim opens PTB
window in lower-right quadrant when there is only
one screen detected. metdaqeye now mirrors mouse
positions if metscrnpar.csv hmirror or vmirror is
non-zero ; fixed error that blocked mouse polling
when eye samples unavailable. rds_simple code
improvements to handling rfdef. cylinder_simple MET
ptb simulus definition and supporting
cylinder_simple_handle class added to generate dot
cylinder stimulus like Dodd et al. 2001. rds_motion
MET ptb stimulus definition and supporting
rds_motion_handle class added to provide moving
dots at different disparities for RF tuning a
conjunction of motion and disparity.
16/07/2018 - 00.04.20 - Added MET ptb stimulus def
movie_advisor. metptb initsdlc queried number of
sd.task.( taskname ) fields NOT the number of
sd.task.( taskname ).link fields , thus we did
not get the number of stimulus links.
mettestptbstim runt returns final version of
stimulus descriptors for final call to fclose.
Added metbasic system shell command that calls
metbasic in a Matlab session ; for really basic
experiments. rds_motion will run in monoscopic
mode, but ignores disparity and delta_disp
values, pegging them to zero ; so does
rds_simple. Added oddoneout_MRI.txt to master
met/tasklogic set of task logic files.
metmridaq MET controller added to record MRI
voltage output indicating each volume of a
BOLD-fMRI collection sequence, for later
synchronisation of MET/PTB events with MRI
data. metptb checks for error when no shared
memory is provided in cmet file. rds_simple had
fprint not fprintf in warning about stereo mode.
17/07/2018 - 00.04.20b Includes binaries
recompiled in Ubuntu 18.04 with GCC 7.3.0
and Linux kernel 4.15.0-23-generic
18/07/2018 - 00.04.20c Fixes movie_advisor to
only close movie resources at the end of a trial.
Otherwise, session closure invokes the closure of
an invalid movie handle, leading to a crash. Adds
movie.cmet to run a copy of default.cmet where
metptb runs with a full Matlab desktop environment
that must be minimised. This is necessary to make
PTB Gstreamer movies run on Matlab R2018a in
Ubuntu 18.04.
05/02/2019 - 00.04.21 - Adds #include <sys/time.h>
to met.h because compiler could no longer find
gettimeofday( ) in Ubuntu 18.04 ... don't know
what changed since Ubuntu 14.04. Had to move
function prototypes from met.c to metx.h and
add prototypes for remaining metx* functions;
met now compiles in Matlab R2018b without any
warnings or errors (except for the usual Matlab
complaing about gcc versions). Had to include
<arpa/inet.h> and <unistd.h> in invudp.c.
Moved #include <string.h> from metx.h to met.h.
metserver.c now declares shmfn as const char **.
metrsv.h now has met* support function prototypes.
Still getting compile warning although we have
included unistd.h and fcntl.h in header files.
$ gcc *.c -o metserver -lrt
metpipe.c: In function ‘metpipe’:
metpipe.c:102:11: warning: implicit declaration of
function ‘pipe2’; did you mean ‘pipe’?
[-Wimplicit-function-declaration]
if ( pipe2 ( fd , flags ) == -1 )
^~~~~
pipe
When shutting down MET we are getting a fatal
error and one of the child MATLABs is killed.
00.04.21a - Adds #define _GNU_SOURCE to the top
of met.h and removes from metsrv.h where it had
been incorrectly placed ; this solves the implicit
declaration warning for pipe2.
11/03/2019 - 00.04.22 - Added task logic
matchtosample.txt and ptb stimulus definition bar.m
06/04/2019 - 00.04.23 - Added met/m/metgui.csv with
options to enable serial port output at the start
and end of each trial. This is to allow metgui.m to
start and stop trial recording on a peripheral system
(like Blackrock Microsystems' Cerebus) without
launching a whole other MET child controller. Make
sure that the system has a serial port, or add a USB
to Serial converter e.g. StarTech.com #ICUSB2321F USB
to Serial RS232 adapter. Added IOPort ( 'CloseAll' )
to metcontroller.m close_resources( ).
06/05/2019 - 00.04.24 - metgui sends out Serial stop
signal following arrival of mstop signal, but after
all other mstop related tasks plus 20ms, to allow the
recording equipment time to register end-of-trial data.
dot.m adds the halfmoon parameter. Applied fix to
rds_simple.m that keeps ratio of white:black dots
close to 50% ; before, random shuffling was sometimes
producing ratios that were visibly different from
50%.
31/05/2019 - 00.04.25 - Updated all task logic files so
that the fix stimulus is the last one drawn but the
first one to be compared against the eye/touch position.
28/06/2019 - 00.04.26 - Implemented rds_ogle.m MET
stimulus definition. New oddoneout_det.txt task logic
definition for deterministic stimuli.
10/10/2019 - 00.04.27 - Added trigger ptb stimulus def'n
for driving photodiode TTL signals in synchrony with
stimulus events. Masking square added to metscrnpar,
metptb, and metptbgui so that an event photodiode is
not activated by background colour. metcbmex now has
an additional wait period after opening a new file
for recording, to prevent dropped data; FOPDUR const
added to metctrlconst for that purpose. metptbgui
now handles stereo eye buffers and allows resizing.
06/12/2019 - 00.04.28 - Add new parameter to metscrnpar.*
defseed instructs metptb to reset Matlab's random number
generator to the default seed at the start of each trial.
This exists so that control experiments can be done in
which the identical dot sequence is presented on each
trial.
*** Fix alpha blending of metptb and rfmaptool rf outlines ***
*** metgui buffers signals from old trial ***
*** rfmaptool gets screwed up between trials ***
*** rds_Cumming99 dies if surround radius is 0 ***
*** Some unknown problem with metrftuning in session switch ***
*** Some unknown problem with creating procedural sin grating after session switch ***
TO-DO in order of importance:
---------------------------- BETA -----------------------------
- metrftuning fails reset when task variable set changes
between sessions. Uses old taskvar name versus new task var
set. See freset case 'sd' and taskvar_cb.
- Latency testing of MET signals between MET controllers, and
in a loop from NSP to MET to NSP.
- A nice extension to met ( 'select' , ... ) would be the ability
to provide a list of additional file descriptors to listen to
e.g. a socket with incoming eye position data
- MET subject GUI is erratic , can't handle system with no subject
often gets the experiment and session ID wrong until manually
refreshed
- Does metgui clear first trial if no recovery data saved yet???
- meteyeplot would crash if hit region for a given stimulus
were to change shape or number.
- metxwrite.c can assume that program runs in MEX mode, thus
NULL returned by mxGetCell means unset element, not lack of
heap memory. This can be handled differently, by immediately
writing type and dims as empty double. Likewise, when reading
with metxread.c , simply skip empty arrays and leave unset ;
but check this first with a test function.
- For some arcane reason, MET controller names cannot be too
long or else metchkargv() thinks that there is a problem
when there isn't. This should not happen.
- There is a small problem with metsd2str in which real numbers
are rounded up to 4 decimal places by num2str. This can be
confusing when a variable uses a value at the edge of a
variable parameter's range.
- metguicentral would not die on error in metgui unless an
explicit delete ( figure handles ) was added to the
metcontroller cleanup function ... even though it executes
the exit command ... perhaps it doesn't if a figure still
exists and returns to the command line
Bugs:
- metsessdlg.m , block list box Value goes to [] at uknown time
About
Software application that runs an integrated psychophysical and electrophysiological experiment.
Topics
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published