Skip to main content

Driver for the PST Chronos response box

Project description

psychopy-chronos

Python driver for the PST Chronos response box, with a drop-in PsychoPy keyboard replacement.

Installation

pip install psychopy-chronos

Windows driver

If you've never installed E-Prime on your machine, install the USB driver for Chronos from the chronos_driver_win/ directory.

Usage

Standalone

import time
from chronos import Chronos

with Chronos() as box:
    time.sleep(5)    
    for evt in box.get_button_events():
        print(f"Button: {evt.button}, Press: {evt.is_press}, Hardware timestamp (μs): {evt.hw_timestamp_us}")

AUX inputs

Chronos comes with AUX cable for digital inputs and outputs. You could, for example, send TTL trigger from your PC into Chronos at stimulus onset to obtain Chronos hardware timestamp. Comparing this with chronos timestamp of the button press gives you jitter-free RTs.

import time
from chronos import Chronos

with Chronos() as box:
    while True:
        # send TTL trigger via for example psychopy.parallel 
        for e in box.get_aux_events():
            if e.is_rising: # trigger onset
                stim_onset_us = e.hw_timestamp_us

        for e in box.get_button_events():
            if e.is_press and stim_onset_us:
                print((e.hw_timestamp_us - stim_onset_us) / 1000.0)
                exit()
        time.sleep(0.001)

Two digital inputs channels are coded as 'F' and 'G' following PST pinout.

Led control

Use ChronosLEDs to manipulate the five onboard lights.

from chronos import ChronosLEDs

with ChronosLEDs() as box:
    box.init_leds()
    # light leftmost, centre, and rightmost leds in red for 1.5 seconds
    box.set_leds(colors=(255, 0, 0), duration=1.5, leds=(0, 2, 4))
    
    # or leave them on without blocking code execution
    box.leds_on(colors=[(255,0,0), (0,255,0)], leds=(0, 1))
    box.leds_off()

PsychoPy Builder

Add a Code Component with this in the Before Experiment tab:

from chronos import HybridKeyboard
from psychopy.hardware import keyboard
keyboard.Keyboard = HybridKeyboard

All Builder Keyboard Response components will then capture Chronos button presses alongside regular keyboard input. Buttons are coded '1' through '5' left to right, so add them to the allowed keys list in your Keyboard Response component.

To save hardware timestamps, add this to the End Routine tab:

if key_resp.response_log:
    thisExp.addData('chronos_hw_us',
        [getattr(k, 'hw_timestamp_us', '') for k in key_resp.response_log])
    thisExp.addData('chronos_pc_time_s',
        [getattr(k, 'tDown', '') for k in key_resp.response_log])

You can find a simple Builder demo in the examples/ directory.

Hardware timestamps and drift correction

Each press is timestamped by both the host PC (chronos_pc_time_s, seconds from experiment start) and the Chronos internal crystal (chronos_hw_us, microseconds). The crystal drifts relative to the PC clock. I measured +68.7ppm on my laptop (1001 presses over 685s, about 47ms of total drift). The drift is linear and can be corrected offline by regressing chronos_pc_time_s onto chronos_hw_us:

import numpy as np
slope, intercept = np.polyfit(hw_us_array, pc_time_array, 1)
corrected_rt = slope * hw_rt_us + intercept

Drift magnitude will vary across different computers. The test script used for this measurement is in test_chronos_timing.py. Feel free to push the buttons few hundred times to test the drift yourself.

chronos_hw_us is a 32-bit counter that wraps every 71.6 minutes. Use modulo 2^32 arithmetic for elapsed time calculations across long sessions.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

psychopy_chronos-0.0.3.tar.gz (17.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

psychopy_chronos-0.0.3-py3-none-any.whl (17.5 kB view details)

Uploaded Python 3

File details

Details for the file psychopy_chronos-0.0.3.tar.gz.

File metadata

  • Download URL: psychopy_chronos-0.0.3.tar.gz
  • Upload date:
  • Size: 17.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for psychopy_chronos-0.0.3.tar.gz
Algorithm Hash digest
SHA256 51589436211ca8c9c9ce00f5eaae807f2c7aca0f1cd44f7ddab4856e3cf141cf
MD5 f9817c5a6e612a637d8112e7441858d3
BLAKE2b-256 a0333a71dbd3dd402e3230dd62cd8593d53c129ce99469d53ba70a9b990225a2

See more details on using hashes here.

File details

Details for the file psychopy_chronos-0.0.3-py3-none-any.whl.

File metadata

File hashes

Hashes for psychopy_chronos-0.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 d2df5e34cee0722f48e6d518baf3277d4b07785642ab476545be8c1f4beebbb3
MD5 0dca88f756c5949661b8445521bb8fdc
BLAKE2b-256 fb573f3518b752777b28f5598d11334d87a012204f20374ebf536f7365aee465

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page