@@ -31,8 +31,13 @@ def __init__(self, *args, **kwargs):
3131 )
3232 Session .frequencies = np .round (self .frequencies ).astype (int )
3333
34- # repetitions per state machine run (253 states max)
35- self .repetitions = 253 // len (self .frequencies )
34+ # calculate repetitions per state machine run (253 states max)
35+ self .repetitions = []
36+ max_reps_per_trial = (253 // self .n_frequencies )
37+ reps_remaining = self .task_params ['n_reps_per_freq' ]
38+ while reps_remaining > 0 :
39+ self .repetitions .append (min (max_reps_per_trial , reps_remaining ))
40+ reps_remaining -= self .repetitions [- 1 ]
3641
3742 # generate stimuli
3843 self .stimuli = []
@@ -51,6 +56,14 @@ def __init__(self, *args, **kwargs):
5156
5257 # self.attenuation = pd.read_csv(self.get_task_directory().joinpath('attenuation.csv'))
5358
59+ @property
60+ def n_frequencies (self ):
61+ return len (self .frequencies )
62+
63+ @property
64+ def n_state_machines (self ):
65+ return len (self .repetitions )
66+
5467 def start_mixin_sound (self ):
5568 logger .info (f'Pushing { len (self .frequencies )} stimuli to Harp soundcard' )
5669 sound .configure_sound_card (sounds = self .stimuli , indexes = self .indices , sample_rate = self .task_params ['fs' ])
@@ -82,12 +95,12 @@ def softcode_handler(softcode: int) -> None:
8295 frequency_index = Session .sequence [state_index ]
8396 frequency = Session .frequencies [frequency_index ]
8497 n_states = len (Session .sequence )
85- logger .info (f'{ state_index + 1 :03d} /{ n_states } : { frequency :5d} Hz' )
98+ logger .info (f'- { state_index + 1 :03d} /{ n_states } : { frequency :5d} Hz' )
8699
87- def get_state_machine (self , seed : int ) -> StateMachine :
100+ def get_state_machine (self , sma_idx : int ) -> StateMachine :
88101 # generate shuffled sequence, seeded with state machine number
89- Session .sequence = np .repeat (np .arange (len (self .frequencies )), self .repetitions )
90- np .random .seed (seed )
102+ Session .sequence = np .repeat (np .arange (len (self .frequencies )), self .repetitions [ sma_idx ] )
103+ np .random .seed (sma_idx )
91104 np .random .shuffle (Session .sequence )
92105
93106 # build state machine
@@ -105,10 +118,12 @@ def _run(self):
105118 logger .info ('Sending spacers to BNC ports' )
106119 self .send_spacers ()
107120
108- sma = self .get_state_machine (1 )
109- self .bpod .send_state_machine (sma )
110- self .bpod .run_state_machine (sma )
111- self .bpod .session .current_trial .export ()
121+ for sma_idx in range (self .n_state_machines ):
122+ logger .info (f'State Machine { sma_idx + 1 } /{ self .n_state_machines } ' )
123+ sma = self .get_state_machine (sma_idx )
124+ self .bpod .send_state_machine (sma )
125+ self .bpod .run_state_machine (sma )
126+ self .bpod .session .current_trial .export ()
112127
113128
114129if __name__ == '__main__' : # pragma: no cover
0 commit comments