ClandininLab / stimpack

Precise and flexible generation of stimuli for neuroscience experiments.
GNU General Public License v3.0
7 stars 2 forks source link

`sched` behavior causes offset #15

Open jbmelander opened 1 year ago

jbmelander commented 1 year ago

SharedPixmap load_stream method schedules frames between 0 and duration. If the protocol has any pre_time, this causes the s.run call to take place pre_time into the schedule. Example:


from multiprocessing import shared_memory
import numpy as np
import time
import sched
import threading

class SchedTest:
    def __init__(self, dur, nominal_frame_rate):
        self.dur = dur
        self.nominal_frame_rate = nominal_frame_rate
        self.frameno = 0
        self.load_stream()
    def close(self):
        self.thread.join()
    def genframe(self):
        print('--- frame number {} at {} seconds'.format(self.frameno, time.time()-self.t))
        self.frameno += 1
    def load_stream(self):
        self.s = sched.scheduler(time.time, time.sleep)
        tis = np.arange(0,self.dur,1/self.nominal_frame_rate)
        tis = tis[1:]
        for ti in tis: 
            self.s.enter(ti, 1, self.genframe)
        self.thread = threading.Thread(target=self.s.run)
    def start_stream(self):
        print('-- starting stream')
        self.t = time.time()
        self.thread.start()

if __name__ == '__main__':
    st = SchedTest(10, 2)
    print('Beginning sleep...')
    time.sleep(5)
    print('Finished sleep...')
    st.start_stream()
    st.close()
    print('Finished test')
jbmelander commented 1 year ago

Above code results in the following output: image

jbmelander commented 1 year ago

Modifying the scheduler to:

pre_time=6
for ti in tis: 
    self.s.enter(ti+pre_time, 1, self.genframe)

yields the expected behavior:

image