Trouble storing continuous VAS (EVA) ratings during thermal stimulation in PsychoPy

Hey guys!

I’m working on a PsychoPy experiment with a thermal stimulator (thermode) and I’m really stuck with storing a continuous VAS (EVA) rating properly. I’d really appreciate some help or advice.

My protocol is the following:

  • PsychoPy controls a thermode

  • Baseline temperature (32°C)

  • Ramp up at 3°C/s

  • Reach target temperature (pain or control)

  • Plateau at target temperature for 30 seconds

  • Ramp down at 8°C/s

  • Baseline for 30 seconds

  • Repeat with different temperatures

  • Stimulations are pain vs control, presented in a pseudo-random order

VAS / EVA details:

  • Horizontal VAS from 0 to 100

  • Cursor starts at 50

  • Participant moves the cursor with left/right arrow keys

  • Each key press should move the cursor by 5 points

  • The participant can change their rating at any time during the 30 s plateau

  • The VAS is displayed ONLY during the plateau phase (not during ramp-up or ramp-down)

What I want to store:

  • Condition (pain vs control)

  • Target temperature

  • Continuous VAS ratings during the 30 s plateau
    (ideally 1 value per second, so 30 values per trial)

What I currently have:

  • The thermode triggering works

  • The VAS displays correctly during the plateau

  • The cursor moves correctly by steps of 5 using arrow keys

The problem: I cannot reliably store the VAS continuously during the plateau.

At this point I’m honestly exhausted and I’m probably missing something simple.
If anyone has:

  • a clean example of storing continuous VAS ratings in PsychoPy, or

  • advice on the best practice for logging 1 Hz VAS data during a fixed-duration plateau,

I would be extremely grateful.

Thanks a lot in advance!

Can’t you just do something like:

#before the trial
log_interval = 1.0       
next_log_time = 0.0       
log_data = []  

#in each frame
current_time = globalClock.getTime()
    if current_time >= next_log_time:
        current_rating = rating_slider.getRating()  #put VAS here
        thisExp.addData(f'VAS_t{int(next_log_time)}', current_rating)
        log_data.append((current_time, current_rating))
        next_log_time += log_interval
#optionally just dump this list at the end of the trial
thisExp.addData("VAS Ratings",log_data) 

Unless I am not understanding the purpose of the plateau?

Issac