Neil's Software Projects


This is a list of the main development projects I developed for research and teaching. These are based on the PC; prior to 1993, I wrote programs for the BBC microcomputer.

Since 2005, most of the programs I have written are for data analysis and for computer administration. Since 2008, I have developed a particular interest in bulk-processing large data sets. The dates generally refer to the first release; nearly all these programs are still available but some require special hardware that is no longer supported.

Self Agency Task, October 2016

A C++/OpenGL program to present an animated task where participants use a mouse to touch some moving symbols whilst avoiding others. At certain intervals, the participant is asked to rate their feeling of self agency and of performance. Based on papers by Janet Metcalfe.

Visual Search Task, Novermber 2015

A C++/OpenGL program to present participants with a visual search task where they have to identify the left/right orientation of an arrow symbol presented alongside up/down distractor arrows. Reaction time was measured with a standard keyboard. Based on papers by Andrea Tales.

Facial Emotion Reaction Time, November 2015

A C++/OpenGL program to present pictures of people's faces as they express different emotions. The task is to identify the particular emotion as quickly as possible. Decision time is measured with a simple key press.

Online PhD Proposal Form, June 2015

An online form for staff to compile applications and proposals from PhD applicants.

Inhibition Task, June 2015

An adaptation, in Java, of the GO:NO-GO (Stop signal) task published by Dr. Gijsbert Stoet as part of his PsyToolkit.

Polar HRM Heart Rate Variance, March 2014

A C++ program that reads Polar HRM files (RR mode, or regular samples) and computes time-domain and frequency-domain (FFT) properties for windows of arbitrary width. Resampling done with a cubic spline interpolation.

Student Marking System, February 2014

A set of ASP pages with an Access database to simplify the entry and management of student examination and project marks.

Chatroom Lexical Analysis, July 2013

A set of Perl scripts that produce a list of words, and the frequency with which they appear from chatroom dialogues.

Delayed Discounting Interpolation, February 2012

A VBScript script to prepare the data, and a gnuplot plot-script for calculating and plotting the best-fit hyperbolic function, for temporal cash discounting.

HMS2Sec, February 2012

Small utility written in C# that converts values in tab-separated text files from HH:MM:SS, HH:MM, and MM:SS to an integer number of seconds. Useful for preprocessing time data for gnuplot.

Vigilance Response Counting, August 2011

VBScript and .BAT scripts to count the number of responses made to Gary Freegard's Vigilance program. Counts valid responses and performs some data validation on comma-separated values.

PCQuest, April 2011

A VB2010 program for presenting questionnaires on a computer, designed specially to ease the entry of questions. Basically a non-networked version of WebQuest (see below).

FindIAs, February 2011

A suite of programs, one VB2010 program for listing the X,Y coordinates of an eye-tracker's target in each frame of an AVI video, and some VBScript and .BAT scripts for converting the interest-area coordinates (which were recorded in tab-separated values using one resolution) to gaze-movement coordinates (which were recorded in excel format using a different resolution), and identifying the appropriate interest-area.

Image Complexity, January 2011

A MATLAB script that attempts to calculate a simple, objective, measure of an image's complexity, along with a Perl script for arranging the results into a presentable HTML document.

Constrast Sensitivity Demonstration, December 2010

VB 2008 (.NET) program to display a contrast grating for the purposes of demonstrating that visual adaptation to a grating is specific to the grating's physical properties. Allows adjustment of contrast, frequency and orientation (tilt).

Meal Microstructure, October 2010

A VBScript script and gnuplot plot-script for analysing the real-time weight of a meal into rates of consumption and satiety.

Hick and Vigilance Data File Summary, August 2010

Two scripts written in Visual Basic Scripting Edition. Each reads its own raw-data files (one file per subject, where each file contains trials in rows and variables in columns). Then removes header (comment) lines and unused columns. Each writes its output to a single file containing one subject per line.

BESA EEG Time-Window Stats, June 2010

