Skip to main content

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.

Metadata

Release files for psychopy-chronos 0.0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for psychopy-chronos 0.0.4
File Size Uploaded
psychopy_chronos-0.0.4.tar.gz 17.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for psychopy-chronos 0.0.4
File Interpreter ABI Platform
psychopy_chronos-0.0.4-py3-none-any.whl Python 3 none any Details

Total release size: 34.8 kB

Release files / psychopy_chronos-0.0.4.tar.gz

Download URL psychopy_chronos-0.0.4.tar.gz
Size 17.5 kB
Tags Source
SHA-256 checksum
How to use checksums
177ebc7025f124022c4550cc97f0e6c6a1e9b7be8193f3328c0008cf8f98617a
BLAKE2b-256 checksum
How to use checksums
0294905d82172ecb28820f1c1a8811d639b45165504106d4b5960504d0a6a550
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.11

Release files / psychopy_chronos-0.0.4-py3-none-any.whl

Download URL psychopy_chronos-0.0.4-py3-none-any.whl
Size 17.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4a8774f5ccf470cd1154ebb9804a04244bd8eb9e97b8781ff65a467ccb5864a8
BLAKE2b-256 checksum
How to use checksums
e91dd551d4c1c0e711868473148bf071f06b034d92b40aedef161c1470a34685
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.11

Release history Release notifications | RSS feed

0.0.5

2 release files

This release

0.0.4 This release

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page