A script written in Visual Basic Scripting Edition. This reads a tab-separated ASCII file exported from BESA and selects a (time) portion of the data specified by the user. It then calculates the mean, maximum and minimum values for each electrode over that time portion and writes the results to a tab-separated file.

Transpose Tab Separated Values, May 2010

A Visual Basic Scripting Edition script that reads a tab-separated text file and converts rows to columns. Writes output to standard output (the screen), which can easily be redirected into a file.

KwikSurvey Checkbox-to-Likert Results Conversion, May 2010

An AWK script that 'repairs' survey results collected using checkbox answers (allowing multiple choices to be made), where Likert scale answers (where only one choice can be made) should have been used.

MVDR Coherence MATLAB Function Optimisation, April 2008

A project to speed up the performance of a MATLAB script published on MathWorks' File Exchange, and used for EEG analysis. Its speed was effectively doubled.

Check IPDbase/Workgroup, January 2008

A Visual Basic Scripting Edition Script that scans the department's IP subnet looking for machines that are improperly registered. It does this by attempting to match the hostname for each entry in the IP database with the NetBios hostname, and attempting to ping the machine. Reports any mismatches in hostname or online status.

Security Event Reader, November 2007

A Visual Basic Scripting Edition script that reads Windows' Security event log and writes important events to a tab-separated plain text file. This script runs automatically on our servers, and the output file is emailed to the administrator's email account.

Word Neighbours Finder, September 2006

A Visual Basic Forms-based application that searches the CELEX Lexical Database for words that are the same length as some given word, but have one letter that is different.

Single Layer Autoassociator Neural Network, June 2006

I assisted Dr Rob Lowe with the MATLAB programming for a neural network that was based on a 1985 paper by McLelland and Rumelhart.

List HTTP Errors, May 2006

A Perl script that runs on our web server, reading the HTTP log and extracting only the key information about the most important types of HTTP errors.

Web Questionnaire, February 2005 (still maintained)

An ASP–based script that generates questionnaire in the form of a web page. This script essentially allows researchers to generate a web page without having to learn HTML. The page contains a series of questions each with its own answer area (that can appear in a variety of formats, such as the Likert Scale). The questions and answer formats are defined by the researcher using a configuration file written in a simple strict format. The page visitor's responses are stored in a structured–format text file. See the demonstration here.

CELEX Lexical Database Manipulation, December 2004

An AWK script to remove some columns and swap other columns in the CELEX Lexical Database.

Automation Script for Connectionist Simulations, Feb 2004

A Microsoft Excel macro for importing the output from an autoassociator neural network.

Older Projects

Before 2005, most of the software I wrote was for reaction time studies, which required accurate and precise timing. The PC usually requires additional hardware to perform timing and interfacing with sufficiently high accuracy for our needs. It was possible to achieve millisecond timing using the onboard interrupt controller, and interfacing using the parallel port, but for reasons of portability and reliability, we chose to use proprietary PC-BUS (ISA) cards for both timing and interfacing.

Except where indicated, all PC programs were written using Borland's Turbo Pascal. Timing and interfacing (current buffering) was performed by proprietary hardware in the form of ISA cards. The accuracy and resolution of timing was within 1 millisecond. Results were written to flat ASCII (plain text) files in either fixed width or delimited format for easy importing to standard publication and analysis software.

We typically use Windows, but due to its lack of real-time features and inherent timing inconsistencies, I developed some projects on QNX, using its Photon GUI—I started using this in summer 2001 as the platform for my MSc dissertation, which was an evaluation of QNX's suitability for psychological experimentation. See my QNX pages for information about QNX. However, due to its specialist nature and our researchers' unfamiliarity with QNX, it is not satisfactory for our purposes, so we still use Windows, but take precautions to control timing errors.

My colleague, Gary Freegard, also specialises in reaction-time software, and he has even created a special button pad for measuring reaction times with exceptionally good accuracy and precision. See Gary's pages for more details.

Stroop, April 2004

The classic Stroop experiment written in C for QNX using Photon. The participants responded vocally, so the voice switch I built some years ago was used to trigger the interrupt line of the parallel port to obtain accurate response timings.

VSearch, July 2003

A program written in C for QNX, using the Photon GUI. Individual letters are displayed scattered randomly on the screen. The participant has to search the letter to find a given letter. A simple search would be looking for a K amongst O's, whilst a difficult search would be looking for a K amongst Z's. The target letter in this case was displayed in one of 16 predefined positions in a circle (like hours of a clock face), chosen randomly. This project was used to test for spatial neglect in brain injured patients.

Effective Symbology Project v3, November 2002

A further modification of the ESP v2 project to change the experimental procedure.

Random Generation of Connectionist Data, November 2002

A C++ program for generating pseudo-random bit patterns conforming to specified criteria, for input to an autoassociator neural network.

Cockpit, Msc Dissertation, October 2002

This program was written in C on QNX using the Photon GUI. It performed a multi-task test of icon efficacy. My dissertation was an evaluation of QNX's suitability for psychological experimentation.

The participant had to identify icons as quickly as possible, whilst simultaneously monitoring two moving objects. The two distractor tasks were designed to increase workload; one task was a dot moving randonmly in a square region — the participant had to press a key to change the direction of the dot before it moved outside of the region. The other task featured three vertical bars — the participant had to press a key to centre these bars before they moved beyond certain limits.

Effective Symbology Project v2, July 2001

A Visual Basic program that measured the time taken to find a given icon in an array of icons displayed in random positions. This was an adaptation of Dr Oscar De Bruijn's original source code to modify the experimental procedure.

DistList, July 2000

A Visual Basic macro to create Microsoft Outlook contacts and email distribution lists from an Access database of people.

Web based Document Storage System (PSYDOC), May 2000

This system allows users to save Microsoft Word documents to our web server, where they are allocated a unique identity code, and stored in an organised set of folders for retrieval via web pages. The Visual Basic program is built into a Word document template. The user interface consists of three toolbar buttons and a simple dialog box for entering details about the document.

Eyeblink, October 1996

Uses a data logging package to control a slide projector and sound generator, whilst continuously measuring the subject's heart and eye blink activity. Subjects are presented with slides of pleasant and unpleasant images whilst being startled at random occasions (synchronised to the presentation of the slides) by a loud white noise played over headphones.

Vigilance, February 1996

Provides a measure of vigilance based on the Bakan or Rapid Information Processing task. Subjects monitor a sequence of pseudo-random digits displayed on screen once every 600msec. Subject responds when three odd numbers are presented contiguously. Subject accuracy and speed is measured, statistically analysed, and output in tabular form.

HMVIS, November 1995

Records operant conditioning of human subjects using multiple variable interval schedules.

PCIB40 Driver Software, November 1995

The PCIB40 interface card is used extensively in projects requiring an interface between a PC computer and laboratory hardware, and millisecond timing. Object-oriented drivers were written to provide a modular and reusable means of controlling the card.

Hick, January 1995

Tests simple and multi-choice reaction time based on the Hick paradigm. The computer is connected to a custom-built reaction pad of 8 LEDs and buttons laid out in a semicircle, with a 'home' button at the centre of the radius. The subject responds to the lighting of an LED by pressing its corresponding button as quickly as possible.

HPR, January 1995

Performs a geometric progressive ratio schedule for operant conditioning of human subjects. No special hardware is required, but reprogramming of the keyboard is done to permit accurate measurement of keyboard presses. Results are analysed and presented graphically and in tabular format.

Kermit Comms, July 1994

To centralise the control of multiple data logging systems, I wrote a set of object-oriented real-time software drivers using the Kermit protocol to transmit data and commands bi-directionally over serial RS-232 lines. Real-time communication and data logging take place concurrently.

Stroop, September 1993

Performs the classic Stroop test. A colour word is displayed on screen in a certain 'ink colour'. Control (non-word), congruent word-colour, and incongruent word-colour tests are presented. The subject's task is to respond to the ink colour and not the colour word, using a five-button response pad. The accuracy and speed of the subject’s response is recorded.

Home About Me
Copyright © Neil Carter